Filters...

This commit is contained in:
unknown 2018-06-02 12:37:48 -07:00
parent 2aca4be821
commit e9d67ff1a9
6 changed files with 82 additions and 57 deletions

View File

@ -86,3 +86,9 @@ class SortProducts {
final String field; final String field;
SortProducts(this.field); SortProducts(this.field);
} }
class FilterProductsByState {
final EntityState state;
FilterProductsByState(this.state);
}

View File

@ -12,8 +12,21 @@ EntityUIState productUIReducer(EntityUIState state, action) {
final productListReducer = combineReducers<ListUIState>([ final productListReducer = combineReducers<ListUIState>([
TypedReducer<ListUIState, SortProducts>(_sortProducts), TypedReducer<ListUIState, SortProducts>(_sortProducts),
TypedReducer<ListUIState, FilterProductsByState>(_filterProductsByState),
]); ]);
ListUIState _filterProductsByState(ListUIState productListState, FilterProductsByState action) {
if (productListState.stateFilters.contains(action.state)) {
return productListState.rebuild((b) => b
..stateFilters.remove(action.state)
);
} else {
return productListState.rebuild((b) => b
..stateFilters.add(action.state)
);
}
}
ListUIState _sortProducts(ListUIState productListState, SortProducts action) { ListUIState _sortProducts(ListUIState productListState, SortProducts action) {
return productListState.rebuild((b) => b return productListState.rebuild((b) => b
..sortAscending = b.sortField != action.field || ! b.sortAscending ..sortAscending = b.sortField != action.field || ! b.sortAscending

View File

@ -1,6 +1,7 @@
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart'; import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart'; import 'package:built_value/serializer.dart';
import 'package:invoiceninja/data/models/models.dart';
part 'list_ui_state.g.dart'; part 'list_ui_state.g.dart';
@ -8,15 +9,15 @@ abstract class ListUIState implements Built<ListUIState, ListUIStateBuilder> {
String get sortField; String get sortField;
bool get sortAscending; bool get sortAscending;
BuiltList<int> get stateFilterIds; BuiltList<EntityState> get stateFilters;
BuiltList<int> get statusFilterIds; BuiltList<int> get statusFilters;
factory ListUIState(sortField) { factory ListUIState(sortField) {
return _$ListUIState._( return _$ListUIState._(
sortField: sortField, sortField: sortField,
sortAscending: true, sortAscending: true,
stateFilterIds: BuiltList<int>(), stateFilters: BuiltList<EntityState>(),
statusFilterIds: BuiltList<int>(), statusFilters: BuiltList<int>(),
); );
} }

View File

@ -32,12 +32,12 @@ class _$ListUIStateSerializer implements StructuredSerializer<ListUIState> {
'sortAscending', 'sortAscending',
serializers.serialize(object.sortAscending, serializers.serialize(object.sortAscending,
specifiedType: const FullType(bool)), specifiedType: const FullType(bool)),
'stateFilterIds', 'stateFilters',
serializers.serialize(object.stateFilterIds, serializers.serialize(object.stateFilters,
specifiedType: specifiedType:
const FullType(BuiltList, const [const FullType(int)])), const FullType(BuiltList, const [const FullType(EntityState)])),
'statusFilterIds', 'statusFilters',
serializers.serialize(object.statusFilterIds, serializers.serialize(object.statusFilters,
specifiedType: specifiedType:
const FullType(BuiltList, const [const FullType(int)])), const FullType(BuiltList, const [const FullType(int)])),
]; ];
@ -64,14 +64,14 @@ class _$ListUIStateSerializer implements StructuredSerializer<ListUIState> {
result.sortAscending = serializers.deserialize(value, result.sortAscending = serializers.deserialize(value,
specifiedType: const FullType(bool)) as bool; specifiedType: const FullType(bool)) as bool;
break; break;
case 'stateFilterIds': case 'stateFilters':
result.stateFilterIds.replace(serializers.deserialize(value, result.stateFilters.replace(serializers.deserialize(value,
specifiedType: specifiedType: const FullType(
const FullType(BuiltList, const [const FullType(int)])) BuiltList, const [const FullType(EntityState)]))
as BuiltList); as BuiltList);
break; break;
case 'statusFilterIds': case 'statusFilters':
result.statusFilterIds.replace(serializers.deserialize(value, result.statusFilters.replace(serializers.deserialize(value,
specifiedType: specifiedType:
const FullType(BuiltList, const [const FullType(int)])) const FullType(BuiltList, const [const FullType(int)]))
as BuiltList); as BuiltList);
@ -89,9 +89,9 @@ class _$ListUIState extends ListUIState {
@override @override
final bool sortAscending; final bool sortAscending;
@override @override
final BuiltList<int> stateFilterIds; final BuiltList<EntityState> stateFilters;
@override @override
final BuiltList<int> statusFilterIds; final BuiltList<int> statusFilters;
factory _$ListUIState([void updates(ListUIStateBuilder b)]) => factory _$ListUIState([void updates(ListUIStateBuilder b)]) =>
(new ListUIStateBuilder()..update(updates)).build(); (new ListUIStateBuilder()..update(updates)).build();
@ -99,17 +99,17 @@ class _$ListUIState extends ListUIState {
_$ListUIState._( _$ListUIState._(
{this.sortField, {this.sortField,
this.sortAscending, this.sortAscending,
this.stateFilterIds, this.stateFilters,
this.statusFilterIds}) this.statusFilters})
: super._() { : super._() {
if (sortField == null) if (sortField == null)
throw new BuiltValueNullFieldError('ListUIState', 'sortField'); throw new BuiltValueNullFieldError('ListUIState', 'sortField');
if (sortAscending == null) if (sortAscending == null)
throw new BuiltValueNullFieldError('ListUIState', 'sortAscending'); throw new BuiltValueNullFieldError('ListUIState', 'sortAscending');
if (stateFilterIds == null) if (stateFilters == null)
throw new BuiltValueNullFieldError('ListUIState', 'stateFilterIds'); throw new BuiltValueNullFieldError('ListUIState', 'stateFilters');
if (statusFilterIds == null) if (statusFilters == null)
throw new BuiltValueNullFieldError('ListUIState', 'statusFilterIds'); throw new BuiltValueNullFieldError('ListUIState', 'statusFilters');
} }
@override @override
@ -125,16 +125,16 @@ class _$ListUIState extends ListUIState {
if (other is! ListUIState) return false; if (other is! ListUIState) return false;
return sortField == other.sortField && return sortField == other.sortField &&
sortAscending == other.sortAscending && sortAscending == other.sortAscending &&
stateFilterIds == other.stateFilterIds && stateFilters == other.stateFilters &&
statusFilterIds == other.statusFilterIds; statusFilters == other.statusFilters;
} }
@override @override
int get hashCode { int get hashCode {
return $jf($jc( return $jf($jc(
$jc($jc($jc(0, sortField.hashCode), sortAscending.hashCode), $jc($jc($jc(0, sortField.hashCode), sortAscending.hashCode),
stateFilterIds.hashCode), stateFilters.hashCode),
statusFilterIds.hashCode)); statusFilters.hashCode));
} }
@override @override
@ -142,8 +142,8 @@ class _$ListUIState extends ListUIState {
return (newBuiltValueToStringHelper('ListUIState') return (newBuiltValueToStringHelper('ListUIState')
..add('sortField', sortField) ..add('sortField', sortField)
..add('sortAscending', sortAscending) ..add('sortAscending', sortAscending)
..add('stateFilterIds', stateFilterIds) ..add('stateFilters', stateFilters)
..add('statusFilterIds', statusFilterIds)) ..add('statusFilters', statusFilters))
.toString(); .toString();
} }
} }
@ -160,17 +160,17 @@ class ListUIStateBuilder implements Builder<ListUIState, ListUIStateBuilder> {
set sortAscending(bool sortAscending) => set sortAscending(bool sortAscending) =>
_$this._sortAscending = sortAscending; _$this._sortAscending = sortAscending;
ListBuilder<int> _stateFilterIds; ListBuilder<EntityState> _stateFilters;
ListBuilder<int> get stateFilterIds => ListBuilder<EntityState> get stateFilters =>
_$this._stateFilterIds ??= new ListBuilder<int>(); _$this._stateFilters ??= new ListBuilder<EntityState>();
set stateFilterIds(ListBuilder<int> stateFilterIds) => set stateFilters(ListBuilder<EntityState> stateFilters) =>
_$this._stateFilterIds = stateFilterIds; _$this._stateFilters = stateFilters;
ListBuilder<int> _statusFilterIds; ListBuilder<int> _statusFilters;
ListBuilder<int> get statusFilterIds => ListBuilder<int> get statusFilters =>
_$this._statusFilterIds ??= new ListBuilder<int>(); _$this._statusFilters ??= new ListBuilder<int>();
set statusFilterIds(ListBuilder<int> statusFilterIds) => set statusFilters(ListBuilder<int> statusFilters) =>
_$this._statusFilterIds = statusFilterIds; _$this._statusFilters = statusFilters;
ListUIStateBuilder(); ListUIStateBuilder();
@ -178,8 +178,8 @@ class ListUIStateBuilder implements Builder<ListUIState, ListUIStateBuilder> {
if (_$v != null) { if (_$v != null) {
_sortField = _$v.sortField; _sortField = _$v.sortField;
_sortAscending = _$v.sortAscending; _sortAscending = _$v.sortAscending;
_stateFilterIds = _$v.stateFilterIds?.toBuilder(); _stateFilters = _$v.stateFilters?.toBuilder();
_statusFilterIds = _$v.statusFilterIds?.toBuilder(); _statusFilters = _$v.statusFilters?.toBuilder();
_$v = null; _$v = null;
} }
return this; return this;
@ -204,15 +204,15 @@ class ListUIStateBuilder implements Builder<ListUIState, ListUIStateBuilder> {
new _$ListUIState._( new _$ListUIState._(
sortField: sortField, sortField: sortField,
sortAscending: sortAscending, sortAscending: sortAscending,
stateFilterIds: stateFilterIds.build(), stateFilters: stateFilters.build(),
statusFilterIds: statusFilterIds.build()); statusFilters: statusFilters.build());
} catch (_) { } catch (_) {
String _$failedField; String _$failedField;
try { try {
_$failedField = 'stateFilterIds'; _$failedField = 'stateFilters';
stateFilterIds.build(); stateFilters.build();
_$failedField = 'statusFilterIds'; _$failedField = 'statusFilters';
statusFilterIds.build(); statusFilters.build();
} catch (e) { } catch (e) {
throw new BuiltValueNestedFieldError( throw new BuiltValueNestedFieldError(
'ListUIState', _$failedField, e.toString()); 'ListUIState', _$failedField, e.toString());

View File

@ -1,3 +1,4 @@
import 'package:built_collection/built_collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja/utils/localization.dart'; import 'package:invoiceninja/utils/localization.dart';
import 'package:invoiceninja/data/models/models.dart'; import 'package:invoiceninja/data/models/models.dart';
@ -10,10 +11,10 @@ class AppBottomBar extends StatefulWidget {
final String selectedSortField; final String selectedSortField;
final bool selectedSortAscending; final bool selectedSortAscending;
final List<int> selectStatusIds; final BuiltList<int> selectedStatuses;
final List<int> selectStateIds; final BuiltList<EntityState> selectedStates;
final Function(List<int>) onSelectedStatusIds; final Function(List<int>) onSelectedStatus;
final Function(List<int>) onSelectedStateIds; final Function(EntityState, bool) onSelectedState;
AppBottomBar( AppBottomBar(
{this.scaffoldKey, {this.scaffoldKey,
@ -21,10 +22,10 @@ class AppBottomBar extends StatefulWidget {
this.onSelectedSortField, this.onSelectedSortField,
this.selectedSortField, this.selectedSortField,
this.selectedSortAscending, this.selectedSortAscending,
this.selectStateIds, this.selectedStates,
this.selectStatusIds, this.selectedStatuses,
this.onSelectedStateIds, this.onSelectedState,
this.onSelectedStatusIds}); this.onSelectedStatus});
@override @override
_AppBottomBarState createState() => new _AppBottomBarState(); _AppBottomBarState createState() => new _AppBottomBarState();
@ -51,10 +52,10 @@ class _AppBottomBarState extends State<AppBottomBar> {
return CheckboxListTile( return CheckboxListTile(
title: Text(AppLocalization.of(context).lookup(state.toString())), title: Text(AppLocalization.of(context).lookup(state.toString())),
controlAffinity: ListTileControlAffinity.leading, controlAffinity: ListTileControlAffinity.leading,
value: true, value: widget.selectedStates.contains(state),
dense: true, dense: true,
onChanged: (value) { onChanged: (value) {
widget.onSelectedState(state, value);
}, },
); );
}).toList(), }).toList(),

View File

@ -56,6 +56,10 @@ class ProductScreen extends StatelessWidget {
ProductFields.productKey, ProductFields.productKey,
ProductFields.cost, ProductFields.cost,
], ],
selectedStates: StoreProvider.of<AppState>(context).state.productListState().stateFilters,
onSelectedState: (EntityState state, value) {
StoreProvider.of<AppState>(context).dispatch(FilterProductsByState(state));
},
), ),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked, floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
floatingActionButton: StoreConnector( floatingActionButton: StoreConnector(