diff --git a/lib/data/models/company_model.dart b/lib/data/models/company_model.dart index 3cec182f0..b9cd629c6 100644 --- a/lib/data/models/company_model.dart +++ b/lib/data/models/company_model.dart @@ -517,7 +517,7 @@ abstract class CompanyEntity extends Object ..passwordTimeout = 30 * 60 * 1000 ..oauthPasswordRequired = false ..invoiceTaskDatelog = true - ..subscriptions = BuiltList(); + ..subscriptions.replace(BuiltList()); static Serializer get serializer => _$companyEntitySerializer; } diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index 0116239f6..81ddf83b1 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -8,6 +8,7 @@ export 'package:invoiceninja_flutter/data/models/company_model.dart'; export 'package:invoiceninja_flutter/data/models/credit_model.dart'; export 'package:invoiceninja_flutter/data/models/tax_rate_model.dart'; export 'package:invoiceninja_flutter/data/models/document_model.dart'; +export 'package:invoiceninja_flutter/data/models/settings_model.dart'; export 'package:invoiceninja_flutter/data/models/entities.dart'; export 'package:invoiceninja_flutter/data/models/expense_model.dart'; export 'package:invoiceninja_flutter/data/models/subscription_model.dart'; diff --git a/lib/data/models/subscription_model.dart b/lib/data/models/subscription_model.dart index 5f5ab4ae8..9ae9629da 100644 --- a/lib/data/models/subscription_model.dart +++ b/lib/data/models/subscription_model.dart @@ -46,7 +46,8 @@ abstract class SubscriptionItemResponse } class SubscriptionFields { - // STARTER: fields - do not remove comment + static const String createdAt = 'created_at'; + static const String updatedAt = 'updated_at'; } abstract class SubscriptionEntity extends Object diff --git a/lib/redux/client/client_selectors.dart b/lib/redux/client/client_selectors.dart index 1c84cfbd9..3508e6831 100644 --- a/lib/redux/client/client_selectors.dart +++ b/lib/redux/client/client_selectors.dart @@ -47,7 +47,6 @@ List filteredClientsSelector( ListUIState clientListState, BuiltMap userMap, StaticState staticState) { - final filterEntityId = selectionState.filterEntityId; final filterEntityType = selectionState.filterEntityType; diff --git a/lib/redux/settings/settings_actions.dart b/lib/redux/settings/settings_actions.dart index 550af615d..ee74afa04 100644 --- a/lib/redux/settings/settings_actions.dart +++ b/lib/redux/settings/settings_actions.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/data/models/user_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart'; diff --git a/lib/redux/subscription/subscription_selectors.dart b/lib/redux/subscription/subscription_selectors.dart index 32ebd3c69..fca366b36 100644 --- a/lib/redux/subscription/subscription_selectors.dart +++ b/lib/redux/subscription/subscription_selectors.dart @@ -1,4 +1,5 @@ import 'package:invoiceninja_flutter/data/models/subscription_model.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; @@ -6,16 +7,19 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; var memoizedDropdownSubscriptionList = memo5( - (BuiltMap subscriptionMap, BuiltList subscriptionList, - StaticState staticState, - BuiltMap userMap, + (BuiltMap subscriptionMap, + BuiltList subscriptionList, + StaticState staticState, + BuiltMap userMap, String clientId) => - dropdownSubscriptionsSelector(subscriptionMap, subscriptionList, staticState, userMap, clientId)); + dropdownSubscriptionsSelector( + subscriptionMap, subscriptionList, staticState, userMap, clientId)); -List dropdownSubscriptionsSelector(BuiltMap subscriptionMap, - BuiltList subscriptionList, +List dropdownSubscriptionsSelector( + BuiltMap subscriptionMap, + BuiltList subscriptionList, StaticState staticState, - BuiltMap userMap, + BuiltMap userMap, String clientId) { final list = subscriptionList.where((subscriptionId) { final subscription = subscriptionMap[subscriptionId]; @@ -30,64 +34,60 @@ List dropdownSubscriptionsSelector(BuiltMap list.sort((subscriptionAId, subscriptionBId) { final subscriptionA = subscriptionMap[subscriptionAId]; final subscriptionB = subscriptionMap[subscriptionBId]; - return subscriptionA.compareTo(subscriptionB, SubscriptionFields.name, true); + return subscriptionA.compareTo( + subscriptionB, SubscriptionFields.createdAt, true); }); return list; } -var memoizedFilteredSubscriptionList = memo7(( - String filterEntityId, - EntityType filterEntityType, +var memoizedFilteredSubscriptionList = memo4((SelectionState selectionState, BuiltMap subscriptionMap, BuiltList subscriptionList, - StaticState staticState, - BuiltMap userMap, ListUIState subscriptionListState) => - filteredSubscriptionsSelector(filterEntityId, filterEntityType, subscriptionMap, subscriptionList, staticState, userMap, subscriptionListState)); + filteredSubscriptionsSelector( + selectionState, + subscriptionMap, + subscriptionList, + subscriptionListState, + )); List filteredSubscriptionsSelector( - String filterEntityId, - EntityType filterEntityType, + SelectionState selectionState, BuiltMap subscriptionMap, - BuiltList subscriptionList, - StaticState staticState, - BuiltMap userMap, + BuiltList subscriptionList, ListUIState subscriptionListState) { + final filterEntityId = selectionState.filterEntityId; + final filterEntityType = selectionState.filterEntityType; + final list = subscriptionList.where((subscriptionId) { final subscription = subscriptionMap[subscriptionId]; + if (subscription.id == selectionState.selectedId) { + return true; + } + if (filterEntityId != null && subscription.id != filterEntityId) { return false; - } else { - - } + } else {} if (!subscription.matchesStates(subscriptionListState.stateFilters)) { return false; } - if (subscriptionListState.custom1Filters.isNotEmpty && - !subscriptionListState.custom1Filters.contains(subscription.customValue1)) { - return false; - } - if (subscriptionListState.custom2Filters.isNotEmpty && - !subscriptionListState.custom2Filters.contains(subscription.customValue2)) { - return false; - } return subscription.matchesFilter(subscriptionListState.filter); }).toList(); list.sort((subscriptionAId, subscriptionBId) { - return subscriptionMap[subscriptionAId].compareTo( - subscription: subscriptionMap[subscriptionBId], - sortField: subscriptionListState.sortField, - sortAscending: subscriptionListState.sortAscending, - ); + final subscriptionA = subscriptionMap[subscriptionAId]; + final subscriptionB = subscriptionMap[subscriptionBId]; + return subscriptionA.compareTo(subscriptionB, + subscriptionListState.sortField, subscriptionListState.sortAscending); }); - return list; } -bool hasSubscriptionChanges( - SubscriptionEntity subscription, BuiltMap subscriptionMap) => - subscription.isNew ? subscription.isChanged : subscription != subscriptionMap[subscription.id]; +bool hasSubscriptionChanges(SubscriptionEntity subscription, + BuiltMap subscriptionMap) => + subscription.isNew + ? subscription.isChanged + : subscription != subscriptionMap[subscription.id]; diff --git a/lib/redux/subscription/subscription_state.dart b/lib/redux/subscription/subscription_state.dart index df20155b6..bc0d686f0 100644 --- a/lib/redux/subscription/subscription_state.dart +++ b/lib/redux/subscription/subscription_state.dart @@ -9,8 +9,8 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; part 'subscription_state.g.dart'; -abstract class SubscriptionState implements Built { - +abstract class SubscriptionState + implements Built { factory SubscriptionState() { return _$SubscriptionState._( map: BuiltMap(), @@ -46,15 +46,16 @@ abstract class SubscriptionState implements Built get serializer => _$subscriptionStateSerializer; + static Serializer get serializer => + _$subscriptionStateSerializer; } -abstract class SubscriptionUIState extends Object with EntityUIState implements Built { - +abstract class SubscriptionUIState extends Object + with EntityUIState + implements Built { factory SubscriptionUIState() { return _$SubscriptionUIState._( - listUIState: ListUIState(SubscriptionFields.name), + listUIState: ListUIState(SubscriptionFields.createdAt), editing: SubscriptionEntity(), selectedId: '', tabIndex: 0, @@ -63,7 +64,7 @@ abstract class SubscriptionUIState extends Object with EntityUIState implements SubscriptionUIState._(); @override -@memoized + @memoized int get hashCode; @nullable @@ -75,5 +76,6 @@ abstract class SubscriptionUIState extends Object with EntityUIState implements @override String get editingId => editing.id; - static Serializer get serializer => _$subscriptionUIStateSerializer; -} \ No newline at end of file + static Serializer get serializer => + _$subscriptionUIStateSerializer; +} diff --git a/lib/ui/invoice/edit/invoice_edit_desktop.dart b/lib/ui/invoice/edit/invoice_edit_desktop.dart index 7f0266baf..ffbf1fad8 100644 --- a/lib/ui/invoice/edit/invoice_edit_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_desktop.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; diff --git a/lib/ui/settings/client_portal_vm.dart b/lib/ui/settings/client_portal_vm.dart index 33c74595d..3785b9b97 100644 --- a/lib/ui/settings/client_portal_vm.dart +++ b/lib/ui/settings/client_portal_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/company_details_vm.dart b/lib/ui/settings/company_details_vm.dart index 1351acf6a..b27b6c9fe 100644 --- a/lib/ui/settings/company_details_vm.dart +++ b/lib/ui/settings/company_details_vm.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/document_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; diff --git a/lib/ui/settings/email_settings_vm.dart b/lib/ui/settings/email_settings_vm.dart index ad20edeef..b1f86d696 100644 --- a/lib/ui/settings/email_settings_vm.dart +++ b/lib/ui/settings/email_settings_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/generated_numbers_vm.dart b/lib/ui/settings/generated_numbers_vm.dart index ad11bacb2..51efbc01d 100644 --- a/lib/ui/settings/generated_numbers_vm.dart +++ b/lib/ui/settings/generated_numbers_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/localization_vm.dart b/lib/ui/settings/localization_vm.dart index 0b318483e..55a842072 100644 --- a/lib/ui/settings/localization_vm.dart +++ b/lib/ui/settings/localization_vm.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; diff --git a/lib/ui/settings/online_payments.dart b/lib/ui/settings/online_payments.dart index c15ec2a16..43e5b64e2 100644 --- a/lib/ui/settings/online_payments.dart +++ b/lib/ui/settings/online_payments.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; diff --git a/lib/ui/settings/online_payments_vm.dart b/lib/ui/settings/online_payments_vm.dart index 351203c5d..384365224 100644 --- a/lib/ui/settings/online_payments_vm.dart +++ b/lib/ui/settings/online_payments_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/task_settings_vm.dart b/lib/ui/settings/task_settings_vm.dart index f0d56a023..f597caa84 100644 --- a/lib/ui/settings/task_settings_vm.dart +++ b/lib/ui/settings/task_settings_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/tax_settings_vm.dart b/lib/ui/settings/tax_settings_vm.dart index cae1c42e2..51568cb74 100644 --- a/lib/ui/settings/tax_settings_vm.dart +++ b/lib/ui/settings/tax_settings_vm.dart @@ -3,6 +3,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/ui/settings/tax_settings.dart'; diff --git a/lib/ui/settings/templates_and_reminders_vm.dart b/lib/ui/settings/templates_and_reminders_vm.dart index a2d9165d8..c878b2d9c 100644 --- a/lib/ui/settings/templates_and_reminders_vm.dart +++ b/lib/ui/settings/templates_and_reminders_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; diff --git a/lib/ui/settings/workflow_settings.dart b/lib/ui/settings/workflow_settings.dart index 5126897bc..ab5bc34f9 100644 --- a/lib/ui/settings/workflow_settings.dart +++ b/lib/ui/settings/workflow_settings.dart @@ -1,7 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; - -import 'package:invoiceninja_flutter/data/models/company_model.dart'; +import 'package:invoiceninja_flutter/data/models/settings_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; diff --git a/lib/ui/subscription/edit/subscription_edit.dart b/lib/ui/subscription/edit/subscription_edit.dart index 1682ae6a5..777b1db1d 100644 --- a/lib/ui/subscription/edit/subscription_edit.dart +++ b/lib/ui/subscription/edit/subscription_edit.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/subscription/edit/subscription_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -19,30 +20,27 @@ class SubscriptionEdit extends StatefulWidget { } class _SubscriptionEditState extends State { - static final GlobalKey _formKey = GlobalKey(debugLabel: '_subscriptionEdit'); + static final GlobalKey _formKey = + GlobalKey(debugLabel: '_subscriptionEdit'); final _debouncer = Debouncer(); // STARTER: controllers - do not remove comment -final _subscriptionsController = TextEditingController(); - + final _subscriptionsController = TextEditingController(); List _controllers = []; @override void didChangeDependencies() { - _controllers = [ // STARTER: array - do not remove comment -_subscriptionsController, - + _subscriptionsController, ]; _controllers.forEach((controller) => controller.removeListener(_onChanged)); final subscription = widget.viewModel.subscription; // STARTER: read value - do not remove comment -_subscriptionsController.text = subscription.subscriptions; - + //_subscriptionsController.text = subscription.subscriptions; _controllers.forEach((controller) => controller.addListener(_onChanged)); @@ -61,15 +59,13 @@ _subscriptionsController.text = subscription.subscriptions; void _onChanged() { _debouncer.run(() { - - final subscription = widget.viewModel.subscription.rebuild((b) => b - // STARTER: set value - do not remove comment -..subscriptions = _subscriptionsController.text.trim() - - ); - if (subscription != widget.viewModel.subscription) { + final subscription = widget.viewModel.subscription.rebuild((b) => b + // STARTER: set value - do not remove comment + //..subscriptions = _subscriptionsController.text.trim() + ); + if (subscription != widget.viewModel.subscription) { widget.viewModel.onChanged(subscription); - } + } }); } @@ -80,46 +76,45 @@ _subscriptionsController.text = subscription.subscriptions; final subscription = viewModel.subscription; return EditScaffold( - title: subscription.isNew ? localization.newSubscription : localization.editSubscription, + title: subscription.isNew + ? localization.newSubscription + : localization.editSubscription, onCancelPressed: (context) => viewModel.onCancelPressed(context), - onSavePressed: (context) { - final bool isValid = _formKey.currentState.validate(); + onSavePressed: (context) { + final bool isValid = _formKey.currentState.validate(); - /* + /* setState(() { _autoValidate = !isValid; }); */ - if (!isValid) { - return; - } + if (!isValid) { + return; + } - viewModel.onSavePressed(context); + viewModel.onSavePressed(context); }, - body:Form( - key: _formKey, - child: Builder(builder: (BuildContext context) { - return ScrollableListView( - children: [ - FormCard( - children: [ - // STARTER: widgets - do not remove comment -TextFormField( -controller: _subscriptionsController, -autocorrect: false, -decoration: InputDecoration( -labelText: 'Subscriptions', -), -), - - ], - ), - ], - ); - }) - ), - + body: Form( + key: _formKey, + child: Builder(builder: (BuildContext context) { + return ScrollableListView( + children: [ + FormCard( + children: [ + // STARTER: widgets - do not remove comment + TextFormField( + controller: _subscriptionsController, + autocorrect: false, + decoration: InputDecoration( + labelText: 'Subscriptions', + ), + ), + ], + ), + ], + ); + })), ); } } diff --git a/lib/ui/subscription/subscription_list_item.dart b/lib/ui/subscription/subscription_list_item.dart index 3ccace10d..74bb90950 100644 --- a/lib/ui/subscription/subscription_list_item.dart +++ b/lib/ui/subscription/subscription_list_item.dart @@ -47,7 +47,9 @@ class SubscriptionListItem extends StatelessWidget { userCompany: state.userCompany, entity: subscription, isSelected: subscription.id == - (uiState.isEditing ? subscriptionUIState.editing.id : subscriptionUIState.selectedId), + (uiState.isEditing + ? subscriptionUIState.editing.id + : subscriptionUIState.selectedId), child: ListTile( onTap: () => onTap != null ? onTap() @@ -73,7 +75,7 @@ class SubscriptionListItem extends StatelessWidget { children: [ Expanded( child: Text( - subscription.name, + subscription.id, style: Theme.of(context).textTheme.headline6, ), ), diff --git a/lib/ui/subscription/subscription_list_vm.dart b/lib/ui/subscription/subscription_list_vm.dart index f33240794..c30f1e6d8 100644 --- a/lib/ui/subscription/subscription_list_vm.dart +++ b/lib/ui/subscription/subscription_list_vm.dart @@ -47,7 +47,8 @@ class SubscriptionListBuilder extends StatelessWidget { user: viewModel.state.user, filter: viewModel.filter, subscription: subscription, - isChecked: isInMultiselect && listState.isSelected(subscription.id), + isChecked: + isInMultiselect && listState.isSelected(subscription.id), ); }); }, @@ -85,23 +86,27 @@ class SubscriptionListVM { final state = store.state; return SubscriptionListVM( - state: state, - userCompany: state.userCompany, - listState: state.subscriptionListState, - subscriptionList: memoizedFilteredSubscriptionList(state.subscriptionState.map, - state.subscriptionState.list, state.subscriptionListState), - subscriptionMap: state.subscriptionState.map, - isLoading: state.isLoading, - filter: state.subscriptionUIState.listUIState.filter, - onEntityAction: - (BuildContext context, List subscriptions, EntityAction action) => + state: state, + userCompany: state.userCompany, + listState: state.subscriptionListState, + subscriptionList: memoizedFilteredSubscriptionList( + state.getUISelection(EntityType.subscription), + state.subscriptionState.map, + state.subscriptionState.list, + state.subscriptionListState, + ), + subscriptionMap: state.subscriptionState.map, + isLoading: state.isLoading, + filter: state.subscriptionUIState.listUIState.filter, + onEntityAction: (BuildContext context, List subscriptions, + EntityAction action) => handleSubscriptionAction(context, subscriptions, action), - onRefreshed: (context) => _handleRefresh(context), - tableColumns: - state.userCompany.settings.getTableColumns(EntityType.subscription) ?? - SubscriptionPresenter.getDefaultTableFields(state.userCompany), - onSortColumn: (field) => store.dispatch(SortSubscriptions(field)), - onClearMultielsect: () => store.dispatch(ClearSubscriptionMultiselect()), + onRefreshed: (context) => _handleRefresh(context), + tableColumns: + state.userCompany.settings.getTableColumns(EntityType.subscription) ?? + SubscriptionPresenter.getDefaultTableFields(state.userCompany), + onSortColumn: (field) => store.dispatch(SortSubscriptions(field)), + onClearMultielsect: () => store.dispatch(ClearSubscriptionMultiselect()), ); } @@ -117,4 +122,4 @@ class SubscriptionListVM { final List tableColumns; final Function(String) onSortColumn; final Function onClearMultielsect; - } +} diff --git a/lib/ui/subscription/subscription_screen.dart b/lib/ui/subscription/subscription_screen.dart index 868f06389..925a208e6 100644 --- a/lib/ui/subscription/subscription_screen.dart +++ b/lib/ui/subscription/subscription_screen.dart @@ -34,7 +34,8 @@ class SubscriptionScreen extends StatelessWidget { return ListScaffold( entityType: EntityType.subscription, - onHamburgerLongPress: () => store.dispatch(StartSubscriptionMultiselect()), + onHamburgerLongPress: () => + store.dispatch(StartSubscriptionMultiselect()), appBarTitle: ListFilter( entityIds: viewModel.subscriptionList, filter: state.subscriptionListState.filter, @@ -46,13 +47,13 @@ class SubscriptionScreen extends StatelessWidget { bottomNavigationBar: AppBottomBar( entityType: EntityType.subscription, tableColumns: SubscriptionPresenter.getAllTableFields(userCompany), - defaultTableColumns: SubscriptionPresenter.getDefaultTableFields(userCompany), + defaultTableColumns: + SubscriptionPresenter.getDefaultTableFields(userCompany), onSelectedSortField: (value) { store.dispatch(SortSubscriptions(value)); }, sortFields: [ - SubscriptionFields.name, - SubscriptionFields.balance, + SubscriptionFields.createdAt, SubscriptionFields.updatedAt, ], onSelectedState: (EntityState state, value) { @@ -65,14 +66,6 @@ class SubscriptionScreen extends StatelessWidget { store.dispatch(StartSubscriptionMultiselect()); } }, - customValues1: company.getCustomFieldValues(CustomFieldType.subscription1, - excludeBlank: true), - customValues2: company.getCustomFieldValues(CustomFieldType.subscription2, - excludeBlank: true), - customValues3: company.getCustomFieldValues(CustomFieldType.subscription3, - excludeBlank: true), - customValues4: company.getCustomFieldValues(CustomFieldType.subscription4, - excludeBlank: true), onSelectedCustom1: (value) => store.dispatch(FilterSubscriptionsByCustom1(value)), onSelectedCustom2: (value) => @@ -82,7 +75,8 @@ class SubscriptionScreen extends StatelessWidget { onSelectedCustom4: (value) => store.dispatch(FilterSubscriptionsByCustom4(value)), ), - floatingActionButton: state.prefState.isMenuFloated && userCompany.canCreate(EntityType.subscription) + floatingActionButton: state.prefState.isMenuFloated && + userCompany.canCreate(EntityType.subscription) ? FloatingActionButton( heroTag: 'subscription_fab', backgroundColor: Theme.of(context).primaryColorDark, diff --git a/lib/ui/subscription/subscription_screen_vm.dart b/lib/ui/subscription/subscription_screen_vm.dart index 4408120ec..c88333a66 100644 --- a/lib/ui/subscription/subscription_screen_vm.dart +++ b/lib/ui/subscription/subscription_screen_vm.dart @@ -47,8 +47,12 @@ class SubscriptionScreenVM { return SubscriptionScreenVM( subscriptionMap: state.subscriptionState.map, - subscriptionList: memoizedFilteredSubscriptionList(state.subscriptionState.map, - state.subscriptionState.list, state.subscriptionListState), + subscriptionList: memoizedFilteredSubscriptionList( + state.getUISelection(EntityType.subscription), + state.subscriptionState.map, + state.subscriptionState.list, + state.subscriptionListState, + ), userCompany: state.userCompany, isInMultiselect: state.subscriptionListState.isInMultiselect(), onEntityAction: (BuildContext context, List subscriptions, diff --git a/lib/ui/subscription/view/subscription_view.dart b/lib/ui/subscription/view/subscription_view.dart index 0f03f0417..a40c200f1 100644 --- a/lib/ui/subscription/view/subscription_view.dart +++ b/lib/ui/subscription/view/subscription_view.dart @@ -1,10 +1,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/subscription/view/subscription_view_vm.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; class SubscriptionView extends StatefulWidget { - const SubscriptionView({ Key key, @required this.viewModel, @@ -28,8 +28,7 @@ class _SubscriptionViewState extends State { isFilter: widget.isFilter, entity: subscription, body: ScrollableListView( - children: [ - ], + children: [], ), ); } diff --git a/stubs/redux/stub/stub_selectors b/stubs/redux/stub/stub_selectors index e9495580d..84be6a57a 100644 --- a/stubs/redux/stub/stub_selectors +++ b/stubs/redux/stub/stub_selectors @@ -1,5 +1,6 @@ import 'package:invoiceninja_flutter/data/models/stub_model.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:memoize/memoize.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -36,9 +37,8 @@ List dropdownStubsSelector(BuiltMap stubMap, return list; } -var memoizedFilteredStubList = memo7(( - String filterEntityId, - EntityType filterEntityType, +var memoizedFilteredStubList = memo6(( + SelectionState selectionState, BuiltMap stubMap, BuiltList stubList, StaticState staticState, @@ -47,13 +47,16 @@ var memoizedFilteredStubList = memo7(( filteredStubsSelector(filterEntityId, filterEntityType, stubMap, stubList, staticState, userMap, stubListState)); List filteredStubsSelector( - String filterEntityId, - EntityType filterEntityType, + SelectionState selectionState, BuiltMap stubMap, BuiltList stubList, StaticState staticState, BuiltMap userMap, ListUIState stubListState) { + + final filterEntityId = selectionState.filterEntityId; + final filterEntityType = selectionState.filterEntityType; + final list = stubList.where((stubId) { final stub = stubMap[stubId]; if (filterEntityId != null && stub.id != filterEntityId) { @@ -77,11 +80,10 @@ List filteredStubsSelector( }).toList(); list.sort((stubAId, stubBId) { - return stubMap[stubAId].compareTo( - stub: stubMap[stubBId], - sortField: stubListState.sortField, - sortAscending: stubListState.sortAscending, - ); + final stubA = stubMap[stubAId]; + final stubB = stubMap[stubBId]; + return clientA.compareTo(stubB, stubListState.sortField, + stubListState.sortAscending, userMap, staticState); }); diff --git a/stubs/ui/stub/edit/stub_edit b/stubs/ui/stub/edit/stub_edit index f0bb657e2..fd7d2745b 100644 --- a/stubs/ui/stub/edit/stub_edit +++ b/stubs/ui/stub/edit/stub_edit @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/stub/edit/stub_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; class StubEdit extends StatefulWidget { const StubEdit({ diff --git a/stubs/ui/stub/view/stub_view b/stubs/ui/stub/view/stub_view index ca35a0331..cd213c122 100644 --- a/stubs/ui/stub/view/stub_view +++ b/stubs/ui/stub/view/stub_view @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/stub/view/stub_view_vm.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart';