Quotes
This commit is contained in:
parent
91ef51d9ca
commit
ca6610bc2b
|
|
@ -40,7 +40,7 @@ class EntityAction extends EnumClass {
|
||||||
static const EntityAction restore = _$restore;
|
static const EntityAction restore = _$restore;
|
||||||
static const EntityAction clone = _$clone;
|
static const EntityAction clone = _$clone;
|
||||||
static const EntityAction download = _$download;
|
static const EntityAction download = _$download;
|
||||||
static const EntityAction emailInvoice = _$email;
|
static const EntityAction email = _$email;
|
||||||
static const EntityAction markSent = _$markSent;
|
static const EntityAction markSent = _$markSent;
|
||||||
static const EntityAction invoice = _$invoice;
|
static const EntityAction invoice = _$invoice;
|
||||||
static const EntityAction pdf = _$pdf;
|
static const EntityAction pdf = _$pdf;
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ class InvoiceList extends StatelessWidget {
|
||||||
leading: Icon(Icons.send),
|
leading: Icon(Icons.send),
|
||||||
title: Text(AppLocalization.of(context).email),
|
title: Text(AppLocalization.of(context).email),
|
||||||
onTap: () => viewModel.onEntityAction(
|
onTap: () => viewModel.onEntityAction(
|
||||||
context, invoice, EntityAction.emailInvoice),
|
context, invoice, EntityAction.email),
|
||||||
)
|
)
|
||||||
: Container(),
|
: Container(),
|
||||||
ListTile(
|
ListTile(
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ class InvoiceListVM {
|
||||||
context, localization.markedInvoiceAsSent),
|
context, localization.markedInvoiceAsSent),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.emailInvoice:
|
case EntityAction.email:
|
||||||
store.dispatch(ShowEmailInvoice(
|
store.dispatch(ShowEmailInvoice(
|
||||||
completer: popCompleter(
|
completer: popCompleter(
|
||||||
context, localization.emailedInvoice),
|
context, localization.emailedInvoice),
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,7 @@ class _CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
: null,
|
: null,
|
||||||
user.canEditEntity(invoice) && client.hasEmailAddress
|
user.canEditEntity(invoice) && client.hasEmailAddress
|
||||||
? ActionMenuChoice(
|
? ActionMenuChoice(
|
||||||
action: EntityAction.emailInvoice,
|
action: EntityAction.email,
|
||||||
icon: Icons.send,
|
icon: Icons.send,
|
||||||
label: AppLocalization.of(context).email,
|
label: AppLocalization.of(context).email,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ class InvoiceViewVM {
|
||||||
snackBarCompleter(context, localization.markedInvoiceAsSent),
|
snackBarCompleter(context, localization.markedInvoiceAsSent),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.emailInvoice:
|
case EntityAction.email:
|
||||||
store.dispatch(ShowEmailInvoice(
|
store.dispatch(ShowEmailInvoice(
|
||||||
completer:
|
completer:
|
||||||
snackBarCompleter(context, localization.emailedInvoice),
|
snackBarCompleter(context, localization.emailedInvoice),
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ class QuoteList extends StatelessWidget {
|
||||||
leading: Icon(Icons.send),
|
leading: Icon(Icons.send),
|
||||||
title: Text(AppLocalization.of(context).email),
|
title: Text(AppLocalization.of(context).email),
|
||||||
onTap: () => viewModel.onEntityAction(
|
onTap: () => viewModel.onEntityAction(
|
||||||
context, invoice, EntityAction.emailInvoice),
|
context, invoice, EntityAction.email),
|
||||||
)
|
)
|
||||||
: Container(),
|
: Container(),
|
||||||
ListTile(
|
ListTile(
|
||||||
|
|
@ -163,7 +163,7 @@ class QuoteList extends StatelessWidget {
|
||||||
viewModel.onDismissed(
|
viewModel.onDismissed(
|
||||||
context, invoice, direction),
|
context, invoice, direction),
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
viewModel.onInvoiceTap(context, invoice),
|
viewModel.onQuoteTap(context, invoice),
|
||||||
onLongPress: () =>
|
onLongPress: () =>
|
||||||
_showMenu(context, invoice, client),
|
_showMenu(context, invoice, client),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:built_collection/built_collection.dart';
|
import 'package:built_collection/built_collection.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
|
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
|
||||||
|
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/quote/quote_selectors.dart';
|
import 'package:invoiceninja_flutter/redux/quote/quote_selectors.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
@ -14,7 +15,6 @@ import 'package:invoiceninja_flutter/utils/pdf.dart';
|
||||||
import 'package:redux/redux.dart';
|
import 'package:redux/redux.dart';
|
||||||
import 'package:invoiceninja_flutter/data/models/models.dart';
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
|
||||||
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
|
|
||||||
|
|
||||||
class QuoteListBuilder extends StatelessWidget {
|
class QuoteListBuilder extends StatelessWidget {
|
||||||
static const String route = '/invoices/edit';
|
static const String route = '/invoices/edit';
|
||||||
|
|
@ -44,7 +44,7 @@ class QuoteListVM {
|
||||||
final String filter;
|
final String filter;
|
||||||
final bool isLoading;
|
final bool isLoading;
|
||||||
final bool isLoaded;
|
final bool isLoaded;
|
||||||
final Function(BuildContext, InvoiceEntity) onInvoiceTap;
|
final Function(BuildContext, InvoiceEntity) onQuoteTap;
|
||||||
final Function(BuildContext, InvoiceEntity, DismissDirection) onDismissed;
|
final Function(BuildContext, InvoiceEntity, DismissDirection) onDismissed;
|
||||||
final Function(BuildContext) onRefreshed;
|
final Function(BuildContext) onRefreshed;
|
||||||
final Function onClearClientFilterPressed;
|
final Function onClearClientFilterPressed;
|
||||||
|
|
@ -60,7 +60,7 @@ class QuoteListVM {
|
||||||
@required this.isLoading,
|
@required this.isLoading,
|
||||||
@required this.isLoaded,
|
@required this.isLoaded,
|
||||||
@required this.filter,
|
@required this.filter,
|
||||||
@required this.onInvoiceTap,
|
@required this.onQuoteTap,
|
||||||
@required this.onDismissed,
|
@required this.onDismissed,
|
||||||
@required this.onRefreshed,
|
@required this.onRefreshed,
|
||||||
@required this.onClearClientFilterPressed,
|
@required this.onClearClientFilterPressed,
|
||||||
|
|
@ -75,7 +75,7 @@ class QuoteListVM {
|
||||||
}
|
}
|
||||||
final completer = snackBarCompleter(
|
final completer = snackBarCompleter(
|
||||||
context, AppLocalization.of(context).refreshComplete);
|
context, AppLocalization.of(context).refreshComplete);
|
||||||
store.dispatch(LoadInvoices(completer: completer, force: true));
|
store.dispatch(LoadQuotes(completer: completer, force: true));
|
||||||
return completer.future;
|
return completer.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,58 +94,58 @@ class QuoteListVM {
|
||||||
isLoading: state.isLoading,
|
isLoading: state.isLoading,
|
||||||
isLoaded: state.invoiceState.isLoaded && state.clientState.isLoaded,
|
isLoaded: state.invoiceState.isLoaded && state.clientState.isLoaded,
|
||||||
filter: state.invoiceListState.filter,
|
filter: state.invoiceListState.filter,
|
||||||
onInvoiceTap: (context, invoice) {
|
onQuoteTap: (context, invoice) {
|
||||||
store.dispatch(ViewInvoice(invoiceId: invoice.id, context: context));
|
store.dispatch(ViewQuote(quoteId: invoice.id, context: context));
|
||||||
},
|
},
|
||||||
onRefreshed: (context) => _handleRefresh(context),
|
onRefreshed: (context) => _handleRefresh(context),
|
||||||
onClearClientFilterPressed: () =>
|
onClearClientFilterPressed: () =>
|
||||||
store.dispatch(FilterInvoicesByClient()),
|
store.dispatch(FilterQuotesByClient()),
|
||||||
onViewClientFilterPressed: (BuildContext context) => store.dispatch(
|
onViewClientFilterPressed: (BuildContext context) => store.dispatch(
|
||||||
ViewClient(
|
ViewClient(
|
||||||
clientId: state.invoiceListState.filterClientId,
|
clientId: state.invoiceListState.filterClientId,
|
||||||
context: context)),
|
context: context)),
|
||||||
onEntityAction: (context, invoice, action) {
|
onEntityAction: (context, quote, action) {
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case EntityAction.pdf:
|
case EntityAction.pdf:
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
viewPdf(invoice, context);
|
viewPdf(quote, context);
|
||||||
break;
|
break;
|
||||||
case EntityAction.markSent:
|
case EntityAction.markSent:
|
||||||
store.dispatch(MarkSentInvoiceRequest(
|
store.dispatch(MarkSentQuoteRequest(
|
||||||
popCompleter(
|
popCompleter(
|
||||||
context, localization.markedInvoiceAsSent),
|
context, localization.markedQuoteAsSent),
|
||||||
invoice.id));
|
quote.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.emailInvoice:
|
case EntityAction.email:
|
||||||
store.dispatch(ShowEmailInvoice(
|
store.dispatch(ShowEmailQuote(
|
||||||
completer: popCompleter(
|
completer: popCompleter(
|
||||||
context, localization.emailedInvoice),
|
context, localization.emailedQuote),
|
||||||
invoice: invoice,
|
quote: quote,
|
||||||
context: context));
|
context: context));
|
||||||
break;
|
break;
|
||||||
case EntityAction.clone:
|
case EntityAction.clone:
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
store.dispatch(
|
store.dispatch(
|
||||||
EditInvoice(context: context, invoice: invoice.clone));
|
EditQuote(context: context, quote: quote.clone));
|
||||||
break;
|
break;
|
||||||
case EntityAction.restore:
|
case EntityAction.restore:
|
||||||
store.dispatch(RestoreInvoiceRequest(
|
store.dispatch(RestoreQuoteRequest(
|
||||||
popCompleter(
|
popCompleter(
|
||||||
context, localization.restoredInvoice),
|
context, localization.restoredQuote),
|
||||||
invoice.id));
|
quote.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.archive:
|
case EntityAction.archive:
|
||||||
store.dispatch(ArchiveInvoiceRequest(
|
store.dispatch(ArchiveQuoteRequest(
|
||||||
popCompleter(
|
popCompleter(
|
||||||
context, localization.archivedInvoice),
|
context, localization.archivedQuote),
|
||||||
invoice.id));
|
quote.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.delete:
|
case EntityAction.delete:
|
||||||
store.dispatch(DeleteInvoiceRequest(
|
store.dispatch(DeleteQuoteRequest(
|
||||||
popCompleter(
|
popCompleter(
|
||||||
context, localization.deletedInvoice),
|
context, localization.deletedQuote),
|
||||||
invoice.id));
|
quote.id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -154,26 +154,26 @@ class QuoteListVM {
|
||||||
final localization = AppLocalization.of(context);
|
final localization = AppLocalization.of(context);
|
||||||
if (direction == DismissDirection.endToStart) {
|
if (direction == DismissDirection.endToStart) {
|
||||||
if (invoice.isDeleted || invoice.isArchived) {
|
if (invoice.isDeleted || invoice.isArchived) {
|
||||||
store.dispatch(RestoreInvoiceRequest(
|
store.dispatch(RestoreQuoteRequest(
|
||||||
snackBarCompleter(
|
snackBarCompleter(
|
||||||
context, localization.restoredInvoice),
|
context, localization.restoredQuote),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(ArchiveInvoiceRequest(
|
store.dispatch(ArchiveQuoteRequest(
|
||||||
snackBarCompleter(
|
snackBarCompleter(
|
||||||
context, localization.archivedInvoice),
|
context, localization.archivedQuote),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
}
|
}
|
||||||
} else if (direction == DismissDirection.startToEnd) {
|
} else if (direction == DismissDirection.startToEnd) {
|
||||||
if (invoice.isDeleted) {
|
if (invoice.isDeleted) {
|
||||||
store.dispatch(RestoreInvoiceRequest(
|
store.dispatch(RestoreQuoteRequest(
|
||||||
snackBarCompleter(
|
snackBarCompleter(
|
||||||
context, localization.restoredInvoice),
|
context, localization.restoredQuote),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
} else {
|
} else {
|
||||||
store.dispatch(DeleteInvoiceRequest(
|
store.dispatch(DeleteQuoteRequest(
|
||||||
snackBarCompleter(
|
snackBarCompleter(
|
||||||
context, localization.deletedInvoice),
|
context, localization.deletedQuote),
|
||||||
invoice.id));
|
invoice.id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,7 @@ class _CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||||
: null,
|
: null,
|
||||||
user.canEditEntity(quote) && client.hasEmailAddress
|
user.canEditEntity(quote) && client.hasEmailAddress
|
||||||
? ActionMenuChoice(
|
? ActionMenuChoice(
|
||||||
action: EntityAction.emailInvoice,
|
action: EntityAction.email,
|
||||||
icon: Icons.send,
|
icon: Icons.send,
|
||||||
label: AppLocalization.of(context).email,
|
label: AppLocalization.of(context).email,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@ class QuoteViewVM {
|
||||||
snackBarCompleter(context, localization.markedQuoteAsSent),
|
snackBarCompleter(context, localization.markedQuoteAsSent),
|
||||||
quote.id));
|
quote.id));
|
||||||
break;
|
break;
|
||||||
case EntityAction.emailInvoice:
|
case EntityAction.email:
|
||||||
store.dispatch(ShowEmailQuote(
|
store.dispatch(ShowEmailQuote(
|
||||||
completer:
|
completer:
|
||||||
snackBarCompleter(context, localization.emailedQuote),
|
snackBarCompleter(context, localization.emailedQuote),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue