diff --git a/lib/redux/client/client_middleware.dart b/lib/redux/client/client_middleware.dart index a76bd8b34..c38d1362d 100644 --- a/lib/redux/client/client_middleware.dart +++ b/lib/redux/client/client_middleware.dart @@ -46,9 +46,13 @@ Middleware _editClient() { next(action); + store.dispatch(UpdateCurrentRoute(ClientEditScreen.route)); + + /* if (action.trackRoute) { store.dispatch(UpdateCurrentRoute(ClientEditScreen.route)); } + */ if (isMobile(action.context)) { Navigator.of(action.context).pushNamed(ClientEditScreen.route); @@ -166,14 +170,16 @@ Middleware _saveClient(ClientRepository repository) { .then((ClientEntity client) { if (action.client.isNew) { store.dispatch(AddClientSuccess(client)); - final clientUIState = store.state.clientUIState; - if (clientUIState.saveCompleter != null) { - clientUIState.saveCompleter.complete(client); - } } else { store.dispatch(SaveClientSuccess(client)); } + action.completer.complete(client); + + final clientUIState = store.state.clientUIState; + if (clientUIState.saveCompleter != null) { + clientUIState.saveCompleter.complete(client); + } }).catchError((Object error) { print(error); store.dispatch(SaveClientFailure(error)); diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 05b96b524..45e2c7a0a 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -13,25 +13,28 @@ import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:flutter/material.dart'; class ViewQuoteList implements PersistUI { - ViewQuoteList(this.context); + ViewQuoteList({this.context, this.force = false}); final BuildContext context; + final bool force; } class ViewQuote implements PersistUI { - ViewQuote({this.quoteId, this.context}); + ViewQuote({this.quoteId, this.context, this.force = false}); final int quoteId; final BuildContext context; + final bool force; } class EditQuote implements PersistUI { - EditQuote({this.quote, this.context, this.completer, this.quoteItem}); + EditQuote({this.quote, this.context, this.completer, this.quoteItem, this.force = false}); final InvoiceEntity quote; final InvoiceItemEntity quoteItem; final BuildContext context; final Completer completer; + final bool force; } class ShowEmailQuote { diff --git a/lib/ui/app/app_drawer.dart b/lib/ui/app/app_drawer.dart index 7f412cf41..0485dc770 100644 --- a/lib/ui/app/app_drawer.dart +++ b/lib/ui/app/app_drawer.dart @@ -251,7 +251,7 @@ class AppDrawer extends StatelessWidget { entityType: EntityType.quote, icon: getEntityIcon(EntityType.quote), title: localization.quotes, - onTap: () => store.dispatch(ViewQuoteList(context)), + onTap: () => store.dispatch(ViewQuoteList(context: context)), onCreateTap: () { if (isMobile(context)) { navigator.pop(); diff --git a/lib/ui/app/entity_dropdown.dart b/lib/ui/app/entity_dropdown.dart index e20a517c9..acbefb127 100644 --- a/lib/ui/app/entity_dropdown.dart +++ b/lib/ui/app/entity_dropdown.dart @@ -1,5 +1,4 @@ import 'dart:async'; - import 'package:built_collection/built_collection.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; diff --git a/lib/ui/client/edit/client_edit_vm.dart b/lib/ui/client/edit/client_edit_vm.dart index 60826e52d..153657d15 100644 --- a/lib/ui/client/edit/client_edit_vm.dart +++ b/lib/ui/client/edit/client_edit_vm.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/ui/client/client_screen.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:redux/redux.dart'; class ClientEditScreen extends StatelessWidget { @@ -110,11 +111,13 @@ class ClientEditVM { if (state.uiState.currentRoute.contains(ClientScreen.route)) { store.dispatch(UpdateCurrentRoute(ClientViewScreen.route)); } - if (client.isNew && state.clientUIState.saveCompleter == null) { - Navigator.of(context) - .pushReplacementNamed(ClientViewScreen.route); - } else { - Navigator.of(context).pop(savedClient); + if (isMobile(context)) { + if (client.isNew && state.clientUIState.saveCompleter == null) { + Navigator.of(context) + .pushReplacementNamed(ClientViewScreen.route); + } else { + Navigator.of(context).pop(savedClient); + } } }).catchError((Object error) { showDialog( diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index 7ef923cc2..5642d0f0e 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -111,7 +111,7 @@ class ClientViewVM { } else { store.dispatch(FilterQuotesByEntity( entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewQuoteList(context)); + store.dispatch(ViewQuoteList(context: context)); } break; case EntityType.payment: diff --git a/lib/ui/invoice/edit/invoice_edit.dart b/lib/ui/invoice/edit/invoice_edit.dart index 2e102f978..167d8fc5a 100644 --- a/lib/ui/invoice/edit/invoice_edit.dart +++ b/lib/ui/invoice/edit/invoice_edit.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/quote/edit/quote_edit_notes_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/action_icon_button.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; class InvoiceEdit extends StatefulWidget { const InvoiceEdit({ @@ -73,6 +74,14 @@ class _InvoiceEditState extends State ? localization.editQuote : localization.editInvoice), actions: [ + if (!isMobile(context)) + FlatButton( + child: Text( + localization.cancel, + style: TextStyle(color: Colors.white), + ), + onPressed: () => viewModel.onCancelPressed(context), + ), ActionIconButton( icon: Icons.cloud_upload, tooltip: localization.save, diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 4e1594bf0..b778d2a8e 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -1,8 +1,12 @@ +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_selectors.dart'; +import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; +import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; @@ -152,6 +156,10 @@ class InvoiceEditDetailsState extends State { }, onAddPressed: (completer) { viewModel.onAddClientPressed(context, completer); + completer.future.then((client) { + final store = StoreProvider.of(context); + store.dispatch(UpdateCurrentRoute(InvoiceEditScreen.route)); + }); }, ) : TextFormField( diff --git a/lib/ui/invoice/edit/invoice_edit_details_vm.dart b/lib/ui/invoice/edit/invoice_edit_details_vm.dart index 55e2025af..030cf6219 100644 --- a/lib/ui/invoice/edit/invoice_edit_details_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_details_vm.dart @@ -84,6 +84,7 @@ class InvoiceEditDetailsVM extends EntityEditDetailsVM { client: ClientEntity(), context: context, completer: completer, + force: true, trackRoute: false)); completer.future.then((SelectableEntity client) { Scaffold.of(context).showSnackBar(SnackBar( diff --git a/lib/ui/invoice/edit/invoice_edit_vm.dart b/lib/ui/invoice/edit/invoice_edit_vm.dart index 510cefe8d..d77c2cce6 100644 --- a/lib/ui/invoice/edit/invoice_edit_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_vm.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:redux/redux.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; @@ -43,6 +44,7 @@ class EntityEditVM { @required this.onItemsAdded, @required this.onBackPressed, @required this.isSaving, + @required this.onCancelPressed, }); final AppState state; @@ -54,6 +56,7 @@ class EntityEditVM { final Function(List, int) onItemsAdded; final Function onBackPressed; final bool isSaving; + final Function(BuildContext) onCancelPressed; } class InvoiceEditVM extends EntityEditVM { @@ -67,6 +70,7 @@ class InvoiceEditVM extends EntityEditVM { Function(List, int) onItemsAdded, Function onBackPressed, bool isSaving, + Function(BuildContext) onCancelPressed, }) : super( state: state, company: company, @@ -77,6 +81,7 @@ class InvoiceEditVM extends EntityEditVM { onItemsAdded: onItemsAdded, onBackPressed: onBackPressed, isSaving: isSaving, + onCancelPressed: onCancelPressed, ); factory InvoiceEditVM.fromStore(Store store) { @@ -102,10 +107,13 @@ class InvoiceEditVM extends EntityEditVM { SaveInvoiceRequest(completer: completer, invoice: invoice)); return completer.future.then((savedInvoice) { store.dispatch(UpdateCurrentRoute(InvoiceViewScreen.route)); - if (invoice.isNew) { - Navigator.of(context).pushReplacementNamed(InvoiceViewScreen.route); - } else { - Navigator.of(context).pop(savedInvoice); + if (isMobile(context)) { + if (invoice.isNew) { + Navigator.of(context) + .pushReplacementNamed(InvoiceViewScreen.route); + } else { + Navigator.of(context).pop(savedInvoice); + } } }).catchError((Object error) { showDialog( @@ -126,6 +134,16 @@ class InvoiceEditVM extends EntityEditVM { store.dispatch(EditInvoiceItem(items[0])); } }, + onCancelPressed: (BuildContext context) { + store.dispatch(EditInvoice( + invoice: InvoiceEntity(), context: context, force: true)); + if (invoice.isNew) { + store.dispatch(ViewInvoiceList(context: context, force: true)); + } else { + store.dispatch(ViewInvoice( + context: context, invoiceId: invoice.id, force: true)); + } + }, ); } } diff --git a/lib/ui/quote/edit/quote_edit_vm.dart b/lib/ui/quote/edit/quote_edit_vm.dart index 97346197a..e40590ffa 100644 --- a/lib/ui/quote/edit/quote_edit_vm.dart +++ b/lib/ui/quote/edit/quote_edit_vm.dart @@ -44,6 +44,7 @@ class QuoteEditVM extends EntityEditVM { Function(List, int) onItemsAdded, Function onBackPressed, bool isSaving, + Function(BuildContext) onCancelPressed, }) : super( state: state, company: company, @@ -54,6 +55,7 @@ class QuoteEditVM extends EntityEditVM { onItemsAdded: onItemsAdded, onBackPressed: onBackPressed, isSaving: isSaving, + onCancelPressed: onCancelPressed, ); factory QuoteEditVM.fromStore(Store store) { @@ -96,6 +98,16 @@ class QuoteEditVM extends EntityEditVM { } store.dispatch(AddQuoteItems(items)); }, + onCancelPressed: (BuildContext context) { + store.dispatch( + EditQuote(quote: InvoiceEntity(), context: context, force: true)); + if (quote.isNew) { + store.dispatch(ViewQuoteList(context: context, force: true)); + } else { + store.dispatch( + ViewQuote(context: context, quoteId: quote.id, force: true)); + } + }, ); } }