From 2bc18c0e74e0fa194d11956868bfda529a66d348 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Tue, 2 Aug 2022 18:39:33 +0300 Subject: [PATCH] Add documents to edit screen --- lib/ui/credit/edit/credit_edit_vm.dart | 36 +++++++++++++++++ lib/ui/invoice/edit/invoice_edit_desktop.dart | 9 ++++- lib/ui/invoice/edit/invoice_edit_vm.dart | 40 +++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/lib/ui/credit/edit/credit_edit_vm.dart b/lib/ui/credit/edit/credit_edit_vm.dart index 51aaa7d77..76976c1ea 100644 --- a/lib/ui/credit/edit/credit_edit_vm.dart +++ b/lib/ui/credit/edit/credit_edit_vm.dart @@ -7,6 +7,9 @@ import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; +import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:redux/redux.dart'; // Project imports: @@ -55,6 +58,8 @@ class CreditEditVM extends AbstractInvoiceEditVM { Function(List, String, String) onItemsAdded, bool isSaving, Function(BuildContext) onCancelPressed, + Function(BuildContext, MultipartFile) onUploadDocument, + Function(BuildContext, DocumentEntity, String, String) onDeleteDocument, }) : super( state: state, company: company, @@ -65,6 +70,8 @@ class CreditEditVM extends AbstractInvoiceEditVM { onItemsAdded: onItemsAdded, isSaving: isSaving, onCancelPressed: onCancelPressed, + onUploadDocument: onUploadDocument, + onDeleteDocument: onDeleteDocument, ); factory CreditEditVM.fromStore(Store store) { @@ -160,6 +167,35 @@ class CreditEditVM extends AbstractInvoiceEditVM { store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute)); } }, + onUploadDocument: (BuildContext context, MultipartFile multipartFile) { + final Completer completer = Completer(); + store.dispatch(SaveCreditDocumentRequest( + multipartFile: multipartFile, + credit: credit, + completer: completer)); + completer.future.then((client) { + showToast(AppLocalization.of(context).uploadedDocument); + }).catchError((Object error) { + showDialog( + context: context, + builder: (BuildContext context) { + return ErrorDialog(error); + }); + }); + }, + onDeleteDocument: (BuildContext context, DocumentEntity document, + String password, String idToken) { + final completer = snackBarCompleter( + context, AppLocalization.of(context).deletedDocument); + completer.future.then( + (value) => store.dispatch(LoadCredit(creditId: credit.id))); + store.dispatch(DeleteDocumentRequest( + completer: completer, + documentIds: [document.id], + password: password, + idToken: idToken, + )); + }, ); } } diff --git a/lib/ui/invoice/edit/invoice_edit_desktop.dart b/lib/ui/invoice/edit/invoice_edit_desktop.dart index db4ce9d4a..86c805ce9 100644 --- a/lib/ui/invoice/edit/invoice_edit_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_desktop.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart'; import 'package:invoiceninja_flutter/redux/vendor/vendor_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; +import 'package:invoiceninja_flutter/ui/app/document_grid.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:http/http.dart' as http; @@ -109,7 +110,7 @@ class InvoiceEditDesktopState extends State _showTasksTable = invoice.hasTasks && !invoice.hasProducts; _focusNode = FocusScopeNode(); - _optionTabController = TabController(vsync: this, length: 5); + _optionTabController = TabController(vsync: this, length: 6); _tableTabController = TabController( vsync: this, length: 2, initialIndex: _showTasksTable ? 1 : 0); _scrollController = ScrollController(); @@ -617,6 +618,7 @@ class InvoiceEditDesktopState extends State left: kMobileDialogPadding), children: [ AppTabBar( + isScrollable: true, controller: _optionTabController, tabs: [ Tab(text: localization.terms), @@ -624,6 +626,7 @@ class InvoiceEditDesktopState extends State Tab(text: localization.publicNotes), Tab(text: localization.privateNotes), Tab(text: localization.settings), + Tab(text: localization.documents), ], ), SizedBox( @@ -797,6 +800,10 @@ class InvoiceEditDesktopState extends State ], ); }), + DocumentGrid( + documents: [], + onUploadDocument: null, + onDeleteDocument: null), ], ), ), diff --git a/lib/ui/invoice/edit/invoice_edit_vm.dart b/lib/ui/invoice/edit/invoice_edit_vm.dart index 44c65b477..a3a952449 100644 --- a/lib/ui/invoice/edit/invoice_edit_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_vm.dart @@ -8,6 +8,9 @@ import 'package:flutter/material.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart'; +import 'package:http/http.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; +import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:redux/redux.dart'; // Project imports: @@ -55,6 +58,8 @@ abstract class AbstractInvoiceEditVM { @required this.onItemsAdded, @required this.isSaving, @required this.onCancelPressed, + @required this.onUploadDocument, + @required this.onDeleteDocument, }); final AppState state; @@ -66,6 +71,8 @@ abstract class AbstractInvoiceEditVM { final Function(List, String, String) onItemsAdded; final bool isSaving; final Function(BuildContext) onCancelPressed; + final Function(BuildContext, MultipartFile) onUploadDocument; + final Function(BuildContext, DocumentEntity, String, String) onDeleteDocument; } class InvoiceEditVM extends AbstractInvoiceEditVM { @@ -79,6 +86,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM { Function(List, String, String) onItemsAdded, bool isSaving, Function(BuildContext) onCancelPressed, + Function(BuildContext, MultipartFile) onUploadDocument, + Function(BuildContext, DocumentEntity, String, String) onDeleteDocument, }) : super( state: state, company: company, @@ -89,6 +98,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM { onItemsAdded: onItemsAdded, isSaving: isSaving, onCancelPressed: onCancelPressed, + onUploadDocument: onUploadDocument, + onDeleteDocument: onDeleteDocument, ); factory InvoiceEditVM.fromStore(Store store) { @@ -221,6 +232,35 @@ class InvoiceEditVM extends AbstractInvoiceEditVM { store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute)); } }, + onUploadDocument: (BuildContext context, MultipartFile multipartFile) { + final Completer completer = Completer(); + store.dispatch(SaveInvoiceDocumentRequest( + multipartFile: multipartFile, + invoice: invoice, + completer: completer)); + completer.future.then((client) { + showToast(AppLocalization.of(context).uploadedDocument); + }).catchError((Object error) { + showDialog( + context: context, + builder: (BuildContext context) { + return ErrorDialog(error); + }); + }); + }, + onDeleteDocument: (BuildContext context, DocumentEntity document, + String password, String idToken) { + final completer = snackBarCompleter( + context, AppLocalization.of(context).deletedDocument); + completer.future.then( + (value) => store.dispatch(LoadInvoice(invoiceId: invoice.id))); + store.dispatch(DeleteDocumentRequest( + completer: completer, + documentIds: [document.id], + password: password, + idToken: idToken, + )); + }, ); } }