diff --git a/analysis_options.yaml b/analysis_options.yaml index 2e396b911..d79ad7336 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -45,6 +45,7 @@ linter: # - prefer_const_literals_to_create_immutables # - avoid_classes_with_only_static_members # - avoid_function_literals_in_foreach_calls + # - avoid_field_initializers_in_const_classes # these rules are documented on and in the same order as # the Dart Lint rules page to make maintenance easier # https://github.com/dart-lang/linter/blob/master/example/all.yaml @@ -61,7 +62,6 @@ linter: # - avoid_catching_errors # we do this commonly # - avoid_double_and_int_checks # only useful when targeting JS runtime - avoid_empty_else - - avoid_field_initializers_in_const_classes - avoid_init_to_null # - avoid_js_rounded_ints # only useful when targeting JS runtime - avoid_null_checks_in_equality_operators diff --git a/lib/redux/client/client_middleware.dart b/lib/redux/client/client_middleware.dart index 7c44c95cf..c06742e2e 100644 --- a/lib/redux/client/client_middleware.dart +++ b/lib/redux/client/client_middleware.dart @@ -3,7 +3,6 @@ import 'package:flutter/widgets.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/product/product_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; -import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/client/client_screen.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; @@ -63,14 +62,7 @@ Middleware _viewClient() { next(action); store.dispatch(UpdateCurrentRoute(ClientViewScreen.route)); - final message = await Navigator.of(action.context).pushNamed(ClientViewScreen.route); - - /* - Scaffold.of(action.context).showSnackBar(SnackBar( - content: SnackBarRow( - message: message, - ))); - */ + Navigator.of(action.context).pushNamed(ClientViewScreen.route); }; } diff --git a/lib/redux/invoice/invoice_middleware.dart b/lib/redux/invoice/invoice_middleware.dart index fd1bba02c..f39b07536 100644 --- a/lib/redux/invoice/invoice_middleware.dart +++ b/lib/redux/invoice/invoice_middleware.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; -import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; @@ -44,14 +43,7 @@ Middleware _viewInvoice() { next(action); store.dispatch(UpdateCurrentRoute(InvoiceViewScreen.route)); - final message = await Navigator.of(action.context).pushNamed(InvoiceViewScreen.route); - - /* - Scaffold.of(action.context).showSnackBar(SnackBar( - content: SnackBarRow( - message: message, - ))); - */ + await Navigator.of(action.context).pushNamed(InvoiceViewScreen.route); }; } @@ -69,14 +61,12 @@ Middleware _editInvoice() { next(action); store.dispatch(UpdateCurrentRoute(InvoiceEditScreen.route)); - final message = await Navigator.of(action.context).pushNamed(InvoiceEditScreen.route); + final invoice = await Navigator.of(action.context).pushNamed(InvoiceEditScreen.route); + + if (action.completer != null) { + action.completer.complete(invoice); + } - /* - Scaffold.of(action.context).showSnackBar(SnackBar( - content: SnackBarRow( - message: message, - ))); - */ }; } diff --git a/lib/redux/product/product_middleware.dart b/lib/redux/product/product_middleware.dart index 08bef30ed..1c8ab639c 100644 --- a/lib/redux/product/product_middleware.dart +++ b/lib/redux/product/product_middleware.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; -import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/product/edit/product_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/product/product_screen.dart'; import 'package:redux/redux.dart'; @@ -36,14 +35,7 @@ Middleware _editProduct() { next(action); store.dispatch(UpdateCurrentRoute(ProductEditScreen.route)); - final message = await Navigator.of(action.context).pushNamed(ProductEditScreen.route); - - /* - Scaffold.of(action.context).showSnackBar(SnackBar( - content: SnackBarRow( - message: message, - ))); - */ + Navigator.of(action.context).pushNamed(ProductEditScreen.route); }; } diff --git a/lib/ui/client/edit/client_edit_vm.dart b/lib/ui/client/edit/client_edit_vm.dart index fe9ef5af8..faf8870e1 100644 --- a/lib/ui/client/edit/client_edit_vm.dart +++ b/lib/ui/client/edit/client_edit_vm.dart @@ -6,7 +6,6 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; -import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/client/client_screen.dart'; @@ -102,28 +101,16 @@ class ClientEditVM { store.dispatch( SaveClientRequest(completer: completer, client: client)); return completer.future.then((savedClient) { - final localization = AppLocalization.of(context); + //final localization = AppLocalization.of(context); if (client.isNew) { if (store.state.uiState.currentRoute == InvoiceEditScreen.route) { - /* - final invoice = store.state.invoiceUIState.editing; - invoice.rebuild((b) => b - ..clientId = client.id - ); - store.dispatch(UpdateInvoice(invoice)); - */ Navigator.of(context).pop(savedClient); } else { Navigator.of(context).pushReplacementNamed( ClientViewScreen.route); } - /* - Navigator.of(context).pop(localization.successfullyCreatedClient); - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => ClientViewScreen())); - */ } else { - Navigator.of(context).pop(localization.successfullyUpdatedClient); + Navigator.of(context).pop(savedClient); } }).catchError((Object error) { showDialog( diff --git a/lib/ui/client/view/client_view.dart b/lib/ui/client/view/client_view.dart index bce0b0faf..ad8fa179e 100644 --- a/lib/ui/client/view/client_view.dart +++ b/lib/ui/client/view/client_view.dart @@ -53,34 +53,10 @@ class _ClientViewState extends State }, child: Scaffold( backgroundColor: Theme.of(context).backgroundColor, - appBar: AppBar( - title: Text( - client.displayName ?? ''), // Text(localizations.clientDetails), - bottom: TabBar( - controller: _controller, - //isScrollable: true, - tabs: [ - Tab( - text: localization.overview, - ), - Tab( - text: localization.details, - ), - ], - ), - actions: client.isNew - ? [] - : [ - EditIconButton( - isVisible: !client.isDeleted, - onPressed: () => viewModel.onEditPressed(context), - ), - ActionMenuButton( - isSaving: viewModel.isSaving, - entity: client, - onSelected: viewModel.onActionSelected, - ) - ], + appBar: CustomAppBar( + viewModel: viewModel, + client: client, + controller: _controller, ), body: TabBarView( controller: _controller, @@ -145,3 +121,53 @@ class _ClientViewState extends State ); } } + +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + const CustomAppBar({ + @required this.client, + @required this.viewModel, + @required this.controller, + }); + + final ClientViewVM viewModel; + final ClientEntity client; + final TabController controller; + + @override + final Size preferredSize = const Size(double.infinity, 100.0); + + @override + Widget build(BuildContext context) { + final localization = AppLocalization.of(context); + + return AppBar( + title: Text( + client.displayName ?? ''), // Text(localizations.clientDetails), + bottom: TabBar( + controller: controller, + //isScrollable: true, + tabs: [ + Tab( + text: localization.overview, + ), + Tab( + text: localization.details, + ), + ], + ), + actions: client.isNew + ? [] + : [ + EditIconButton( + isVisible: !client.isDeleted, + onPressed: () => viewModel.onEditPressed(context), + ), + ActionMenuButton( + isSaving: viewModel.isSaving, + entity: client, + onSelected: viewModel.onActionSelected, + ) + ], + ); + } +} diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index 6b843d5a2..87eef362d 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -64,7 +64,15 @@ class ClientViewVM { client: client, company: state.selectedCompany, onEditPressed: (BuildContext context) { - store.dispatch(EditClient(client: client, context: context)); + final Completer completer = new Completer(); + store.dispatch(EditClient(client: client, context: context, completer: completer)); + completer.future.then((client) { + Scaffold.of(context).showSnackBar(SnackBar( + content: SnackBarRow( + message: AppLocalization.of(context).successfullyUpdatedClient, + ) + )); + }); }, onInvoicesPressed: (BuildContext context) { store.dispatch(FilterInvoicesByClient(client.id));