diff --git a/lib/redux/company/company_actions.dart b/lib/redux/company/company_actions.dart index 1d71f0d90..0900b1c9c 100644 --- a/lib/redux/company/company_actions.dart +++ b/lib/redux/company/company_actions.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:http/http.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; @@ -93,3 +94,25 @@ class UpdateCompanyLanguage { final String languageId; } + +class SaveCompanyDocumentRequest implements StartSaving { + SaveCompanyDocumentRequest({ + @required this.completer, + @required this.multipartFile, + }); + + final Completer completer; + final MultipartFile multipartFile; +} + +class SaveCompanyDocumentSuccess implements StopSaving, PersistData, PersistUI { + SaveCompanyDocumentSuccess(this.document); + + final DocumentEntity document; +} + +class SaveCompanyDocumentFailure implements StopSaving { + SaveCompanyDocumentFailure(this.error); + + final Object error; +} diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index fe67c96df..7c14745f0 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -122,11 +122,4 @@ class ClientViewVM { final bool isSaving; final bool isLoading; final bool isDirty; - - @override - bool operator ==(dynamic other) => - client == other.client && company == other.company; - - @override - int get hashCode => client.hashCode ^ company.hashCode; } diff --git a/lib/ui/settings/company_details.dart b/lib/ui/settings/company_details.dart index 2d4eb38d7..b943c36b4 100644 --- a/lib/ui/settings/company_details.dart +++ b/lib/ui/settings/company_details.dart @@ -598,10 +598,12 @@ class _CompanyDetailsState extends State ], ), DocumentGrid( - //documents: company., - //onUploadDocument: onUploadDocument, - //onDeleteDocument: onDeleteDocument, - ), + documents: company.documents.toList(), + onUploadDocument: (path) => + viewModel.onUploadDocument(context, path), + onDeleteDocument: (document, password) => + viewModel.onDeleteDocument(context, document, password), + ), ], ), ); diff --git a/lib/ui/settings/company_details_vm.dart b/lib/ui/settings/company_details_vm.dart index b8e2d324c..587631751 100644 --- a/lib/ui/settings/company_details_vm.dart +++ b/lib/ui/settings/company_details_vm.dart @@ -1,16 +1,23 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter/widgets.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/constants.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/company_model.dart'; +import 'package:invoiceninja_flutter/data/models/document_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/group_model.dart'; +import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/company/company_actions.dart'; +import 'package:invoiceninja_flutter/redux/document/document_actions.dart'; import 'package:invoiceninja_flutter/redux/group/group_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; +import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/settings/company_details.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -45,6 +52,8 @@ class CompanyDetailsVM { @required this.onUploadLogo, @required this.onDeleteLogo, @required this.onConfigurePaymentTermsPressed, + @required this.onUploadDocument, + @required this.onDeleteDocument, }); static CompanyDetailsVM fromStore(Store store) { @@ -131,6 +140,31 @@ class CompanyDetailsVM { section: kSettingsPaymentTerms)); } }, + onUploadDocument: (BuildContext context, MultipartFile multipartFile) { + final Completer completer = Completer(); + store.dispatch(SaveCompanyDocumentRequest( + multipartFile: multipartFile, 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) { + final completer = snackBarCompleter( + context, AppLocalization.of(context).deletedDocument); + completer.future.then((value) => store.dispatch(RefreshData())); + store.dispatch(DeleteDocumentRequest( + completer: completer, + documentIds: [document.id], + password: password, + )); + }, ); } @@ -143,4 +177,6 @@ class CompanyDetailsVM { final Function(BuildContext, MultipartFile) onUploadLogo; final Function(BuildContext) onDeleteLogo; final Function(BuildContext) onConfigurePaymentTermsPressed; + final Function(BuildContext, MultipartFile) onUploadDocument; + final Function(BuildContext, DocumentEntity, String) onDeleteDocument; }