Add documents to edit screen
This commit is contained in:
parent
6ae0bc66ec
commit
2bc18c0e74
|
|
@ -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,
|
||||||
|
));
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
));
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue