diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index c1bcdb070..e63fe9de7 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -483,8 +483,10 @@ Future handleCreditAction( case EntityAction.emailCredit: case EntityAction.bulkEmailCredit: bool emailValid = true; - creditIds.forEach((element) { - final client = state.clientState.get(credit.clientId); + credits.forEach((credit) { + final client = state.clientState.get( + (credit as InvoiceEntity).clientId, + ); if (!client.hasEmailAddress) { emailValid = false; } diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index bc595eaa7..cfb7450f1 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -569,8 +569,10 @@ void handleInvoiceAction(BuildContext context, List invoices, case EntityAction.emailInvoice: case EntityAction.bulkEmailInvoice: bool emailValid = true; - invoiceIds.forEach((element) { - final client = state.clientState.get(invoice.clientId); + invoices.forEach((invoice) { + final client = state.clientState.get( + (invoice as InvoiceEntity).clientId, + ); if (!client.hasEmailAddress) { emailValid = false; } diff --git a/lib/redux/purchase_order/purchase_order_actions.dart b/lib/redux/purchase_order/purchase_order_actions.dart index a7c9fa0bf..5b3b0bc8d 100644 --- a/lib/redux/purchase_order/purchase_order_actions.dart +++ b/lib/redux/purchase_order/purchase_order_actions.dart @@ -1,11 +1,12 @@ import 'dart:async'; import 'package:built_collection/built_collection.dart'; -import 'package:flutter/widgets.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.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/utils/completers.dart'; +import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; @@ -172,6 +173,25 @@ class SavePurchaseOrderFailure implements StopSaving { final Object error; } +class BulkEmailPurchaseOrdersRequest implements StartSaving { + BulkEmailPurchaseOrdersRequest(this.completer, this.purchaseOrderIds); + + final Completer completer; + final List purchaseOrderIds; +} + +class BulkEmailPurchaseOrdersSuccess implements StopSaving, PersistData { + BulkEmailPurchaseOrdersSuccess(this.purchaseOrders); + + final List purchaseOrders; +} + +class BulkEmailPurchaseOrdersFailure implements StopSaving { + BulkEmailPurchaseOrdersFailure(this.error); + + final dynamic error; +} + class ArchivePurchaseOrdersRequest implements StartSaving { ArchivePurchaseOrdersRequest(this.completer, this.purchaseOrderIds); @@ -429,6 +449,7 @@ void handlePurchaseOrderAction(BuildContext context, } final store = StoreProvider.of(context); + final state = store.state; final localization = AppLocalization.of(context); final purchaseOrder = purchaseOrders.first as InvoiceEntity; final purchaseOrderIds = @@ -480,6 +501,54 @@ void handlePurchaseOrderAction(BuildContext context, } } break; + case EntityAction.emailPurchaseOrder: + case EntityAction.bulkEmailPurchaseOrder: + bool emailValid = true; + purchaseOrders.forEach((purchaseOrder) { + final client = state.clientState.get( + (purchaseOrder as InvoiceEntity).clientId, + ); + if (!client.hasEmailAddress) { + emailValid = false; + } + }); + if (!emailValid) { + showMessageDialog( + context: context, + message: localization.clientEmailNotSet, + secondaryActions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + editEntity( + entity: state.clientState.get(purchaseOrder.clientId)); + }, + child: Text(localization.editClient.toUpperCase())) + ]); + return; + } + if (action == EntityAction.emailQuote) { + store.dispatch(ShowEmailPurchaseOrder( + completer: snackBarCompleter( + context, localization.emailedPurchaseOrder), + purchaseOrder: purchaseOrder, + context: context)); + } else { + confirmCallback( + context: context, + message: localization.bulkEmailQuote, + callback: (_) { + store.dispatch(BulkEmailPurchaseOrdersRequest( + snackBarCompleter( + context, + purchaseOrderIds.length == 1 + ? localization.emailedPurchaseOrder + : localization.emailedPurchaseOrders), + purchaseOrderIds)); + }); + } + break; + case EntityAction.more: showEntityActionsDialog( entities: [purchaseOrder], diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 2a798eae7..ada010daa 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -522,8 +522,10 @@ Future handleQuoteAction( case EntityAction.emailQuote: case EntityAction.bulkEmailQuote: bool emailValid = true; - quoteIds.forEach((element) { - final client = state.clientState.get(quote.clientId); + quotes.forEach((quote) { + final client = state.clientState.get( + (quote as InvoiceEntity).clientId, + ); if (!client.hasEmailAddress) { emailValid = false; }