Quotes
This commit is contained in:
parent
5ed5f85124
commit
128c025224
|
|
@ -17,8 +17,8 @@ Join the Android beta: https://play.google.com/apps/testing/com.invoiceninja.inv
|
|||
- [x] Clients
|
||||
- [x] Products
|
||||
- [x] Invoices
|
||||
- [x] Quotes
|
||||
- [ ] Payments
|
||||
- [ ] Quotes
|
||||
- [ ] Credits
|
||||
- [ ] Recurring
|
||||
- [ ] Vendors
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
import 'package:intl/intl.dart';
|
||||
import 'package:invoiceninja_flutter/redux/company/company_selectors.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/app_builder.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/quote_email_vm.dart';
|
||||
import 'package:redux/redux.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
|
@ -146,6 +147,7 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
|
|||
},
|
||||
QuoteViewScreen.route: (context) => QuoteViewScreen(),
|
||||
QuoteEditScreen.route: (context) => QuoteEditScreen(),
|
||||
QuoteEmailScreen.route: (context) => QuoteEmailScreen(),
|
||||
SettingsScreen.route: (context) => SettingsScreen(),
|
||||
},
|
||||
);
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
|
||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart';
|
||||
|
|
|
|||
|
|
@ -2,8 +2,9 @@ import 'package:flutter/material.dart';
|
|||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
|
||||
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/edit/quote_edit_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/quote_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/quote_screen.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/view/quote_view_vm.dart';
|
||||
import 'package:redux/redux.dart';
|
||||
|
|
@ -80,7 +81,8 @@ Middleware<AppState> _showEmailQuote() {
|
|||
return (Store<AppState> store, dynamic action, NextDispatcher next) async {
|
||||
next(action);
|
||||
|
||||
final emailWasSent = await Navigator.of(action.context).pushNamed(InvoiceEmailScreen.route);
|
||||
final emailWasSent =
|
||||
await Navigator.of(action.context).pushNamed(QuoteEmailScreen.route);
|
||||
|
||||
if (action.completer != null && emailWasSent) {
|
||||
action.completer.complete(null);
|
||||
|
|
@ -92,8 +94,8 @@ Middleware<AppState> _archiveQuote(QuoteRepository repository) {
|
|||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||
final origQuote = store.state.quoteState.map[action.quoteId];
|
||||
repository
|
||||
.saveData(store.state.selectedCompany, store.state.authState,
|
||||
origQuote, EntityAction.archive)
|
||||
.saveData(store.state.selectedCompany, store.state.authState, origQuote,
|
||||
EntityAction.archive)
|
||||
.then((dynamic quote) {
|
||||
store.dispatch(ArchiveQuoteSuccess(quote));
|
||||
if (action.completer != null) {
|
||||
|
|
@ -115,8 +117,8 @@ Middleware<AppState> _deleteQuote(QuoteRepository repository) {
|
|||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||
final origQuote = store.state.quoteState.map[action.quoteId];
|
||||
repository
|
||||
.saveData(store.state.selectedCompany, store.state.authState,
|
||||
origQuote, EntityAction.delete)
|
||||
.saveData(store.state.selectedCompany, store.state.authState, origQuote,
|
||||
EntityAction.delete)
|
||||
.then((InvoiceEntity quote) {
|
||||
store.dispatch(DeleteQuoteSuccess(quote));
|
||||
store.dispatch(LoadClient(clientId: quote.clientId));
|
||||
|
|
@ -139,8 +141,8 @@ Middleware<AppState> _restoreQuote(QuoteRepository repository) {
|
|||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||
final origQuote = store.state.quoteState.map[action.quoteId];
|
||||
repository
|
||||
.saveData(store.state.selectedCompany, store.state.authState,
|
||||
origQuote, EntityAction.restore)
|
||||
.saveData(store.state.selectedCompany, store.state.authState, origQuote,
|
||||
EntityAction.restore)
|
||||
.then((InvoiceEntity quote) {
|
||||
store.dispatch(RestoreQuoteSuccess(quote));
|
||||
store.dispatch(LoadClient(clientId: quote.clientId));
|
||||
|
|
@ -163,8 +165,8 @@ Middleware<AppState> _markSentQuote(QuoteRepository repository) {
|
|||
return (Store<AppState> store, dynamic action, NextDispatcher next) {
|
||||
final origQuote = store.state.quoteState.map[action.quoteId];
|
||||
repository
|
||||
.saveData(store.state.selectedCompany, store.state.authState,
|
||||
origQuote, EntityAction.markSent)
|
||||
.saveData(store.state.selectedCompany, store.state.authState, origQuote,
|
||||
EntityAction.markSent)
|
||||
.then((dynamic quote) {
|
||||
store.dispatch(MarkSentQuoteSuccess(quote));
|
||||
store.dispatch(LoadClient(clientId: quote.clientId));
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import 'package:invoiceninja_flutter/constants.dart';
|
|||
import 'package:invoiceninja_flutter/data/models/entities.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/buttons/refresh_icon_button.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/form_card.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/invoice/invoice_email_vm.dart';
|
||||
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/lists/activity_list_tile.dart';
|
||||
|
|
@ -14,7 +14,7 @@ import 'package:invoiceninja_flutter/utils/templates.dart';
|
|||
import 'package:html/parser.dart';
|
||||
|
||||
class InvoiceEmailView extends StatefulWidget {
|
||||
final EmailInvoiceVM viewModel;
|
||||
final EmailEntityVM viewModel;
|
||||
|
||||
const InvoiceEmailView({
|
||||
Key key,
|
||||
|
|
@ -68,14 +68,20 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView> {
|
|||
}
|
||||
|
||||
void loadTemplate(EmailTemplate template) {
|
||||
final company = widget.viewModel.company;
|
||||
final viewModel = widget.viewModel;
|
||||
final company = viewModel.company;
|
||||
|
||||
selectedTemplate = template;
|
||||
|
||||
switch (template) {
|
||||
case EmailTemplate.initial:
|
||||
if (viewModel.invoice.isQuote) {
|
||||
emailSubject = company.emailSubjectQuote;
|
||||
emailBody = company.emailBodyQuote;
|
||||
} else {
|
||||
emailSubject = company.emailSubjectInvoice;
|
||||
emailBody = company.emailBodyInvoice;
|
||||
}
|
||||
break;
|
||||
case EmailTemplate.reminder1:
|
||||
emailSubject = company.emailSubjectReminder1;
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class InvoiceEmailScreen extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
|
||||
class EmailInvoiceVM {
|
||||
abstract class EmailEntityVM {
|
||||
final bool isLoading;
|
||||
final bool isSaving;
|
||||
final CompanyEntity company;
|
||||
|
|
@ -49,7 +49,7 @@ class EmailInvoiceVM {
|
|||
final ClientEntity client;
|
||||
final Function(BuildContext, EmailTemplate, String, String) onSendPressed;
|
||||
|
||||
EmailInvoiceVM({
|
||||
EmailEntityVM({
|
||||
@required this.isLoading,
|
||||
@required this.isSaving,
|
||||
@required this.company,
|
||||
|
|
@ -57,6 +57,25 @@ class EmailInvoiceVM {
|
|||
@required this.client,
|
||||
@required this.onSendPressed,
|
||||
});
|
||||
}
|
||||
|
||||
class EmailInvoiceVM extends EmailEntityVM {
|
||||
|
||||
EmailInvoiceVM({
|
||||
bool isLoading,
|
||||
bool isSaving,
|
||||
CompanyEntity company,
|
||||
InvoiceEntity invoice,
|
||||
ClientEntity client,
|
||||
Function(BuildContext, EmailTemplate, String, String) onSendPressed,
|
||||
}): super(
|
||||
isLoading: isLoading,
|
||||
isSaving: isSaving,
|
||||
company: company,
|
||||
invoice: invoice,
|
||||
client: client,
|
||||
onSendPressed: onSendPressed,
|
||||
);
|
||||
|
||||
factory EmailInvoiceVM.fromStore(
|
||||
Store<AppState> store, InvoiceEntity invoice) {
|
||||
|
|
@ -9,7 +9,6 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
|
|||
import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/icon_message.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/invoice/invoice_item_view.dart';
|
||||
import 'package:invoiceninja_flutter/ui/app/two_value_header.dart';
|
||||
import 'package:invoiceninja_flutter/ui/quote/view/quote_view_vm.dart';
|
||||
import 'package:invoiceninja_flutter/utils/localization.dart';
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue