Refactor
This commit is contained in:
parent
719184a097
commit
11abf6c373
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue