diff --git a/lib/data/models/expense_model.dart b/lib/data/models/expense_model.dart index d9775e016..78a1dd6cc 100644 --- a/lib/data/models/expense_model.dart +++ b/lib/data/models/expense_model.dart @@ -365,6 +365,10 @@ abstract class ExpenseEntity extends Object } } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index ad7776138..d6116c497 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -951,6 +951,10 @@ abstract class InvoiceEntity extends Object } } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/product_model.dart b/lib/data/models/product_model.dart index 49d436b9a..0bf6d7227 100644 --- a/lib/data/models/product_model.dart +++ b/lib/data/models/product_model.dart @@ -322,6 +322,10 @@ abstract class ProductEntity extends Object actions.add(EntityAction.clone); } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/project_model.dart b/lib/data/models/project_model.dart index 7cac876ae..2335a6f5d 100644 --- a/lib/data/models/project_model.dart +++ b/lib/data/models/project_model.dart @@ -192,6 +192,10 @@ abstract class ProjectEntity extends Object actions.add(EntityAction.clone); } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index b48819ed8..a0328ca91 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -610,6 +610,10 @@ abstract class TaskEntity extends Object } } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/data/models/vendor_model.dart b/lib/data/models/vendor_model.dart index a6d02f5a1..d8cf78240 100644 --- a/lib/data/models/vendor_model.dart +++ b/lib/data/models/vendor_model.dart @@ -208,6 +208,10 @@ abstract class VendorEntity extends Object } } + if (!isDeleted && multiselect) { + actions.add(EntityAction.documents); + } + if (actions.isNotEmpty && actions.last != null) { actions.add(null); } diff --git a/lib/redux/credit/credit_actions.dart b/lib/redux/credit/credit_actions.dart index 4cd19cd05..121ac1175 100644 --- a/lib/redux/credit/credit_actions.dart +++ b/lib/redux/credit/credit_actions.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -632,6 +633,26 @@ Future handleCreditAction( entities: [credit], ); break; + case EntityAction.documents: + final documentIds = []; + for (var credit in credits) { + for (var document in (credit as InvoiceEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in credit_actions'); + break; } } diff --git a/lib/redux/expense/expense_actions.dart b/lib/redux/expense/expense_actions.dart index cbadec00e..a067954d5 100644 --- a/lib/redux/expense/expense_actions.dart +++ b/lib/redux/expense/expense_actions.dart @@ -14,6 +14,7 @@ import 'package:http/http.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/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -360,6 +361,26 @@ void handleExpenseAction( entities: [expense], ); break; + case EntityAction.documents: + final documentIds = []; + for (var expense in expenses) { + for (var document in (expense as ExpenseEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in expense_actions'); + break; } } diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 3f51940fc..544fc141d 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -711,5 +712,25 @@ void handleInvoiceAction(BuildContext context, List invoices, entities: [invoice], ); break; + case EntityAction.documents: + final documentIds = []; + for (var invoice in invoices) { + for (var document in (invoice as InvoiceEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in invoice_actions'); + break; } } diff --git a/lib/redux/product/product_actions.dart b/lib/redux/product/product_actions.dart index 9ee9b6b39..02dfb03bf 100644 --- a/lib/redux/product/product_actions.dart +++ b/lib/redux/product/product_actions.dart @@ -18,6 +18,8 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart' import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; +import '../document/document_actions.dart'; + class ViewProductList implements PersistUI { ViewProductList({this.force = false}); @@ -320,6 +322,26 @@ void handleProductAction( entities: [product], ); break; + case EntityAction.documents: + final documentIds = []; + for (var product in products) { + for (var document in (product as ProductEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in product_actions'); + break; } } diff --git a/lib/redux/project/project_actions.dart b/lib/redux/project/project_actions.dart index a6726cf32..0d663558c 100644 --- a/lib/redux/project/project_actions.dart +++ b/lib/redux/project/project_actions.dart @@ -14,6 +14,7 @@ import 'package:http/http.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/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/project/project_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -337,6 +338,23 @@ void handleProjectAction( entities: [project], ); break; + case EntityAction.documents: + final documentIds = []; + for (var project in projects) { + for (var document in (project as ProjectEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; } } diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index 28ff376fc..d7f64f874 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -648,6 +649,26 @@ Future handleQuoteAction( entities: [quote], ); break; + case EntityAction.documents: + final documentIds = []; + for (var quote in quotes) { + for (var document in (quote as InvoiceEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in quote_actions'); + break; } } diff --git a/lib/redux/recurring_expense/recurring_expense_actions.dart b/lib/redux/recurring_expense/recurring_expense_actions.dart index 0525551cd..27daede54 100644 --- a/lib/redux/recurring_expense/recurring_expense_actions.dart +++ b/lib/redux/recurring_expense/recurring_expense_actions.dart @@ -13,6 +13,7 @@ import 'package:http/http.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/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -123,7 +124,11 @@ class LoadRecurringExpensesSuccess implements StopLoading { } class SaveRecurringExpenseRequest implements StartSaving { - SaveRecurringExpenseRequest({this.completer, this.recurringExpense, this.action,}); + SaveRecurringExpenseRequest({ + this.completer, + this.recurringExpense, + this.action, + }); final Completer completer; final ExpenseEntity recurringExpense; @@ -430,6 +435,23 @@ void handleRecurringExpenseAction(BuildContext context, entities: [recurringExpense], ); break; + case EntityAction.documents: + final documentIds = []; + for (var expense in recurringExpenses) { + for (var document in (expense as ExpenseEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; default: print('## ERROR: unhandled action $action in recurring_expense_actions'); break; diff --git a/lib/redux/recurring_invoice/recurring_invoice_actions.dart b/lib/redux/recurring_invoice/recurring_invoice_actions.dart index 428fa49c3..75cab1420 100644 --- a/lib/redux/recurring_invoice/recurring_invoice_actions.dart +++ b/lib/redux/recurring_invoice/recurring_invoice_actions.dart @@ -8,6 +8,7 @@ import 'package:flutter/widgets.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:url_launcher/url_launcher.dart'; // Project imports: @@ -561,6 +562,23 @@ void handleRecurringInvoiceAction(BuildContext context, entities: [recurringInvoice], ); break; + case EntityAction.documents: + final documentIds = []; + for (var invoice in recurringInvoices) { + for (var document in (invoice as InvoiceEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; } } diff --git a/lib/redux/task/task_actions.dart b/lib/redux/task/task_actions.dart index d6627e4a0..637b860aa 100644 --- a/lib/redux/task/task_actions.dart +++ b/lib/redux/task/task_actions.dart @@ -13,6 +13,7 @@ import 'package:http/http.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/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/task/task_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -487,6 +488,26 @@ void handleTaskAction( entities: [task], ); break; + case EntityAction.documents: + final documentIds = []; + for (var task in tasks) { + for (var document in (task as TaskEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in task_actions'); + break; } } diff --git a/lib/redux/vendor/vendor_actions.dart b/lib/redux/vendor/vendor_actions.dart index 793f46240..682a6efa7 100644 --- a/lib/redux/vendor/vendor_actions.dart +++ b/lib/redux/vendor/vendor_actions.dart @@ -13,6 +13,7 @@ import 'package:http/http.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/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -359,6 +360,26 @@ void handleVendorAction( entities: [vendor], ); break; + case EntityAction.documents: + final documentIds = []; + for (var vendor in vendors) { + for (var document in (vendor as VendorEntity).documents) { + documentIds.add(document.id); + } + } + store.dispatch( + DownloadDocumentsRequest( + documentIds: documentIds, + completer: snackBarCompleter( + context, + localization.exportedData, + ), + ), + ); + break; + default: + print('## ERROR: unhandled action $action in vendor_actions'); + break; } }