From 3fbf36307e4991264785633daa70fec3e7cc85a0 Mon Sep 17 00:00:00 2001 From: Gianfranco Gasbarri Date: Thu, 25 Jun 2020 23:03:11 +0100 Subject: [PATCH 1/5] Completed Sort Fields for Client model --- lib/data/models/client_model.dart | 91 ++++++++++++++++++- lib/redux/client/client_selectors.dart | 53 ++++++++--- lib/ui/app/forms/client_picker.dart | 12 ++- lib/ui/client/client_list_vm.dart | 11 ++- lib/ui/client/client_screen_vm.dart | 11 ++- lib/ui/expense/edit/expense_edit_details.dart | 11 ++- lib/ui/payment/edit/payment_edit.dart | 7 +- lib/ui/project/edit/project_edit.dart | 7 +- lib/ui/task/edit/task_edit_details.dart | 7 +- 9 files changed, 187 insertions(+), 23 deletions(-) diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index e56562f33..8890c00b0 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -323,7 +323,14 @@ abstract class ClientEntity extends Object bool get hasEmailAddress => contacts.where((contact) => contact.email?.isNotEmpty).isNotEmpty; - int compareTo(ClientEntity client, String sortField, bool sortAscending) { + int compareTo( + ClientEntity client, + String sortField, + bool sortAscending, + BuiltMap userMap, + BuiltMap countryMap, + BuiltMap languageMap, + BuiltMap currencyMap) { int response = 0; final ClientEntity clientA = sortAscending ? this : client; final ClientEntity clientB = sortAscending ? client : this; @@ -356,9 +363,91 @@ abstract class ClientEntity extends Object case ClientFields.idNumber: response = clientA.idNumber.compareTo(clientB.idNumber); break; + case ClientFields.website: + response = clientA.website + .toLowerCase() + .compareTo(clientB.website.toLowerCase()); + break; + case ClientFields.address1: + response = clientA.address1 + .toLowerCase() + .compareTo(clientB.address1.toLowerCase()); + break; + case ClientFields.address2: + response = clientA.address2 + .toLowerCase() + .compareTo(clientB.address2.toLowerCase()); + break; + case ClientFields.phone: + response = clientA.phone + .toLowerCase() + .compareTo(clientB.phone.toLowerCase()); + break; + case ClientFields.publicNotes: + response = clientA.publicNotes + .toLowerCase() + .compareTo(clientB.publicNotes.toLowerCase()); + break; + case ClientFields.privateNotes: + response = clientA.privateNotes + .toLowerCase() + .compareTo(clientB.privateNotes.toLowerCase()); + break; + case ClientFields.vatNumber: + response = clientA.vatNumber + .toLowerCase() + .compareTo(clientB.vatNumber.toLowerCase()); + break; + case ClientFields.assignedToId: + case EntityFields.assignedTo: + final userA = userMap[clientA.assignedUserId] ?? UserEntity(); + final userB = userMap[clientB.assignedUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case ClientFields.createdById: + case EntityFields.createdBy: + final userA = userMap[clientA.createdUserId] ?? UserEntity(); + final userB = userMap[clientB.createdUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case ClientFields.country: + final countryA = countryMap[clientA.countryId] ?? CountryEntity(); + final countryB = countryMap[clientB.countryId] ?? CountryEntity(); + response = countryA.name.toLowerCase() + .compareTo(countryB.name.toLowerCase()); + break; + case ClientFields.currency: + final currencyA = currencyMap[clientA.currencyId] ?? CurrencyEntity(); + final currencyB = currencyMap[clientB.currencyId] ?? CurrencyEntity(); + response = currencyA.name.toLowerCase() + .compareTo(currencyB.name.toLowerCase()); + break; + case EntityFields.state: + case ClientFields.state: + final stateA = EntityState.valueOf(clientA.entityState) ?? EntityState.active; + final stateB = EntityState.valueOf(clientB.entityState) ?? EntityState.active; + response = stateA.name.toLowerCase() + .compareTo(stateB.name.toLowerCase()); + break; + case ClientFields.language: + final languageA = languageMap[clientA.languageId] ?? LanguageEntity(); + final languageB = languageMap[clientB.languageId] ?? LanguageEntity(); + response = languageA.name.toLowerCase() + .compareTo(languageB.name.toLowerCase()); + break; case ClientFields.createdAt: response = clientA.createdAt.compareTo(clientB.createdAt); break; + case ClientFields.archivedAt: + response = clientA.archivedAt.compareTo(clientB.archivedAt); + break; + case ClientFields.lastLoginAt: + response = clientA.lastLogin.compareTo(clientB.lastLogin); + break; case ClientFields.custom1: response = clientA.customValue1 .toLowerCase() diff --git a/lib/redux/client/client_selectors.dart b/lib/redux/client/client_selectors.dart index 6b2e84364..7137551ea 100644 --- a/lib/redux/client/client_selectors.dart +++ b/lib/redux/client/client_selectors.dart @@ -4,36 +4,57 @@ import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -var memoizedDropdownClientList = memo2( - (BuiltMap clientMap, BuiltList clientList) => - dropdownClientsSelector(clientMap, clientList)); +var memoizedDropdownClientList = memo6( + (BuiltMap clientMap, + BuiltList clientList, + BuiltMap userMap, + BuiltMap countryMap, + BuiltMap languageMap, + BuiltMap currencyMap) => + dropdownClientsSelector(clientMap, clientList, userMap, countryMap, + languageMap, currencyMap)); List dropdownClientsSelector( - BuiltMap clientMap, BuiltList clientList) { + BuiltMap clientMap, + BuiltList clientList, + BuiltMap userMap, + BuiltMap countryMap, + BuiltMap languageMap, + BuiltMap currencyMap) { final list = clientList.where((clientId) => clientMap[clientId].isActive).toList(); list.sort((clientAId, clientBId) { final clientA = clientMap[clientAId]; final clientB = clientMap[clientBId]; - return clientA.compareTo(clientB, ClientFields.name, true); + return clientA.compareTo(clientB, ClientFields.name, true, userMap, + countryMap, languageMap, currencyMap); }); return list; } -var memoizedFilteredClientList = memo4((BuiltMap - clientMap, - BuiltList clientList, - BuiltMap groupMap, - ListUIState clientListState) => - filteredClientsSelector(clientMap, clientList, groupMap, clientListState)); +var memoizedFilteredClientList = memo8( + (BuiltMap clientMap, + BuiltList clientList, + BuiltMap groupMap, + ListUIState clientListState, + BuiltMap userMap, + BuiltMap countryMap, + BuiltMap languageMap, + BuiltMap currencyMap) => + filteredClientsSelector(clientMap, clientList, groupMap, + clientListState, userMap, countryMap, languageMap, currencyMap)); List filteredClientsSelector( BuiltMap clientMap, BuiltList clientList, BuiltMap groupMap, - ListUIState clientListState) { + ListUIState clientListState, + BuiltMap userMap, + BuiltMap countryMap, + BuiltMap languageMap, + BuiltMap currencyMap) { final list = clientList.where((clientId) { final client = clientMap[clientId]; final group = groupMap[client.groupId] ?? GroupEntity(id: client.groupId); @@ -79,7 +100,13 @@ List filteredClientsSelector( final clientA = clientMap[clientAId]; final clientB = clientMap[clientBId]; return clientA.compareTo( - clientB, clientListState.sortField, clientListState.sortAscending); + clientB, + clientListState.sortField, + clientListState.sortAscending, + userMap, + countryMap, + languageMap, + currencyMap); }); return list; diff --git a/lib/ui/app/forms/client_picker.dart b/lib/ui/app/forms/client_picker.dart index 934711cb6..79d863aec 100644 --- a/lib/ui/app/forms/client_picker.dart +++ b/lib/ui/app/forms/client_picker.dart @@ -1,7 +1,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; import 'package:invoiceninja_flutter/redux/client/client_state.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; @@ -25,6 +27,8 @@ class ClientPicker extends StatelessWidget { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); + final store = StoreProvider.of(context); + final state = store.state; return EntityDropdown( key: ValueKey('__client_${clientId}__'), @@ -32,7 +36,13 @@ class ClientPicker extends StatelessWidget { labelText: localization.client, entityId: clientId, autofocus: autofocus, - entityList: memoizedDropdownClientList(clientState.map, clientState.list), + entityList: memoizedDropdownClientList( + clientState.map, + clientState.list, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), entityMap: clientState.map, validator: (String val) => val.trim().isEmpty ? AppLocalization.of(context).pleaseSelectAClient diff --git a/lib/ui/client/client_list_vm.dart b/lib/ui/client/client_list_vm.dart index e4ec07351..4874f4900 100644 --- a/lib/ui/client/client_list_vm.dart +++ b/lib/ui/client/client_list_vm.dart @@ -128,8 +128,15 @@ class ClientListVM { return ClientListVM( state: state, - clientList: memoizedFilteredClientList(state.clientState.map, - state.clientState.list, state.groupState.map, state.clientListState), + clientList: memoizedFilteredClientList( + state.clientState.map, + state.clientState.list, + state.groupState.map, + state.clientListState, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), clientMap: state.clientState.map, isLoading: state.isLoading, isLoaded: state.clientState.isLoaded, diff --git a/lib/ui/client/client_screen_vm.dart b/lib/ui/client/client_screen_vm.dart index 579bb1f86..d1745f646 100644 --- a/lib/ui/client/client_screen_vm.dart +++ b/lib/ui/client/client_screen_vm.dart @@ -44,8 +44,15 @@ class ClientScreenVM { return ClientScreenVM( clientMap: state.clientState.map, - clientList: memoizedFilteredClientList(state.clientState.map, - state.clientState.list, state.groupState.map, state.clientListState), + clientList: memoizedFilteredClientList( + state.clientState.map, + state.clientState.list, + state.groupState.map, + state.clientListState, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), userCompany: state.userCompany, isInMultiselect: state.clientListState.isInMultiselect(), ); diff --git a/lib/ui/expense/edit/expense_edit_details.dart b/lib/ui/expense/edit/expense_edit_details.dart index 56e1b2752..3e6d47f98 100644 --- a/lib/ui/expense/edit/expense_edit_details.dart +++ b/lib/ui/expense/edit/expense_edit_details.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; @@ -84,6 +86,8 @@ class ExpenseEditDetailsState extends State { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); + final store = StoreProvider.of(context); + final state = store.state; final viewModel = widget.viewModel; final expense = viewModel.expense; final company = viewModel.company; @@ -121,7 +125,12 @@ class ExpenseEditDetailsState extends State { labelText: localization.client, entityId: expense.clientId, entityList: memoizedDropdownClientList( - clientState.map, clientState.list), + clientState.map, + clientState.list, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), onSelected: (client) { final currencyId = (client as ClientEntity)?.settings?.currencyId ?? diff --git a/lib/ui/payment/edit/payment_edit.dart b/lib/ui/payment/edit/payment_edit.dart index ae518fcc3..28884892e 100644 --- a/lib/ui/payment/edit/payment_edit.dart +++ b/lib/ui/payment/edit/payment_edit.dart @@ -149,7 +149,12 @@ class _PaymentEditState extends State { ..invoices.clear())); }, entityList: memoizedDropdownClientList( - state.clientState.map, state.clientState.list), + state.clientState.map, + state.clientState.list, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), ), if (payment.isForInvoice != true) DecoratedFormField( diff --git a/lib/ui/project/edit/project_edit.dart b/lib/ui/project/edit/project_edit.dart index 75bb01990..7db748a19 100644 --- a/lib/ui/project/edit/project_edit.dart +++ b/lib/ui/project/edit/project_edit.dart @@ -137,7 +137,12 @@ class _ProjectEditState extends State { labelText: localization.client, entityId: project.clientId, entityList: memoizedDropdownClientList( - state.clientState.map, state.clientState.list), + state.clientState.map, + state.clientState.list, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), validator: (String val) => val.trim().isEmpty ? localization.pleaseSelectAClient : null, diff --git a/lib/ui/task/edit/task_edit_details.dart b/lib/ui/task/edit/task_edit_details.dart index 8dfcead23..f740ff475 100644 --- a/lib/ui/task/edit/task_edit_details.dart +++ b/lib/ui/task/edit/task_edit_details.dart @@ -93,7 +93,12 @@ class _TaskEditDetailsState extends State { labelText: localization.client, entityId: task.clientId, entityList: memoizedDropdownClientList( - state.clientState.map, state.clientState.list), + state.clientState.map, + state.clientState.list, + state.userState.map, + state.staticState.countryMap, + state.staticState.languageMap, + state.staticState.currencyMap), onSelected: (client) { viewModel.onChanged(task.rebuild((b) => b ..clientId = client?.id From ef51e8200758c5195120ff02bcbdf94bc5282ce3 Mon Sep 17 00:00:00 2001 From: Gianfranco Gasbarri Date: Thu, 25 Jun 2020 23:17:14 +0100 Subject: [PATCH 2/5] Completed Sort Fields for Product model --- lib/data/models/product_model.dart | 34 +++++++++++++++++-- lib/redux/product/product_selectors.dart | 33 +++++++++++------- .../edit/invoice_edit_items_desktop.dart | 6 ++-- lib/ui/product/product_list_vm.dart | 2 +- lib/ui/product/product_screen_vm.dart | 2 +- 5 files changed, 57 insertions(+), 20 deletions(-) diff --git a/lib/data/models/product_model.dart b/lib/data/models/product_model.dart index 5cb26802b..6637e6cec 100644 --- a/lib/data/models/product_model.dart +++ b/lib/data/models/product_model.dart @@ -168,8 +168,12 @@ abstract class ProductEntity extends Object @override FormatNumberType get listDisplayAmountType => FormatNumberType.money; - int compareTo(ProductEntity product, - [String sortField, bool sortAscending = true]) { + int compareTo( + ProductEntity product, [ + String sortField, + bool sortAscending = true, + BuiltMap userMap, + ]) { int response = 0; final ProductEntity productA = sortAscending ? this : product; final ProductEntity productB = sortAscending ? product : this; @@ -192,11 +196,37 @@ abstract class ProductEntity extends Object case ProductFields.updatedAt: response = productA.updatedAt.compareTo(productB.updatedAt); break; + case EntityFields.createdAt: + response = productA.createdAt.compareTo(productB.createdAt); + break; + case ProductFields.archivedAt: + response = productA.archivedAt.compareTo(productB.archivedAt); + break; case ProductFields.notes: response = productA.notes .toLowerCase() .compareTo(productB.notes.toLowerCase()); break; + case EntityFields.assignedTo: + final userA = userMap[productA.assignedUserId] ?? UserEntity(); + final userB = userMap[productB.assignedUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.createdBy: + final userA = userMap[productA.createdUserId] ?? UserEntity(); + final userB = userMap[productB.createdUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.state: + final stateA = EntityState.valueOf(productA.entityState) ?? EntityState.active; + final stateB = EntityState.valueOf(productB.entityState) ?? EntityState.active; + response = stateA.name.toLowerCase() + .compareTo(stateB.name.toLowerCase()); + break; case ProductFields.customValue1: response = productA.customValue1 .toLowerCase() diff --git a/lib/redux/product/product_selectors.dart b/lib/redux/product/product_selectors.dart index 41c633644..efb8a7b10 100644 --- a/lib/redux/product/product_selectors.dart +++ b/lib/redux/product/product_selectors.dart @@ -29,20 +29,23 @@ InvoiceItemEntity convertProductToInvoiceItem({ } } -var memoizedDropdownProductList = memo2( - (BuiltMap productMap, - BuiltList productList) => - dropdownProductsSelector(productMap, productList)); +var memoizedDropdownProductList = memo3( + (BuiltMap productMap, BuiltList productList, + BuiltMap userMap) => + dropdownProductsSelector(productMap, productList, userMap)); List dropdownProductsSelector( - BuiltMap productMap, BuiltList productList) { + BuiltMap productMap, + BuiltList productList, + BuiltMap userMap) { final list = productList.where((productId) => productMap[productId].isActive).toList(); list.sort((productAId, productBId) { final productA = productMap[productAId]; final productB = productMap[productBId]; - return productA.compareTo(productB, ProductFields.productKey, true); + return productA.compareTo( + productB, ProductFields.productKey, true, userMap); }); return list; @@ -63,15 +66,19 @@ List productList(BuiltMap productMap) { return list; } -var memoizedFilteredProductList = memo3( - (BuiltMap productMap, BuiltList productList, - ListUIState productListState) => - filteredProductsSelector(productMap, productList, productListState)); +var memoizedFilteredProductList = memo4( + (BuiltMap productMap, + BuiltList productList, + ListUIState productListState, + BuiltMap userMap) => + filteredProductsSelector( + productMap, productList, productListState, userMap)); List filteredProductsSelector( BuiltMap productMap, BuiltList productList, - ListUIState productListState) { + ListUIState productListState, + BuiltMap userMap) { final list = productList.where((productId) { final product = productMap[productId]; if (!product.matchesStates(productListState.stateFilters)) { @@ -94,8 +101,8 @@ List filteredProductsSelector( list.sort((productAId, productBId) { final productA = productMap[productAId]; final productB = productMap[productBId]; - return productA.compareTo( - productB, productListState.sortField, productListState.sortAscending); + return productA.compareTo(productB, productListState.sortField, + productListState.sortAscending, userMap); }); return list; diff --git a/lib/ui/invoice/edit/invoice_edit_items_desktop.dart b/lib/ui/invoice/edit/invoice_edit_items_desktop.dart index f4914beb7..535b21dbc 100644 --- a/lib/ui/invoice/edit/invoice_edit_items_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_items_desktop.dart @@ -68,8 +68,8 @@ class _InvoiceEditItemsDesktopState extends State { final invoice = viewModel.invoice; final lineItems = invoice.lineItems.toList(); final productState = state.productState; - final productIds = - memoizedDropdownProductList(productState.map, productState.list); + final productIds = memoizedDropdownProductList( + productState.map, productState.list, state.userState.map); if (lineItems.where((item) => item.isEmpty).isEmpty) { lineItems.add(InvoiceItemEntity()); @@ -150,7 +150,7 @@ class _InvoiceEditItemsDesktopState extends State { return productIds .where((productId) => productState.map[productId] .matchesFilter(pattern)) - .toList(); + .toList(); */ }, itemBuilder: (context, productId) { diff --git a/lib/ui/product/product_list_vm.dart b/lib/ui/product/product_list_vm.dart index 7064ce27c..7765abde2 100644 --- a/lib/ui/product/product_list_vm.dart +++ b/lib/ui/product/product_list_vm.dart @@ -110,7 +110,7 @@ class ProductListVM { return ProductListVM( state: state, productList: memoizedFilteredProductList(state.productState.map, - state.productState.list, state.productListState), + state.productState.list, state.productListState, state.userState.map), productMap: state.productState.map, isLoading: state.isLoading, isLoaded: state.productState.isLoaded, diff --git a/lib/ui/product/product_screen_vm.dart b/lib/ui/product/product_screen_vm.dart index ac715f628..1d84c2938 100644 --- a/lib/ui/product/product_screen_vm.dart +++ b/lib/ui/product/product_screen_vm.dart @@ -45,7 +45,7 @@ class ProductScreenVM { return ProductScreenVM( productMap: state.productState.map, productList: memoizedFilteredProductList(state.productState.map, - state.productState.list, state.productListState), + state.productState.list, state.productListState, state.userState.map), userCompany: state.userCompany, isInMultiselect: state.productListState.isInMultiselect(), ); From 677c5e1d1526bf35b1af9767443617c9a7358116 Mon Sep 17 00:00:00 2001 From: Gianfranco Gasbarri Date: Thu, 25 Jun 2020 23:59:57 +0100 Subject: [PATCH 3/5] Completed Sort Fields for Invoice model --- lib/data/models/invoice_model.dart | 56 ++++++++++++++++++- lib/redux/credit/credit_selectors.dart | 55 +++++++++++-------- lib/redux/invoice/invoice_selectors.dart | 68 ++++++++++++++---------- lib/redux/quote/quote_selectors.dart | 25 +++++---- lib/ui/credit/credit_list_vm.dart | 9 +++- lib/ui/credit/credit_screen_vm.dart | 9 +++- lib/ui/invoice/invoice_list_vm.dart | 13 ++--- lib/ui/invoice/invoice_screen_vm.dart | 13 ++--- lib/ui/payment/edit/payment_edit.dart | 8 ++- lib/ui/quote/quote_list_vm.dart | 9 +++- lib/ui/quote/quote_screen_vm.dart | 9 +++- 11 files changed, 192 insertions(+), 82 deletions(-) diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index ed8cf1098..45fa70cd4 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/data/models/mixins/invoice_mixin.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/quote_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; part 'invoice_model.g.dart'; @@ -376,7 +377,9 @@ abstract class InvoiceEntity extends Object {InvoiceEntity invoice, String sortField, bool sortAscending, - BuiltMap clientMap}) { + BuiltMap clientMap, + StaticState staticState, + BuiltMap userMap}) { int response = 0; final InvoiceEntity invoiceA = sortAscending ? this : invoice; final InvoiceEntity invoiceB = sortAscending ? invoice : this; @@ -394,9 +397,15 @@ abstract class InvoiceEntity extends Object case CreditFields.amount: response = invoiceA.amount.compareTo(invoiceB.amount); break; + case EntityFields.createdAt: + response = invoiceA.createdAt.compareTo(invoiceB.createdAt); + break; case EntityFields.updatedAt: response = invoiceA.updatedAt.compareTo(invoiceB.updatedAt); break; + case EntityFields.archivedAt: + response = invoiceA.archivedAt.compareTo(invoiceB.archivedAt); + break; case InvoiceFields.invoiceDate: case QuoteFields.date: case CreditFields.date: @@ -405,13 +414,58 @@ abstract class InvoiceEntity extends Object case InvoiceFields.balance: response = invoiceA.balance.compareTo(invoiceB.balance); break; + case InvoiceFields.discount: + response = invoiceA.discount.compareTo(invoiceB.discount); + break; + case InvoiceFields.documents: + response = invoiceA.documents.length.compareTo(invoiceB.documents.length); + break; + case InvoiceFields.poNumber: + response = invoiceA.poNumber.compareTo(invoiceB.poNumber); + break; case InvoiceFields.statusId: response = invoiceA.statusId.compareTo(invoiceB.statusId); break; + case InvoiceFields.status: + response = (staticState.invoiceStatusMap[invoiceA.statusId]?.name ?? '') + .toLowerCase() + .compareTo( + staticState.invoiceStatusMap[invoiceB.statusId]?.name ?? ''); + break; + case EntityFields.state: + final stateA = EntityState.valueOf(invoiceA.entityState) ?? EntityState.active; + final stateB = EntityState.valueOf(invoiceB.entityState) ?? EntityState.active; + response = stateA.name.toLowerCase() + .compareTo(stateB.name.toLowerCase()); + break; case InvoiceFields.dueDate: case QuoteFields.validUntil: response = invoiceA.dueDate.compareTo(invoiceB.dueDate); break; + case EntityFields.assignedTo: + final userA = userMap[invoiceA.assignedUserId] ?? UserEntity(); + final userB = userMap[invoiceB.assignedUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.createdBy: + final userA = userMap[invoiceA.createdUserId] ?? UserEntity(); + final userB = userMap[invoiceB.createdUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case InvoiceFields.publicNotes: + response = invoiceA.publicNotes + .toLowerCase() + .compareTo(invoiceB.publicNotes.toLowerCase()); + break; + case InvoiceFields.privateNotes: + response = invoiceA.privateNotes + .toLowerCase() + .compareTo(invoiceB.privateNotes.toLowerCase()); + break; case InvoiceFields.customValue1: response = invoiceA.customValue1 .toLowerCase() diff --git a/lib/redux/credit/credit_selectors.dart b/lib/redux/credit/credit_selectors.dart index 7e471acc5..3bd7b575a 100644 --- a/lib/redux/credit/credit_selectors.dart +++ b/lib/redux/credit/credit_selectors.dart @@ -1,20 +1,26 @@ +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -var memoizedDropdownCreditList = memo4( +var memoizedDropdownCreditList = memo6( (BuiltMap creditMap, BuiltMap clientMap, BuiltList creditList, - String clientId) => - dropdownCreditSelector(creditMap, clientMap, creditList, clientId)); + String clientId, + StaticState staticState, + BuiltMap userMap) => + dropdownCreditSelector( + creditMap, clientMap, creditList, clientId, staticState, userMap)); List dropdownCreditSelector( BuiltMap creditMap, BuiltMap clientMap, BuiltList creditList, - String clientId) { + String clientId, + StaticState staticState, + BuiltMap userMap) { final list = creditList.where((creditId) { final credit = creditMap[creditId]; if (clientId != null && @@ -33,11 +39,12 @@ List dropdownCreditSelector( final creditA = creditMap[creditAId]; final creditB = creditMap[creditBId]; return creditA.compareTo( - invoice: creditB, - clientMap: clientMap, - sortAscending: true, - sortField: ClientFields.name, - ); + invoice: creditB, + clientMap: clientMap, + sortAscending: true, + sortField: ClientFields.name, + staticState: staticState, + userMap: userMap); }); return list; @@ -48,18 +55,23 @@ ClientEntity creditClientSelector( return clientMap[credit.clientId]; } -var memoizedFilteredCreditList = memo4((BuiltMap - creditMap, - BuiltList creditList, - BuiltMap clientMap, - ListUIState creditListState) => - filteredCreditsSelector(creditMap, creditList, clientMap, creditListState)); +var memoizedFilteredCreditList = memo6( + (BuiltMap creditMap, + BuiltList creditList, + BuiltMap clientMap, + ListUIState creditListState, + StaticState staticState, + BuiltMap userMap) => + filteredCreditsSelector(creditMap, creditList, clientMap, + creditListState, staticState, userMap)); List filteredCreditsSelector( BuiltMap creditMap, BuiltList creditList, BuiltMap clientMap, - ListUIState creditListState) { + ListUIState creditListState, + StaticState staticState, + BuiltMap userMap) { final list = creditList.where((creditId) { final credit = creditMap[creditId]; final client = @@ -102,11 +114,12 @@ List filteredCreditsSelector( list.sort((creditAId, creditBId) { return creditMap[creditAId].compareTo( - invoice: creditMap[creditBId], - sortField: creditListState.sortField, - sortAscending: creditListState.sortAscending, - clientMap: clientMap, - ); + invoice: creditMap[creditBId], + sortField: creditListState.sortField, + sortAscending: creditListState.sortAscending, + clientMap: clientMap, + staticState: staticState, + userMap: userMap); }); return list; diff --git a/lib/redux/invoice/invoice_selectors.dart b/lib/redux/invoice/invoice_selectors.dart index fc154b575..89d0c270e 100644 --- a/lib/redux/invoice/invoice_selectors.dart +++ b/lib/redux/invoice/invoice_selectors.dart @@ -1,20 +1,26 @@ +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -var memoizedDropdownInvoiceList = memo4( +var memoizedDropdownInvoiceList = memo6( (BuiltMap invoiceMap, BuiltMap clientMap, BuiltList invoiceList, - String clientId) => - dropdownInvoiceSelector(invoiceMap, clientMap, invoiceList, clientId)); + String clientId, + StaticState staticState, + BuiltMap userMap) => + dropdownInvoiceSelector(invoiceMap, clientMap, invoiceList, clientId, + staticState, userMap)); List dropdownInvoiceSelector( BuiltMap invoiceMap, BuiltMap clientMap, BuiltList invoiceList, - String clientId) { + String clientId, + StaticState staticState, + BuiltMap userMap) { final list = invoiceList.where((invoiceId) { final invoice = invoiceMap[invoiceId]; if (clientId != null && @@ -33,33 +39,36 @@ List dropdownInvoiceSelector( final invoiceA = invoiceMap[invoiceAId]; final invoiceB = invoiceMap[invoiceBId]; return invoiceA.compareTo( - invoice: invoiceB, - clientMap: clientMap, - sortAscending: false, - sortField: InvoiceFields.invoiceNumber, - ); + invoice: invoiceB, + clientMap: clientMap, + sortAscending: false, + sortField: InvoiceFields.invoiceNumber, + staticState: staticState, + userMap: userMap); }); return list; } -var memoizedFilteredInvoiceList = memo5(( - BuiltMap invoiceMap, - BuiltList invoiceList, - BuiltMap clientMap, - BuiltMap paymentMap, - ListUIState invoiceListState, -) => - filteredInvoicesSelector( - invoiceMap, invoiceList, clientMap, paymentMap, invoiceListState)); +var memoizedFilteredInvoiceList = memo7( + (BuiltMap invoiceMap, + BuiltList invoiceList, + BuiltMap clientMap, + BuiltMap paymentMap, + ListUIState invoiceListState, + StaticState staticState, + BuiltMap userMap) => + filteredInvoicesSelector(invoiceMap, invoiceList, clientMap, paymentMap, + invoiceListState, staticState, userMap)); List filteredInvoicesSelector( - BuiltMap invoiceMap, - BuiltList invoiceList, - BuiltMap clientMap, - BuiltMap paymentMap, - ListUIState invoiceListState, -) { + BuiltMap invoiceMap, + BuiltList invoiceList, + BuiltMap clientMap, + BuiltMap paymentMap, + ListUIState invoiceListState, + StaticState staticState, + BuiltMap userMap) { final Map> invoicePaymentMap = {}; if (invoiceListState.filterEntityType == EntityType.payment) { @@ -126,11 +135,12 @@ List filteredInvoicesSelector( list.sort((invoiceAId, invoiceBId) { return invoiceMap[invoiceAId].compareTo( - invoice: invoiceMap[invoiceBId], - sortField: invoiceListState.sortField, - sortAscending: invoiceListState.sortAscending, - clientMap: clientMap, - ); + invoice: invoiceMap[invoiceBId], + sortField: invoiceListState.sortField, + sortAscending: invoiceListState.sortAscending, + clientMap: clientMap, + staticState: staticState, + userMap: userMap); }); return list; diff --git a/lib/redux/quote/quote_selectors.dart b/lib/redux/quote/quote_selectors.dart index e0e27965d..ae0268403 100644 --- a/lib/redux/quote/quote_selectors.dart +++ b/lib/redux/quote/quote_selectors.dart @@ -1,3 +1,4 @@ +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -8,17 +9,22 @@ ClientEntity quoteClientSelector( return clientMap[quote.clientId]; } -var memoizedFilteredQuoteList = memo4((BuiltMap quoteMap, +var memoizedFilteredQuoteList = memo6((BuiltMap quoteMap, BuiltList quoteList, BuiltMap clientMap, - ListUIState quoteListState) => - filteredQuotesSelector(quoteMap, quoteList, clientMap, quoteListState)); + ListUIState quoteListState, + StaticState staticState, + BuiltMap userMap) => + filteredQuotesSelector( + quoteMap, quoteList, clientMap, quoteListState, staticState, userMap)); List filteredQuotesSelector( BuiltMap quoteMap, BuiltList quoteList, BuiltMap clientMap, - ListUIState quoteListState) { + ListUIState quoteListState, + StaticState staticState, + BuiltMap userMap) { final list = quoteList.where((quoteId) { final quote = quoteMap[quoteId]; final client = @@ -61,11 +67,12 @@ List filteredQuotesSelector( list.sort((quoteAId, quoteBId) { return quoteMap[quoteAId].compareTo( - invoice: quoteMap[quoteBId], - sortField: quoteListState.sortField, - sortAscending: quoteListState.sortAscending, - clientMap: clientMap, - ); + invoice: quoteMap[quoteBId], + sortField: quoteListState.sortField, + sortAscending: quoteListState.sortAscending, + clientMap: clientMap, + staticState: staticState, + userMap: userMap); }); return list; diff --git a/lib/ui/credit/credit_list_vm.dart b/lib/ui/credit/credit_list_vm.dart index 9bd414997..c77a7819e 100644 --- a/lib/ui/credit/credit_list_vm.dart +++ b/lib/ui/credit/credit_list_vm.dart @@ -145,8 +145,13 @@ class CreditListVM extends EntityListVM { state: state, user: state.user, listState: state.creditListState, - invoiceList: memoizedFilteredCreditList(state.creditState.map, - state.creditState.list, state.clientState.map, state.creditListState), + invoiceList: memoizedFilteredCreditList( + state.creditState.map, + state.creditState.list, + state.clientState.map, + state.creditListState, + state.staticState, + state.userState.map), invoiceMap: state.creditState.map, clientMap: state.clientState.map, isLoading: state.isLoading, diff --git a/lib/ui/credit/credit_screen_vm.dart b/lib/ui/credit/credit_screen_vm.dart index 6618173c5..af2fd502d 100644 --- a/lib/ui/credit/credit_screen_vm.dart +++ b/lib/ui/credit/credit_screen_vm.dart @@ -47,8 +47,13 @@ class CreditScreenVM { return CreditScreenVM( creditMap: state.creditState.map, - creditList: memoizedFilteredCreditList(state.creditState.map, - state.creditState.list, state.clientState.map, state.creditListState), + creditList: memoizedFilteredCreditList( + state.creditState.map, + state.creditState.list, + state.clientState.map, + state.creditListState, + state.staticState, + state.userState.map), userCompany: state.userCompany, isInMultiselect: state.creditListState.isInMultiselect(), onEntityAction: (BuildContext context, List credits, diff --git a/lib/ui/invoice/invoice_list_vm.dart b/lib/ui/invoice/invoice_list_vm.dart index f46972928..da6259fe0 100644 --- a/lib/ui/invoice/invoice_list_vm.dart +++ b/lib/ui/invoice/invoice_list_vm.dart @@ -182,12 +182,13 @@ class InvoiceListVM extends EntityListVM { user: state.user, listState: state.invoiceListState, invoiceList: memoizedFilteredInvoiceList( - state.invoiceState.map, - state.invoiceState.list, - state.clientState.map, - state.paymentState.map, - state.invoiceListState, - ), + state.invoiceState.map, + state.invoiceState.list, + state.clientState.map, + state.paymentState.map, + state.invoiceListState, + state.staticState, + state.userState.map), invoiceMap: state.invoiceState.map, clientMap: state.clientState.map, isLoading: state.isLoading, diff --git a/lib/ui/invoice/invoice_screen_vm.dart b/lib/ui/invoice/invoice_screen_vm.dart index 7f74b3083..9d895d995 100644 --- a/lib/ui/invoice/invoice_screen_vm.dart +++ b/lib/ui/invoice/invoice_screen_vm.dart @@ -45,12 +45,13 @@ class InvoiceScreenVM { return InvoiceScreenVM( invoiceMap: state.invoiceState.map, invoiceList: memoizedFilteredInvoiceList( - state.invoiceState.map, - state.invoiceState.list, - state.clientState.map, - state.paymentState.map, - state.invoiceListState, - ), + state.invoiceState.map, + state.invoiceState.list, + state.clientState.map, + state.paymentState.map, + state.invoiceListState, + state.staticState, + state.userState.map), userCompany: state.userCompany, isInMultiselect: state.invoiceListState.isInMultiselect(), ); diff --git a/lib/ui/payment/edit/payment_edit.dart b/lib/ui/payment/edit/payment_edit.dart index 28884892e..44c9b0b7a 100644 --- a/lib/ui/payment/edit/payment_edit.dart +++ b/lib/ui/payment/edit/payment_edit.dart @@ -359,7 +359,9 @@ class _PaymentableEditorState extends State { state.invoiceState.map, state.clientState.map, state.invoiceState.list, - payment.clientId), + payment.clientId, + state.staticState, + state.userState.map), onSelected: (selected) { final invoice = selected as InvoiceEntity; _amountController.text = formatNumber(invoice.balance, context, @@ -380,7 +382,9 @@ class _PaymentableEditorState extends State { state.creditState.map, state.clientState.map, state.creditState.list, - payment.clientId), + payment.clientId, + state.staticState, + state.userState.map), onSelected: (selected) { final credit = selected as InvoiceEntity; _amountController.text = formatNumber(credit.balance, context, diff --git a/lib/ui/quote/quote_list_vm.dart b/lib/ui/quote/quote_list_vm.dart index ad4cc6f5d..b9c9e856a 100644 --- a/lib/ui/quote/quote_list_vm.dart +++ b/lib/ui/quote/quote_list_vm.dart @@ -144,8 +144,13 @@ class QuoteListVM extends EntityListVM { state: state, user: state.user, listState: state.quoteListState, - invoiceList: memoizedFilteredQuoteList(state.quoteState.map, - state.quoteState.list, state.clientState.map, state.quoteListState), + invoiceList: memoizedFilteredQuoteList( + state.quoteState.map, + state.quoteState.list, + state.clientState.map, + state.quoteListState, + state.staticState, + state.userState.map), invoiceMap: state.quoteState.map, clientMap: state.clientState.map, isLoading: state.isLoading, diff --git a/lib/ui/quote/quote_screen_vm.dart b/lib/ui/quote/quote_screen_vm.dart index 75e8d69c9..90cb1e9fe 100644 --- a/lib/ui/quote/quote_screen_vm.dart +++ b/lib/ui/quote/quote_screen_vm.dart @@ -44,8 +44,13 @@ class QuoteScreenVM { return QuoteScreenVM( quoteMap: state.quoteState.map, - quoteList: memoizedFilteredQuoteList(state.quoteState.map, - state.quoteState.list, state.clientState.map, state.quoteListState), + quoteList: memoizedFilteredQuoteList( + state.quoteState.map, + state.quoteState.list, + state.clientState.map, + state.quoteListState, + state.staticState, + state.userState.map), userCompany: state.userCompany, isInMultiselect: state.quoteListState.isInMultiselect(), ); From af46cc3236a6d9a50f47a972559533104e4dda5e Mon Sep 17 00:00:00 2001 From: Gianfranco Gasbarri Date: Mon, 29 Jun 2020 22:44:06 +0100 Subject: [PATCH 4/5] Changed Client model to use Static State --- lib/data/models/client_model.dart | 17 ++++--- lib/redux/client/client_selectors.dart | 44 ++++++------------- lib/ui/app/forms/client_picker.dart | 9 +--- lib/ui/client/client_list_vm.dart | 4 +- lib/ui/client/client_screen_vm.dart | 4 +- lib/ui/expense/edit/expense_edit_details.dart | 4 +- lib/ui/payment/edit/payment_edit.dart | 4 +- lib/ui/project/edit/project_edit.dart | 4 +- lib/ui/task/edit/task_edit_details.dart | 4 +- 9 files changed, 30 insertions(+), 64 deletions(-) diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index 8890c00b0..d9deb9b64 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/data/models/gateway_token_model.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; part 'client_model.g.dart'; @@ -328,9 +329,7 @@ abstract class ClientEntity extends Object String sortField, bool sortAscending, BuiltMap userMap, - BuiltMap countryMap, - BuiltMap languageMap, - BuiltMap currencyMap) { + StaticState staticState) { int response = 0; final ClientEntity clientA = sortAscending ? this : client; final ClientEntity clientB = sortAscending ? client : this; @@ -415,14 +414,14 @@ abstract class ClientEntity extends Object .compareTo(userB.listDisplayName.toLowerCase()); break; case ClientFields.country: - final countryA = countryMap[clientA.countryId] ?? CountryEntity(); - final countryB = countryMap[clientB.countryId] ?? CountryEntity(); + final countryA = staticState.countryMap[clientA.countryId] ?? CountryEntity(); + final countryB = staticState.countryMap[clientB.countryId] ?? CountryEntity(); response = countryA.name.toLowerCase() .compareTo(countryB.name.toLowerCase()); break; case ClientFields.currency: - final currencyA = currencyMap[clientA.currencyId] ?? CurrencyEntity(); - final currencyB = currencyMap[clientB.currencyId] ?? CurrencyEntity(); + final currencyA = staticState.currencyMap[clientA.currencyId] ?? CurrencyEntity(); + final currencyB = staticState.currencyMap[clientB.currencyId] ?? CurrencyEntity(); response = currencyA.name.toLowerCase() .compareTo(currencyB.name.toLowerCase()); break; @@ -434,8 +433,8 @@ abstract class ClientEntity extends Object .compareTo(stateB.name.toLowerCase()); break; case ClientFields.language: - final languageA = languageMap[clientA.languageId] ?? LanguageEntity(); - final languageB = languageMap[clientB.languageId] ?? LanguageEntity(); + final languageA = staticState.languageMap[clientA.languageId] ?? LanguageEntity(); + final languageB = staticState.languageMap[clientB.languageId] ?? LanguageEntity(); response = languageA.name.toLowerCase() .compareTo(languageB.name.toLowerCase()); break; diff --git a/lib/redux/client/client_selectors.dart b/lib/redux/client/client_selectors.dart index 7137551ea..11f905e18 100644 --- a/lib/redux/client/client_selectors.dart +++ b/lib/redux/client/client_selectors.dart @@ -1,50 +1,42 @@ import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -var memoizedDropdownClientList = memo6( - (BuiltMap clientMap, - BuiltList clientList, - BuiltMap userMap, - BuiltMap countryMap, - BuiltMap languageMap, - BuiltMap currencyMap) => - dropdownClientsSelector(clientMap, clientList, userMap, countryMap, - languageMap, currencyMap)); +var memoizedDropdownClientList = memo4( + (BuiltMap clientMap, BuiltList clientList, + BuiltMap userMap, StaticState staticState) => + dropdownClientsSelector(clientMap, clientList, userMap, staticState)); List dropdownClientsSelector( BuiltMap clientMap, BuiltList clientList, BuiltMap userMap, - BuiltMap countryMap, - BuiltMap languageMap, - BuiltMap currencyMap) { + StaticState staticState) { final list = clientList.where((clientId) => clientMap[clientId].isActive).toList(); list.sort((clientAId, clientBId) { final clientA = clientMap[clientAId]; final clientB = clientMap[clientBId]; - return clientA.compareTo(clientB, ClientFields.name, true, userMap, - countryMap, languageMap, currencyMap); + return clientA.compareTo( + clientB, ClientFields.name, true, userMap, staticState); }); return list; } -var memoizedFilteredClientList = memo8( +var memoizedFilteredClientList = memo6( (BuiltMap clientMap, BuiltList clientList, BuiltMap groupMap, ListUIState clientListState, BuiltMap userMap, - BuiltMap countryMap, - BuiltMap languageMap, - BuiltMap currencyMap) => + StaticState staticState) => filteredClientsSelector(clientMap, clientList, groupMap, - clientListState, userMap, countryMap, languageMap, currencyMap)); + clientListState, userMap, staticState)); List filteredClientsSelector( BuiltMap clientMap, @@ -52,9 +44,7 @@ List filteredClientsSelector( BuiltMap groupMap, ListUIState clientListState, BuiltMap userMap, - BuiltMap countryMap, - BuiltMap languageMap, - BuiltMap currencyMap) { + StaticState staticState) { final list = clientList.where((clientId) { final client = clientMap[clientId]; final group = groupMap[client.groupId] ?? GroupEntity(id: client.groupId); @@ -99,14 +89,8 @@ List filteredClientsSelector( list.sort((clientAId, clientBId) { final clientA = clientMap[clientAId]; final clientB = clientMap[clientBId]; - return clientA.compareTo( - clientB, - clientListState.sortField, - clientListState.sortAscending, - userMap, - countryMap, - languageMap, - currencyMap); + return clientA.compareTo(clientB, clientListState.sortField, + clientListState.sortAscending, userMap, staticState); }); return list; diff --git a/lib/ui/app/forms/client_picker.dart b/lib/ui/app/forms/client_picker.dart index 79d863aec..510a5c968 100644 --- a/lib/ui/app/forms/client_picker.dart +++ b/lib/ui/app/forms/client_picker.dart @@ -36,13 +36,8 @@ class ClientPicker extends StatelessWidget { labelText: localization.client, entityId: clientId, autofocus: autofocus, - entityList: memoizedDropdownClientList( - clientState.map, - clientState.list, - state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + entityList: memoizedDropdownClientList(clientState.map, clientState.list, + state.userState.map, state.staticState), entityMap: clientState.map, validator: (String val) => val.trim().isEmpty ? AppLocalization.of(context).pleaseSelectAClient diff --git a/lib/ui/client/client_list_vm.dart b/lib/ui/client/client_list_vm.dart index 4874f4900..373f120ae 100644 --- a/lib/ui/client/client_list_vm.dart +++ b/lib/ui/client/client_list_vm.dart @@ -134,9 +134,7 @@ class ClientListVM { state.groupState.map, state.clientListState, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), clientMap: state.clientState.map, isLoading: state.isLoading, isLoaded: state.clientState.isLoaded, diff --git a/lib/ui/client/client_screen_vm.dart b/lib/ui/client/client_screen_vm.dart index d1745f646..0956a6357 100644 --- a/lib/ui/client/client_screen_vm.dart +++ b/lib/ui/client/client_screen_vm.dart @@ -50,9 +50,7 @@ class ClientScreenVM { state.groupState.map, state.clientListState, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), userCompany: state.userCompany, isInMultiselect: state.clientListState.isInMultiselect(), ); diff --git a/lib/ui/expense/edit/expense_edit_details.dart b/lib/ui/expense/edit/expense_edit_details.dart index 3e6d47f98..18f47dc09 100644 --- a/lib/ui/expense/edit/expense_edit_details.dart +++ b/lib/ui/expense/edit/expense_edit_details.dart @@ -128,9 +128,7 @@ class ExpenseEditDetailsState extends State { clientState.map, clientState.list, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), onSelected: (client) { final currencyId = (client as ClientEntity)?.settings?.currencyId ?? diff --git a/lib/ui/payment/edit/payment_edit.dart b/lib/ui/payment/edit/payment_edit.dart index 44c9b0b7a..cb494f50d 100644 --- a/lib/ui/payment/edit/payment_edit.dart +++ b/lib/ui/payment/edit/payment_edit.dart @@ -152,9 +152,7 @@ class _PaymentEditState extends State { state.clientState.map, state.clientState.list, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), ), if (payment.isForInvoice != true) DecoratedFormField( diff --git a/lib/ui/project/edit/project_edit.dart b/lib/ui/project/edit/project_edit.dart index 7db748a19..dc3496220 100644 --- a/lib/ui/project/edit/project_edit.dart +++ b/lib/ui/project/edit/project_edit.dart @@ -140,9 +140,7 @@ class _ProjectEditState extends State { state.clientState.map, state.clientState.list, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), validator: (String val) => val.trim().isEmpty ? localization.pleaseSelectAClient : null, diff --git a/lib/ui/task/edit/task_edit_details.dart b/lib/ui/task/edit/task_edit_details.dart index f740ff475..20a9ab033 100644 --- a/lib/ui/task/edit/task_edit_details.dart +++ b/lib/ui/task/edit/task_edit_details.dart @@ -96,9 +96,7 @@ class _TaskEditDetailsState extends State { state.clientState.map, state.clientState.list, state.userState.map, - state.staticState.countryMap, - state.staticState.languageMap, - state.staticState.currencyMap), + state.staticState), onSelected: (client) { viewModel.onChanged(task.rebuild((b) => b ..clientId = client?.id From 661aa2adc55e7db07044b3827122bf33d9ee96b9 Mon Sep 17 00:00:00 2001 From: Gianfranco Gasbarri Date: Mon, 29 Jun 2020 23:18:49 +0100 Subject: [PATCH 5/5] Completed Sort Fields for Payment model & removed duplicated field --- lib/data/models/payment_model.dart | 41 +++++++++++++++++++- lib/redux/payment/payment_selectors.dart | 48 +++++++++++++----------- lib/ui/payment/payment_list_vm.dart | 1 + lib/ui/payment/payment_presenter.dart | 1 - lib/ui/payment/payment_screen_vm.dart | 1 + 5 files changed, 68 insertions(+), 24 deletions(-) diff --git a/lib/data/models/payment_model.dart b/lib/data/models/payment_model.dart index 92ac15489..a396cf57f 100644 --- a/lib/data/models/payment_model.dart +++ b/lib/data/models/payment_model.dart @@ -57,7 +57,6 @@ class PaymentFields { static const String privateNotes = 'private_notes'; static const String exchangeRate = 'exchange_rate'; static const String exchangeCurrencyId = 'exchange_currency_id'; - static const String paymentStatusId = 'payment_status_id'; static const String paymentStatus = 'payment_status'; static const String customValue1 = 'custom1'; static const String customValue2 = 'custom2'; @@ -187,7 +186,8 @@ abstract class PaymentEntity extends Object String sortField, bool sortAscending, BuiltMap invoiceMap, - BuiltMap clientMap}) { + BuiltMap clientMap, + BuiltMap userMap}) { int response = 0; final PaymentEntity paymentA = sortAscending ? this : payment; final PaymentEntity paymentB = sortAscending ? payment : this; @@ -196,6 +196,12 @@ abstract class PaymentEntity extends Object case PaymentFields.amount: response = paymentA.amount.compareTo(paymentB.amount); break; + case PaymentFields.exchangeRate: + response = paymentA.exchangeRate.compareTo(paymentB.exchangeRate); + break; + case PaymentFields.refunded: + response = paymentA.refunded.compareTo(paymentB.refunded); + break; case PaymentFields.paymentNumber: response = paymentA.number .toLowerCase() @@ -208,9 +214,20 @@ abstract class PaymentEntity extends Object case PaymentFields.paymentDate: response = paymentA.date.compareTo(paymentB.date); break; + case PaymentFields.privateNotes: + response = paymentA.privateNotes + .toLowerCase() + .compareTo(paymentB.date.toLowerCase()); + break; case EntityFields.updatedAt: response = paymentA.updatedAt.compareTo(paymentB.updatedAt); break; + case EntityFields.createdAt: + response = paymentA.createdAt.compareTo(paymentB.createdAt); + break; + case EntityFields.archivedAt: + response = paymentA.archivedAt.compareTo(paymentB.archivedAt); + break; case PaymentFields.paymentStatus: response = paymentA.statusId.compareTo(paymentB.statusId); break; @@ -248,6 +265,26 @@ abstract class PaymentEntity extends Object .toLowerCase() .compareTo(clientB.displayName.toLowerCase()); break; + case EntityFields.assignedTo: + final userA = userMap[paymentA.assignedUserId] ?? UserEntity(); + final userB = userMap[paymentB.assignedUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.createdBy: + final userA = userMap[paymentA.createdUserId] ?? UserEntity(); + final userB = userMap[paymentB.createdUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.state: + final stateA = EntityState.valueOf(paymentA.entityState) ?? EntityState.active; + final stateB = EntityState.valueOf(paymentB.entityState) ?? EntityState.active; + response = stateA.name.toLowerCase() + .compareTo(stateB.name.toLowerCase()); + break; default: print('## ERROR: sort by payment.$sortField is not implemented'); break; diff --git a/lib/redux/payment/payment_selectors.dart b/lib/redux/payment/payment_selectors.dart index a7d5d7d70..9e5f3cd87 100644 --- a/lib/redux/payment/payment_selectors.dart +++ b/lib/redux/payment/payment_selectors.dart @@ -18,18 +18,22 @@ List paymentsByInvoiceSelector(String invoiceId, .toList(); } -var memoizedDropdownPaymentList = memo4((BuiltMap - paymentMap, - BuiltList paymentList, - BuiltMap invoiceMap, - BuiltMap clientMap) => - dropdownPaymentsSelector(paymentMap, paymentList, invoiceMap, clientMap)); +var memoizedDropdownPaymentList = memo5(( + BuiltMap paymentMap, + BuiltList paymentList, + BuiltMap invoiceMap, + BuiltMap clientMap, + BuiltMap userMap, +) => + dropdownPaymentsSelector( + paymentMap, paymentList, invoiceMap, clientMap, userMap)); List dropdownPaymentsSelector( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, + BuiltMap userMap, ) { final list = paymentList.where((paymentId) => paymentMap[paymentId].isActive).toList(); @@ -39,31 +43,33 @@ List dropdownPaymentsSelector( final paymentB = paymentMap[paymentBId]; return paymentA.compareTo( - payment: paymentB, - sortAscending: true, - sortField: PaymentFields.paymentDate, - invoiceMap: invoiceMap, - clientMap: clientMap, - ); + payment: paymentB, + sortAscending: true, + sortField: PaymentFields.paymentDate, + invoiceMap: invoiceMap, + clientMap: clientMap, + userMap: userMap); }); return list; } -var memoizedFilteredPaymentList = memo5( +var memoizedFilteredPaymentList = memo6( (BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, + BuiltMap userMap, ListUIState paymentListState) => - filteredPaymentsSelector( - paymentMap, paymentList, invoiceMap, clientMap, paymentListState)); + filteredPaymentsSelector(paymentMap, paymentList, invoiceMap, clientMap, + userMap, paymentListState)); List filteredPaymentsSelector( BuiltMap paymentMap, BuiltList paymentList, BuiltMap invoiceMap, BuiltMap clientMap, + BuiltMap userMap, ListUIState paymentListState) { final list = paymentList.where((paymentId) { final payment = paymentMap[paymentId]; @@ -101,12 +107,12 @@ List filteredPaymentsSelector( final paymentA = paymentMap[paymentAId]; final paymentB = paymentMap[paymentBId]; return paymentA.compareTo( - payment: paymentB, - sortAscending: paymentListState.sortAscending, - sortField: paymentListState.sortField, - invoiceMap: invoiceMap, - clientMap: clientMap, - ); + payment: paymentB, + sortAscending: paymentListState.sortAscending, + sortField: paymentListState.sortField, + invoiceMap: invoiceMap, + clientMap: clientMap, + userMap: userMap); }); return list; diff --git a/lib/ui/payment/payment_list_vm.dart b/lib/ui/payment/payment_list_vm.dart index 39340b6c4..5ffc84913 100644 --- a/lib/ui/payment/payment_list_vm.dart +++ b/lib/ui/payment/payment_list_vm.dart @@ -125,6 +125,7 @@ class PaymentListVM { state.paymentState.list, state.invoiceState.map, state.clientState.map, + state.userState.map, state.paymentListState), paymentMap: state.paymentState.map, clientMap: state.clientState.map, diff --git a/lib/ui/payment/payment_presenter.dart b/lib/ui/payment/payment_presenter.dart index db9131b3d..ebcce815c 100644 --- a/lib/ui/payment/payment_presenter.dart +++ b/lib/ui/payment/payment_presenter.dart @@ -12,7 +12,6 @@ class PaymentPresenter extends EntityPresenter { PaymentFields.paymentNumber, PaymentFields.client, PaymentFields.amount, - PaymentFields.paymentStatus, PaymentFields.invoiceNumber, PaymentFields.paymentDate, PaymentFields.transactionReference, diff --git a/lib/ui/payment/payment_screen_vm.dart b/lib/ui/payment/payment_screen_vm.dart index 7e2840b48..5af961403 100644 --- a/lib/ui/payment/payment_screen_vm.dart +++ b/lib/ui/payment/payment_screen_vm.dart @@ -49,6 +49,7 @@ class PaymentScreenVM { state.paymentState.list, state.invoiceState.map, state.clientState.map, + state.userState.map, state.paymentListState), userCompany: state.userCompany, isInMultiselect: state.paymentListState.isInMultiselect(),