Add documents to edit expense screen

This commit is contained in:
Hillel Coren 2022-08-03 15:41:44 +03:00
parent 99069cfab4
commit 8deaeb4601
2 changed files with 75 additions and 0 deletions

View File

@ -7,7 +7,10 @@ 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/redux/expense/expense_selectors.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
// Project imports:
@ -52,6 +55,8 @@ abstract class AbstractExpenseEditVM {
@required this.onCancelPressed,
@required this.onAddClientPressed,
@required this.onAddVendorPressed,
@required this.onUploadDocument,
@required this.onDeleteDocument,
});
final ExpenseEntity expense;
@ -64,6 +69,8 @@ abstract class AbstractExpenseEditVM {
onAddClientPressed;
final Function(BuildContext context, Completer<SelectableEntity> completer)
onAddVendorPressed;
final Function(BuildContext, MultipartFile) onUploadDocument;
final Function(BuildContext, DocumentEntity, String, String) onDeleteDocument;
}
class ExpenseEditVM extends AbstractExpenseEditVM {
@ -80,6 +87,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
onAddClientPressed,
Function(BuildContext context, Completer<SelectableEntity> completer)
onAddVendorPressed,
Function(BuildContext, MultipartFile) onUploadDocument,
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
}) : super(
state: state,
expense: expense,
@ -89,6 +98,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
origExpense: origExpense,
onAddClientPressed: onAddClientPressed,
onAddVendorPressed: onAddVendorPressed,
onUploadDocument: onUploadDocument,
onDeleteDocument: onDeleteDocument,
);
factory ExpenseEditVM.fromStore(Store<AppState> store) {
@ -193,6 +204,35 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
}
});
},
onUploadDocument: (BuildContext context, MultipartFile multipartFile) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
store.dispatch(SaveExpenseDocumentRequest(
multipartFile: multipartFile,
expense: expense,
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(LoadExpense(expenseId: expense.id)));
store.dispatch(DeleteDocumentRequest(
completer: completer,
documentIds: [document.id],
password: password,
idToken: idToken,
));
},
);
}
}

View File

@ -7,6 +7,8 @@ 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:redux/redux.dart';
// Project imports:
@ -57,6 +59,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
onAddClientPressed,
Function(BuildContext context, Completer<SelectableEntity> completer)
onAddVendorPressed,
Function(BuildContext, MultipartFile) onUploadDocument,
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
}) : super(
state: state,
expense: expense,
@ -66,6 +70,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
origExpense: origExpense,
onAddClientPressed: onAddClientPressed,
onAddVendorPressed: onAddVendorPressed,
onUploadDocument: onUploadDocument,
onDeleteDocument: onDeleteDocument,
);
factory RecurringExpenseEditVM.fromStore(Store<AppState> store) {
@ -182,6 +188,35 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
}
});
},
onUploadDocument: (BuildContext context, MultipartFile multipartFile) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
store.dispatch(SaveRecurringExpenseDocumentRequest(
multipartFile: multipartFile,
expense: recurringExpense,
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(
LoadRecurringExpense(recurringExpenseId: recurringExpense.id)));
store.dispatch(DeleteDocumentRequest(
completer: completer,
documentIds: [document.id],
password: password,
idToken: idToken,
));
},
);
}
}