diff --git a/lib/redux/client/client_selectors.dart b/lib/redux/client/client_selectors.dart index 32abb5509..69b75682e 100644 --- a/lib/redux/client/client_selectors.dart +++ b/lib/redux/client/client_selectors.dart @@ -3,24 +3,14 @@ import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/redux/ui/list_ui_state.dart'; -var memoizedDropdownClientList = memo3(( - BuiltMap clientMap, - BuiltList clientList, - String filter) => dropdownClientsSelector(clientMap, clientList, filter) -); +var memoizedDropdownClientList = memo2( + (BuiltMap clientMap, BuiltList clientList) => + dropdownClientsSelector(clientMap, clientList)); List dropdownClientsSelector( - BuiltMap clientMap, - BuiltList clientList, - String filter) { - - final list = clientList.where((clientId) { - final client = clientMap[clientId]; - if (! client.isActive) { - return false; - } - return client.matchesSearch(filter); - }).toList(); + BuiltMap clientMap, BuiltList clientList) { + final list = + clientList.where((clientId) => clientMap[clientId].isActive).toList(); list.sort((clientAId, clientBId) { final clientA = clientMap[clientAId]; @@ -31,21 +21,15 @@ List dropdownClientsSelector( return list; } +var memoizedClientList = memo3((BuiltMap clientMap, + BuiltList clientList, ListUIState clientListState) => + visibleClientsSelector(clientMap, clientList, clientListState)); -var memoizedClientList = memo3(( - BuiltMap clientMap, - BuiltList clientList, - ListUIState clientListState) => visibleClientsSelector(clientMap, clientList, clientListState) -); - -List visibleClientsSelector( - BuiltMap clientMap, - BuiltList clientList, - ListUIState clientListState) { - +List visibleClientsSelector(BuiltMap clientMap, + BuiltList clientList, ListUIState clientListState) { final list = clientList.where((clientId) { final client = clientMap[clientId]; - if (! client.matchesStates(clientListState.stateFilters)) { + if (!client.matchesStates(clientListState.stateFilters)) { return false; } return client.matchesSearch(clientListState.search); @@ -54,8 +38,9 @@ List visibleClientsSelector( list.sort((clientAId, clientBId) { final clientA = clientMap[clientAId]; final clientB = clientMap[clientBId]; - return clientA.compareTo(clientB, clientListState.sortField, clientListState.sortAscending); + return clientA.compareTo( + clientB, clientListState.sortField, clientListState.sortAscending); }); return list; -} \ No newline at end of file +} diff --git a/lib/redux/static/static_selectors.dart b/lib/redux/static/static_selectors.dart new file mode 100644 index 000000000..32099f349 --- /dev/null +++ b/lib/redux/static/static_selectors.dart @@ -0,0 +1,16 @@ +import 'package:built_collection/built_collection.dart'; +import 'package:invoiceninja/data/models/static/country_model.dart'; +import 'package:memoize/memoize.dart'; + + +var memoizedCountryList = memo1((BuiltMap countryMap) => + countryList(countryMap)); + +List countryList(BuiltMap countryMap) { + final list = countryMap.keys.toList(); + + list.sort((idA, idB) => countryMap[idA].listDisplayName + .compareTo(countryMap[idB].listDisplayName)); + + return list; +} \ No newline at end of file diff --git a/lib/ui/app/entity_dropdown.dart b/lib/ui/app/entity_dropdown.dart index ddc0ce4e7..7b9fb8589 100644 --- a/lib/ui/app/entity_dropdown.dart +++ b/lib/ui/app/entity_dropdown.dart @@ -12,6 +12,7 @@ class EntityDropdown extends StatefulWidget { @required this.entityType, @required this.labelText, @required this.entityMap, + @required this.entityList, @required this.onSelected, this.validator, this.initialValue, @@ -19,6 +20,7 @@ class EntityDropdown extends StatefulWidget { final EntityType entityType; final BuiltMap entityMap; + final List entityList; final String labelText; final String initialValue; final Function(int) onSelected; @@ -49,6 +51,7 @@ class _EntityDropdownState extends State { builder: (BuildContext context) { return EntityDropdownDialog( entityMap: widget.entityMap, + entityList: widget.entityList, onSelected: (entityId) { _textController.text = widget.entityMap[entityId].listDisplayName; widget.onSelected(entityId); @@ -80,10 +83,12 @@ class _EntityDropdownState extends State { class EntityDropdownDialog extends StatefulWidget { EntityDropdownDialog({ @required this.entityMap, + @required this.entityList, @required this.onSelected, }); final BuiltMap entityMap; + final List entityList; final Function(int) onSelected; @override @@ -92,15 +97,6 @@ class EntityDropdownDialog extends StatefulWidget { class _EntityDropdownDialogState extends State { String _filter; - List _entityList; - - @override - void initState() { - super.initState(); - _entityList = widget.entityMap.keys.toList(); - _entityList.sort((idA, idB) => widget.entityMap[idA].listDisplayName - .compareTo(widget.entityMap[idB].listDisplayName)); - } @override Widget build(BuildContext context) { @@ -139,7 +135,7 @@ class _EntityDropdownDialogState extends State { } Widget _createList() { - final matches = _entityList + final matches = widget.entityList .where((entityId) => widget.entityMap[entityId].matchesSearch(_filter)) .toList(); diff --git a/lib/ui/client/edit/client_edit_billing_address.dart b/lib/ui/client/edit/client_edit_billing_address.dart index 3fd48383f..3dd2a104e 100644 --- a/lib/ui/client/edit/client_edit_billing_address.dart +++ b/lib/ui/client/edit/client_edit_billing_address.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja/ui/app/entity_dropdown.dart'; import 'package:invoiceninja/ui/app/form_card.dart'; import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja/utils/localization.dart'; +import 'package:invoiceninja/redux/static/static_selectors.dart'; class ClientEditBillingAddress extends StatefulWidget { ClientEditBillingAddress({ @@ -125,6 +126,7 @@ class ClientEditBillingAddressState extends State { EntityDropdown( entityType: EntityType.country, entityMap: viewModel.countryMap, + entityList: memoizedCountryList(viewModel.countryMap), labelText: localization.country, initialValue: viewModel.countryMap[client.countryId]?.name, onSelected: (int countryId) => viewModel diff --git a/lib/ui/client/edit/client_edit_shipping_address.dart b/lib/ui/client/edit/client_edit_shipping_address.dart index 1205e68ef..8d3ebb476 100644 --- a/lib/ui/client/edit/client_edit_shipping_address.dart +++ b/lib/ui/client/edit/client_edit_shipping_address.dart @@ -3,6 +3,7 @@ import 'package:invoiceninja/data/models/entities.dart'; import 'package:invoiceninja/ui/app/entity_dropdown.dart'; import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja/utils/localization.dart'; +import 'package:invoiceninja/redux/static/static_selectors.dart'; import '../../app/form_card.dart'; @@ -125,6 +126,7 @@ class ClientEditShippingAddressState extends State { EntityDropdown( entityType: EntityType.country, entityMap: viewModel.countryMap, + entityList: memoizedCountryList(viewModel.countryMap), labelText: localization.country, initialValue: viewModel.countryMap[client.shippingCountryId]?.name, onSelected: (int countryId) => viewModel diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index fc8b3d405..a5962e738 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -1,4 +1,5 @@ import 'package:invoiceninja/data/models/invoice_model.dart'; +import 'package:invoiceninja/redux/client/client_selectors.dart'; import 'package:invoiceninja/utils/formatting.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja/data/models/entities.dart'; @@ -100,6 +101,7 @@ class InvoiceEditDetailsState extends State with AutomaticKe initialValue: viewModel.clientMap[invoice.clientId]?.displayName, entityMap: viewModel.clientMap, + entityList: memoizedDropdownClientList(viewModel.clientMap, viewModel.clientList), validator: (String val) => val.trim().isEmpty ? AppLocalization.of(context).pleaseSelectAClient : null, diff --git a/lib/ui/invoice/edit/invoice_edit_details_vm.dart b/lib/ui/invoice/edit/invoice_edit_details_vm.dart index 7b804c3c6..8d5875c8c 100644 --- a/lib/ui/invoice/edit/invoice_edit_details_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_details_vm.dart @@ -33,12 +33,14 @@ class InvoiceEditDetailsVM { final InvoiceEntity invoice; final Function(InvoiceEntity) onChanged; final BuiltMap clientMap; + final BuiltList clientList; InvoiceEditDetailsVM({ @required this.state, @required this.invoice, @required this.onChanged, @required this.clientMap, + @required this.clientList, }); factory InvoiceEditDetailsVM.fromStore(Store store) { @@ -51,6 +53,7 @@ class InvoiceEditDetailsVM { onChanged: (InvoiceEntity invoice) => store.dispatch(UpdateInvoice(invoice)), clientMap: state.clientState.map, + clientList: state.clientState.list, ); } }