From da7ac8ebf4589a66bb2da56aecf424213b81c959 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 15 Mar 2022 14:52:13 +0200 Subject: [PATCH] Improve edit page actions --- lib/data/models/expense_model.dart | 23 ++++++----- lib/data/models/invoice_model.dart | 2 +- lib/data/models/models.dart | 11 ++++++ lib/data/models/task_model.dart | 2 +- lib/ui/app/edit_scaffold.dart | 38 +++++++++++-------- lib/ui/credit/edit/credit_edit.dart | 12 +++--- lib/ui/credit/edit/credit_edit_vm.dart | 15 ++------ lib/ui/expense/edit/expense_edit.dart | 12 +++--- lib/ui/expense/edit/expense_edit_vm.dart | 11 ++---- lib/ui/invoice/edit/invoice_edit.dart | 14 +++---- lib/ui/invoice/edit/invoice_edit_vm.dart | 17 ++------- lib/ui/quote/edit/quote_edit_vm.dart | 17 ++------- lib/ui/quote/quote_edit.dart | 15 +++----- .../edit/recurring_expense_edit_vm.dart | 20 ++-------- .../edit/recurring_invoice_edit.dart | 13 +++---- .../edit/recurring_invoice_edit_vm.dart | 21 ++-------- lib/ui/task/edit/task_edit.dart | 12 +++--- lib/ui/task/edit/task_edit_vm.dart | 21 ++-------- 18 files changed, 97 insertions(+), 179 deletions(-) diff --git a/lib/data/models/expense_model.dart b/lib/data/models/expense_model.dart index 6077acf0b..d9775e016 100644 --- a/lib/data/models/expense_model.dart +++ b/lib/data/models/expense_model.dart @@ -351,19 +351,18 @@ abstract class ExpenseEntity extends Object } } - if (userCompany.canCreate(EntityType.expense) && - !multiselect && - !isRecurring) { - actions.add(EntityAction.cloneToExpense); - } + if (!multiselect && isOld) { + if (userCompany.canCreate(EntityType.expense) && !isRecurring) { + actions.add(EntityAction.cloneToExpense); + } - if (userCompany.canCreate(EntityType.recurringExpense) && !multiselect) { - actions.add(EntityAction.cloneToRecurring); - } - if (userCompany.canCreate(EntityType.expense) && - !multiselect && - isRecurring) { - actions.add(EntityAction.cloneToExpense); + if (userCompany.canCreate(EntityType.recurringExpense)) { + actions.add(EntityAction.cloneToRecurring); + } + + if (userCompany.canCreate(EntityType.expense) && isRecurring) { + actions.add(EntityAction.cloneToExpense); + } } if (actions.isNotEmpty && actions.last != null) { diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index dd6d8ad60..ad7776138 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -955,7 +955,7 @@ abstract class InvoiceEntity extends Object actions.add(null); } - if (!multiselect) { + if (!multiselect && isOld) { int countOtherTypes = 0; if (userCompany.canCreate(EntityType.invoice)) { countOtherTypes++; diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index e64d5a64c..f275aefe8 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -115,6 +115,17 @@ class EntityAction extends EnumClass { bool get isEmail => toString().startsWith('email'); + bool get isServerSide => [ + EntityAction.start, + EntityAction.stop, + EntityAction.markPaid, + EntityAction.markSent, + EntityAction.convertToInvoice, + EntityAction.approve, + ].contains(this); + + bool get isClientSide => !isServerSide; + String toApiParam() { final value = toString(); diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 9248757ae..9742d336b 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -606,7 +606,7 @@ abstract class TaskEntity extends Object } } - if (!multiselect) { + if (!multiselect && isOld) { if (userCompany.canCreate(EntityType.task)) { actions.add(EntityAction.clone); } diff --git a/lib/ui/app/edit_scaffold.dart b/lib/ui/app/edit_scaffold.dart index 1dc146e21..552e1455f 100644 --- a/lib/ui/app/edit_scaffold.dart +++ b/lib/ui/app/edit_scaffold.dart @@ -179,23 +179,29 @@ class EditScaffold extends StatelessWidget { //size: iconSize, //color: color, ), - itemBuilder: (BuildContext context) => actions - .map((action) => PopupMenuItem( - child: Row( - children: [ - Icon( - getEntityActionIcon(action), - color: - Theme.of(context).colorScheme.secondary, + itemBuilder: (BuildContext context) => + >[ + ...actions + .map((action) => action == null + ? PopupMenuDivider() + : PopupMenuItem( + child: Row( + children: [ + Icon( + getEntityActionIcon(action), + color: Theme.of(context) + .colorScheme + .secondary, + ), + SizedBox(width: 16.0), + Text(AppLocalization.of(context) + .lookup(action.toString())), + ], ), - SizedBox(width: 16.0), - Text(AppLocalization.of(context) - .lookup(action.toString())), - ], - ), - value: action, - )) - .toList(), + value: action, + )) + .toList() + ], onSelected: (action) => onActionPressed(context, action), enabled: isEnabled, ) diff --git a/lib/ui/credit/edit/credit_edit.dart b/lib/ui/credit/edit/credit_edit.dart index b8aba54c9..f6749a3e2 100644 --- a/lib/ui/credit/edit/credit_edit.dart +++ b/lib/ui/credit/edit/credit_edit.dart @@ -88,6 +88,7 @@ class _CreditEditState extends State final state = viewModel.state; final prefState = state.prefState; final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice); + final client = state.clientState.get(invoice.clientId); return EditScaffold( isFullscreen: isFullscreen, @@ -95,13 +96,10 @@ class _CreditEditState extends State title: invoice.isNew ? localization.newCredit : localization.editCredit, onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context) => _onSavePressed(context), - actions: [ - EntityAction.viewPdf, - EntityAction.download, - EntityAction.emailCredit, - if (!invoice.isSent) EntityAction.markSent, - if (invoice.isOld) EntityAction.clone, - ], + actions: invoice.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/credit/edit/credit_edit_vm.dart b/lib/ui/credit/edit/credit_edit_vm.dart index 927c82a25..46eec4036 100644 --- a/lib/ui/credit/edit/credit_edit_vm.dart +++ b/lib/ui/credit/edit/credit_edit_vm.dart @@ -94,12 +94,8 @@ class CreditEditVM extends AbstractInvoiceEditVM { if (credit.isOld && !hasCreditChanges(credit, state.creditState.map) && - [ - EntityAction.emailCredit, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(credit, action); } else { final Completer completer = @@ -131,12 +127,7 @@ class CreditEditVM extends AbstractInvoiceEditVM { } } - if ([ - EntityAction.emailCredit, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedCredit, action); } }).catchError((Object error) { diff --git a/lib/ui/expense/edit/expense_edit.dart b/lib/ui/expense/edit/expense_edit.dart index 86902684b..25ef5b68d 100644 --- a/lib/ui/expense/edit/expense_edit.dart +++ b/lib/ui/expense/edit/expense_edit.dart @@ -77,6 +77,7 @@ class _ExpenseEditState extends State final expense = viewModel.expense; final state = viewModel.state; final store = StoreProvider.of(context); + final client = state.clientState.get(expense.clientId); final prefState = state.prefState; final isFullscreen = prefState.isEditorFullScreen(EntityType.expense); final footer = localization.expenseTotal + @@ -96,13 +97,10 @@ class _ExpenseEditState extends State : localization.editExpense), onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context) => _onSavePressed(context), - actions: [ - if (expense.isRecurring) - if (expense.isRunning) EntityAction.stop else EntityAction.start, - if (expense.isOld) EntityAction.clone, - if (!expense.isRecurring && !expense.isInvoiced) - EntityAction.invoiceExpense, - ], + actions: expense.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/expense/edit/expense_edit_vm.dart b/lib/ui/expense/edit/expense_edit_vm.dart index 29eed501d..9208c75f4 100644 --- a/lib/ui/expense/edit/expense_edit_vm.dart +++ b/lib/ui/expense/edit/expense_edit_vm.dart @@ -144,10 +144,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM { if (expense.isOld && !hasExpenseChanges(expense, state.expenseState.map) && - [ - EntityAction.invoiceExpense, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(expense, action); } else { final Completer completer = @@ -176,10 +174,7 @@ class ExpenseEditVM extends AbstractExpenseEditVM { } } - if ([ - EntityAction.invoiceExpense, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedExpense, action); } }).catchError((Object error) { diff --git a/lib/ui/invoice/edit/invoice_edit.dart b/lib/ui/invoice/edit/invoice_edit.dart index 90e711df0..002640ee3 100644 --- a/lib/ui/invoice/edit/invoice_edit.dart +++ b/lib/ui/invoice/edit/invoice_edit.dart @@ -110,6 +110,7 @@ class _InvoiceEditState extends State final viewModel = widget.viewModel; final invoice = viewModel.invoice; final state = viewModel.state; + final client = state.clientState.get(invoice.clientId); final prefState = state.prefState; final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice); @@ -119,15 +120,10 @@ class _InvoiceEditState extends State title: invoice.isNew ? localization.newInvoice : localization.editInvoice, onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context) => _onSavePressed(context), - actions: [ - EntityAction.viewPdf, - EntityAction.download, - EntityAction.emailInvoice, - if (!invoice.isSent) EntityAction.markSent, - if (!invoice.isPaid) EntityAction.markPaid, - if (!invoice.isPaid) EntityAction.newPayment, - if (invoice.isOld) EntityAction.clone, - ], + actions: invoice.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/invoice/edit/invoice_edit_vm.dart b/lib/ui/invoice/edit/invoice_edit_vm.dart index eda894088..da3f76019 100644 --- a/lib/ui/invoice/edit/invoice_edit_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_vm.dart @@ -143,13 +143,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM { if (invoice.isOld && !hasInvoiceChanges(invoice, state.invoiceState.map) && - [ - EntityAction.newPayment, - EntityAction.emailInvoice, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(invoice, action); } else { final Completer completer = @@ -181,13 +176,7 @@ class InvoiceEditVM extends AbstractInvoiceEditVM { } } - if ([ - EntityAction.newPayment, - EntityAction.emailInvoice, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedInvoice, action); } }).catchError((Object error) { diff --git a/lib/ui/quote/edit/quote_edit_vm.dart b/lib/ui/quote/edit/quote_edit_vm.dart index 543445224..0afa45930 100644 --- a/lib/ui/quote/edit/quote_edit_vm.dart +++ b/lib/ui/quote/edit/quote_edit_vm.dart @@ -93,13 +93,8 @@ class QuoteEditVM extends AbstractInvoiceEditVM { } if (quote.isOld && !hasQuoteChanges(quote, state.quoteState.map) && - [ - EntityAction.emailQuote, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.viewInvoice, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(quote, action); } else { final Completer completer = @@ -130,13 +125,7 @@ class QuoteEditVM extends AbstractInvoiceEditVM { } } - if ([ - EntityAction.emailQuote, - EntityAction.viewPdf, - EntityAction.download, - EntityAction.viewInvoice, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedQuote, action); } }).catchError((Object error) { diff --git a/lib/ui/quote/quote_edit.dart b/lib/ui/quote/quote_edit.dart index a4db81bff..f1bb3b884 100644 --- a/lib/ui/quote/quote_edit.dart +++ b/lib/ui/quote/quote_edit.dart @@ -87,6 +87,7 @@ class _QuoteEditState extends State final invoice = viewModel.invoice; final state = viewModel.state; final prefState = state.prefState; + final client = state.clientState.get(invoice.clientId); final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice); return EditScaffold( @@ -95,16 +96,10 @@ class _QuoteEditState extends State title: invoice.isNew ? localization.newQuote : localization.editQuote, onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context) => _onSavePressed(context), - actions: [ - EntityAction.viewPdf, - EntityAction.download, - EntityAction.emailQuote, - if (!invoice.isSent) EntityAction.markSent, - invoice.invoiceId.isEmpty - ? EntityAction.convertToInvoice - : EntityAction.viewInvoice, - if (invoice.isOld) EntityAction.clone, - ], + actions: invoice.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart b/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart index 992eb62c3..450202e30 100644 --- a/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart +++ b/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart @@ -130,15 +130,9 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM { if (recurringExpense.isOld && !hasRecurringExpenseChanges( recurringExpense, state.recurringExpenseState.map) && - [ - EntityAction.start, - EntityAction.stop, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(recurringExpense, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: recurringExpense, force: true); - } } else { final Completer completer = new Completer(); @@ -167,16 +161,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM { } } - if ([ - EntityAction.start, - EntityAction.stop, - EntityAction.clone, - EntityAction.viewPdf, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedRecurringExpense, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: savedRecurringExpense, force: true); - } } }).catchError((Object error) { showDialog( diff --git a/lib/ui/recurring_invoice/edit/recurring_invoice_edit.dart b/lib/ui/recurring_invoice/edit/recurring_invoice_edit.dart index 7a667e5f4..e9b8d148c 100644 --- a/lib/ui/recurring_invoice/edit/recurring_invoice_edit.dart +++ b/lib/ui/recurring_invoice/edit/recurring_invoice_edit.dart @@ -87,6 +87,7 @@ class _RecurringInvoiceEditState extends State final state = viewModel.state; final invoice = viewModel.invoice; final prefState = state.prefState; + final client = state.clientState.get(invoice.clientId); final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice); return EditScaffold( @@ -97,14 +98,10 @@ class _RecurringInvoiceEditState extends State : localization.editRecurringInvoice, onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context) => _onSavePressed(context), - actions: [ - if (!recurringInvoice.isRunning) - EntityAction.start - else - EntityAction.stop, - EntityAction.viewPdf, - if (invoice.isOld) EntityAction.clone, - ], + actions: invoice.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/recurring_invoice/edit/recurring_invoice_edit_vm.dart b/lib/ui/recurring_invoice/edit/recurring_invoice_edit_vm.dart index baa37ca52..13bf328db 100644 --- a/lib/ui/recurring_invoice/edit/recurring_invoice_edit_vm.dart +++ b/lib/ui/recurring_invoice/edit/recurring_invoice_edit_vm.dart @@ -95,16 +95,9 @@ class RecurringInvoiceEditVM extends AbstractInvoiceEditVM { if (recurringInvoice.isOld && !hasRecurringInvoiceChanges( recurringInvoice, state.recurringInvoiceState.map) && - [ - EntityAction.start, - EntityAction.stop, - EntityAction.viewPdf, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(recurringInvoice, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: recurringInvoice, force: true); - } } else { final Completer completer = Completer(); @@ -136,16 +129,8 @@ class RecurringInvoiceEditVM extends AbstractInvoiceEditVM { } } - if ([ - EntityAction.start, - EntityAction.stop, - EntityAction.viewPdf, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedRecurringInvoice, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: savedRecurringInvoice, force: true); - } } }).catchError((Object error) { showDialog( diff --git a/lib/ui/task/edit/task_edit.dart b/lib/ui/task/edit/task_edit.dart index 82b286757..147b3456d 100644 --- a/lib/ui/task/edit/task_edit.dart +++ b/lib/ui/task/edit/task_edit.dart @@ -93,6 +93,7 @@ class _TaskEditState extends State final viewModel = widget.viewModel; final task = viewModel.task; final state = viewModel.state; + final client = state.clientState.get(task.clientId); final isFullscreen = state.prefState.isEditorFullScreen(EntityType.task); return EditScaffold( @@ -102,13 +103,10 @@ class _TaskEditState extends State onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: (context, [EntityAction action]) => _onSavePressed(context, action), - actions: [ - if (!task.isInvoiced) ...[ - task.isRunning ? EntityAction.stop : EntityAction.start, - EntityAction.invoiceTask, - ], - if (task.isOld) EntityAction.clone, - ], + actions: task.getActions( + userCompany: state.userCompany, + client: client, + ), onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, diff --git a/lib/ui/task/edit/task_edit_vm.dart b/lib/ui/task/edit/task_edit_vm.dart index 3f57c54ee..36663daa2 100644 --- a/lib/ui/task/edit/task_edit_vm.dart +++ b/lib/ui/task/edit/task_edit_vm.dart @@ -98,16 +98,9 @@ class TaskEditVM { if (task.isOld && !hasTaskChanges(task, state.taskState.map) && - [ - EntityAction.start, - EntityAction.stop, - EntityAction.invoiceTask, - EntityAction.clone, - ].contains(action)) { + action != null && + action.isClientSide) { handleEntityAction(task, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: task, force: true); - } } else { final Completer completer = new Completer(); store.dispatch(SaveTaskRequest(completer: completer, task: task)); @@ -132,16 +125,8 @@ class TaskEditVM { } } - if ([ - EntityAction.start, - EntityAction.stop, - EntityAction.invoiceTask, - EntityAction.clone, - ].contains(action)) { + if (action != null && action.isClientSide) { handleEntityAction(savedTask, action); - if ([EntityAction.start, EntityAction.stop].contains(action)) { - viewEntity(entity: task, force: true); - } } }).catchError((Object error) { showDialog(