Add documents to edit expense screen
This commit is contained in:
parent
99069cfab4
commit
8deaeb4601
|
|
@ -7,7 +7,10 @@ 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/redux/expense/expense_selectors.dart';
|
import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart';
|
||||||
|
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -52,6 +55,8 @@ abstract class AbstractExpenseEditVM {
|
||||||
@required this.onCancelPressed,
|
@required this.onCancelPressed,
|
||||||
@required this.onAddClientPressed,
|
@required this.onAddClientPressed,
|
||||||
@required this.onAddVendorPressed,
|
@required this.onAddVendorPressed,
|
||||||
|
@required this.onUploadDocument,
|
||||||
|
@required this.onDeleteDocument,
|
||||||
});
|
});
|
||||||
|
|
||||||
final ExpenseEntity expense;
|
final ExpenseEntity expense;
|
||||||
|
|
@ -64,6 +69,8 @@ abstract class AbstractExpenseEditVM {
|
||||||
onAddClientPressed;
|
onAddClientPressed;
|
||||||
final Function(BuildContext context, Completer<SelectableEntity> completer)
|
final Function(BuildContext context, Completer<SelectableEntity> completer)
|
||||||
onAddVendorPressed;
|
onAddVendorPressed;
|
||||||
|
final Function(BuildContext, MultipartFile) onUploadDocument;
|
||||||
|
final Function(BuildContext, DocumentEntity, String, String) onDeleteDocument;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExpenseEditVM extends AbstractExpenseEditVM {
|
class ExpenseEditVM extends AbstractExpenseEditVM {
|
||||||
|
|
@ -80,6 +87,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
|
||||||
onAddClientPressed,
|
onAddClientPressed,
|
||||||
Function(BuildContext context, Completer<SelectableEntity> completer)
|
Function(BuildContext context, Completer<SelectableEntity> completer)
|
||||||
onAddVendorPressed,
|
onAddVendorPressed,
|
||||||
|
Function(BuildContext, MultipartFile) onUploadDocument,
|
||||||
|
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
|
||||||
}) : super(
|
}) : super(
|
||||||
state: state,
|
state: state,
|
||||||
expense: expense,
|
expense: expense,
|
||||||
|
|
@ -89,6 +98,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
|
||||||
origExpense: origExpense,
|
origExpense: origExpense,
|
||||||
onAddClientPressed: onAddClientPressed,
|
onAddClientPressed: onAddClientPressed,
|
||||||
onAddVendorPressed: onAddVendorPressed,
|
onAddVendorPressed: onAddVendorPressed,
|
||||||
|
onUploadDocument: onUploadDocument,
|
||||||
|
onDeleteDocument: onDeleteDocument,
|
||||||
);
|
);
|
||||||
|
|
||||||
factory ExpenseEditVM.fromStore(Store<AppState> store) {
|
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,
|
||||||
|
));
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ 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:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
|
|
||||||
// Project imports:
|
// Project imports:
|
||||||
|
|
@ -57,6 +59,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
|
||||||
onAddClientPressed,
|
onAddClientPressed,
|
||||||
Function(BuildContext context, Completer<SelectableEntity> completer)
|
Function(BuildContext context, Completer<SelectableEntity> completer)
|
||||||
onAddVendorPressed,
|
onAddVendorPressed,
|
||||||
|
Function(BuildContext, MultipartFile) onUploadDocument,
|
||||||
|
Function(BuildContext, DocumentEntity, String, String) onDeleteDocument,
|
||||||
}) : super(
|
}) : super(
|
||||||
state: state,
|
state: state,
|
||||||
expense: expense,
|
expense: expense,
|
||||||
|
|
@ -66,6 +70,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
|
||||||
origExpense: origExpense,
|
origExpense: origExpense,
|
||||||
onAddClientPressed: onAddClientPressed,
|
onAddClientPressed: onAddClientPressed,
|
||||||
onAddVendorPressed: onAddVendorPressed,
|
onAddVendorPressed: onAddVendorPressed,
|
||||||
|
onUploadDocument: onUploadDocument,
|
||||||
|
onDeleteDocument: onDeleteDocument,
|
||||||
);
|
);
|
||||||
|
|
||||||
factory RecurringExpenseEditVM.fromStore(Store<AppState> store) {
|
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,
|
||||||
|
));
|
||||||
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue