From a9d70c4172f95a38f77fb83900dbefd7ec855f54 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Thu, 20 Dec 2018 13:17:39 +0200 Subject: [PATCH] Tasks --- lib/redux/task/task_selectors.dart | 38 ++++++++++++++++++++ lib/ui/client/view/client_view_overview.dart | 14 ++++++++ lib/ui/client/view/client_view_vm.dart | 6 ++++ 3 files changed, 58 insertions(+) diff --git a/lib/redux/task/task_selectors.dart b/lib/redux/task/task_selectors.dart index e7f6d5435..9e953b348 100644 --- a/lib/redux/task/task_selectors.dart +++ b/lib/redux/task/task_selectors.dart @@ -77,6 +77,44 @@ double taskRateSelector({CompanyEntity company, ProjectEntity project}) { return 0; } +var memoizedTaskStatsForClient = memo4((int clientId, + BuiltMap taskMap, + String activeLabel, + String archivedLabel) => + taskStatsForClient(clientId, taskMap, activeLabel, archivedLabel)); + +String taskStatsForClient( + int clientId, + BuiltMap taskMap, + String activeLabel, + String archivedLabel) { + int countActive = 0; + int countArchived = 0; + taskMap.forEach((taskId, task) { + if (task.clientId == clientId) { + if (task.isActive) { + countActive++; + } else if (task.isArchived) { + countArchived++; + } + } + }); + + String str = ''; + if (countActive > 0) { + str = '$countActive $activeLabel'; + if (countArchived > 0) { + str += ' • '; + } + } + if (countArchived > 0) { + str += '$countArchived $archivedLabel'; + } + + return str; +} + + var memoizedTaskStatsForProject = memo4((int projectId, BuiltMap taskMap, String activeLabel, diff --git a/lib/ui/client/view/client_view_overview.dart b/lib/ui/client/view/client_view_overview.dart index 28564fc90..a6a91147e 100644 --- a/lib/ui/client/view/client_view_overview.dart +++ b/lib/ui/client/view/client_view_overview.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart'; import 'package:invoiceninja_flutter/redux/project/project_selectors.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart'; +import 'package:invoiceninja_flutter/redux/task/task_selectors.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/FieldGrid.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; @@ -114,6 +115,19 @@ class ClientOverview extends StatelessWidget { localization.archived), ) : Container(), + company.isModuleEnabled(EntityType.task) + ? EntityListTile( + icon: getEntityIcon(EntityType.task), + title: localization.tasks, + onTap: () => + viewModel.onEntityPressed(context, EntityType.task), + subtitle: memoizedTaskStatsForClient( + client.id, + state.taskState.map, + localization.active, + localization.archived), + ) + : Container(), ], ); } diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index 53882c903..d84bb0a89 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; import 'package:invoiceninja_flutter/redux/project/project_actions.dart'; import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart'; +import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/client/client_screen.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -105,6 +106,11 @@ class ClientViewVM { entityId: client.id, entityType: EntityType.client)); store.dispatch(ViewProjectList(context)); break; + case EntityType.task: + store.dispatch(FilterTasksByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewTaskList(context)); + break; } }, onRefreshed: (context, loadActivities) =>