Filters...
This commit is contained in:
parent
2aca4be821
commit
e9d67ff1a9
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue