From e659f07f20bf9f75e09ce257f8cc68b914dabb06 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 6 Nov 2019 16:18:20 +0200 Subject: [PATCH] Settings --- lib/redux/client/client_actions.dart | 5 ++--- lib/redux/invoice/invoice_actions.dart | 6 ++++++ lib/redux/invoice/invoice_reducer.dart | 8 +++++++ lib/redux/quote/quote_actions.dart | 21 +++++++++++++++++++ lib/redux/quote/quote_reducer.dart | 16 ++++++++++++++ lib/ui/client/view/client_view.dart | 8 +++---- lib/ui/client/view/client_view_vm.dart | 20 +++++++++++------- .../invoice/edit/invoice_edit_contacts.dart | 1 - lib/ui/invoice/edit/invoice_edit_details.dart | 3 +-- .../invoice/edit/invoice_edit_details_vm.dart | 7 +++++++ lib/ui/quote/edit/quote_edit_details_vm.dart | 5 +++++ 11 files changed, 82 insertions(+), 18 deletions(-) diff --git a/lib/redux/client/client_actions.dart b/lib/redux/client/client_actions.dart index c5ca936ab..29155919c 100644 --- a/lib/redux/client/client_actions.dart +++ b/lib/redux/client/client_actions.dart @@ -292,9 +292,8 @@ void handleClientAction( break; case EntityAction.newInvoice: store.dispatch(EditInvoice( - invoice: InvoiceEntity(company: company) - .rebuild((b) => b.clientId = client.id), - context: context)); + invoice: InvoiceEntity(company: company), context: context)); + store.dispatch(UpdateInvoiceClient(client: client)); break; case EntityAction.newExpense: store.dispatch(EditExpense( diff --git a/lib/redux/invoice/invoice_actions.dart b/lib/redux/invoice/invoice_actions.dart index 72d1554ed..a4e607b4f 100644 --- a/lib/redux/invoice/invoice_actions.dart +++ b/lib/redux/invoice/invoice_actions.dart @@ -63,6 +63,12 @@ class UpdateInvoice implements PersistUI { final InvoiceEntity invoice; } +class UpdateInvoiceClient implements PersistUI { + UpdateInvoiceClient({this.client}); + + final ClientEntity client; +} + class LoadInvoice { LoadInvoice({this.completer, this.invoiceId}); diff --git a/lib/redux/invoice/invoice_reducer.dart b/lib/redux/invoice/invoice_reducer.dart index 60545584a..5eea34bd7 100644 --- a/lib/redux/invoice/invoice_reducer.dart +++ b/lib/redux/invoice/invoice_reducer.dart @@ -53,6 +53,14 @@ final editingReducer = combineReducers([ TypedReducer((invoice, action) { return action.invoice.rebuild((b) => b..isChanged = true); }), + TypedReducer((invoice, action) { + final client = action.client; + return invoice.rebuild((b) => b + ..isChanged = true + ..clientId = client.id + ..invitations.addAll(client.contacts + .map((contact) => InvitationEntity(contactId: contact.id)))); + }), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), diff --git a/lib/redux/quote/quote_actions.dart b/lib/redux/quote/quote_actions.dart index b0f507cb6..03bfff81a 100644 --- a/lib/redux/quote/quote_actions.dart +++ b/lib/redux/quote/quote_actions.dart @@ -63,6 +63,13 @@ class UpdateQuote implements PersistUI { final InvoiceEntity quote; } +class UpdateQuoteClient implements PersistUI { + UpdateQuoteClient({this.client}); + + final ClientEntity client; +} + + class LoadQuote { LoadQuote({this.completer, this.quoteId}); @@ -125,6 +132,20 @@ class LoadQuotesSuccess implements StopLoading, PersistData { } } +class AddQuoteContact implements PersistUI { + AddQuoteContact({this.contact, this.invitation}); + + final ContactEntity contact; + final InvitationEntity invitation; +} + +class RemoveQuoteContact implements PersistUI { + RemoveQuoteContact({this.invitation}); + + final InvitationEntity invitation; +} + + class AddQuoteItem implements PersistUI { AddQuoteItem({this.quoteItem}); diff --git a/lib/redux/quote/quote_reducer.dart b/lib/redux/quote/quote_reducer.dart index e26a0eafa..53121c4f9 100644 --- a/lib/redux/quote/quote_reducer.dart +++ b/lib/redux/quote/quote_reducer.dart @@ -51,6 +51,14 @@ final editingReducer = combineReducers([ TypedReducer((quote, action) { return action.quote.rebuild((b) => b..isChanged = true); }), + TypedReducer((quote, action) { + final client = action.client; + return quote.rebuild((b) => b + ..isChanged = true + ..clientId = client.id + ..invitations.addAll(client.contacts + .map((contact) => InvitationEntity(contactId: contact.id)))); + }), TypedReducer(_updateEditing), TypedReducer(_updateEditing), TypedReducer(_updateEditing), @@ -60,6 +68,14 @@ final editingReducer = combineReducers([ TypedReducer(_updateQuoteItem), TypedReducer(_clearEditing), TypedReducer(_clearEditing), + TypedReducer((invoice, action) { + return invoice.rebuild((b) => b + ..invitations.add( + action.invitation ?? InvitationEntity(contactId: action.contact.id))); + }), + TypedReducer((invoice, action) { + return invoice.rebuild((b) => b..invitations.remove(action.invitation)); + }), ]); InvoiceEntity _clearEditing(InvoiceEntity quote, dynamic action) { diff --git a/lib/ui/client/view/client_view.dart b/lib/ui/client/view/client_view.dart index ce17589a2..8b86d2438 100644 --- a/lib/ui/client/view/client_view.dart +++ b/lib/ui/client/view/client_view.dart @@ -86,9 +86,9 @@ class _ClientViewState extends State onTap: () { Navigator.of(context).pop(); store.dispatch(EditInvoice( - invoice: InvoiceEntity(company: company) - .rebuild((b) => b.clientId = client.id), + invoice: InvoiceEntity(company: company), context: context)); + store.dispatch(UpdateInvoiceClient(client: client)); }, ) : Container(), @@ -115,9 +115,9 @@ class _ClientViewState extends State onTap: () { Navigator.of(context).pop(); store.dispatch(EditQuote( - quote: InvoiceEntity(isQuote: true) - .rebuild((b) => b.clientId = client.id), + quote: InvoiceEntity(isQuote: true), context: context)); + store.dispatch(UpdateQuoteClient(client: client)); }, ) : Container(), diff --git a/lib/ui/client/view/client_view_vm.dart b/lib/ui/client/view/client_view_vm.dart index f3cc64b01..3ecc514f1 100644 --- a/lib/ui/client/view/client_view_vm.dart +++ b/lib/ui/client/view/client_view_vm.dart @@ -63,7 +63,9 @@ class ClientViewVM { Future _handleRefresh(BuildContext context, bool loadActivities) { final completer = snackBarCompleter( - context, AppLocalization.of(context).refreshComplete); + context, AppLocalization + .of(context) + .refreshComplete); store.dispatch(LoadClient( completer: completer, clientId: client.id, @@ -85,8 +87,10 @@ class ClientViewVM { completer.future.then((client) { Scaffold.of(context).showSnackBar(SnackBar( content: SnackBarRow( - message: AppLocalization.of(context).updatedClient, - ))); + message: AppLocalization + .of(context) + .updatedClient, + ))); }); }, onEntityPressed: (BuildContext context, EntityType entityType, @@ -96,8 +100,8 @@ class ClientViewVM { if (longPress && client.isActive) { store.dispatch(EditInvoice( context: context, - invoice: InvoiceEntity(company: state.selectedCompany) - .rebuild((b) => b..clientId = client.id))); + invoice: InvoiceEntity(company: state.selectedCompany))); + store.dispatch(UpdateInvoiceClient(client: client)); } else { store.dispatch(FilterInvoicesByEntity( entityId: client.id, entityType: EntityType.client)); @@ -109,8 +113,8 @@ class ClientViewVM { store.dispatch(EditQuote( context: context, quote: InvoiceEntity( - company: state.selectedCompany, isQuote: true) - .rebuild((b) => b..clientId = client.id))); + company: state.selectedCompany, isQuote: true))); + store.dispatch(UpdateQuoteClient(client: client)); } else { store.dispatch(FilterQuotesByEntity( entityId: client.id, entityType: EntityType.client)); @@ -134,7 +138,7 @@ class ClientViewVM { store.dispatch(EditProject( context: context, project: - ProjectEntity().rebuild((b) => b..clientId = client.id))); + ProjectEntity().rebuild((b) => b..clientId = client.id))); } else { store.dispatch(FilterProjectsByEntity( entityId: client.id, entityType: EntityType.client)); diff --git a/lib/ui/invoice/edit/invoice_edit_contacts.dart b/lib/ui/invoice/edit/invoice_edit_contacts.dart index 0adfe43f0..c21f25717 100644 --- a/lib/ui/invoice/edit/invoice_edit_contacts.dart +++ b/lib/ui/invoice/edit/invoice_edit_contacts.dart @@ -16,7 +16,6 @@ class InvoiceEditContacts extends StatelessWidget { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); - //final viewModel = widget.viewModel; final invoice = viewModel.invoice; final client = viewModel.client; diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 73669cae1..b159ea570 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -151,8 +151,7 @@ class InvoiceEditDetailsState extends State { ? AppLocalization.of(context).pleaseSelectAClient : null, onSelected: (client) { - viewModel.onChanged( - invoice.rebuild((b) => b..clientId = client.id)); + viewModel.onClientChanged(invoice, client); }, onAddPressed: (completer) { viewModel.onAddClientPressed(context, completer); diff --git a/lib/ui/invoice/edit/invoice_edit_details_vm.dart b/lib/ui/invoice/edit/invoice_edit_details_vm.dart index e1ba42d94..fe6aa8b72 100644 --- a/lib/ui/invoice/edit/invoice_edit_details_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_details_vm.dart @@ -39,6 +39,7 @@ class EntityEditDetailsVM { @required this.company, @required this.invoice, @required this.onChanged, + @required this.onClientChanged, @required this.clientMap, @required this.clientList, @required this.onAddClientPressed, @@ -47,6 +48,7 @@ class EntityEditDetailsVM { final CompanyEntity company; final InvoiceEntity invoice; final Function(InvoiceEntity) onChanged; + final Function(InvoiceEntity, ClientEntity) onClientChanged; final BuiltMap clientMap; final BuiltList clientList; final Function(BuildContext context, Completer completer) @@ -58,6 +60,7 @@ class InvoiceEditDetailsVM extends EntityEditDetailsVM { CompanyEntity company, InvoiceEntity invoice, Function(InvoiceEntity) onChanged, + Function(InvoiceEntity, ClientEntity) onClientChanged, BuiltMap clientMap, BuiltList clientList, Function(BuildContext context, Completer completer) @@ -66,6 +69,7 @@ class InvoiceEditDetailsVM extends EntityEditDetailsVM { company: company, invoice: invoice, onChanged: onChanged, + onClientChanged: onClientChanged, clientMap: clientMap, clientList: clientList, onAddClientPressed: onAddClientPressed, @@ -82,6 +86,9 @@ class InvoiceEditDetailsVM extends EntityEditDetailsVM { store.dispatch(UpdateInvoice(invoice)), clientMap: state.clientState.map, clientList: state.clientState.list, + onClientChanged: (invoice, client) { + store.dispatch(UpdateInvoiceClient(client: client)); + }, onAddClientPressed: (context, completer) { store.dispatch(EditClient( client: ClientEntity(), diff --git a/lib/ui/quote/edit/quote_edit_details_vm.dart b/lib/ui/quote/edit/quote_edit_details_vm.dart index 35b469e46..6a17a8a4c 100644 --- a/lib/ui/quote/edit/quote_edit_details_vm.dart +++ b/lib/ui/quote/edit/quote_edit_details_vm.dart @@ -40,6 +40,7 @@ class QuoteEditDetailsVM extends EntityEditDetailsVM { CompanyEntity company, InvoiceEntity invoice, Function(InvoiceEntity) onChanged, + Function(InvoiceEntity, ClientEntity) onClientChanged, BuiltMap clientMap, BuiltList clientList, Function(BuildContext context, Completer completer) @@ -48,6 +49,7 @@ class QuoteEditDetailsVM extends EntityEditDetailsVM { company: company, invoice: invoice, onChanged: onChanged, + onClientChanged: onClientChanged, clientMap: clientMap, clientList: clientList, onAddClientPressed: onAddClientPressed, @@ -63,6 +65,9 @@ class QuoteEditDetailsVM extends EntityEditDetailsVM { onChanged: (InvoiceEntity quote) => store.dispatch(UpdateQuote(quote)), clientMap: state.clientState.map, clientList: state.clientState.list, + onClientChanged: (invoice, client) { + store.dispatch(UpdateQuoteClient(client: client)); + }, onAddClientPressed: (context, completer) { store.dispatch(EditClient( client: ClientEntity(),