Add documents to edit screen

This commit is contained in:
Hillel Coren 2022-08-02 18:39:33 +03:00
parent 6ae0bc66ec
commit 2bc18c0e74
3 changed files with 84 additions and 1 deletions

View File

@ -7,6 +7,9 @@ import 'package:flutter/material.dart';
// Package imports: // Package imports:
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.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'; import 'package:redux/redux.dart';
// Project imports: // Project imports:
@ -55,6 +58,8 @@ class CreditEditVM extends AbstractInvoiceEditVM {
Function(List<InvoiceItemEntity>, String, String) onItemsAdded, Function(List<InvoiceItemEntity>, String, String) onItemsAdded,
bool isSaving, bool isSaving,
Function(BuildContext) onCancelPressed, Function(BuildContext) onCancelPressed,
Function(BuildContext, MultipartFile) onUploadDocument,
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
}) : super( }) : super(
state: state, state: state,
company: company, company: company,
@ -65,6 +70,8 @@ class CreditEditVM extends AbstractInvoiceEditVM {
onItemsAdded: onItemsAdded, onItemsAdded: onItemsAdded,
isSaving: isSaving, isSaving: isSaving,
onCancelPressed: onCancelPressed, onCancelPressed: onCancelPressed,
onUploadDocument: onUploadDocument,
onDeleteDocument: onDeleteDocument,
); );
factory CreditEditVM.fromStore(Store<AppState> store) { factory CreditEditVM.fromStore(Store<AppState> store) {
@ -160,6 +167,35 @@ class CreditEditVM extends AbstractInvoiceEditVM {
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute)); store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
} }
}, },
onUploadDocument: (BuildContext context, MultipartFile multipartFile) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
store.dispatch(SaveCreditDocumentRequest(
multipartFile: multipartFile,
credit: credit,
completer: completer));
completer.future.then((client) {
showToast(AppLocalization.of(context).uploadedDocument);
}).catchError((Object error) {
showDialog<ErrorDialog>(
context: context,
builder: (BuildContext context) {
return ErrorDialog(error);
});
});
},
onDeleteDocument: (BuildContext context, DocumentEntity document,
String password, String idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context).deletedDocument);
completer.future.then<Null>(
(value) => store.dispatch(LoadCredit(creditId: credit.id)));
store.dispatch(DeleteDocumentRequest(
completer: completer,
documentIds: [document.id],
password: password,
idToken: idToken,
));
},
); );
} }
} }

View File

@ -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_actions.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_selectors.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/buttons/elevated_button.dart';
import 'package:invoiceninja_flutter/ui/app/document_grid.dart';
import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -109,7 +110,7 @@ class InvoiceEditDesktopState extends State<InvoiceEditDesktop>
_showTasksTable = invoice.hasTasks && !invoice.hasProducts; _showTasksTable = invoice.hasTasks && !invoice.hasProducts;
_focusNode = FocusScopeNode(); _focusNode = FocusScopeNode();
_optionTabController = TabController(vsync: this, length: 5); _optionTabController = TabController(vsync: this, length: 6);
_tableTabController = TabController( _tableTabController = TabController(
vsync: this, length: 2, initialIndex: _showTasksTable ? 1 : 0); vsync: this, length: 2, initialIndex: _showTasksTable ? 1 : 0);
_scrollController = ScrollController(); _scrollController = ScrollController();
@ -617,6 +618,7 @@ class InvoiceEditDesktopState extends State<InvoiceEditDesktop>
left: kMobileDialogPadding), left: kMobileDialogPadding),
children: <Widget>[ children: <Widget>[
AppTabBar( AppTabBar(
isScrollable: true,
controller: _optionTabController, controller: _optionTabController,
tabs: [ tabs: [
Tab(text: localization.terms), Tab(text: localization.terms),
@ -624,6 +626,7 @@ class InvoiceEditDesktopState extends State<InvoiceEditDesktop>
Tab(text: localization.publicNotes), Tab(text: localization.publicNotes),
Tab(text: localization.privateNotes), Tab(text: localization.privateNotes),
Tab(text: localization.settings), Tab(text: localization.settings),
Tab(text: localization.documents),
], ],
), ),
SizedBox( SizedBox(
@ -797,6 +800,10 @@ class InvoiceEditDesktopState extends State<InvoiceEditDesktop>
], ],
); );
}), }),
DocumentGrid(
documents: [],
onUploadDocument: null,
onDeleteDocument: null),
], ],
), ),
), ),

View File

@ -8,6 +8,9 @@ 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:flutter_styled_toast/flutter_styled_toast.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'; import 'package:redux/redux.dart';
// Project imports: // Project imports:
@ -55,6 +58,8 @@ abstract class AbstractInvoiceEditVM {
@required this.onItemsAdded, @required this.onItemsAdded,
@required this.isSaving, @required this.isSaving,
@required this.onCancelPressed, @required this.onCancelPressed,
@required this.onUploadDocument,
@required this.onDeleteDocument,
}); });
final AppState state; final AppState state;
@ -66,6 +71,8 @@ abstract class AbstractInvoiceEditVM {
final Function(List<InvoiceItemEntity>, String, String) onItemsAdded; final Function(List<InvoiceItemEntity>, String, String) onItemsAdded;
final bool isSaving; final bool isSaving;
final Function(BuildContext) onCancelPressed; final Function(BuildContext) onCancelPressed;
final Function(BuildContext, MultipartFile) onUploadDocument;
final Function(BuildContext, DocumentEntity, String, String) onDeleteDocument;
} }
class InvoiceEditVM extends AbstractInvoiceEditVM { class InvoiceEditVM extends AbstractInvoiceEditVM {
@ -79,6 +86,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
Function(List<InvoiceItemEntity>, String, String) onItemsAdded, Function(List<InvoiceItemEntity>, String, String) onItemsAdded,
bool isSaving, bool isSaving,
Function(BuildContext) onCancelPressed, Function(BuildContext) onCancelPressed,
Function(BuildContext, MultipartFile) onUploadDocument,
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
}) : super( }) : super(
state: state, state: state,
company: company, company: company,
@ -89,6 +98,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
onItemsAdded: onItemsAdded, onItemsAdded: onItemsAdded,
isSaving: isSaving, isSaving: isSaving,
onCancelPressed: onCancelPressed, onCancelPressed: onCancelPressed,
onUploadDocument: onUploadDocument,
onDeleteDocument: onDeleteDocument,
); );
factory InvoiceEditVM.fromStore(Store<AppState> store) { factory InvoiceEditVM.fromStore(Store<AppState> store) {
@ -221,6 +232,35 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute)); store.dispatch(UpdateCurrentRoute(state.uiState.previousRoute));
} }
}, },
onUploadDocument: (BuildContext context, MultipartFile multipartFile) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
store.dispatch(SaveInvoiceDocumentRequest(
multipartFile: multipartFile,
invoice: invoice,
completer: completer));
completer.future.then((client) {
showToast(AppLocalization.of(context).uploadedDocument);
}).catchError((Object error) {
showDialog<ErrorDialog>(
context: context,
builder: (BuildContext context) {
return ErrorDialog(error);
});
});
},
onDeleteDocument: (BuildContext context, DocumentEntity document,
String password, String idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context).deletedDocument);
completer.future.then<Null>(
(value) => store.dispatch(LoadInvoice(invoiceId: invoice.id)));
store.dispatch(DeleteDocumentRequest(
completer: completer,
documentIds: [document.id],
password: password,
idToken: idToken,
));
},
); );
} }
} }