diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index a6d9052a2..121559e58 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -1,8 +1,15 @@ import 'dart:async'; import 'package:flutter/widgets.dart'; +import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; +import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; +import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; +import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; +import 'package:invoiceninja_flutter/utils/completers.dart'; +import 'package:invoiceninja_flutter/utils/localization.dart'; class ViewClientList implements PersistUI { ViewClientList(this.context); @@ -244,3 +251,46 @@ class FilterClientsByCustom2 implements PersistUI { final String value; } + +void handleClientAction( + ClientEntity client, EntityAction action, BuildContext context) { + final store = StoreProvider.of(context); + final state = store.state; + final CompanyEntity company = state.selectedCompany; + final localization = AppLocalization.of(context); + switch (action) { + case EntityAction.edit: + store.dispatch(EditClient(context: context, client: client)); + break; + case EntityAction.newInvoice: + store.dispatch(EditInvoice( + invoice: InvoiceEntity(company: company) + .rebuild((b) => b.clientId = client.id), + context: context)); + break; + case EntityAction.newExpense: + store.dispatch(EditExpense( + expense: ExpenseEntity( + company: company, client: client, uiState: state.uiState), + context: context)); + break; + case EntityAction.enterPayment: + store.dispatch(EditPayment( + payment: PaymentEntity(company: company) + .rebuild((b) => b.clientId = client.id), + context: context)); + break; + case EntityAction.restore: + store.dispatch(RestoreClientRequest( + snackBarCompleter(context, localization.restoredClient), client.id)); + break; + case EntityAction.archive: + store.dispatch(ArchiveClientRequest( + snackBarCompleter(context, localization.archivedClient), client.id)); + break; + case EntityAction.delete: + store.dispatch(DeleteClientRequest( + snackBarCompleter(context, localization.deletedClient), client.id)); + break; + } +} diff --git a/lib/ui/client/client_list.dart b/lib/ui/client/client_list.dart index 3c0b4bd09..3912e6d80 100644 --- a/lib/ui/client/client_list.dart +++ b/lib/ui/client/client_list.dart @@ -91,6 +91,7 @@ class ClientList extends StatelessWidget { if (action == EntityAction.more) { _showMenu(context, client, viewModel.user); } else { + Navigator.of(context).pop(); viewModel.onEntityAction(context, client, action); } }, diff --git a/lib/ui/client/client_list_vm.dart b/lib/ui/client/client_list_vm.dart index 190b2e1d8..3f70d1b16 100644 --- a/lib/ui/client/client_list_vm.dart +++ b/lib/ui/client/client_list_vm.dart @@ -5,9 +5,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; -import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart'; -import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; -import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:redux/redux.dart'; @@ -80,50 +77,9 @@ class ClientListVM { onClientTap: (context, client) { store.dispatch(ViewClient(clientId: client.id, context: context)); }, - onEntityAction: (context, client, action) { - final localization = AppLocalization.of(context); - switch (action) { - case EntityAction.edit: - store.dispatch(EditClient(context: context, client: client)); - break; - case EntityAction.newInvoice: - store.dispatch(EditInvoice( - invoice: InvoiceEntity(company: state.selectedCompany) - .rebuild((b) => b.clientId = client.id), - context: context)); - break; - case EntityAction.newExpense: - store.dispatch(EditExpense( - expense: ExpenseEntity( - company: state.selectedCompany, - client: client, - uiState: state.uiState), - context: context)); - break; - case EntityAction.enterPayment: - store.dispatch(EditPayment( - payment: PaymentEntity(company: state.selectedCompany) - .rebuild((b) => b.clientId = client.id), - context: context)); - break; - case EntityAction.restore: - store.dispatch(RestoreClientRequest( - snackBarCompleter(context, localization.restoredClient), - client.id)); - break; - case EntityAction.archive: - store.dispatch(ArchiveClientRequest( - snackBarCompleter(context, localization.archivedClient), - client.id)); - break; - case EntityAction.delete: - store.dispatch(DeleteClientRequest( - snackBarCompleter(context, localization.deletedClient), - client.id)); - break; - } - return false; - }, + onEntityAction: + (BuildContext context, ClientEntity client, EntityAction action) => + handleClientAction(client, action, context), onRefreshed: (context) => _handleRefresh(context), ); } diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index 2c4303cea..b489926c4 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -70,149 +70,112 @@ class ClientViewVM { } return ClientViewVM( - isSaving: state.isSaving, - isLoading: state.isLoading, - isDirty: client.isNew, - client: client, - company: state.selectedCompany, - onEditPressed: (BuildContext context) { - final Completer completer = 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).updatedClient, - ))); - }); - }, - onEntityPressed: (BuildContext context, EntityType entityType, - [longPress = false]) { - switch (entityType) { - case EntityType.invoice: - if (longPress) { - store.dispatch(EditInvoice( - context: context, - invoice: InvoiceEntity(company: state.selectedCompany) - .rebuild((b) => b..clientId = client.id))); - } else { - store.dispatch(FilterInvoicesByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewInvoiceList(context)); - } - break; - case EntityType.quote: - if (longPress) { - store.dispatch(EditQuote( - context: context, - quote: InvoiceEntity( - company: state.selectedCompany, isQuote: true) - .rebuild((b) => b..clientId = client.id))); - } else { - store.dispatch(FilterQuotesByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewQuoteList(context)); - } - break; - case EntityType.payment: - if (longPress) { - store.dispatch(EditPayment( - context: context, - payment: PaymentEntity(company: state.selectedCompany) - .rebuild((b) => b..clientId = client.id))); - } else { - store.dispatch(FilterPaymentsByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewPaymentList(context)); - } - break; - case EntityType.project: - if (longPress) { - store.dispatch(EditProject( - context: context, - project: ProjectEntity() - .rebuild((b) => b..clientId = client.id))); - } else { - store.dispatch(FilterProjectsByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewProjectList(context)); - } - break; - case EntityType.task: - if (longPress) { - store.dispatch(EditTask( - context: context, - task: TaskEntity(isRunning: state.uiState.autoStartTasks) - .rebuild((b) => b..clientId = client.id))); - } else { - store.dispatch(FilterTasksByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewTaskList(context)); - } - break; - case EntityType.expense: - if (longPress) { - store.dispatch(EditExpense( - context: context, - expense: ExpenseEntity( - company: state.selectedCompany, - client: client, - uiState: state.uiState))); - } else { - store.dispatch(FilterExpensesByEntity( - entityId: client.id, entityType: EntityType.client)); - store.dispatch(ViewExpenseList(context)); - } - break; - } - }, - onRefreshed: (context, loadActivities) => - _handleRefresh(context, loadActivities), - onBackPressed: () { - if (state.uiState.currentRoute.contains(ClientScreen.route)) { - store.dispatch(UpdateCurrentRoute(ClientScreen.route)); - } - }, - onActionSelected: (BuildContext context, EntityAction action) { - final localization = AppLocalization.of(context); - switch (action) { - case EntityAction.newInvoice: + isSaving: state.isSaving, + isLoading: state.isLoading, + isDirty: client.isNew, + client: client, + company: state.selectedCompany, + onEditPressed: (BuildContext context) { + final Completer completer = 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).updatedClient, + ))); + }); + }, + onEntityPressed: (BuildContext context, EntityType entityType, + [longPress = false]) { + switch (entityType) { + case EntityType.invoice: + if (longPress) { store.dispatch(EditInvoice( + context: context, invoice: InvoiceEntity(company: state.selectedCompany) - .rebuild((b) => b.clientId = client.id), - context: context)); - break; - case EntityAction.newExpense: + .rebuild((b) => b..clientId = client.id))); + } else { + store.dispatch(FilterInvoicesByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewInvoiceList(context)); + } + break; + case EntityType.quote: + if (longPress) { + store.dispatch(EditQuote( + context: context, + quote: InvoiceEntity( + company: state.selectedCompany, isQuote: true) + .rebuild((b) => b..clientId = client.id))); + } else { + store.dispatch(FilterQuotesByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewQuoteList(context)); + } + break; + case EntityType.payment: + if (longPress) { + store.dispatch(EditPayment( + context: context, + payment: PaymentEntity(company: state.selectedCompany) + .rebuild((b) => b..clientId = client.id))); + } else { + store.dispatch(FilterPaymentsByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewPaymentList(context)); + } + break; + case EntityType.project: + if (longPress) { + store.dispatch(EditProject( + context: context, + project: + ProjectEntity().rebuild((b) => b..clientId = client.id))); + } else { + store.dispatch(FilterProjectsByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewProjectList(context)); + } + break; + case EntityType.task: + if (longPress) { + store.dispatch(EditTask( + context: context, + task: TaskEntity(isRunning: state.uiState.autoStartTasks) + .rebuild((b) => b..clientId = client.id))); + } else { + store.dispatch(FilterTasksByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewTaskList(context)); + } + break; + case EntityType.expense: + if (longPress) { store.dispatch(EditExpense( + context: context, expense: ExpenseEntity( company: state.selectedCompany, client: client, - uiState: state.uiState), - context: context)); - break; - case EntityAction.enterPayment: - store.dispatch(EditPayment( - payment: PaymentEntity(company: state.selectedCompany) - .rebuild((b) => b.clientId = client.id), - context: context)); - break; - case EntityAction.archive: - store.dispatch(ArchiveClientRequest( - popCompleter(context, localization.archivedClient), - client.id)); - break; - case EntityAction.delete: - store.dispatch(DeleteClientRequest( - popCompleter(context, localization.deletedClient), - client.id)); - break; - case EntityAction.restore: - store.dispatch(RestoreClientRequest( - snackBarCompleter(context, localization.restoredClient), - client.id)); - break; - } - }); + uiState: state.uiState))); + } else { + store.dispatch(FilterExpensesByEntity( + entityId: client.id, entityType: EntityType.client)); + store.dispatch(ViewExpenseList(context)); + } + break; + } + }, + onRefreshed: (context, loadActivities) => + _handleRefresh(context, loadActivities), + onBackPressed: () { + if (state.uiState.currentRoute.contains(ClientScreen.route)) { + store.dispatch(UpdateCurrentRoute(ClientScreen.route)); + } + }, + onActionSelected: (BuildContext context, EntityAction action) => + handleClientAction(client, action, context), + ); } final ClientEntity client;