diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index 8937c09b7..6e7beb663 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -234,7 +234,7 @@ class FilterClients implements PersistUI { final String filter; } -class SortClients implements PersistUI { +class SortClients implements PersistUI, PersistPrefs { SortClients(this.field); final String field; diff --git a/lib/redux/company_gateway/company_gateway_actions.dart b/lib/redux/company_gateway/company_gateway_actions.dart index 969d6be5a..416412bbb 100644 --- a/lib/redux/company_gateway/company_gateway_actions.dart +++ b/lib/redux/company_gateway/company_gateway_actions.dart @@ -198,7 +198,7 @@ class FilterCompanyGateways implements PersistUI { final String filter; } -class SortCompanyGateways implements PersistUI { +class SortCompanyGateways implements PersistUI, PersistPrefs { SortCompanyGateways(this.field); final String field; diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 5629131d8..c5561c83f 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -347,7 +347,7 @@ class FilterCredits implements PersistUI { final String filter; } -class SortCredits implements PersistUI { +class SortCredits implements PersistUI, PersistPrefs { SortCredits(this.field); final String field; diff --git a/lib/redux/design/design_actions.dart b/lib/redux/design/design_actions.dart index 4f43bb7a4..93f340028 100644 --- a/lib/redux/design/design_actions.dart +++ b/lib/redux/design/design_actions.dart @@ -202,7 +202,7 @@ class FilterDesigns implements PersistUI { final String filter; } -class SortDesigns implements PersistUI { +class SortDesigns implements PersistUI, PersistPrefs { SortDesigns(this.field); final String field; diff --git a/lib/redux/document/document_actions.dart b/lib/redux/document/document_actions.dart index d22c8fba9..2648f88b3 100644 --- a/lib/redux/document/document_actions.dart +++ b/lib/redux/document/document_actions.dart @@ -206,7 +206,7 @@ class FilterDocuments implements PersistUI { final String filter; } -class SortDocuments implements PersistUI { +class SortDocuments implements PersistUI, PersistPrefs { SortDocuments(this.field); final String field; diff --git a/lib/redux/expense/expense_actions.dart b/lib/redux/expense/expense_actions.dart index 523249026..90503c0b7 100644 --- a/lib/redux/expense/expense_actions.dart +++ b/lib/redux/expense/expense_actions.dart @@ -199,7 +199,7 @@ class FilterExpenses implements PersistUI { final String filter; } -class SortExpenses implements PersistUI { +class SortExpenses implements PersistUI, PersistPrefs { SortExpenses(this.field); final String field; diff --git a/lib/redux/expense_category/expense_category_actions.dart b/lib/redux/expense_category/expense_category_actions.dart index cb1b7200e..ea265e361 100644 --- a/lib/redux/expense_category/expense_category_actions.dart +++ b/lib/redux/expense_category/expense_category_actions.dart @@ -202,7 +202,7 @@ class FilterExpenseCategories implements PersistUI { final String filter; } -class SortExpenseCategories implements PersistUI { +class SortExpenseCategories implements PersistUI, PersistPrefs { SortExpenseCategories(this.field); final String field; diff --git a/lib/redux/group/group_actions.dart b/lib/redux/group/group_actions.dart index 4dd68df4a..93f31c7f3 100644 --- a/lib/redux/group/group_actions.dart +++ b/lib/redux/group/group_actions.dart @@ -200,7 +200,7 @@ class FilterGroups implements PersistUI { final String filter; } -class SortGroups implements PersistUI { +class SortGroups implements PersistUI, PersistPrefs { SortGroups(this.field); final String field; diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 2be8fd426..96850d06a 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -410,7 +410,7 @@ class FilterInvoices implements PersistUI { final String filter; } -class SortInvoices implements PersistUI { +class SortInvoices implements PersistUI, PersistPrefs { SortInvoices(this.field); final String field; diff --git a/lib/redux/payment/payment_actions.dart b/lib/redux/payment/payment_actions.dart index 991894283..f4477547e 100644 --- a/lib/redux/payment/payment_actions.dart +++ b/lib/redux/payment/payment_actions.dart @@ -246,7 +246,7 @@ class FilterPayments implements PersistUI { final String filter; } -class SortPayments implements PersistUI { +class SortPayments implements PersistUI, PersistPrefs { SortPayments(this.field); final String field; diff --git a/lib/redux/payment_term/payment_term_actions.dart b/lib/redux/payment_term/payment_term_actions.dart index 83757621f..b0f8b3ddc 100644 --- a/lib/redux/payment_term/payment_term_actions.dart +++ b/lib/redux/payment_term/payment_term_actions.dart @@ -203,7 +203,7 @@ class FilterPaymentTerms implements PersistUI { final String filter; } -class SortPaymentTerms implements PersistUI { +class SortPaymentTerms implements PersistUI, PersistPrefs { SortPaymentTerms(this.field); final String field; diff --git a/lib/redux/product/product_actions.dart b/lib/redux/product/product_actions.dart index 605bd07f4..a15f8c1ba 100644 --- a/lib/redux/product/product_actions.dart +++ b/lib/redux/product/product_actions.dart @@ -188,7 +188,7 @@ class FilterProducts implements PersistUI { final String filter; } -class SortProducts implements PersistUI { +class SortProducts implements PersistUI, PersistPrefs { SortProducts(this.field); final String field; diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index e45c7cde2..857c67b33 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -204,7 +204,7 @@ class FilterProjects implements PersistUI { final String filter; } -class SortProjects implements PersistUI { +class SortProjects implements PersistUI, PersistPrefs { SortProjects(this.field); final String field; diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index d8dfbd943..3b2600e4f 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -347,7 +347,7 @@ class FilterQuotes implements PersistUI { final String filter; } -class SortQuotes implements PersistUI { +class SortQuotes implements PersistUI, PersistPrefs { SortQuotes(this.field); final String field; diff --git a/lib/redux/recurring_invoice/recurring_invoice_actions.dart b/lib/redux/recurring_invoice/recurring_invoice_actions.dart index 0018d5af8..c4ad55377 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_actions.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_actions.dart @@ -308,7 +308,7 @@ class FilterRecurringInvoices implements PersistUI { final String filter; } -class SortRecurringInvoices implements PersistUI { +class SortRecurringInvoices implements PersistUI, PersistPrefs { SortRecurringInvoices(this.field); final String field; diff --git a/lib/redux/subscription/subscription_actions.dart b/lib/redux/subscription/subscription_actions.dart index 74bd9a9ee..f80def456 100644 --- a/lib/redux/subscription/subscription_actions.dart +++ b/lib/redux/subscription/subscription_actions.dart @@ -202,7 +202,7 @@ class FilterSubscriptions implements PersistUI { final String filter; } -class SortSubscriptions implements PersistUI { +class SortSubscriptions implements PersistUI, PersistPrefs { SortSubscriptions(this.field); final String field; diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index 3994968b9..18a8b92dc 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -257,7 +257,7 @@ class FilterTasks implements PersistUI { final String filter; } -class SortTasks implements PersistUI { +class SortTasks implements PersistUI, PersistPrefs { SortTasks(this.field); final String field; diff --git a/lib/redux/task_status/task_status_actions.dart b/lib/redux/task_status/task_status_actions.dart index a5603e011..43f9e467a 100644 --- a/lib/redux/task_status/task_status_actions.dart +++ b/lib/redux/task_status/task_status_actions.dart @@ -202,7 +202,7 @@ class FilterTaskStatuses implements PersistUI { final String filter; } -class SortTaskStatuses implements PersistUI { +class SortTaskStatuses implements PersistUI, PersistPrefs { SortTaskStatuses(this.field); final String field; diff --git a/lib/redux/tax_rate/tax_rate_actions.dart b/lib/redux/tax_rate/tax_rate_actions.dart index 670186b19..2d49a9831 100644 --- a/lib/redux/tax_rate/tax_rate_actions.dart +++ b/lib/redux/tax_rate/tax_rate_actions.dart @@ -196,7 +196,7 @@ class FilterTaxRates implements PersistUI { final String filter; } -class SortTaxRates implements PersistUI { +class SortTaxRates implements PersistUI, PersistPrefs { SortTaxRates(this.field); final String field; diff --git a/lib/redux/token/token_actions.dart b/lib/redux/token/token_actions.dart index 4d231f24d..a632153b8 100644 --- a/lib/redux/token/token_actions.dart +++ b/lib/redux/token/token_actions.dart @@ -215,7 +215,7 @@ class FilterTokens implements PersistUI { final String filter; } -class SortTokens implements PersistUI { +class SortTokens implements PersistUI, PersistPrefs { SortTokens(this.field); final String field; diff --git a/lib/redux/ui/pref_reducer.dart b/lib/redux/ui/pref_reducer.dart index d62a0296e..3eb72a35f 100644 --- a/lib/redux/ui/pref_reducer.dart +++ b/lib/redux/ui/pref_reducer.dart @@ -17,6 +17,7 @@ import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart'; import 'package:invoiceninja_flutter/redux/reports/reports_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/redux/task/task_actions.dart'; +import 'package:invoiceninja_flutter/redux/tax_rate/tax_rate_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/pref_state.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/redux/user/user_actions.dart'; @@ -62,11 +63,86 @@ PrefState prefReducer( ..requireAuthentication = requireAuthenticationReducer(state.requireAuthentication, action) ..colorTheme = colorThemeReducer(state.colorTheme, action) - ..useSidebarEditor - .replace(sidebarEditorReducer(state.useSidebarEditor, action)), + ..useSidebarEditor.replace( + sidebarEditorReducer(state.useSidebarEditor, action), + ) + ..sortFields.replace(sortFieldsReducer(state.sortFields, action)), ); } +BuiltMap _resortFields( + BuiltMap value, + EntityType entityType, + String field) { + final sortField = value[entityType] ?? PrefStateSortField(field); + final directon = sortField.rebuild((b) => b + ..ascending = sortField.field != field || !sortField.ascending + ..field = field); + return value.rebuild((b) => b..[entityType] = directon); +} + +Reducer> sortFieldsReducer = + combineReducers([ + TypedReducer, SortClients>( + (value, action) => _resortFields(value, EntityType.client, action.field)), + TypedReducer, SortProducts>( + (value, action) => + _resortFields(value, EntityType.product, action.field)), + TypedReducer, SortInvoices>( + (value, action) => + _resortFields(value, EntityType.invoice, action.field)), + TypedReducer, SortPayments>( + (value, action) => + _resortFields(value, EntityType.payment, action.field)), + TypedReducer, SortRecurringInvoices>( + (value, action) => + _resortFields(value, EntityType.recurringInvoice, action.field)), + TypedReducer, SortQuotes>( + (value, action) => _resortFields(value, EntityType.quote, action.field)), + TypedReducer, SortCredits>( + (value, action) => _resortFields(value, EntityType.credit, action.field)), + TypedReducer, SortProjects>( + (value, action) => + _resortFields(value, EntityType.project, action.field)), + TypedReducer, SortTasks>( + (value, action) => _resortFields(value, EntityType.task, action.field)), + TypedReducer, SortVendors>( + (value, action) => _resortFields(value, EntityType.vendor, action.field)), + TypedReducer, SortExpenses>( + (value, action) => + _resortFields(value, EntityType.expense, action.field)), + TypedReducer, SortPaymentTerms>( + (value, action) => + _resortFields(value, EntityType.payment, action.field)), + TypedReducer, SortTaxRates>( + (value, action) => + _resortFields(value, EntityType.taxRate, action.field)), + TypedReducer, SortCompanyGateways>( + (value, action) => + _resortFields(value, EntityType.companyGateway, action.field)), + TypedReducer, SortUsers>( + (value, action) => _resortFields(value, EntityType.user, action.field)), + TypedReducer, SortGroups>( + (value, action) => _resortFields(value, EntityType.group, action.field)), + TypedReducer, SortDesigns>( + (value, action) => _resortFields(value, EntityType.design, action.field)), + TypedReducer, SortTokens>( + (value, action) => _resortFields(value, EntityType.token, action.field)), + TypedReducer, SortWebhooks>( + (value, action) => + _resortFields(value, EntityType.webhook, action.field)), + TypedReducer, SortExpenseCategories>( + (value, action) => + _resortFields(value, EntityType.expenseCategory, action.field)), + TypedReducer, SortTaskStatuses>( + (value, action) => + _resortFields(value, EntityType.taskStatus, action.field)), + TypedReducer, SortSubscriptions>( + (value, action) => + _resortFields(value, EntityType.subscription, action.field)), + // TODO add to starter.sh +]); + Reducer> sidebarEditorReducer = combineReducers([ TypedReducer, ToggleEditorLayout>((value, action) { final entityType = action.entityType; diff --git a/lib/redux/ui/pref_state.dart b/lib/redux/ui/pref_state.dart index c7e655b2f..456326657 100644 --- a/lib/redux/ui/pref_state.dart +++ b/lib/redux/ui/pref_state.dart @@ -131,10 +131,10 @@ abstract class PrefState implements Built { abstract class PrefStateSortField implements Built { - factory PrefStateSortField() { + factory PrefStateSortField(String field) { return _$PrefStateSortField._( - field: '', - ascending: false, + field: field ?? '', + ascending: true, ); } diff --git a/lib/redux/user/user_actions.dart b/lib/redux/user/user_actions.dart index 551ca0755..4d90e753d 100644 --- a/lib/redux/user/user_actions.dart +++ b/lib/redux/user/user_actions.dart @@ -290,7 +290,7 @@ class FilterUsers { final String filter; } -class SortUsers implements PersistUI { +class SortUsers implements PersistUI, PersistPrefs { SortUsers(this.field); final String field; diff --git a/lib/redux/vendor/vendor_actions.dart b/lib/redux/vendor/vendor_actions.dart index 4b24cc8be..17194d67c 100644 --- a/lib/redux/vendor/vendor_actions.dart +++ b/lib/redux/vendor/vendor_actions.dart @@ -229,7 +229,7 @@ class FilterVendors implements PersistUI { final String filter; } -class SortVendors implements PersistUI { +class SortVendors implements PersistUI, PersistPrefs { SortVendors(this.field); final String field; diff --git a/lib/redux/webhook/webhook_actions.dart b/lib/redux/webhook/webhook_actions.dart index 83ddbc7d3..886b33d96 100644 --- a/lib/redux/webhook/webhook_actions.dart +++ b/lib/redux/webhook/webhook_actions.dart @@ -205,7 +205,7 @@ class FilterWebhooks implements PersistUI { final String filter; } -class SortWebhooks implements PersistUI { +class SortWebhooks implements PersistUI, PersistPrefs { SortWebhooks(this.field); final String field; diff --git a/stubs/redux/stub/stub_actions b/stubs/redux/stub/stub_actions index 434ed5c92..b0bd3edf5 100644 --- a/stubs/redux/stub/stub_actions +++ b/stubs/redux/stub/stub_actions @@ -210,7 +210,7 @@ class FilterStubs implements PersistUI { final String filter; } -class SortStubs implements PersistUI { +class SortStubs implements PersistUI, PersistPrefs { SortStubs(this.field); final String field;