diff --git a/lib/ui/app/app_scaffold.dart b/lib/ui/app/app_scaffold.dart index b7880e05d..b7f171fde 100644 --- a/lib/ui/app/app_scaffold.dart +++ b/lib/ui/app/app_scaffold.dart @@ -1,23 +1,28 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_actions.dart'; +import 'package:invoiceninja_flutter/redux/ui/ui_state.dart'; import 'package:invoiceninja_flutter/ui/app/app_bottom_bar.dart'; +import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'app_drawer_vm.dart'; class AppScaffold extends StatelessWidget { - const AppScaffold( - {@required this.appBar, - @required this.body, - @required this.bottomNavigationBar, - @required this.floatingActionButton}); + const AppScaffold({@required this.appBarTitle, + @required this.appBarActions, + @required this.body, + @required this.bottomNavigationBar, + @required this.floatingActionButton}); - final AppBar appBar; final Widget body; final AppBottomBar bottomNavigationBar; final FloatingActionButton floatingActionButton; + final Widget appBarTitle; + final List appBarActions; + @override Widget build(BuildContext context) { final store = StoreProvider.of(context); @@ -29,7 +34,17 @@ class AppScaffold extends StatelessWidget { }, child: Scaffold( drawer: AppDrawerBuilder(), - appBar: appBar, + appBar: AppBar( + leading: !isMobile(context) + ? IconButton( + icon: Icon(Icons.menu), + onPressed: () => + store.dispatch(UpdateSidebar(AppSidebar.menu)), + ) + : null, + title: appBarTitle, + actions: appBarActions, + ), body: body, bottomNavigationBar: bottomNavigationBar, floatingActionButton: floatingActionButton, diff --git a/lib/ui/client/client_screen.dart b/lib/ui/client/client_screen.dart index 5953febf0..4a75dc504 100644 --- a/lib/ui/client/client_screen.dart +++ b/lib/ui/client/client_screen.dart @@ -1,5 +1,3 @@ -import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; -import 'package:invoiceninja_flutter/redux/ui/ui_state.dart'; import 'package:invoiceninja_flutter/ui/app/app_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; @@ -12,7 +10,6 @@ import 'package:invoiceninja_flutter/ui/client/client_list_vm.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/ui/app/app_bottom_bar.dart'; -import 'package:invoiceninja_flutter/utils/platforms.dart'; class ClientScreen extends StatelessWidget { static const String route = '/client'; @@ -26,29 +23,21 @@ class ClientScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - leading: !isMobile(context) - ? IconButton( - icon: Icon(Icons.menu), - onPressed: () => store.dispatch(UpdateSidebar(AppSidebar.menu)), - ) - : null, - title: ListFilter( - key: ValueKey(state.clientListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(state.clientListState.filterClearedAt), + entityType: EntityType.client, + onFilterChanged: (value) { + store.dispatch(FilterClients(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.client, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterClients(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.client, - onFilterPressed: (String value) { - store.dispatch(FilterClients(value)); - }, - ), - ], - ), + ], body: ClientListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.client, diff --git a/lib/ui/document/document_screen.dart b/lib/ui/document/document_screen.dart index fd27f175e..19316c004 100644 --- a/lib/ui/document/document_screen.dart +++ b/lib/ui/document/document_screen.dart @@ -22,23 +22,21 @@ class DocumentScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(state.documentListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(state.documentListState.filterClearedAt), + entityType: EntityType.document, + onFilterChanged: (value) { + store.dispatch(FilterDocuments(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.document, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterDocuments(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.document, - onFilterPressed: (String value) { - store.dispatch(FilterDocuments(value)); - }, - ), - ], - ), + ], body: DocumentListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.document, diff --git a/lib/ui/expense/expense_screen.dart b/lib/ui/expense/expense_screen.dart index 7a38fb9bc..f58250f89 100644 --- a/lib/ui/expense/expense_screen.dart +++ b/lib/ui/expense/expense_screen.dart @@ -22,23 +22,21 @@ class ExpenseScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.expenseListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.expenseListState.filterClearedAt), + entityType: EntityType.expense, + onFilterChanged: (value) { + store.dispatch(FilterExpenses(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.expense, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterExpenses(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.expense, - onFilterPressed: (String value) { - store.dispatch(FilterExpenses(value)); - }, - ), - ], - ), + ], body: ExpenseListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.expense, diff --git a/lib/ui/invoice/invoice_screen.dart b/lib/ui/invoice/invoice_screen.dart index 4cc95e25c..0aa2f6e58 100644 --- a/lib/ui/invoice/invoice_screen.dart +++ b/lib/ui/invoice/invoice_screen.dart @@ -21,23 +21,21 @@ class InvoiceScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.invoiceListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.invoiceListState.filterClearedAt), + entityType: EntityType.invoice, + onFilterChanged: (value) { + store.dispatch(FilterInvoices(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.invoice, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterInvoices(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.invoice, - onFilterPressed: (String value) { - store.dispatch(FilterInvoices(value)); - }, - ), - ], - ), + ], body: InvoiceListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.invoice, @@ -66,32 +64,32 @@ class InvoiceScreen extends StatelessWidget { store.dispatch(FilterInvoicesByCustom2(value)), statuses: [ InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = 1 ..name = localization.draft, ), InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = 2 ..name = localization.sent, ), InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = 3 ..name = localization.viewed, ), InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = 5 ..name = localization.partial, ), InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = 6 ..name = localization.paid, ), InvoiceStatusEntity().rebuild( - (b) => b + (b) => b ..id = -1 ..name = localization.pastDue, ), @@ -99,17 +97,17 @@ class InvoiceScreen extends StatelessWidget { ), floatingActionButton: user.canCreate(EntityType.invoice) ? FloatingActionButton( - backgroundColor: Theme.of(context).primaryColorDark, - onPressed: () { - store.dispatch(EditInvoice( - invoice: InvoiceEntity(company: company).rebuild((b) => b - ..clientId = - store.state.invoiceListState.filterEntityId ?? 0), - context: context)); - }, - child: Icon(Icons.add, color: Colors.white), - tooltip: localization.newInvoice, - ) + backgroundColor: Theme.of(context).primaryColorDark, + onPressed: () { + store.dispatch(EditInvoice( + invoice: InvoiceEntity(company: company).rebuild((b) => b + ..clientId = + store.state.invoiceListState.filterEntityId ?? 0), + context: context)); + }, + child: Icon(Icons.add, color: Colors.white), + tooltip: localization.newInvoice, + ) : null, ); } diff --git a/lib/ui/payment/payment_screen.dart b/lib/ui/payment/payment_screen.dart index 95eeb0147..baf94b3aa 100644 --- a/lib/ui/payment/payment_screen.dart +++ b/lib/ui/payment/payment_screen.dart @@ -19,23 +19,21 @@ class PaymentScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.paymentListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.paymentListState.filterClearedAt), + entityType: EntityType.payment, + onFilterChanged: (value) { + store.dispatch(FilterPayments(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.payment, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterPayments(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.payment, - onFilterPressed: (String value) { - store.dispatch(FilterPayments(value)); - }, - ), - ], - ), + ], body: PaymentListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.payment, diff --git a/lib/ui/product/product_screen.dart b/lib/ui/product/product_screen.dart index 34b72a7ed..ff169a62a 100644 --- a/lib/ui/product/product_screen.dart +++ b/lib/ui/product/product_screen.dart @@ -22,23 +22,21 @@ class ProductScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.productListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.productListState.filterClearedAt), + entityType: EntityType.product, + onFilterChanged: (value) { + store.dispatch(FilterProducts(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.product, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterProducts(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.product, - onFilterPressed: (String value) { - store.dispatch(FilterProducts(value)); - }, - ), - ], - ), + ], body: ProductListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.product, diff --git a/lib/ui/project/project_screen.dart b/lib/ui/project/project_screen.dart index f1d444248..01b57bfeb 100644 --- a/lib/ui/project/project_screen.dart +++ b/lib/ui/project/project_screen.dart @@ -21,23 +21,21 @@ class ProjectScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.projectListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.projectListState.filterClearedAt), + entityType: EntityType.project, + onFilterChanged: (value) { + store.dispatch(FilterProjects(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.project, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterProjects(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.project, - onFilterPressed: (String value) { - store.dispatch(FilterProjects(value)); - }, - ), - ], - ), + ], body: ProjectListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.project, diff --git a/lib/ui/quote/quote_screen.dart b/lib/ui/quote/quote_screen.dart index ca2233ddc..5fec9775f 100644 --- a/lib/ui/quote/quote_screen.dart +++ b/lib/ui/quote/quote_screen.dart @@ -21,23 +21,21 @@ class QuoteScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.quoteListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.quoteListState.filterClearedAt), + entityType: EntityType.quote, + onFilterChanged: (value) { + store.dispatch(FilterQuotes(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.quote, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterQuotes(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.quote, - onFilterPressed: (String value) { - store.dispatch(FilterQuotes(value)); - }, - ), - ], - ), + ], body: QuoteListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.quote, diff --git a/lib/ui/task/task_screen.dart b/lib/ui/task/task_screen.dart index ffec22179..b0e15825c 100644 --- a/lib/ui/task/task_screen.dart +++ b/lib/ui/task/task_screen.dart @@ -22,23 +22,21 @@ class TaskScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.taskListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.taskListState.filterClearedAt), + entityType: EntityType.task, + onFilterChanged: (value) { + store.dispatch(FilterTasks(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.task, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterTasks(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.task, - onFilterPressed: (String value) { - store.dispatch(FilterTasks(value)); - }, - ), - ], - ), + ], body: TaskListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.task, diff --git a/lib/ui/vendor/vendor_screen.dart b/lib/ui/vendor/vendor_screen.dart index 26970a98d..9930276b7 100644 --- a/lib/ui/vendor/vendor_screen.dart +++ b/lib/ui/vendor/vendor_screen.dart @@ -21,23 +21,21 @@ class VendorScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( - key: ValueKey(store.state.vendorListState.filterClearedAt), + appBarTitle: ListFilter( + key: ValueKey(store.state.vendorListState.filterClearedAt), + entityType: EntityType.vendor, + onFilterChanged: (value) { + store.dispatch(FilterVendors(value)); + }, + ), + appBarActions: [ + ListFilterButton( entityType: EntityType.vendor, - onFilterChanged: (value) { + onFilterPressed: (String value) { store.dispatch(FilterVendors(value)); }, ), - actions: [ - ListFilterButton( - entityType: EntityType.vendor, - onFilterPressed: (String value) { - store.dispatch(FilterVendors(value)); - }, - ), - ], - ), + ], body: VendorListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.vendor, diff --git a/stubs/ui/stub/stub_screen b/stubs/ui/stub/stub_screen index 0aa30563e..a0f4508a0 100644 --- a/stubs/ui/stub/stub_screen +++ b/stubs/ui/stub/stub_screen @@ -24,15 +24,14 @@ class StubScreen extends StatelessWidget { final localization = AppLocalization.of(context); return AppScaffold( - appBar: AppBar( - title: ListFilter( + appBarTitle: ListFilter( key: ValueKey(state.stubListState.filterClearedAt), entityType: EntityType.stub, onFilterChanged: (value) { store.dispatch(FilterStubs(value)); }, ), - actions: [ + appBarActions: [ ListFilterButton( entityType: EntityType.stub, onFilterPressed: (String value) { @@ -40,7 +39,6 @@ class StubScreen extends StatelessWidget { }, ), ], - ), body: StubListBuilder(), bottomNavigationBar: AppBottomBar( entityType: EntityType.stub,