From 9615f7296483abebc96ec12891504a0c66bd9aec Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 1 Aug 2018 20:04:06 +0300 Subject: [PATCH] Search/filter refactor --- lib/data/models/client_model.dart | 58 +++++++++---------- lib/data/models/credit_model.dart | 10 ++-- lib/data/models/entities.dart | 4 +- lib/data/models/expense_model.dart | 18 +++--- lib/data/models/invoice_model.dart | 38 ++++++------ lib/data/models/payment_model.dart | 10 ++-- lib/data/models/product_model.dart | 26 ++++----- lib/data/models/project_model.dart | 10 ++-- lib/data/models/static/country_model.dart | 22 +++---- lib/data/models/static/currency_model.dart | 18 +++--- lib/data/models/static/language_model.dart | 18 +++--- lib/data/models/task_model.dart | 10 ++-- lib/data/models/vendor_model.dart | 18 +++--- lib/redux/client/client_actions.dart | 6 +- lib/redux/client/client_reducer.dart | 6 +- lib/redux/client/client_selectors.dart | 2 +- lib/redux/invoice/invoice_actions.dart | 7 +-- lib/redux/invoice/invoice_reducer.dart | 6 +- lib/redux/invoice/invoice_selectors.dart | 2 +- lib/redux/product/product_actions.dart | 6 +- lib/redux/product/product_reducer.dart | 6 +- lib/redux/product/product_selectors.dart | 2 +- lib/redux/ui/list_ui_state.dart | 2 +- lib/redux/ui/list_ui_state.g.dart | 30 +++++----- lib/ui/app/entity_dropdown.dart | 4 +- .../app/{app_search.dart => list_filter.dart} | 22 +++---- ...ch_button.dart => list_filter_button.dart} | 14 ++--- lib/ui/client/client_list_item.dart | 8 +-- lib/ui/client/client_list_vm.dart | 2 +- lib/ui/client/client_screen.dart | 16 ++--- .../invoice/edit/invoice_item_selector.dart | 4 +- lib/ui/invoice/invoice_list_item.dart | 8 +-- lib/ui/invoice/invoice_list_vm.dart | 2 +- lib/ui/invoice/invoice_screen.dart | 16 ++--- lib/ui/product/product_list_item.dart | 6 +- lib/ui/product/product_list_vm.dart | 2 +- lib/ui/product/product_screen.dart | 16 ++--- 37 files changed, 227 insertions(+), 228 deletions(-) rename lib/ui/app/{app_search.dart => list_filter.dart} (81%) rename lib/ui/app/{app_search_button.dart => list_filter_button.dart} (73%) diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index 731963904..552a42fad 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -243,50 +243,50 @@ abstract class ClientEntity extends Object } @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } - search = search.toLowerCase(); - if (displayName.toLowerCase().contains(search)) { + filter = filter.toLowerCase(); + if (displayName.toLowerCase().contains(filter)) { return true; } - if (vatNumber.toLowerCase().contains(search)) { + if (vatNumber.toLowerCase().contains(filter)) { return true; } - if (idNumber.toLowerCase().contains(search)) { + if (idNumber.toLowerCase().contains(filter)) { return true; } - if (workPhone.toLowerCase().contains(search)) { + if (workPhone.toLowerCase().contains(filter)) { return true; } - if (contacts.where((contact) => contact.matchesSearch(search)).isNotEmpty) { + if (contacts.where((contact) => contact.matchesFilter(filter)).isNotEmpty) { return true; } return false; } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } - search = search.toLowerCase(); - if (vatNumber.toLowerCase().contains(search)) { + filter = filter.toLowerCase(); + if (vatNumber.toLowerCase().contains(filter)) { return vatNumber; } - if (idNumber.toLowerCase().contains(search)) { + if (idNumber.toLowerCase().contains(filter)) { return idNumber; } - if (workPhone.toLowerCase().contains(search)) { + if (workPhone.toLowerCase().contains(filter)) { return workPhone; } final contact = contacts.firstWhere( - (contact) => contact.matchesSearch(search), + (contact) => contact.matchesFilter(filter), orElse: () => null); if (contact != null) { - return contact.matchesSearchValue(search); + return contact.matchesFilterValue(filter); } return null; @@ -375,38 +375,38 @@ abstract class ContactEntity extends Object } @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } - search = search.toLowerCase(); - if (firstName.toLowerCase().contains(search)) { + filter = filter.toLowerCase(); + if (firstName.toLowerCase().contains(filter)) { return true; } - if (lastName.toLowerCase().contains(search)) { + if (lastName.toLowerCase().contains(filter)) { return true; } - if (phone.toLowerCase().contains(search)) { + if (phone.toLowerCase().contains(filter)) { return true; } - if (email.toLowerCase().contains(search)) { + if (email.toLowerCase().contains(filter)) { return true; } return false; } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } - search = search.toLowerCase(); - if (fullName.toLowerCase().contains(search)) { + filter = filter.toLowerCase(); + if (fullName.toLowerCase().contains(filter)) { return fullName; - } else if (email.toLowerCase().contains(search)) { + } else if (email.toLowerCase().contains(filter)) { return email; - } else if (phone.toLowerCase().contains(search)) { + } else if (phone.toLowerCase().contains(filter)) { return phone; } diff --git a/lib/data/models/credit_model.dart b/lib/data/models/credit_model.dart index a6c56880c..a3db96830 100644 --- a/lib/data/models/credit_model.dart +++ b/lib/data/models/credit_model.dart @@ -100,17 +100,17 @@ abstract class CreditEntity extends Object with BaseEntity implements Built true; - String matchesSearchValue(String search) => null; + bool matchesFilter(String filter) => true; + String matchesFilterValue(String filter) => null; String get listDisplayName => 'Error: listDisplayName not set'; diff --git a/lib/data/models/expense_model.dart b/lib/data/models/expense_model.dart index 1bc5d7484..7f46dc791 100644 --- a/lib/data/models/expense_model.dart +++ b/lib/data/models/expense_model.dart @@ -176,17 +176,17 @@ abstract class ExpenseEntity extends Object } @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } - return privateNotes.contains(search); + return privateNotes.contains(filter); } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } @@ -216,8 +216,8 @@ abstract class ExpenseCategoryEntity extends Object ExpenseCategoryEntity._(); @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } @@ -225,8 +225,8 @@ abstract class ExpenseCategoryEntity extends Object } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index 8ae184363..a58afa5c8 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -293,18 +293,18 @@ abstract class InvoiceEntity extends Object } @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } - if (invoiceNumber.toLowerCase().contains(search)) { + if (invoiceNumber.toLowerCase().contains(filter)) { return true; } else if (customTextValue1.isNotEmpty && - customTextValue1.toLowerCase().contains(search)) { + customTextValue1.toLowerCase().contains(filter)) { return true; } else if (customTextValue2.isNotEmpty && - customTextValue2.toLowerCase().contains(search)) { + customTextValue2.toLowerCase().contains(filter)) { return true; } @@ -312,19 +312,19 @@ abstract class InvoiceEntity extends Object } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } - search = search.toLowerCase(); - if (invoiceNumber.toLowerCase().contains(search)) { + filter = filter.toLowerCase(); + if (invoiceNumber.toLowerCase().contains(filter)) { return invoiceNumber; } else if (customTextValue1.isNotEmpty && - customTextValue1.toLowerCase().contains(search)) { + customTextValue1.toLowerCase().contains(filter)) { return customTextValue1; } else if (customTextValue2.isNotEmpty && - customTextValue2.toLowerCase().contains(search)) { + customTextValue2.toLowerCase().contains(filter)) { return customTextValue2; } return null; @@ -427,8 +427,8 @@ abstract class InvoiceItemEntity extends Object double get total => qty * cost; @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } @@ -436,8 +436,8 @@ abstract class InvoiceItemEntity extends Object } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } @@ -491,8 +491,8 @@ abstract class InvitationEntity extends Object String get downloadLink => link.replaceFirst('/view/', '/download/'); @override - bool matchesSearch(String search) { - if (search == null || search.isEmpty) { + bool matchesFilter(String filter) { + if (filter == null || filter.isEmpty) { return true; } @@ -500,8 +500,8 @@ abstract class InvitationEntity extends Object } @override - String matchesSearchValue(String search) { - if (search == null || search.isEmpty) { + String matchesFilterValue(String filter) { + if (filter == null || filter.isEmpty) { return null; } diff --git a/lib/data/models/payment_model.dart b/lib/data/models/payment_model.dart index d2ad0bf83..bcc637e88 100644 --- a/lib/data/models/payment_model.dart +++ b/lib/data/models/payment_model.dart @@ -111,17 +111,17 @@ abstract class PaymentEntity extends Object with BaseEntity implements Built([ TypedReducer(_sortClients), TypedReducer(_filterClientsByState), - TypedReducer(_searchClients), + TypedReducer(_filterClients), ]); ListUIState _filterClientsByState(ListUIState clientListState, FilterClientsByState action) { @@ -87,9 +87,9 @@ ListUIState _filterClientsByState(ListUIState clientListState, FilterClientsBySt } } -ListUIState _searchClients(ListUIState clientListState, SearchClients action) { +ListUIState _filterClients(ListUIState clientListState, FilterClients action) { return clientListState.rebuild((b) => b - ..search = action.search + ..filter = action.filter ); } diff --git a/lib/redux/client/client_selectors.dart b/lib/redux/client/client_selectors.dart index 8743d4d7a..2f7233ee6 100644 --- a/lib/redux/client/client_selectors.dart +++ b/lib/redux/client/client_selectors.dart @@ -32,7 +32,7 @@ List filteredClientsSelector(BuiltMap clientMap, if (!client.matchesStates(clientListState.stateFilters)) { return false; } - return client.matchesSearch(clientListState.search); + return client.matchesFilter(clientListState.filter); }).toList(); list.sort((clientAId, clientBId) { diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index b40da89d8..f32a5bbd4 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -219,10 +219,9 @@ class RestoreInvoiceFailure implements StopSaving { - -class SearchInvoices { - final String search; - SearchInvoices(this.search); +class FilterInvoices { + final String filter; + FilterInvoices(this.filter); } class SortInvoices implements PersistUI { diff --git a/lib/redux/invoice/invoice_reducer.dart b/lib/redux/invoice/invoice_reducer.dart index 975fd1c6d..5520ed380 100644 --- a/lib/redux/invoice/invoice_reducer.dart +++ b/lib/redux/invoice/invoice_reducer.dart @@ -90,7 +90,7 @@ final invoiceListReducer = combineReducers([ TypedReducer(_filterInvoicesByState), TypedReducer(_filterInvoicesByStatus), TypedReducer(_filterInvoicesByClient), - TypedReducer(_searchInvoices), + TypedReducer(_filterInvoices), ]); ListUIState _filterInvoicesByState(ListUIState invoiceListState, FilterInvoicesByState action) { @@ -123,9 +123,9 @@ ListUIState _filterInvoicesByClient(ListUIState invoiceListState, FilterInvoices ); } -ListUIState _searchInvoices(ListUIState invoiceListState, SearchInvoices action) { +ListUIState _filterInvoices(ListUIState invoiceListState, FilterInvoices action) { return invoiceListState.rebuild((b) => b - ..search = action.search + ..filter = action.filter ); } diff --git a/lib/redux/invoice/invoice_selectors.dart b/lib/redux/invoice/invoice_selectors.dart index e5784bbe7..f098f10d9 100644 --- a/lib/redux/invoice/invoice_selectors.dart +++ b/lib/redux/invoice/invoice_selectors.dart @@ -32,7 +32,7 @@ List filteredInvoicesSelector( if (!invoice.matchesStatuses(invoiceListState.statusFilters)) { return false; } - if (!invoice.matchesSearch(invoiceListState.search)) { + if (!invoice.matchesFilter(invoiceListState.filter)) { return false; } if (invoiceListState.filterClientId != null && diff --git a/lib/redux/product/product_actions.dart b/lib/redux/product/product_actions.dart index 6d8eac920..066d1391c 100644 --- a/lib/redux/product/product_actions.dart +++ b/lib/redux/product/product_actions.dart @@ -123,9 +123,9 @@ class RestoreProductFailure implements StopSaving { } -class SearchProducts { - final String search; - SearchProducts(this.search); +class FilterProducts { + final String filter; + FilterProducts(this.filter); } class SortProducts implements PersistUI { diff --git a/lib/redux/product/product_reducer.dart b/lib/redux/product/product_reducer.dart index b3bc789ee..11d51f150 100644 --- a/lib/redux/product/product_reducer.dart +++ b/lib/redux/product/product_reducer.dart @@ -43,7 +43,7 @@ ProductEntity _updateEditing(ProductEntity client, dynamic action) { final productListReducer = combineReducers([ TypedReducer(_sortProducts), TypedReducer(_filterProductsByState), - TypedReducer(_searchProducts), + TypedReducer(_filterProducts), ]); ListUIState _filterProductsByState(ListUIState productListState, FilterProductsByState action) { @@ -58,9 +58,9 @@ ListUIState _filterProductsByState(ListUIState productListState, FilterProductsB } } -ListUIState _searchProducts(ListUIState productListState, SearchProducts action) { +ListUIState _filterProducts(ListUIState productListState, FilterProducts action) { return productListState.rebuild((b) => b - ..search = action.search + ..filter = action.filter ); } diff --git a/lib/redux/product/product_selectors.dart b/lib/redux/product/product_selectors.dart index e26a5085f..45b852c83 100644 --- a/lib/redux/product/product_selectors.dart +++ b/lib/redux/product/product_selectors.dart @@ -31,7 +31,7 @@ List filteredProductsSelector( if (! product.matchesStates(productListState.stateFilters)) { return false; } - if (! product.matchesSearch(productListState.search)) { + if (! product.matchesFilter(productListState.filter)) { return false; } return true; diff --git a/lib/redux/ui/list_ui_state.dart b/lib/redux/ui/list_ui_state.dart index 96b774194..6ec0b9fc0 100644 --- a/lib/redux/ui/list_ui_state.dart +++ b/lib/redux/ui/list_ui_state.dart @@ -20,7 +20,7 @@ abstract class ListUIState implements Built { ListUIState._(); @nullable - String get search; + String get filter; @nullable int get filterClientId; diff --git a/lib/redux/ui/list_ui_state.g.dart b/lib/redux/ui/list_ui_state.g.dart index 094df2772..e994bed69 100644 --- a/lib/redux/ui/list_ui_state.g.dart +++ b/lib/redux/ui/list_ui_state.g.dart @@ -41,10 +41,10 @@ class _$ListUIStateSerializer implements StructuredSerializer { specifiedType: const FullType(BuiltList, const [const FullType(EntityStatus)])), ]; - if (object.search != null) { + if (object.filter != null) { result - ..add('search') - ..add(serializers.serialize(object.search, + ..add('filter') + ..add(serializers.serialize(object.filter, specifiedType: const FullType(String))); } if (object.filterClientId != null) { @@ -68,8 +68,8 @@ class _$ListUIStateSerializer implements StructuredSerializer { iterator.moveNext(); final dynamic value = iterator.current; switch (key) { - case 'search': - result.search = serializers.deserialize(value, + case 'filter': + result.filter = serializers.deserialize(value, specifiedType: const FullType(String)) as String; break; case 'filterClientId': @@ -105,7 +105,7 @@ class _$ListUIStateSerializer implements StructuredSerializer { class _$ListUIState extends ListUIState { @override - final String search; + final String filter; @override final int filterClientId; @override @@ -121,7 +121,7 @@ class _$ListUIState extends ListUIState { (new ListUIStateBuilder()..update(updates)).build(); _$ListUIState._( - {this.search, + {this.filter, this.filterClientId, this.sortField, this.sortAscending, @@ -149,7 +149,7 @@ class _$ListUIState extends ListUIState { bool operator ==(dynamic other) { if (identical(other, this)) return true; if (other is! ListUIState) return false; - return search == other.search && + return filter == other.filter && filterClientId == other.filterClientId && sortField == other.sortField && sortAscending == other.sortAscending && @@ -162,7 +162,7 @@ class _$ListUIState extends ListUIState { return $jf($jc( $jc( $jc( - $jc($jc($jc(0, search.hashCode), filterClientId.hashCode), + $jc($jc($jc(0, filter.hashCode), filterClientId.hashCode), sortField.hashCode), sortAscending.hashCode), stateFilters.hashCode), @@ -172,7 +172,7 @@ class _$ListUIState extends ListUIState { @override String toString() { return (newBuiltValueToStringHelper('ListUIState') - ..add('search', search) + ..add('filter', filter) ..add('filterClientId', filterClientId) ..add('sortField', sortField) ..add('sortAscending', sortAscending) @@ -185,9 +185,9 @@ class _$ListUIState extends ListUIState { class ListUIStateBuilder implements Builder { _$ListUIState _$v; - String _search; - String get search => _$this._search; - set search(String search) => _$this._search = search; + String _filter; + String get filter => _$this._filter; + set filter(String filter) => _$this._filter = filter; int _filterClientId; int get filterClientId => _$this._filterClientId; @@ -219,7 +219,7 @@ class ListUIStateBuilder implements Builder { ListUIStateBuilder get _$this { if (_$v != null) { - _search = _$v.search; + _filter = _$v.filter; _filterClientId = _$v.filterClientId; _sortField = _$v.sortField; _sortAscending = _$v.sortAscending; @@ -247,7 +247,7 @@ class ListUIStateBuilder implements Builder { try { _$result = _$v ?? new _$ListUIState._( - search: search, + filter: filter, filterClientId: filterClientId, sortField: sortField, sortAscending: sortAscending, diff --git a/lib/ui/app/entity_dropdown.dart b/lib/ui/app/entity_dropdown.dart index 7f0117946..7a847b2a0 100644 --- a/lib/ui/app/entity_dropdown.dart +++ b/lib/ui/app/entity_dropdown.dart @@ -155,7 +155,7 @@ class _EntityDropdownDialogState extends State { Widget _createList() { final matches = widget.entityList .where( - (entityId) => widget.entityMap[entityId].matchesSearch(_filter)) + (entityId) => widget.entityMap[entityId].matchesFilter(_filter)) .toList(); return ListView.builder( @@ -164,7 +164,7 @@ class _EntityDropdownDialogState extends State { itemBuilder: (BuildContext context, int index) { final int entityId = matches[index]; final entity = widget.entityMap[entityId]; - final String subtitle = entity.matchesSearchValue(_filter); + final String subtitle = entity.matchesFilterValue(_filter); return ListTile( dense: true, title: Row( diff --git a/lib/ui/app/app_search.dart b/lib/ui/app/list_filter.dart similarity index 81% rename from lib/ui/app/app_search.dart rename to lib/ui/app/list_filter.dart index aff01dcfc..cd1832042 100644 --- a/lib/ui/app/app_search.dart +++ b/lib/ui/app/list_filter.dart @@ -5,15 +5,15 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:redux/redux.dart'; -class AppSearch extends StatelessWidget { +class ListFilter extends StatelessWidget { final EntityType entityType; - final String search; - final Function(String) onSearchChanged; + final String filter; + final Function(String) onFilterChanged; - const AppSearch({ + const ListFilter({ this.entityType, - this.search, - this.onSearchChanged, + this.filter, + this.onFilterChanged, }); @override @@ -25,15 +25,15 @@ class AppSearch extends StatelessWidget { builder: (BuildContext context, state) { final listUIState = state.getListState(entityType); final bool enableDarkMode = state.uiState.enableDarkMode; - return listUIState.search == null + return listUIState.filter == null ? Text(localization.lookup(entityType.plural.toString())) : Container( padding: const EdgeInsets.only(left: 8.0), height: 38.0, margin: EdgeInsets.only(bottom: 2.0), decoration: BoxDecoration( - color: listUIState.search != null && - listUIState.search.isNotEmpty + color: listUIState.filter != null && + listUIState.filter.isNotEmpty ? enableDarkMode ? Colors.yellow.shade900 : Colors.yellow.shade200 @@ -51,10 +51,10 @@ class AppSearch extends StatelessWidget { child: Icon(Icons.search), ), border: InputBorder.none, - hintText: localization.search), + hintText: localization.filter), autofocus: true, autocorrect: false, - onChanged: (value) => onSearchChanged(value), + onChanged: (value) => onFilterChanged(value), ), ); }, diff --git a/lib/ui/app/app_search_button.dart b/lib/ui/app/list_filter_button.dart similarity index 73% rename from lib/ui/app/app_search_button.dart rename to lib/ui/app/list_filter_button.dart index 11f551aef..84ab5e74c 100644 --- a/lib/ui/app/app_search_button.dart +++ b/lib/ui/app/list_filter_button.dart @@ -6,14 +6,14 @@ import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; -class AppSearchButton extends StatelessWidget { +class ListFilterButton extends StatelessWidget { final EntityType entityType; - final Function onSearchPressed; + final Function onFilterPressed; - const AppSearchButton({ + const ListFilterButton({ this.entityType, - this.onSearchPressed, + this.onFilterPressed, }); @override @@ -26,9 +26,9 @@ class AppSearchButton extends StatelessWidget { distinct: true, builder: (BuildContext context, listUIState) { return IconButton( - icon: Icon(listUIState.search == null ? Icons.search : Icons.close), - tooltip: localization.search, - onPressed: () => onSearchPressed(listUIState.search == null ? '' : null), + icon: Icon(listUIState.filter == null ? Icons.search : Icons.close), + tooltip: localization.filter, + onPressed: () => onFilterPressed(listUIState.filter == null ? '' : null), ); }, ); diff --git a/lib/ui/client/client_list_item.dart b/lib/ui/client/client_list_item.dart index 2f09ea3de..7709a662b 100644 --- a/lib/ui/client/client_list_item.dart +++ b/lib/ui/client/client_list_item.dart @@ -25,8 +25,8 @@ class ClientListItem extends StatelessWidget { @override Widget build(BuildContext context) { //var localization = AppLocalization.of(context); - final searchMatch = filter != null && filter.isNotEmpty - ? client.matchesSearchValue(filter) + final filterMatch = filter != null && filter.isNotEmpty + ? client.matchesFilterValue(filter) : null; return DismissibleEntity( @@ -50,10 +50,10 @@ class ClientListItem extends StatelessWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - searchMatch == null + filterMatch == null ? Container() : Text( - searchMatch, + filterMatch, maxLines: 3, overflow: TextOverflow.ellipsis, ), diff --git a/lib/ui/client/client_list_vm.dart b/lib/ui/client/client_list_vm.dart index 45862679c..757a0c195 100644 --- a/lib/ui/client/client_list_vm.dart +++ b/lib/ui/client/client_list_vm.dart @@ -69,7 +69,7 @@ class ClientListVM { clientMap: store.state.clientState.map, isLoading: store.state.isLoading, isLoaded: store.state.clientState.isLoaded, - filter: store.state.clientListState.search, + filter: store.state.clientListState.filter, onClientTap: (context, client) { store.dispatch(ViewClient(clientId: client.id, context: context)); }, diff --git a/lib/ui/client/client_screen.dart b/lib/ui/client/client_screen.dart index c2c836962..5ac5e70a9 100644 --- a/lib/ui/client/client_screen.dart +++ b/lib/ui/client/client_screen.dart @@ -1,5 +1,5 @@ -import 'package:invoiceninja_flutter/ui/app/app_search.dart'; -import 'package:invoiceninja_flutter/ui/app/app_search_button.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:flutter/material.dart'; @@ -20,17 +20,17 @@ class ClientScreen extends StatelessWidget { return Scaffold( appBar: AppBar( - title: AppSearch( + title: ListFilter( entityType: EntityType.client, - onSearchChanged: (value) { - store.dispatch(SearchClients(value)); + onFilterChanged: (value) { + store.dispatch(FilterClients(value)); }, ), actions: [ - AppSearchButton( + ListFilterButton( entityType: EntityType.client, - onSearchPressed: (String value) { - store.dispatch(SearchClients(value)); + onFilterPressed: (String value) { + store.dispatch(FilterClients(value)); }, ), ], diff --git a/lib/ui/invoice/edit/invoice_item_selector.dart b/lib/ui/invoice/edit/invoice_item_selector.dart index 88576e43f..7ed386e60 100644 --- a/lib/ui/invoice/edit/invoice_item_selector.dart +++ b/lib/ui/invoice/edit/invoice_item_selector.dart @@ -138,7 +138,7 @@ class _InvoiceItemSelectorState extends State { Widget _entityList() { final matches = memoizedProductList(widget.productMap).where((entityId) { final entity = widget.productMap[entityId]; - return entity.isActive && entity.matchesSearch(_filter); + return entity.isActive && entity.matchesFilter(_filter); }).toList(); matches.sort((idA, idB) => @@ -150,7 +150,7 @@ class _InvoiceItemSelectorState extends State { itemBuilder: (BuildContext context, int index) { final int entityId = matches[index]; final entity = widget.productMap[entityId]; - final String subtitle = entity.matchesSearchValue(_filter); + final String subtitle = entity.matchesFilterValue(_filter); return ListTile( dense: true, leading: Checkbox( diff --git a/lib/ui/invoice/invoice_list_item.dart b/lib/ui/invoice/invoice_list_item.dart index 30b7b14ce..e24473b51 100644 --- a/lib/ui/invoice/invoice_list_item.dart +++ b/lib/ui/invoice/invoice_list_item.dart @@ -25,8 +25,8 @@ class InvoiceListItem extends StatelessWidget { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); - final searchMatch = filter != null && filter.isNotEmpty - ? invoice.matchesSearchValue(filter) + final filterMatch = filter != null && filter.isNotEmpty + ? invoice.matchesFilterValue(filter) : null; return DismissibleEntity( @@ -58,10 +58,10 @@ class InvoiceListItem extends StatelessWidget { Row( children: [ Expanded( - child: searchMatch == null + child: filterMatch == null ? Text(invoice.invoiceNumber) : Text( - searchMatch, + filterMatch, maxLines: 3, overflow: TextOverflow.ellipsis, ), diff --git a/lib/ui/invoice/invoice_list_vm.dart b/lib/ui/invoice/invoice_list_vm.dart index edde6d340..ec2a8a49c 100644 --- a/lib/ui/invoice/invoice_list_vm.dart +++ b/lib/ui/invoice/invoice_list_vm.dart @@ -87,7 +87,7 @@ class InvoiceListVM { clientMap: state.clientState.map, isLoading: state.isLoading, isLoaded: state.invoiceState.isLoaded && state.clientState.isLoaded, - filter: state.invoiceListState.search, + filter: state.invoiceListState.filter, onInvoiceTap: (context, invoice) { store.dispatch(ViewInvoice(invoiceId: invoice.id, context: context)); }, diff --git a/lib/ui/invoice/invoice_screen.dart b/lib/ui/invoice/invoice_screen.dart index 6e7000b5e..05a8a98f5 100644 --- a/lib/ui/invoice/invoice_screen.dart +++ b/lib/ui/invoice/invoice_screen.dart @@ -1,5 +1,5 @@ -import 'package:invoiceninja_flutter/ui/app/app_search.dart'; -import 'package:invoiceninja_flutter/ui/app/app_search_button.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:flutter/material.dart'; @@ -22,17 +22,17 @@ class InvoiceScreen extends StatelessWidget { return Scaffold( key: _scaffoldKey, appBar: AppBar( - title: AppSearch( + title: ListFilter( entityType: EntityType.invoice, - onSearchChanged: (value) { - store.dispatch(SearchInvoices(value)); + onFilterChanged: (value) { + store.dispatch(FilterInvoices(value)); }, ), actions: [ - AppSearchButton( + ListFilterButton( entityType: EntityType.invoice, - onSearchPressed: (String value) { - store.dispatch(SearchInvoices(value)); + onFilterPressed: (String value) { + store.dispatch(FilterInvoices(value)); }, ), ], diff --git a/lib/ui/product/product_list_item.dart b/lib/ui/product/product_list_item.dart index a652b3eb3..0b8b9ce9d 100644 --- a/lib/ui/product/product_list_item.dart +++ b/lib/ui/product/product_list_item.dart @@ -24,10 +24,10 @@ class ProductListItem extends StatelessWidget { @override Widget build(BuildContext context) { - final searchMatch = filter != null && filter.isNotEmpty - ? product.matchesSearchValue(filter) + final filterMatch = filter != null && filter.isNotEmpty + ? product.matchesFilterValue(filter) : null; - final subtitle = searchMatch ?? product.notes; + final subtitle = filterMatch ?? product.notes; return DismissibleEntity( entity: product, diff --git a/lib/ui/product/product_list_vm.dart b/lib/ui/product/product_list_vm.dart index 7f415d24d..2c594ea72 100644 --- a/lib/ui/product/product_list_vm.dart +++ b/lib/ui/product/product_list_vm.dart @@ -68,7 +68,7 @@ class ProductListVM { productMap: store.state.productState.map, isLoading: store.state.isLoading, isLoaded: store.state.productState.isLoaded, - filter: store.state.productUIState.listUIState.search, + filter: store.state.productUIState.listUIState.filter, onProductTap: (context, product) { store.dispatch(EditProduct(product: product, context: context)); }, diff --git a/lib/ui/product/product_screen.dart b/lib/ui/product/product_screen.dart index b2ce94d49..2adb4ac33 100644 --- a/lib/ui/product/product_screen.dart +++ b/lib/ui/product/product_screen.dart @@ -1,5 +1,5 @@ -import 'package:invoiceninja_flutter/ui/app/app_search.dart'; -import 'package:invoiceninja_flutter/ui/app/app_search_button.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; +import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:flutter/material.dart'; @@ -21,17 +21,17 @@ class ProductScreen extends StatelessWidget { return Scaffold( appBar: AppBar( - title: AppSearch( + title: ListFilter( entityType: EntityType.product, - onSearchChanged: (value) { - store.dispatch(SearchProducts(value)); + onFilterChanged: (value) { + store.dispatch(FilterProducts(value)); }, ), actions: [ - AppSearchButton( + ListFilterButton( entityType: EntityType.product, - onSearchPressed: (String value) { - store.dispatch(SearchProducts(value)); + onFilterPressed: (String value) { + store.dispatch(FilterProducts(value)); }, ), ],