Support bulk downloading documents
This commit is contained in:
parent
5ad78f05ae
commit
ea68c82cf7
|
|
@ -365,6 +365,10 @@ abstract class ExpenseEntity extends Object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -951,6 +951,10 @@ abstract class InvoiceEntity extends Object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -322,6 +322,10 @@ abstract class ProductEntity extends Object
|
||||||
actions.add(EntityAction.clone);
|
actions.add(EntityAction.clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,10 @@ abstract class ProjectEntity extends Object
|
||||||
actions.add(EntityAction.clone);
|
actions.add(EntityAction.clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -610,6 +610,10 @@ abstract class TaskEntity extends Object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -208,6 +208,10 @@ abstract class VendorEntity extends Object
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isDeleted && multiselect) {
|
||||||
|
actions.add(EntityAction.documents);
|
||||||
|
}
|
||||||
|
|
||||||
if (actions.isNotEmpty && actions.last != null) {
|
if (actions.isNotEmpty && actions.last != null) {
|
||||||
actions.add(null);
|
actions.add(null);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -632,6 +633,26 @@ Future handleCreditAction(
|
||||||
entities: [credit],
|
entities: [credit],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import 'package:http/http.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.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_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.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/redux/expense/expense_selectors.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
|
@ -360,6 +361,26 @@ void handleExpenseAction(
|
||||||
entities: [expense],
|
entities: [expense],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -711,5 +712,25 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
|
||||||
entities: [invoice],
|
entities: [invoice],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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/completers.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
||||||
|
import '../document/document_actions.dart';
|
||||||
|
|
||||||
class ViewProductList implements PersistUI {
|
class ViewProductList implements PersistUI {
|
||||||
ViewProductList({this.force = false});
|
ViewProductList({this.force = false});
|
||||||
|
|
||||||
|
|
@ -320,6 +322,26 @@ void handleProductAction(
|
||||||
entities: [product],
|
entities: [product],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import 'package:http/http.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.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_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.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/redux/project/project_selectors.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
|
@ -337,6 +338,23 @@ void handleProjectAction(
|
||||||
entities: [project],
|
entities: [project],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -648,6 +649,26 @@ Future handleQuoteAction(
|
||||||
entities: [quote],
|
entities: [quote],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import 'package:http/http.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.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_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.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/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
@ -123,7 +124,11 @@ class LoadRecurringExpensesSuccess implements StopLoading {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SaveRecurringExpenseRequest implements StartSaving {
|
class SaveRecurringExpenseRequest implements StartSaving {
|
||||||
SaveRecurringExpenseRequest({this.completer, this.recurringExpense, this.action,});
|
SaveRecurringExpenseRequest({
|
||||||
|
this.completer,
|
||||||
|
this.recurringExpense,
|
||||||
|
this.action,
|
||||||
|
});
|
||||||
|
|
||||||
final Completer completer;
|
final Completer completer;
|
||||||
final ExpenseEntity recurringExpense;
|
final ExpenseEntity recurringExpense;
|
||||||
|
|
@ -430,6 +435,23 @@ void handleRecurringExpenseAction(BuildContext context,
|
||||||
entities: [recurringExpense],
|
entities: [recurringExpense],
|
||||||
);
|
);
|
||||||
break;
|
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:
|
default:
|
||||||
print('## ERROR: unhandled action $action in recurring_expense_actions');
|
print('## ERROR: unhandled action $action in recurring_expense_actions');
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import 'package:flutter/widgets.dart';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
import 'package:flutter_redux/flutter_redux.dart';
|
import 'package:flutter_redux/flutter_redux.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -561,6 +562,23 @@ void handleRecurringInvoiceAction(BuildContext context,
|
||||||
entities: [recurringInvoice],
|
entities: [recurringInvoice],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import 'package:http/http.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.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_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.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/redux/task/task_selectors.dart';
|
||||||
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
|
|
@ -487,6 +488,26 @@ void handleTaskAction(
|
||||||
entities: [task],
|
entities: [task],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import 'package:http/http.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.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_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.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/ui/app/entities/entity_actions_dialog.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/completers.dart';
|
import 'package:invoiceninja_flutter/utils/completers.dart';
|
||||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
|
|
@ -359,6 +360,26 @@ void handleVendorAction(
|
||||||
entities: [vendor],
|
entities: [vendor],
|
||||||
);
|
);
|
||||||
break;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue