This commit is contained in:
unknown 2018-07-02 20:55:51 +03:00
parent 719184a097
commit 11abf6c373
7 changed files with 46 additions and 40 deletions

View File

@ -3,24 +3,14 @@ import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/data/models/models.dart';
import 'package:invoiceninja/redux/ui/list_ui_state.dart'; import 'package:invoiceninja/redux/ui/list_ui_state.dart';
var memoizedDropdownClientList = memo3(( var memoizedDropdownClientList = memo2(
BuiltMap<int, ClientEntity> clientMap, (BuiltMap<int, ClientEntity> clientMap, BuiltList<int> clientList) =>
BuiltList<int> clientList, dropdownClientsSelector(clientMap, clientList));
String filter) => dropdownClientsSelector(clientMap, clientList, filter)
);
List<int> dropdownClientsSelector( List<int> dropdownClientsSelector(
BuiltMap<int, ClientEntity> clientMap, BuiltMap<int, ClientEntity> clientMap, BuiltList<int> clientList) {
BuiltList<int> clientList, final list =
String filter) { clientList.where((clientId) => clientMap[clientId].isActive).toList();
final list = clientList.where((clientId) {
final client = clientMap[clientId];
if (! client.isActive) {
return false;
}
return client.matchesSearch(filter);
}).toList();
list.sort((clientAId, clientBId) { list.sort((clientAId, clientBId) {
final clientA = clientMap[clientAId]; final clientA = clientMap[clientAId];
@ -31,21 +21,15 @@ List<int> dropdownClientsSelector(
return list; return list;
} }
var memoizedClientList = memo3((BuiltMap<int, ClientEntity> clientMap,
BuiltList<int> clientList, ListUIState clientListState) =>
visibleClientsSelector(clientMap, clientList, clientListState));
var memoizedClientList = memo3(( List<int> visibleClientsSelector(BuiltMap<int, ClientEntity> clientMap,
BuiltMap<int, ClientEntity> clientMap, BuiltList<int> clientList, ListUIState clientListState) {
BuiltList<int> clientList,
ListUIState clientListState) => visibleClientsSelector(clientMap, clientList, clientListState)
);
List<int> visibleClientsSelector(
BuiltMap<int, ClientEntity> clientMap,
BuiltList<int> clientList,
ListUIState clientListState) {
final list = clientList.where((clientId) { final list = clientList.where((clientId) {
final client = clientMap[clientId]; final client = clientMap[clientId];
if (! client.matchesStates(clientListState.stateFilters)) { if (!client.matchesStates(clientListState.stateFilters)) {
return false; return false;
} }
return client.matchesSearch(clientListState.search); return client.matchesSearch(clientListState.search);
@ -54,8 +38,9 @@ List<int> visibleClientsSelector(
list.sort((clientAId, clientBId) { list.sort((clientAId, clientBId) {
final clientA = clientMap[clientAId]; final clientA = clientMap[clientAId];
final clientB = clientMap[clientBId]; final clientB = clientMap[clientBId];
return clientA.compareTo(clientB, clientListState.sortField, clientListState.sortAscending); return clientA.compareTo(
clientB, clientListState.sortField, clientListState.sortAscending);
}); });
return list; return list;
} }

View File

@ -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<int, CountryEntity> countryMap) =>
countryList(countryMap));
List<int> countryList(BuiltMap<int, CountryEntity> countryMap) {
final list = countryMap.keys.toList();
list.sort((idA, idB) => countryMap[idA].listDisplayName
.compareTo(countryMap[idB].listDisplayName));
return list;
}

View File

@ -12,6 +12,7 @@ class EntityDropdown extends StatefulWidget {
@required this.entityType, @required this.entityType,
@required this.labelText, @required this.labelText,
@required this.entityMap, @required this.entityMap,
@required this.entityList,
@required this.onSelected, @required this.onSelected,
this.validator, this.validator,
this.initialValue, this.initialValue,
@ -19,6 +20,7 @@ class EntityDropdown extends StatefulWidget {
final EntityType entityType; final EntityType entityType;
final BuiltMap<int, SelectableEntity> entityMap; final BuiltMap<int, SelectableEntity> entityMap;
final List<int> entityList;
final String labelText; final String labelText;
final String initialValue; final String initialValue;
final Function(int) onSelected; final Function(int) onSelected;
@ -49,6 +51,7 @@ class _EntityDropdownState extends State<EntityDropdown> {
builder: (BuildContext context) { builder: (BuildContext context) {
return EntityDropdownDialog( return EntityDropdownDialog(
entityMap: widget.entityMap, entityMap: widget.entityMap,
entityList: widget.entityList,
onSelected: (entityId) { onSelected: (entityId) {
_textController.text = widget.entityMap[entityId].listDisplayName; _textController.text = widget.entityMap[entityId].listDisplayName;
widget.onSelected(entityId); widget.onSelected(entityId);
@ -80,10 +83,12 @@ class _EntityDropdownState extends State<EntityDropdown> {
class EntityDropdownDialog extends StatefulWidget { class EntityDropdownDialog extends StatefulWidget {
EntityDropdownDialog({ EntityDropdownDialog({
@required this.entityMap, @required this.entityMap,
@required this.entityList,
@required this.onSelected, @required this.onSelected,
}); });
final BuiltMap<int, SelectableEntity> entityMap; final BuiltMap<int, SelectableEntity> entityMap;
final List<int> entityList;
final Function(int) onSelected; final Function(int) onSelected;
@override @override
@ -92,15 +97,6 @@ class EntityDropdownDialog extends StatefulWidget {
class _EntityDropdownDialogState extends State<EntityDropdownDialog> { class _EntityDropdownDialogState extends State<EntityDropdownDialog> {
String _filter; String _filter;
List<int> _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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -139,7 +135,7 @@ class _EntityDropdownDialogState extends State<EntityDropdownDialog> {
} }
Widget _createList() { Widget _createList() {
final matches = _entityList final matches = widget.entityList
.where((entityId) => widget.entityMap[entityId].matchesSearch(_filter)) .where((entityId) => widget.entityMap[entityId].matchesSearch(_filter))
.toList(); .toList();

View File

@ -5,6 +5,7 @@ import 'package:invoiceninja/ui/app/entity_dropdown.dart';
import 'package:invoiceninja/ui/app/form_card.dart'; import 'package:invoiceninja/ui/app/form_card.dart';
import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/redux/static/static_selectors.dart';
class ClientEditBillingAddress extends StatefulWidget { class ClientEditBillingAddress extends StatefulWidget {
ClientEditBillingAddress({ ClientEditBillingAddress({
@ -125,6 +126,7 @@ class ClientEditBillingAddressState extends State<ClientEditBillingAddress> {
EntityDropdown( EntityDropdown(
entityType: EntityType.country, entityType: EntityType.country,
entityMap: viewModel.countryMap, entityMap: viewModel.countryMap,
entityList: memoizedCountryList(viewModel.countryMap),
labelText: localization.country, labelText: localization.country,
initialValue: viewModel.countryMap[client.countryId]?.name, initialValue: viewModel.countryMap[client.countryId]?.name,
onSelected: (int countryId) => viewModel onSelected: (int countryId) => viewModel

View File

@ -3,6 +3,7 @@ import 'package:invoiceninja/data/models/entities.dart';
import 'package:invoiceninja/ui/app/entity_dropdown.dart'; import 'package:invoiceninja/ui/app/entity_dropdown.dart';
import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/redux/static/static_selectors.dart';
import '../../app/form_card.dart'; import '../../app/form_card.dart';
@ -125,6 +126,7 @@ class ClientEditShippingAddressState extends State<ClientEditShippingAddress> {
EntityDropdown( EntityDropdown(
entityType: EntityType.country, entityType: EntityType.country,
entityMap: viewModel.countryMap, entityMap: viewModel.countryMap,
entityList: memoizedCountryList(viewModel.countryMap),
labelText: localization.country, labelText: localization.country,
initialValue: viewModel.countryMap[client.shippingCountryId]?.name, initialValue: viewModel.countryMap[client.shippingCountryId]?.name,
onSelected: (int countryId) => viewModel onSelected: (int countryId) => viewModel

View File

@ -1,4 +1,5 @@
import 'package:invoiceninja/data/models/invoice_model.dart'; import 'package:invoiceninja/data/models/invoice_model.dart';
import 'package:invoiceninja/redux/client/client_selectors.dart';
import 'package:invoiceninja/utils/formatting.dart'; import 'package:invoiceninja/utils/formatting.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja/data/models/entities.dart'; import 'package:invoiceninja/data/models/entities.dart';
@ -100,6 +101,7 @@ class InvoiceEditDetailsState extends State<InvoiceEditDetails> with AutomaticKe
initialValue: initialValue:
viewModel.clientMap[invoice.clientId]?.displayName, viewModel.clientMap[invoice.clientId]?.displayName,
entityMap: viewModel.clientMap, entityMap: viewModel.clientMap,
entityList: memoizedDropdownClientList(viewModel.clientMap, viewModel.clientList),
validator: (String val) => val.trim().isEmpty validator: (String val) => val.trim().isEmpty
? AppLocalization.of(context).pleaseSelectAClient ? AppLocalization.of(context).pleaseSelectAClient
: null, : null,

View File

@ -33,12 +33,14 @@ class InvoiceEditDetailsVM {
final InvoiceEntity invoice; final InvoiceEntity invoice;
final Function(InvoiceEntity) onChanged; final Function(InvoiceEntity) onChanged;
final BuiltMap<int, ClientEntity> clientMap; final BuiltMap<int, ClientEntity> clientMap;
final BuiltList<int> clientList;
InvoiceEditDetailsVM({ InvoiceEditDetailsVM({
@required this.state, @required this.state,
@required this.invoice, @required this.invoice,
@required this.onChanged, @required this.onChanged,
@required this.clientMap, @required this.clientMap,
@required this.clientList,
}); });
factory InvoiceEditDetailsVM.fromStore(Store<AppState> store) { factory InvoiceEditDetailsVM.fromStore(Store<AppState> store) {
@ -51,6 +53,7 @@ class InvoiceEditDetailsVM {
onChanged: (InvoiceEntity invoice) => onChanged: (InvoiceEntity invoice) =>
store.dispatch(UpdateInvoice(invoice)), store.dispatch(UpdateInvoice(invoice)),
clientMap: state.clientState.map, clientMap: state.clientState.map,
clientList: state.clientState.list,
); );
} }
} }