From 4f05863570315f552d4b1298cb4644c4cb102e50 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 27 Feb 2022 13:03:09 +0200 Subject: [PATCH] Add more actions to the edit screen --- lib/redux/expense/expense_actions.dart | 1 + lib/ui/expense/edit/expense_edit.dart | 4 +- lib/ui/expense/edit/expense_edit_vm.dart | 73 ++++++++++++------- .../edit/recurring_expense_edit_vm.dart | 14 +++- lib/ui/task/edit/task_edit.dart | 42 ++++++----- lib/ui/task/edit/task_edit_vm.dart | 72 +++++++++++------- 6 files changed, 132 insertions(+), 74 deletions(-) diff --git a/lib/redux/expense/expense_actions.dart b/lib/redux/expense/expense_actions.dart index 622a61c5e..cbadec00e 100644 --- a/lib/redux/expense/expense_actions.dart +++ b/lib/redux/expense/expense_actions.dart @@ -260,6 +260,7 @@ void handleExpenseAction( case EntityAction.edit: editEntity(context: context, entity: expense); break; + case EntityAction.clone: case EntityAction.cloneToExpense: createEntity( context: context, diff --git a/lib/ui/expense/edit/expense_edit.dart b/lib/ui/expense/edit/expense_edit.dart index ff6849d0d..682745396 100644 --- a/lib/ui/expense/edit/expense_edit.dart +++ b/lib/ui/expense/edit/expense_edit.dart @@ -96,12 +96,12 @@ 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, + EntityAction.clone, + if (!expense.isRecurring) EntityAction.invoiceExpense, ], - */ 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 e3cbb86b0..29eed501d 100644 --- a/lib/ui/expense/edit/expense_edit_vm.dart +++ b/lib/ui/expense/edit/expense_edit_vm.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart'; import 'package:redux/redux.dart'; // Project imports: @@ -140,37 +141,55 @@ class ExpenseEditVM extends AbstractExpenseEditVM { final expense = store.state.expenseUIState.editing; final localization = navigatorKey.localization; final navigator = navigatorKey.currentState; - final Completer completer = - new Completer(); - store.dispatch( - SaveExpenseRequest(completer: completer, expense: expense)); - return completer.future.then((savedExpense) { - showToast(expense.isNew - ? localization.createdExpense - : localization.updatedExpense); - if (state.prefState.isMobile) { - store.dispatch(UpdateCurrentRoute(ExpenseViewScreen.route)); - if (expense.isNew) { - navigator.pushReplacementNamed(ExpenseViewScreen.route); + if (expense.isOld && + !hasExpenseChanges(expense, state.expenseState.map) && + [ + EntityAction.invoiceExpense, + EntityAction.clone, + ].contains(action)) { + handleEntityAction(expense, action); + } else { + final Completer completer = + new Completer(); + store.dispatch( + SaveExpenseRequest(completer: completer, expense: expense)); + return completer.future.then((savedExpense) { + showToast(expense.isNew + ? localization.createdExpense + : localization.updatedExpense); + + if (state.prefState.isMobile) { + store.dispatch(UpdateCurrentRoute(ExpenseViewScreen.route)); + if (expense.isNew) { + navigator.pushReplacementNamed(ExpenseViewScreen.route); + } else { + navigator.pop(savedExpense); + } } else { - navigator.pop(savedExpense); - } - } else { - viewEntity(entity: savedExpense); + viewEntity(entity: savedExpense); - if (state.prefState.isEditorFullScreen(EntityType.expense)) { - editEntity( - context: navigatorKey.currentContext, entity: savedExpense); + if (state.prefState.isEditorFullScreen(EntityType.expense)) { + editEntity( + context: navigatorKey.currentContext, + entity: savedExpense); + } } - } - }).catchError((Object error) { - showDialog( - context: navigatorKey.currentContext, - builder: (BuildContext context) { - return ErrorDialog(error); - }); - }); + + if ([ + EntityAction.invoiceExpense, + EntityAction.clone, + ].contains(action)) { + handleEntityAction(savedExpense, action); + } + }).catchError((Object error) { + showDialog( + context: navigatorKey.currentContext, + builder: (BuildContext context) { + return ErrorDialog(error); + }); + }); + } }); }, ); 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 80c831710..b9cdc5556 100644 --- a/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart +++ b/lib/ui/recurring_expense/edit/recurring_expense_edit_vm.dart @@ -130,7 +130,11 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM { if (recurringExpense.isOld && !hasRecurringExpenseChanges( recurringExpense, state.recurringExpenseState.map) && - action != null) { + [ + EntityAction.start, + EntityAction.stop, + EntityAction.clone, + ].contains(action)) { handleEntityAction(recurringExpense, action); } else { final Completer completer = @@ -159,6 +163,14 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM { entity: savedRecurringExpense); } } + + if ([ + EntityAction.start, + EntityAction.stop, + EntityAction.clone, + ].contains(action)) { + handleEntityAction(savedRecurringExpense, action); + } }).catchError((Object error) { showDialog( context: context, diff --git a/lib/ui/task/edit/task_edit.dart b/lib/ui/task/edit/task_edit.dart index e8aa10378..ec9e08a0b 100644 --- a/lib/ui/task/edit/task_edit.dart +++ b/lib/ui/task/edit/task_edit.dart @@ -9,8 +9,7 @@ import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/constants.dart'; -import 'package:invoiceninja_flutter/data/models/entities.dart'; -import 'package:invoiceninja_flutter/data/models/task_model.dart'; +import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/app_border.dart'; @@ -71,6 +70,23 @@ class _TaskEditState extends State super.dispose(); } + void _onSavePressed(BuildContext context, [EntityAction action]) { + final bool isValid = _formKey.currentState.validate(); + + /* + setState(() { + autoValidate = !isValid ?? false; + }); + */ + + if (!isValid) { + return; + } + + final viewModel = widget.viewModel; + viewModel.onSavePressed(context, action); + } + @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); @@ -84,21 +100,13 @@ class _TaskEditState extends State entity: task, title: task.isNew ? localization.newTask : localization.editTask, onCancelPressed: (context) => viewModel.onCancelPressed(context), - onSavePressed: (context) { - final bool isValid = _formKey.currentState.validate(); - - /* - setState(() { - autoValidate = !isValid ?? false; - }); - */ - - if (!isValid) { - return; - } - - viewModel.onSavePressed(context); - }, + onSavePressed: (context, [EntityAction action]) => + _onSavePressed(context, action), + actions: [ + EntityAction.invoiceTask, + EntityAction.clone, + ], + onActionPressed: (context, action) => _onSavePressed(context, action), appBarBottom: TabBar( controller: _controller, //isScrollable: true, diff --git a/lib/ui/task/edit/task_edit_vm.dart b/lib/ui/task/edit/task_edit_vm.dart index f3e6a2528..e67b71d95 100644 --- a/lib/ui/task/edit/task_edit_vm.dart +++ b/lib/ui/task/edit/task_edit_vm.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:invoiceninja_flutter/redux/task/task_selectors.dart'; import 'package:redux/redux.dart'; // Project imports: @@ -81,7 +82,7 @@ class TaskEditVM { store.dispatch(AddTaskTime(TaskTime(), showAsRunning: true)); } }, - onSavePressed: (BuildContext context) { + onSavePressed: (BuildContext context, [EntityAction action]) { Debouncer.runOnComplete(() { final task = store.state.taskUIState.editing; final localization = navigatorKey.localization; @@ -94,35 +95,52 @@ class TaskEditVM { }); return null; } - final Completer completer = new Completer(); - store.dispatch(SaveTaskRequest(completer: completer, task: task)); - return completer.future.then((savedTask) { - showToast(task.isNew - ? localization.createdTask - : localization.updatedTask); - if (state.prefState.isMobile) { - store.dispatch(UpdateCurrentRoute(TaskViewScreen.route)); - if (task.isNew) { - navigator.pushReplacementNamed(TaskViewScreen.route); + if (task.isOld && + !hasTaskChanges(task, state.taskState.map) && + [ + EntityAction.invoiceTask, + EntityAction.clone, + ].contains(action)) { + handleEntityAction(task, action); + } else { + final Completer completer = new Completer(); + store.dispatch(SaveTaskRequest(completer: completer, task: task)); + return completer.future.then((savedTask) { + showToast(task.isNew + ? localization.createdTask + : localization.updatedTask); + + if (state.prefState.isMobile) { + store.dispatch(UpdateCurrentRoute(TaskViewScreen.route)); + if (task.isNew) { + navigator.pushReplacementNamed(TaskViewScreen.route); + } else { + navigator.pop(savedTask); + } } else { - navigator.pop(savedTask); - } - } else { - viewEntity(entity: savedTask); + viewEntity(entity: savedTask); - if (state.prefState.isEditorFullScreen(EntityType.task)) { - editEntity( - context: navigatorKey.currentContext, entity: savedTask); + if (state.prefState.isEditorFullScreen(EntityType.task)) { + editEntity( + context: navigatorKey.currentContext, entity: savedTask); + } } - } - }).catchError((Object error) { - showDialog( - context: navigatorKey.currentContext, - builder: (BuildContext context) { - return ErrorDialog(error); - }); - }); + + if ([ + EntityAction.invoiceTask, + EntityAction.clone, + ].contains(action)) { + handleEntityAction(savedTask, action); + } + }).catchError((Object error) { + showDialog( + context: navigatorKey.currentContext, + builder: (BuildContext context) { + return ErrorDialog(error); + }); + }); + } }); }, ); @@ -131,7 +149,7 @@ class TaskEditVM { final TaskEntity task; final int taskTimeIndex; final CompanyEntity company; - final Function(BuildContext) onSavePressed; + final Function(BuildContext, [EntityAction]) onSavePressed; final Function(BuildContext) onCancelPressed; final Function onFabPressed; final bool isLoading;