From ca188d07536c633a8acc81d96e336bef6118b200 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 14 Jul 2019 17:02:22 +0300 Subject: [PATCH] Show archived/deleted records when filtered by client --- lib/redux/expense/expense_selectors.dart | 55 ++++++++++++++---------- lib/redux/invoice/invoice_selectors.dart | 12 +++--- lib/redux/payment/payment_selectors.dart | 9 ++-- lib/redux/project/project_selectors.dart | 12 +++--- lib/redux/quote/quote_selectors.dart | 12 +++--- lib/redux/task/task_selectors.dart | 5 +++ lib/redux/ui/list_ui_state.dart | 13 ++++++ lib/redux/vendor/vendor_selectors.dart | 16 ++----- lib/ui/expense/expense_list_vm.dart | 1 + lib/ui/vendor/vendor_list_item.dart | 12 +++--- lib/ui/vendor/view/vendor_view.dart | 2 +- stubs/redux/stub/stub_selectors | 19 +++----- 12 files changed, 95 insertions(+), 73 deletions(-) diff --git a/lib/redux/expense/expense_selectors.dart b/lib/redux/expense/expense_selectors.dart index c2d80e222..5f0448da9 100644 --- a/lib/redux/expense/expense_selectors.dart +++ b/lib/redux/expense/expense_selectors.dart @@ -41,15 +41,42 @@ List dropdownExpensesSelector(BuiltMap expenseMap, return list; } -var memoizedFilteredExpenseList = memo3( - (BuiltMap expenseMap, BuiltList expenseList, +var memoizedFilteredExpenseList = memo5( + (BuiltMap expenseMap, + BuiltMap clientMap, + BuiltMap vendorMap, + BuiltList expenseList, ListUIState expenseListState) => - filteredExpensesSelector(expenseMap, expenseList, expenseListState)); + filteredExpensesSelector( + expenseMap, clientMap, vendorMap, expenseList, expenseListState)); -List filteredExpensesSelector(BuiltMap expenseMap, - BuiltList expenseList, ListUIState expenseListState) { +List filteredExpensesSelector( + BuiltMap expenseMap, + BuiltMap clientMap, + BuiltMap vendorMap, + BuiltList expenseList, + ListUIState expenseListState) { final list = expenseList.where((expenseId) { final expense = expenseMap[expenseId]; + final vendor = + vendorMap[expense.vendorId] ?? VendorEntity(id: expense.vendorId); + final client = + clientMap[expense.clientId] ?? ClientEntity(id: expense.clientId); + + if (expenseListState.filterEntityType != null) { + if (expenseListState.filterEntityType == EntityType.client && + expense.clientId != expenseListState.filterEntityId) { + return false; + } else if (expenseListState.filterEntityType == EntityType.vendor && + expense.vendorId != expenseListState.filterEntityId) { + return false; + } + } else if (expense.vendorId != null && !vendor.isActive) { + return false; + } else if (expense.clientId != null && !client.isActive) { + return false; + } + if (!expense.matchesStates(expenseListState.stateFilters)) { return false; } @@ -57,18 +84,6 @@ List filteredExpensesSelector(BuiltMap expenseMap, return false; } - if (expenseListState.filterEntityId != null && - expenseListState.filterEntityType == EntityType.client && - expense.clientId != expenseListState.filterEntityId) { - return false; - } - - if (expenseListState.filterEntityId != null && - expenseListState.filterEntityType == EntityType.vendor && - expense.vendorId != expenseListState.filterEntityId) { - return false; - } - if (expenseListState.custom1Filters.isNotEmpty && !expenseListState.custom1Filters.contains(expense.customValue1)) { return false; @@ -77,12 +92,6 @@ List filteredExpensesSelector(BuiltMap expenseMap, !expenseListState.custom2Filters.contains(expense.customValue2)) { return false; } - /* - if (expenseListState.filterEntityId != null && - expense.entityId != expenseListState.filterEntityId) { - return false; - } - */ return expense.matchesFilter(expenseListState.filter); }).toList(); diff --git a/lib/redux/invoice/invoice_selectors.dart b/lib/redux/invoice/invoice_selectors.dart index f1fb364ec..ac611825a 100644 --- a/lib/redux/invoice/invoice_selectors.dart +++ b/lib/redux/invoice/invoice_selectors.dart @@ -58,9 +58,15 @@ List filteredInvoicesSelector( final invoice = invoiceMap[invoiceId]; final client = clientMap[invoice.clientId] ?? ClientEntity(id: invoice.clientId); - if (client == null || !client.isActive) { + + if (invoiceListState.filterEntityId != null) { + if (!invoiceListState.entityMatchesFilter(client)) { + return false; + } + } else if (!client.isActive) { return false; } + if (!invoice.matchesStates(invoiceListState.stateFilters)) { return false; } @@ -71,10 +77,6 @@ List filteredInvoicesSelector( !client.matchesFilter(invoiceListState.filter)) { return false; } - if (invoiceListState.filterEntityId != null && - invoice.clientId != invoiceListState.filterEntityId) { - return false; - } if (invoiceListState.custom1Filters.isNotEmpty && !invoiceListState.custom1Filters.contains(invoice.customTextValue1)) { return false; diff --git a/lib/redux/payment/payment_selectors.dart b/lib/redux/payment/payment_selectors.dart index b05259a21..5ad0763de 100644 --- a/lib/redux/payment/payment_selectors.dart +++ b/lib/redux/payment/payment_selectors.dart @@ -72,20 +72,19 @@ List filteredPaymentsSelector( invoiceMap[payment.invoiceId] ?? InvoiceEntity(id: payment.invoiceId); final client = clientMap[invoice.clientId] ?? ClientEntity(id: invoice.clientId); - if (invoice.isDeleted || !client.isActive) { - return false; - } if (paymentListState.filterEntityId != null) { if (paymentListState.filterEntityType == EntityType.client && - invoiceMap[payment.invoiceId].clientId != - paymentListState.filterEntityId) { + invoice.clientId != paymentListState.filterEntityId) { return false; } else if (paymentListState.filterEntityType == EntityType.invoice && payment.invoiceId != paymentListState.filterEntityId) { return false; } + } else if (invoice.isDeleted || !client.isActive) { + return false; } + return payment.matchesFilter(paymentListState.filter); }).toList(); diff --git a/lib/redux/project/project_selectors.dart b/lib/redux/project/project_selectors.dart index a6504abf3..e81ba8df3 100644 --- a/lib/redux/project/project_selectors.dart +++ b/lib/redux/project/project_selectors.dart @@ -71,7 +71,11 @@ List filteredProjectsSelector( final client = clientMap[project.clientId] ?? ClientEntity(id: project.clientId); - if (!client.isActive) { + if (projectListState.filterEntityId != null) { + if (!projectListState.entityMatchesFilter(client)) { + return false; + } + } else if (!client.isActive) { return false; } @@ -83,14 +87,12 @@ List filteredProjectsSelector( if (!project.matchesStates(projectListState.stateFilters)) { return false; } - if (projectListState.filterEntityId != null && - project.clientId != projectListState.filterEntityId) { - return false; - } + if (projectListState.custom1Filters.isNotEmpty && !projectListState.custom1Filters.contains(project.customValue1)) { return false; } + if (projectListState.custom2Filters.isNotEmpty && !projectListState.custom2Filters.contains(project.customValue2)) { return false; diff --git a/lib/redux/quote/quote_selectors.dart b/lib/redux/quote/quote_selectors.dart index c134a22fc..5d7b8e4a1 100644 --- a/lib/redux/quote/quote_selectors.dart +++ b/lib/redux/quote/quote_selectors.dart @@ -22,9 +22,15 @@ List filteredQuotesSelector( final list = quoteList.where((quoteId) { final quote = quoteMap[quoteId]; final client = clientMap[quote.clientId]; - if (client == null || !client.isActive) { + + if (quoteListState.filterEntityId != null) { + if (!quoteListState.entityMatchesFilter(client)) { + return false; + } + } else if (!client.isActive) { return false; } + if (!quote.matchesStates(quoteListState.stateFilters)) { return false; } @@ -35,10 +41,6 @@ List filteredQuotesSelector( !client.matchesFilter(quoteListState.filter)) { return false; } - if (quoteListState.filterEntityId != null && - quote.clientId != quoteListState.filterEntityId) { - return false; - } if (quoteListState.custom1Filters.isNotEmpty && !quoteListState.custom1Filters.contains(quote.customTextValue1)) { return false; diff --git a/lib/redux/task/task_selectors.dart b/lib/redux/task/task_selectors.dart index 18aa6eca6..cf38182a6 100644 --- a/lib/redux/task/task_selectors.dart +++ b/lib/redux/task/task_selectors.dart @@ -107,7 +107,12 @@ List filteredTasksSelector( task.projectId != taskListState.filterEntityId) { return false; } + } else if (task.clientId != null && !client.isActive) { + return false; + } else if (task.projectId != null && !project.isActive) { + return false; } + if (taskListState.custom1Filters.isNotEmpty && !taskListState.custom1Filters.contains(task.customValue1)) { return false; diff --git a/lib/redux/ui/list_ui_state.dart b/lib/redux/ui/list_ui_state.dart index 47807e255..e07c9f43b 100644 --- a/lib/redux/ui/list_ui_state.dart +++ b/lib/redux/ui/list_ui_state.dart @@ -19,6 +19,7 @@ abstract class ListUIState implements Built { custom2Filters: BuiltList(), ); } + ListUIState._(); @nullable @@ -32,17 +33,29 @@ abstract class ListUIState implements Built { @nullable EntityType get filterEntityType; + bool entityMatchesFilter(BaseEntity entity) { + return filterEntityId == entity.id && filterEntityType == entity.entityType; + } + String get sortField; + bool get sortAscending; + BuiltList get stateFilters; + BuiltList get statusFilters; + BuiltList get custom1Filters; + BuiltList get custom2Filters; bool get hasStateFilters => stateFilters.length != 1 || stateFilters.first != EntityState.active; + bool get hasStatusFilters => statusFilters.isNotEmpty; + bool get hasCustom1Filters => custom1Filters.isNotEmpty; + bool get hasCustom2Filters => custom2Filters.isNotEmpty; //factory EntityUIState([void updates(EntityUIStateBuilder b)]) = _$listUIState; diff --git a/lib/redux/vendor/vendor_selectors.dart b/lib/redux/vendor/vendor_selectors.dart index 6ef192c57..3774c6bd7 100644 --- a/lib/redux/vendor/vendor_selectors.dart +++ b/lib/redux/vendor/vendor_selectors.dart @@ -31,29 +31,21 @@ List filteredVendorsSelector(BuiltMap vendorMap, BuiltList vendorList, ListUIState vendorListState) { final list = vendorList.where((vendorId) { final vendor = vendorMap[vendorId]; + if (!vendor.matchesStates(vendorListState.stateFilters)) { return false; } - /* - if (vendorListState.filterEntityId != null && - vendor.clientId != vendorListState.filterEntityId) { - return false; - } - */ + if (vendorListState.custom1Filters.isNotEmpty && !vendorListState.custom1Filters.contains(vendor.customValue1)) { return false; } + if (vendorListState.custom2Filters.isNotEmpty && !vendorListState.custom2Filters.contains(vendor.customValue2)) { return false; } - /* - if (vendorListState.filterEntityId != null && - vendor.entityId != vendorListState.filterEntityId) { - return false; - } - */ + return vendor.matchesFilter(vendorListState.filter); }).toList(); diff --git a/lib/ui/expense/expense_list_vm.dart b/lib/ui/expense/expense_list_vm.dart index 5dbedae30..1717e8bc4 100644 --- a/lib/ui/expense/expense_list_vm.dart +++ b/lib/ui/expense/expense_list_vm.dart @@ -67,6 +67,7 @@ class ExpenseListVM { user: state.user, listState: state.expenseListState, expenseList: memoizedFilteredExpenseList(state.expenseState.map, + state.clientState.map, state.vendorState.map, state.expenseState.list, state.expenseListState), expenseMap: state.expenseState.map, isLoading: state.isLoading, diff --git a/lib/ui/vendor/vendor_list_item.dart b/lib/ui/vendor/vendor_list_item.dart index 373c89cdd..9417834f5 100644 --- a/lib/ui/vendor/vendor_list_item.dart +++ b/lib/ui/vendor/vendor_list_item.dart @@ -20,6 +20,7 @@ class VendorListItem extends StatelessWidget { final Function(EntityAction) onEntityAction; final GestureTapCallback onTap; final GestureTapCallback onLongPress; + //final ValueChanged onCheckboxChanged; final VendorEntity vendor; final String filter; @@ -70,11 +71,12 @@ class VendorListItem extends StatelessWidget { : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - filterMatch, - maxLines: 3, - overflow: TextOverflow.ellipsis, - ), + if (filterMatch != null) + Text( + filterMatch, + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), EntityStateLabel(vendor), ], ), diff --git a/lib/ui/vendor/view/vendor_view.dart b/lib/ui/vendor/view/vendor_view.dart index 366aa7742..d8bda13b6 100644 --- a/lib/ui/vendor/view/vendor_view.dart +++ b/lib/ui/vendor/view/vendor_view.dart @@ -26,7 +26,7 @@ class _VendorViewState extends State @override void initState() { super.initState(); - _controller = TabController(vsync: this, length: 3); + _controller = TabController(vsync: this, length: 2); } @override diff --git a/stubs/redux/stub/stub_selectors b/stubs/redux/stub/stub_selectors index 962a2547e..c126cf72b 100644 --- a/stubs/redux/stub/stub_selectors +++ b/stubs/redux/stub/stub_selectors @@ -37,15 +37,16 @@ List filteredStubsSelector(BuiltMap stubMap, BuiltList stubList, ListUIState stubListState) { final list = stubList.where((stubId) { final stub = stubMap[stubId]; + if (stubListState.filterEntityId != null && + stub.entityId != stubListState.filterEntityId) { + return false; + } else { + + } + if (!stub.matchesStates(stubListState.stateFilters)) { return false; } - /* - if (stubListState.filterEntityId != null && - stub.clientId != stubListState.filterEntityId) { - return false; - } - */ if (stubListState.custom1Filters.isNotEmpty && !stubListState.custom1Filters.contains(stub.customValue1)) { return false; @@ -54,12 +55,6 @@ List filteredStubsSelector(BuiltMap stubMap, !stubListState.custom2Filters.contains(stub.customValue2)) { return false; } - /* - if (stubListState.filterEntityId != null && - stub.entityId != stubListState.filterEntityId) { - return false; - } - */ return stub.matchesFilter(stubListState.filter); }).toList();