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;
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>([
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) {
return productListState.rebuild((b) => b
..sortAscending = b.sortField != action.field || ! b.sortAscending

View File

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

View File

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

View File

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

View File

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