Support bulk downloading documents

This commit is contained in:
Hillel Coren 2022-03-16 15:25:40 +02:00
parent 5ad78f05ae
commit ea68c82cf7
16 changed files with 231 additions and 1 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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 = <String>[];
for (var credit in credits) {
for (var document in (credit as InvoiceEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in credit_actions');
break;
}
}

View File

@ -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 = <String>[];
for (var expense in expenses) {
for (var document in (expense as ExpenseEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in expense_actions');
break;
}
}

View File

@ -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<BaseEntity> invoices,
entities: [invoice],
);
break;
case EntityAction.documents:
final documentIds = <String>[];
for (var invoice in invoices) {
for (var document in (invoice as InvoiceEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in invoice_actions');
break;
}
}

View File

@ -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 = <String>[];
for (var product in products) {
for (var document in (product as ProductEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in product_actions');
break;
}
}

View File

@ -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 = <String>[];
for (var project in projects) {
for (var document in (project as ProjectEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
}
}

View File

@ -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 = <String>[];
for (var quote in quotes) {
for (var document in (quote as InvoiceEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in quote_actions');
break;
}
}

View File

@ -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 = <String>[];
for (var expense in recurringExpenses) {
for (var document in (expense as ExpenseEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in recurring_expense_actions');
break;

View File

@ -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 = <String>[];
for (var invoice in recurringInvoices) {
for (var document in (invoice as InvoiceEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
}
}

View File

@ -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 = <String>[];
for (var task in tasks) {
for (var document in (task as TaskEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in task_actions');
break;
}
}

View File

@ -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 = <String>[];
for (var vendor in vendors) {
for (var document in (vendor as VendorEntity).documents) {
documentIds.add(document.id);
}
}
store.dispatch(
DownloadDocumentsRequest(
documentIds: documentIds,
completer: snackBarCompleter<Null>(
context,
localization.exportedData,
),
),
);
break;
default:
print('## ERROR: unhandled action $action in vendor_actions');
break;
}
}