Refactorerd Actions to take Lists

This commit is contained in:
Gianfranco Gasbarri 2019-09-30 00:28:17 +01:00
parent c06ac2cd07
commit f8fa32b516
42 changed files with 500 additions and 390 deletions

View File

@ -1,12 +1,13 @@
import 'dart:async';
import 'dart:convert';
import 'dart:core';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/serializers.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/data/models/serializers.dart';
import 'package:invoiceninja_flutter/data/web_client.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class ClientRepository {
const ClientRepository({
@ -47,8 +48,34 @@ class ClientRepository {
return clientResponse.data;
}
Future<ClientEntity> saveData(Credentials credentials, ClientEntity client,
[EntityAction action]) async {
Future<List<ClientEntity>> bulkAction(
Credentials credentials, List<String> ids, EntityAction action) async {
dynamic response;
switch (action) {
case EntityAction.restore:
case EntityAction.archive:
case EntityAction.delete:
var url = credentials.url + '/clients/bulk?include=activities';
if (action != null) {
url += '&action=' + action.toString();
}
response =
await webClient.put(url, credentials.token, json.encode([ids]));
break;
default:
// Might have other actions in the future
break;
}
final ClientListResponse clientResponse =
serializers.deserializeWith(ClientListResponse.serializer, response);
return clientResponse.data.toList();
}
Future<ClientEntity> saveData(
Credentials credentials, ClientEntity client) async {
final data = serializers.serializeWith(ClientEntity.serializer, client);
dynamic response;

View File

@ -175,60 +175,60 @@ class SaveClientFailure implements StopSaving {
}
class ArchiveClientRequest implements StartSaving {
ArchiveClientRequest(this.completer, this.clientId);
ArchiveClientRequest(this.completer, this.clientIds);
final Completer completer;
final String clientId;
final List<String> clientIds;
}
class ArchiveClientSuccess implements StopSaving, PersistData {
ArchiveClientSuccess(this.client);
ArchiveClientSuccess(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class ArchiveClientFailure implements StopSaving {
ArchiveClientFailure(this.client);
ArchiveClientFailure(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class DeleteClientRequest implements StartSaving {
DeleteClientRequest(this.completer, this.clientId);
DeleteClientRequest(this.completer, this.clientIds);
final Completer completer;
final String clientId;
final List<String> clientIds;
}
class DeleteClientSuccess implements StopSaving, PersistData {
DeleteClientSuccess(this.client);
DeleteClientSuccess(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class DeleteClientFailure implements StopSaving {
DeleteClientFailure(this.client);
DeleteClientFailure(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class RestoreClientRequest implements StartSaving {
RestoreClientRequest(this.completer, this.clientId);
RestoreClientRequest(this.completer, this.clientIds);
final Completer completer;
final String clientId;
final List<String> clientIds;
}
class RestoreClientSuccess implements StopSaving, PersistData {
RestoreClientSuccess(this.client);
RestoreClientSuccess(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class RestoreClientFailure implements StopSaving {
RestoreClientFailure(this.client);
RestoreClientFailure(this.clients);
final ClientEntity client;
final List<ClientEntity> clients;
}
class FilterClients {
@ -269,71 +269,64 @@ class FilterClientsByCustom2 implements PersistUI {
}
void handleClientAction(
BuildContext context, ClientEntity client, EntityAction action) {
BuildContext context, List<ClientEntity> clients, EntityAction action) {
assert(
[EntityAction.restore, EntityAction.archive, EntityAction.delete]
.contains(action) ||
clients.length == 1,
'Cannot perform this action on more than one client');
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
final localization = AppLocalization.of(context);
final multiselect = state.clientListState.isInMultiselect();
final isMultiselectLast =
client == state.clientListState.selectedEntities.last;
final clientIds = clients.map((client) => client.id).toList();
switch (action) {
case EntityAction.edit:
store.dispatch(EditClient(context: context, client: client));
store.dispatch(EditClient(context: context, client: clients[0]));
break;
case EntityAction.newInvoice:
store.dispatch(EditInvoice(
invoice: InvoiceEntity(company: company)
.rebuild((b) => b.clientId = client.id),
.rebuild((b) => b.clientId = clients[0].id),
context: context));
break;
case EntityAction.newExpense:
store.dispatch(EditExpense(
expense: ExpenseEntity(
company: company, client: client, uiState: state.uiState),
company: company, client: clients[0], uiState: state.uiState),
context: context));
break;
case EntityAction.enterPayment:
store.dispatch(EditPayment(
payment: PaymentEntity(company: company)
.rebuild((b) => b.clientId = client.id),
.rebuild((b) => b.clientId = clients[0].id),
context: context));
break;
case EntityAction.restore:
if (multiselect && !isMultiselectLast) {
store.dispatch(RestoreClientRequest(null, client.id));
} else {
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient),
client.id));
}
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient), clientIds));
break;
case EntityAction.archive:
if (multiselect && !isMultiselectLast) {
store.dispatch(ArchiveClientRequest(null, client.id));
} else {
store.dispatch(ArchiveClientRequest(
snackBarCompleter(context, localization.archivedClient),
client.id));
}
store.dispatch(ArchiveClientRequest(
snackBarCompleter(context, localization.archivedClient), clientIds));
break;
case EntityAction.delete:
if (multiselect && !isMultiselectLast) {
store.dispatch(DeleteClientRequest(null, client.id));
} else {
store.dispatch(DeleteClientRequest(
snackBarCompleter(context, localization.deletedClient), client.id));
}
store.dispatch(DeleteClientRequest(
snackBarCompleter(context, localization.deletedClient), clientIds));
break;
case EntityAction.toggleMultiselect:
if (!store.state.clientListState.isInMultiselect()) {
store.dispatch(StartMultiselect(context: context));
}
if (!store.state.clientListState.isSelected(client)) {
store.dispatch(AddToMultiselect(context: context, entity: client));
} else {
store.dispatch(RemoveFromMultiselect(context: context, entity: client));
for (final client in clients) {
if (!store.state.clientListState.isSelected(client)) {
store.dispatch(AddToMultiselect(context: context, entity: client));
} else {
store.dispatch(
RemoveFromMultiselect(context: context, entity: client));
}
}
break;
}

View File

@ -1,16 +1,16 @@
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/data/repositories/client_repository.dart';
import 'package:invoiceninja_flutter/redux/app/app_middleware.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/client/client_screen.dart';
import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart';
import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/data/repositories/client_repository.dart';
import 'package:redux/redux.dart';
List<Middleware<AppState>> createStoreClientsMiddleware([
ClientRepository repository = const ClientRepository(),
@ -105,17 +105,20 @@ Middleware<AppState> _viewClientList() {
Middleware<AppState> _archiveClient(ClientRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as ArchiveClientRequest;
final origClient = store.state.clientState.map[action.clientId];
repository
.saveData(store.state.credentials, origClient, EntityAction.archive)
.then((ClientEntity client) {
store.dispatch(ArchiveClientSuccess(client));
.bulkAction(
store.state.credentials, action.clientIds, EntityAction.archive)
.then((List<ClientEntity> clients) {
store.dispatch(ArchiveClientSuccess(clients));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(ArchiveClientFailure(origClient));
final clients = action.clientIds
.map((id) => store.state.clientState.map[id])
.toList();
store.dispatch(ArchiveClientFailure(clients));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -128,17 +131,20 @@ Middleware<AppState> _archiveClient(ClientRepository repository) {
Middleware<AppState> _deleteClient(ClientRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as DeleteClientRequest;
final origClient = store.state.clientState.map[action.clientId];
repository
.saveData(store.state.credentials, origClient, EntityAction.delete)
.then((ClientEntity client) {
store.dispatch(DeleteClientSuccess(client));
.bulkAction(
store.state.credentials, action.clientIds, EntityAction.delete)
.then((List<ClientEntity> clients) {
store.dispatch(DeleteClientSuccess(clients));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(DeleteClientFailure(origClient));
final clients = action.clientIds
.map((id) => store.state.clientState.map[id])
.toList();
store.dispatch(DeleteClientFailure(clients));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -151,17 +157,20 @@ Middleware<AppState> _deleteClient(ClientRepository repository) {
Middleware<AppState> _restoreClient(ClientRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as RestoreClientRequest;
final origClient = store.state.clientState.map[action.clientId];
repository
.saveData(store.state.credentials, origClient, EntityAction.restore)
.then((ClientEntity client) {
store.dispatch(RestoreClientSuccess(client));
.bulkAction(
store.state.credentials, action.clientIds, EntityAction.restore)
.then((List<ClientEntity> clients) {
store.dispatch(RestoreClientSuccess(clients));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(RestoreClientFailure(origClient));
final clients = action.clientIds
.map((id) => store.state.clientState.map[id])
.toList();
store.dispatch(RestoreClientFailure(clients));
if (action.completer != null) {
action.completer.completeError(error);
}

View File

@ -58,14 +58,14 @@ final editingReducer = combineReducers<ClientEntity>([
TypedReducer<ClientEntity, AddClientSuccess>((client, action) {
return action.client;
}),
TypedReducer<ClientEntity, RestoreClientSuccess>((client, action) {
return action.client;
TypedReducer<ClientEntity, RestoreClientSuccess>((clients, action) {
return action.clients[0];
}),
TypedReducer<ClientEntity, ArchiveClientSuccess>((client, action) {
return action.client;
TypedReducer<ClientEntity, ArchiveClientSuccess>((clients, action) {
return action.clients[0];
}),
TypedReducer<ClientEntity, DeleteClientSuccess>((client, action) {
return action.client;
TypedReducer<ClientEntity, DeleteClientSuccess>((clients, action) {
return action.clients[0];
}),
TypedReducer<ClientEntity, EditClient>((client, action) {
return action.client;
@ -197,57 +197,103 @@ final clientsReducer = combineReducers<ClientState>([
ClientState _archiveClientRequest(
ClientState clientState, ArchiveClientRequest action) {
final client = clientState.map[action.clientId]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
final clients = action.clientIds.map((id) => clientState.map[id]).toList();
return clientState.rebuild((b) => b..map[action.clientId] = client);
for (int i = 0; i < clients.length; i++) {
clients[i] = clients[i]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
}
return clientState.rebuild((b) {
for (final client in clients) {
b.map[client.id] = client;
}
});
}
ClientState _archiveClientSuccess(
ClientState clientState, ArchiveClientSuccess action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _archiveClientFailure(
ClientState clientState, ArchiveClientFailure action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _deleteClientRequest(
ClientState clientState, DeleteClientRequest action) {
final client = clientState.map[action.clientId].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
final clients = action.clientIds.map((id) => clientState.map[id]).toList();
return clientState.rebuild((b) => b..map[action.clientId] = client);
for (int i = 0; i < clients.length; i++) {
clients[i] = clients[i].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
}
return clientState.rebuild((b) {
for (final client in clients) {
b.map[client.id] = client;
}
});
}
ClientState _deleteClientSuccess(
ClientState clientState, DeleteClientSuccess action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _deleteClientFailure(
ClientState clientState, DeleteClientFailure action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _restoreClientRequest(
ClientState clientState, RestoreClientRequest action) {
final client = clientState.map[action.clientId].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
return clientState.rebuild((b) => b..map[action.clientId] = client);
final clients = action.clientIds.map((id) => clientState.map[id]).toList();
for (int i = 0; i < clients.length; i++) {
clients[i] = clients[i].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
}
return clientState.rebuild((b) {
for (final client in clients) {
b.map[client.id] = client;
}
});
}
ClientState _restoreClientSuccess(
ClientState clientState, RestoreClientSuccess action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _restoreClientFailure(
ClientState clientState, RestoreClientFailure action) {
return clientState.rebuild((b) => b..map[action.client.id] = action.client);
return clientState.rebuild((b) {
for (final client in action.clients) {
b.map[client.id] = client;
}
});
}
ClientState _addClient(ClientState clientState, AddClientSuccess action) {

View File

@ -1,17 +1,18 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_email_vm.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/pdf.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:url_launcher/url_launcher.dart';
@ -322,8 +323,8 @@ class FilterInvoicesByCustom2 implements PersistUI {
final String value;
}
void handleInvoiceAction(
BuildContext context, InvoiceEntity invoice, EntityAction action) async {
void handleInvoiceAction(BuildContext context, List<InvoiceEntity> invoices,
EntityAction action) async {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
@ -331,27 +332,27 @@ void handleInvoiceAction(
switch (action) {
case EntityAction.edit:
store.dispatch(EditInvoice(context: context, invoice: invoice));
store.dispatch(EditInvoice(context: context, invoice: invoices[0]));
break;
case EntityAction.pdf:
viewPdf(invoice, context);
viewPdf(invoices[0], context);
break;
case EntityAction.clientPortal:
if (await canLaunch(invoice.invitationSilentLink)) {
await launch(invoice.invitationSilentLink,
if (await canLaunch(invoices[0].invitationSilentLink)) {
await launch(invoices[0].invitationSilentLink,
forceSafariVC: false, forceWebView: false);
}
break;
case EntityAction.markSent:
store.dispatch(MarkSentInvoiceRequest(
snackBarCompleter(context, localization.markedInvoiceAsSent),
invoice.id));
invoices[0].id));
break;
case EntityAction.sendEmail:
if (isMobile(context)) {
store.dispatch(ShowEmailInvoice(
completer: snackBarCompleter(context, localization.emailedInvoice),
invoice: invoice,
invoice: invoices[0],
context: context));
} else {
showDialog<ResponsivePadding>(
@ -363,28 +364,30 @@ void handleInvoiceAction(
break;
case EntityAction.cloneToInvoice:
store.dispatch(
EditInvoice(context: context, invoice: invoice.cloneToInvoice));
EditInvoice(context: context, invoice: invoices[0].cloneToInvoice));
break;
case EntityAction.cloneToQuote:
store.dispatch(EditQuote(context: context, quote: invoice.cloneToQuote));
store.dispatch(
EditQuote(context: context, quote: invoices[0].cloneToQuote));
break;
case EntityAction.enterPayment:
store.dispatch(EditPayment(
context: context, payment: invoice.createPayment(company)));
context: context, payment: invoices[0].createPayment(company)));
break;
case EntityAction.restore:
store.dispatch(RestoreInvoiceRequest(
snackBarCompleter(context, localization.restoredInvoice),
invoice.id));
invoices[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveInvoiceRequest(
snackBarCompleter(context, localization.archivedInvoice),
invoice.id));
invoices[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteInvoiceRequest(
snackBarCompleter(context, localization.deletedInvoice), invoice.id));
snackBarCompleter(context, localization.deletedInvoice),
invoices[0].id));
break;
}
}

View File

@ -1,9 +1,10 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
@ -251,31 +252,33 @@ class FilterPaymentsByEntity implements PersistUI {
}
void handlePaymentAction(
BuildContext context, PaymentEntity payment, EntityAction action) {
BuildContext context, List<PaymentEntity> payments, EntityAction action) {
final store = StoreProvider.of<AppState>(context);
final localization = AppLocalization.of(context);
switch (action) {
case EntityAction.edit:
store.dispatch(EditPayment(context: context, payment: payment));
store.dispatch(EditPayment(context: context, payment: payments[0]));
break;
case EntityAction.sendEmail:
store.dispatch(EmailPaymentRequest(
snackBarCompleter(context, localization.emailedPayment), payment));
snackBarCompleter(context, localization.emailedPayment),
payments[0]));
break;
case EntityAction.restore:
store.dispatch(RestorePaymentRequest(
snackBarCompleter(context, localization.restoredPayment),
payment.id));
payments[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchivePaymentRequest(
snackBarCompleter(context, localization.archivedPayment),
payment.id));
payments[0].id));
break;
case EntityAction.delete:
store.dispatch(DeletePaymentRequest(
snackBarCompleter(context, localization.deletedPayment), payment.id));
snackBarCompleter(context, localization.deletedPayment),
payments[0].id));
break;
}
}

View File

@ -1,12 +1,13 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
@ -195,7 +196,7 @@ class FilterProductDropdown {
}
void handleProductAction(
BuildContext context, ProductEntity product, EntityAction action) {
BuildContext context, List<ProductEntity> products, EntityAction action) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final localization = AppLocalization.of(context);
@ -203,31 +204,32 @@ void handleProductAction(
switch (action) {
case EntityAction.newInvoice:
final item =
convertProductToInvoiceItem(context: context, product: product);
convertProductToInvoiceItem(context: context, product: products[0]);
store.dispatch(EditInvoice(
context: context,
invoice: InvoiceEntity(company: state.selectedCompany)
.rebuild((b) => b..invoiceItems.add(item))));
break;
case EntityAction.edit:
store.dispatch(EditProduct(context: context, product: product));
store.dispatch(EditProduct(context: context, product: products[0]));
break;
case EntityAction.clone:
store.dispatch(EditProduct(context: context, product: product.clone));
store.dispatch(EditProduct(context: context, product: products[0].clone));
break;
case EntityAction.restore:
store.dispatch(RestoreProductRequest(
snackBarCompleter(context, localization.restoredProduct),
product.id));
products[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveProductRequest(
snackBarCompleter(context, localization.archivedProduct),
product.id));
products[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteProductRequest(
snackBarCompleter(context, localization.deletedProduct), product.id));
snackBarCompleter(context, localization.deletedProduct),
products[0].id));
break;
}
}

View File

@ -242,53 +242,53 @@ class FilterProjectsByEntity implements PersistUI {
}
void handleProjectAction(
BuildContext context, ProjectEntity project, EntityAction action) {
BuildContext context, List<ProjectEntity> projects, EntityAction action) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
switch (action) {
case EntityAction.edit:
store.dispatch(EditProject(context: context, project: project));
store.dispatch(EditProject(context: context, project: projects[0]));
break;
case EntityAction.newTask:
store.dispatch(EditTask(
task: TaskEntity(isRunning: state.uiState.autoStartTasks)
.rebuild((b) => b
..projectId = project.id
..clientId = project.clientId),
..projectId = projects[0].id
..clientId = projects[0].clientId),
context: context));
break;
case EntityAction.newInvoice:
final items =
convertProjectToInvoiceItem(project: project, context: context);
convertProjectToInvoiceItem(project: projects[0], context: context);
store.dispatch(EditInvoice(
invoice: InvoiceEntity(company: company).rebuild((b) => b
..hasTasks = true
..clientId = project.clientId
..clientId = projects[0].clientId
..invoiceItems.addAll(items)),
context: context));
break;
case EntityAction.clone:
store.dispatch(EditProject(context: context, project: project.clone));
store.dispatch(EditProject(context: context, project: projects[0].clone));
break;
case EntityAction.restore:
store.dispatch(RestoreProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).restoredProject),
project.id));
projects[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).archivedProject),
project.id));
projects[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).deletedProject),
project.id));
projects[0].id));
break;
}
}

View File

@ -1,16 +1,17 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/pdf.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:flutter/material.dart';
class ViewQuoteList implements PersistUI {
ViewQuoteList({this.context, this.force = false});
@ -338,31 +339,31 @@ class ConvertQuoteFailure implements StopSaving {
final dynamic error;
}
Future handleQuoteAction(
BuildContext context, InvoiceEntity quote, EntityAction action) async {
Future handleQuoteAction(BuildContext context, List<InvoiceEntity> quotes,
EntityAction action) async {
final store = StoreProvider.of<AppState>(context);
final localization = AppLocalization.of(context);
switch (action) {
case EntityAction.edit:
store.dispatch(EditQuote(context: context, quote: quote));
store.dispatch(EditQuote(context: context, quote: quotes[0]));
break;
case EntityAction.pdf:
viewPdf(quote, context);
viewPdf(quotes[0], context);
break;
case EntityAction.clientPortal:
if (await canLaunch(quote.invitationSilentLink)) {
await launch(quote.invitationSilentLink,
if (await canLaunch(quotes[0].invitationSilentLink)) {
await launch(quotes[0].invitationSilentLink,
forceSafariVC: false, forceWebView: false);
}
break;
case EntityAction.viewInvoice:
store.dispatch(
ViewInvoice(context: context, invoiceId: quote.quoteInvoiceId));
ViewInvoice(context: context, invoiceId: quotes[0].quoteInvoiceId));
break;
case EntityAction.convert:
final Completer<InvoiceEntity> completer = Completer<InvoiceEntity>();
store.dispatch(ConvertQuote(completer, quote.id));
store.dispatch(ConvertQuote(completer, quotes[0].id));
completer.future.then((InvoiceEntity invoice) {
store.dispatch(ViewInvoice(invoiceId: invoice.id, context: context));
});
@ -370,32 +371,35 @@ Future handleQuoteAction(
case EntityAction.markSent:
store.dispatch(MarkSentQuoteRequest(
snackBarCompleter(context, localization.markedQuoteAsSent),
quote.id));
quotes[0].id));
break;
case EntityAction.sendEmail:
store.dispatch(ShowEmailQuote(
completer: snackBarCompleter(context, localization.emailedQuote),
quote: quote,
quote: quotes[0],
context: context));
break;
case EntityAction.cloneToInvoice:
store.dispatch(
EditInvoice(context: context, invoice: quote.cloneToInvoice));
EditInvoice(context: context, invoice: quotes[0].cloneToInvoice));
break;
case EntityAction.cloneToQuote:
store.dispatch(EditQuote(context: context, quote: quote.cloneToQuote));
store
.dispatch(EditQuote(context: context, quote: quotes[0].cloneToQuote));
break;
case EntityAction.restore:
store.dispatch(RestoreQuoteRequest(
snackBarCompleter(context, localization.restoredQuote), quote.id));
snackBarCompleter(context, localization.restoredQuote),
quotes[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveQuoteRequest(
snackBarCompleter(context, localization.archivedQuote), quote.id));
snackBarCompleter(context, localization.archivedQuote),
quotes[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteQuoteRequest(
snackBarCompleter(context, localization.deletedQuote), quote.id));
snackBarCompleter(context, localization.deletedQuote), quotes[0].id));
break;
}
}

View File

@ -1,17 +1,18 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class ViewTaskList implements PersistUI {
ViewTaskList({@required this.context, this.force = false});
@ -276,7 +277,7 @@ class FilterTasksByEntity implements PersistUI {
}
void handleTaskAction(
BuildContext context, TaskEntity task, EntityAction action) {
BuildContext context, List<TaskEntity> tasks, EntityAction action) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
@ -284,15 +285,15 @@ void handleTaskAction(
switch (action) {
case EntityAction.edit:
store.dispatch(EditTask(context: context, task: task));
store.dispatch(EditTask(context: context, task: tasks[0]));
break;
case EntityAction.start:
case EntityAction.stop:
case EntityAction.resume:
final Completer<TaskEntity> completer = new Completer<TaskEntity>();
final localization = AppLocalization.of(context);
store
.dispatch(SaveTaskRequest(completer: completer, task: task.toggle()));
store.dispatch(
SaveTaskRequest(completer: completer, task: tasks[0].toggle()));
completer.future.then((savedTask) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(
@ -312,31 +313,32 @@ void handleTaskAction(
break;
case EntityAction.newInvoice:
final item = convertTaskToInvoiceItem(task: task, context: context);
final item = convertTaskToInvoiceItem(task: tasks[0], context: context);
store.dispatch(EditInvoice(
invoice: InvoiceEntity(company: company).rebuild((b) => b
..hasTasks = true
..clientId = task.clientId
..clientId = tasks[0].clientId
..invoiceItems.add(item)),
context: context));
break;
case EntityAction.viewInvoice:
store.dispatch(ViewInvoice(invoiceId: task.invoiceId, context: context));
store.dispatch(
ViewInvoice(invoiceId: tasks[0].invoiceId, context: context));
break;
case EntityAction.clone:
store.dispatch(EditTask(context: context, task: task.clone));
store.dispatch(EditTask(context: context, task: tasks[0].clone));
break;
case EntityAction.restore:
store.dispatch(RestoreTaskRequest(
snackBarCompleter(context, localization.restoredTask), task.id));
snackBarCompleter(context, localization.restoredTask), tasks[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveTaskRequest(
snackBarCompleter(context, localization.archivedTask), task.id));
snackBarCompleter(context, localization.archivedTask), tasks[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteTaskRequest(
snackBarCompleter(context, localization.deletedTask), task.id));
snackBarCompleter(context, localization.deletedTask), tasks[0].id));
break;
}
}

View File

@ -1,13 +1,14 @@
import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class ViewVendorList implements PersistUI {
ViewVendorList({@required this.context, this.force = false});
@ -266,7 +267,7 @@ class FilterVendorsByEntity implements PersistUI {
}
void handleVendorAction(
BuildContext context, VendorEntity vendor, EntityAction action) {
BuildContext context, List<VendorEntity> vendors, EntityAction action) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
@ -274,24 +275,27 @@ void handleVendorAction(
switch (action) {
case EntityAction.edit:
store.dispatch(EditVendor(context: context, vendor: vendor));
store.dispatch(EditVendor(context: context, vendor: vendors[0]));
break;
case EntityAction.newExpense:
store.dispatch(EditExpense(
expense: ExpenseEntity(company: company, vendor: vendor),
expense: ExpenseEntity(company: company, vendor: vendors[0]),
context: context));
break;
case EntityAction.restore:
store.dispatch(RestoreVendorRequest(
snackBarCompleter(context, localization.restoredVendor), vendor.id));
snackBarCompleter(context, localization.restoredVendor),
vendors[0].id));
break;
case EntityAction.archive:
store.dispatch(ArchiveVendorRequest(
snackBarCompleter(context, localization.archivedVendor), vendor.id));
snackBarCompleter(context, localization.archivedVendor),
vendors[0].id));
break;
case EntityAction.delete:
store.dispatch(DeleteVendorRequest(
snackBarCompleter(context, localization.deletedVendor), vendor.id));
snackBarCompleter(context, localization.deletedVendor),
vendors[0].id));
break;
}
}

View File

@ -8,7 +8,8 @@ Future<void> showEntityActionsDialog({
@required BuildContext context,
@required List<BaseEntity> entities,
@required UserCompanyEntity userCompany,
@required Function(BuildContext, BaseEntity, EntityAction) onEntityAction,
@required
Function(BuildContext, List<BaseEntity>, EntityAction) onEntityAction,
ClientEntity client,
}) async {
if (entities == null) {
@ -49,7 +50,7 @@ class EntityActionListTile extends StatelessWidget {
final List<BaseEntity> entities;
final EntityAction entityAction;
final BuildContext mainContext;
final Function(BuildContext, BaseEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<BaseEntity>, EntityAction) onEntityAction;
@override
Widget build(BuildContext context) {
@ -60,10 +61,7 @@ class EntityActionListTile extends StatelessWidget {
title: Text(localization.lookup(entityAction.toString())),
onTap: () {
Navigator.of(context).pop();
for (int i = 0; i < entities.length; i++) {
final BaseEntity entity = entities[i];
onEntityAction(context, entity, entityAction);
}
onEntityAction(context, entities, entityAction);
},
);
}

View File

@ -82,7 +82,7 @@ class ClientList extends StatelessWidget {
store.state.uiState.longPressSelectionIsDefault ?? true;
if (longPressIsSelection) {
viewModel.onEntityAction(
context, client, EntityAction.toggleMultiselect);
context, [client], EntityAction.toggleMultiselect);
} else {
showDialog();
}

View File

@ -5,11 +5,11 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/group/group_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/client/client_selectors.dart';
import 'package:invoiceninja_flutter/redux/group/group_actions.dart';
import 'package:invoiceninja_flutter/ui/client/client_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
@ -55,7 +55,7 @@ class ClientListVM {
final bool isLoaded;
final Function(BuildContext, ClientEntity) onClientTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, ClientEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<ClientEntity>, EntityAction) onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
@ -84,9 +84,9 @@ class ClientListVM {
store.dispatch(ViewClient(clientId: client.id, context: context));
},
onRefreshed: (context) => _handleRefresh(context),
onEntityAction:
(BuildContext context, BaseEntity client, EntityAction action) =>
handleClientAction(context, client, action),
onEntityAction: (BuildContext context, List<BaseEntity> client,
EntityAction action) =>
handleClientAction(context, client, action),
onClearEntityFilterPressed: () => store.dispatch(FilterClientsByEntity()),
onViewEntityFilterPressed: (BuildContext context) => store.dispatch(
ViewGroup(

View File

@ -35,7 +35,7 @@ class ClientScreenVM {
final bool isInMultiselect;
final UserCompanyEntity userCompany;
final Function(BuildContext, ClientEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<ClientEntity>, EntityAction) onEntityAction;
static ClientScreenVM fromStore(Store<AppState> store) {
final state = store.state;
@ -43,9 +43,9 @@ class ClientScreenVM {
return ClientScreenVM(
userCompany: state.userCompany,
isInMultiselect: state.clientListState.isInMultiselect(),
onEntityAction:
(BuildContext context, BaseEntity client, EntityAction action) =>
handleClientAction(context, client, action),
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, clients, action),
);
}
}

View File

@ -1,23 +1,24 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/redux/project/project_actions.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_actions.dart';
import 'package:invoiceninja_flutter/redux/task/task_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/client/client_screen.dart';
import 'package:invoiceninja_flutter/ui/client/view/client_view.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/client/view/client_view.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
class ClientViewScreen extends StatelessWidget {
const ClientViewScreen({Key key}) : super(key: key);
@ -176,7 +177,7 @@ class ClientViewVM {
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleClientAction(context, client, action),
handleClientAction(context, [client], action),
);
}

View File

@ -63,7 +63,7 @@ class DocumentList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, document, action);
context, [document], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,19 +1,20 @@
import 'dart:async';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/document/document_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/document/document_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/document/document_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/document/document_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:redux/redux.dart';
class DocumentListBuilder extends StatelessWidget {
const DocumentListBuilder({Key key}) : super(key: key);
@ -78,9 +79,9 @@ class DocumentListVM {
onDocumentTap: (context, document) {
store.dispatch(ViewDocument(documentId: document.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity document, EntityAction action) =>
handleDocumentAction(context, document, action),
onEntityAction: (BuildContext context, List<BaseEntity> documents,
EntityAction action) =>
handleDocumentAction(context, documents[0], action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -94,7 +95,8 @@ class DocumentListVM {
final bool isLoaded;
final Function(BuildContext, DocumentEntity) onDocumentTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, DocumentEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<DocumentEntity>, EntityAction)
onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
}

View File

@ -84,7 +84,7 @@ class ExpenseList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, expense, action);
context, [expense], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,20 +1,21 @@
import 'dart:async';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:invoiceninja_flutter/ui/expense/expense_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/expense/expense_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:redux/redux.dart';
class ExpenseListBuilder extends StatelessWidget {
const ExpenseListBuilder({Key key}) : super(key: key);
@ -95,9 +96,9 @@ class ExpenseListVM {
onExpenseTap: (context, expense) {
store.dispatch(ViewExpense(expenseId: expense.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity expense, EntityAction action) =>
handleExpenseAction(context, expense, action),
onEntityAction: (BuildContext context, List<BaseEntity> expenses,
EntityAction action) =>
handleExpenseAction(context, expenses[0], action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -112,7 +113,8 @@ class ExpenseListVM {
final bool isLoaded;
final Function(BuildContext, ExpenseEntity) onExpenseTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, ExpenseEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<ExpenseEntity>, EntityAction)
onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
}

View File

@ -106,9 +106,9 @@ class ExpenseViewVM {
userCompany: userCompany,
context: context,
entities: [vendor],
onEntityAction: (BuildContext context, BaseEntity vendor,
EntityAction action) =>
handleVendorAction(context, vendor, action));
onEntityAction: (BuildContext context,
List<BaseEntity> vendors, EntityAction action) =>
handleVendorAction(context, vendors, action));
} else {
store.dispatch(
ViewVendor(vendorId: vendor.id, context: context));
@ -120,9 +120,9 @@ class ExpenseViewVM {
userCompany: userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
EntityAction action) =>
handleClientAction(context, client, action));
onEntityAction: (BuildContext context,
List<BaseEntity> clients, EntityAction action) =>
handleClientAction(context, clients, action));
} else {
store.dispatch(
ViewClient(clientId: client.id, context: context));
@ -135,9 +135,9 @@ class ExpenseViewVM {
context: context,
entities: [invoice],
client: client,
onEntityAction: (BuildContext context, BaseEntity invoice,
EntityAction action) =>
handleInvoiceAction(context, invoice, action));
onEntityAction: (BuildContext context,
List<BaseEntity> invoices, EntityAction action) =>
handleInvoiceAction(context, invoices, action));
} else {
store.dispatch(
ViewInvoice(invoiceId: invoice.id, context: context));

View File

@ -101,7 +101,7 @@ class InvoiceList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, invoice, action);
context, [invoice], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,19 +1,20 @@
import 'dart:async';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
class InvoiceListBuilder extends StatelessWidget {
const InvoiceListBuilder({Key key}) : super(key: key);
@ -64,7 +65,8 @@ class EntityListVM {
final Function(BuildContext) onRefreshed;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
final Function(BuildContext, InvoiceEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<InvoiceEntity>, EntityAction)
onEntityAction;
}
class InvoiceListVM extends EntityListVM {
@ -82,7 +84,7 @@ class InvoiceListVM extends EntityListVM {
Function(BuildContext) onRefreshed,
Function onClearEntityFilterPressed,
Function(BuildContext) onViewEntityFilterPressed,
Function(BuildContext, InvoiceEntity, EntityAction) onEntityAction,
Function(BuildContext, List<InvoiceEntity>, EntityAction) onEntityAction,
}) : super(
state: state,
user: user,
@ -137,9 +139,9 @@ class InvoiceListVM extends EntityListVM {
ViewClient(
clientId: state.invoiceListState.filterEntityId,
context: context)),
onEntityAction:
(BuildContext context, BaseEntity invoice, EntityAction action) =>
handleInvoiceAction(context, invoice, action),
onEntityAction: (BuildContext context, List<BaseEntity> invoices,
EntityAction action) =>
handleInvoiceAction(context, invoices, action),
);
}
}

View File

@ -1,23 +1,24 @@
import 'dart:async';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
import 'package:redux/redux.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/document/document_actions.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_actions_dialog.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_screen.dart';
import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:redux/redux.dart';
class InvoiceViewScreen extends StatelessWidget {
const InvoiceViewScreen({Key key}) : super(key: key);
@ -159,9 +160,9 @@ class InvoiceViewVM extends EntityViewVM {
userCompany: state.userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, client, action));
handleClientAction(context, clients, action));
} else {
store.dispatch(ViewClient(clientId: client.id, context: context));
}
@ -174,9 +175,9 @@ class InvoiceViewVM extends EntityViewVM {
context: context,
client: client,
entities: [payment],
onEntityAction: (BuildContext context, BaseEntity payment,
onEntityAction: (BuildContext context, List<BaseEntity> payments,
EntityAction action) =>
handlePaymentAction(context, payment, action));
handlePaymentAction(context, payments, action));
} else {
store.dispatch(ViewPayment(paymentId: payment.id, context: context));
}
@ -187,7 +188,7 @@ class InvoiceViewVM extends EntityViewVM {
store.dispatch(ViewPaymentList(context: context));
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleInvoiceAction(context, invoice, action),
handleInvoiceAction(context, [invoice], action),
onUploadDocument: (BuildContext context, String path) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
final document = DocumentEntity().rebuild((b) => b

View File

@ -112,7 +112,7 @@ class PaymentList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, payment, action);
context, [payment], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,20 +1,21 @@
import 'dart:async';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/payment/payment_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/payment/payment_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:redux/redux.dart';
class PaymentListBuilder extends StatelessWidget {
const PaymentListBuilder({Key key}) : super(key: key);
@ -79,9 +80,9 @@ class PaymentListVM {
onPaymentTap: (context, payment) {
store.dispatch(ViewPayment(paymentId: payment.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity payment, EntityAction action) =>
handlePaymentAction(context, payment, action),
onEntityAction: (BuildContext context, List<BaseEntity> payments,
EntityAction action) =>
handlePaymentAction(context, payments, action),
onClearEntityFilterPressed: () =>
store.dispatch(FilterPaymentsByEntity()),
onViewClientFilterPressed: (BuildContext context) {
@ -114,5 +115,6 @@ class PaymentListVM {
final Function(BuildContext) onRefreshed;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewClientFilterPressed;
final Function(BuildContext, PaymentEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<PaymentEntity>, EntityAction)
onEntityAction;
}

View File

@ -70,9 +70,9 @@ class PaymentViewVM {
userCompany: state.userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, client, action));
handleClientAction(context, clients, action));
} else {
store.dispatch(ViewClient(clientId: client.id, context: context));
}
@ -84,7 +84,7 @@ class PaymentViewVM {
context: context,
entities: [invoice],
client: client,
onEntityAction: (BuildContext context, BaseEntity invoice,
onEntityAction: (BuildContext context, List<BaseEntity> invoice,
EntityAction action) =>
handleInvoiceAction(context, invoice, action));
} else {
@ -92,7 +92,7 @@ class PaymentViewVM {
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handlePaymentAction(context, payment, action),
handlePaymentAction(context, [payment], action),
);
}

View File

@ -1,17 +1,18 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart';
import 'package:invoiceninja_flutter/ui/product/edit/product_edit.dart';
import 'package:invoiceninja_flutter/ui/product/product_screen.dart';
import 'package:invoiceninja_flutter/ui/product/view/product_view_vm.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/product/edit/product_edit.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class ProductEditScreen extends StatelessWidget {
const ProductEditScreen({Key key}) : super(key: key);
@ -102,10 +103,10 @@ class ProductEditVM {
if (action == EntityAction.clone) {
Navigator.pop(context);
WidgetsBinding.instance.addPostFrameCallback((duration) {
handleProductAction(context, product, action);
handleProductAction(context, [product], action);
});
} else {
handleProductAction(context, product, action);
handleProductAction(context, [product], action);
}
},
);

View File

@ -52,7 +52,7 @@ class ProductList extends StatelessWidget {
if (action == EntityAction.more) {
showDialog();
} else {
viewModel.onEntityAction(context, product, action);
viewModel.onEntityAction(context, [product], action);
}
},
onTap: () => viewModel.onProductTap(context, product),

View File

@ -1,17 +1,18 @@
import 'dart:async';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/redux/product/product_selectors.dart';
import 'package:invoiceninja_flutter/ui/product/product_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/product/product_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
class ProductListBuilder extends StatelessWidget {
const ProductListBuilder({Key key}) : super(key: key);
@ -66,9 +67,9 @@ class ProductListVM {
onProductTap: (context, product) {
store.dispatch(ViewProduct(productId: product.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity product, EntityAction action) =>
handleProductAction(context, product, action),
onEntityAction: (BuildContext context, List<BaseEntity> products,
EntityAction action) =>
handleProductAction(context, products, action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -81,5 +82,6 @@ class ProductListVM {
final bool isLoaded;
final Function(BuildContext, ProductEntity) onProductTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, ProductEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<ProductEntity>, EntityAction)
onEntityAction;
}

View File

@ -1,16 +1,17 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/product/product_screen.dart';
import 'package:invoiceninja_flutter/ui/product/view/product_view.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
import 'package:invoiceninja_flutter/redux/product/product_actions.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
class ProductViewScreen extends StatelessWidget {
const ProductViewScreen({Key key}) : super(key: key);
@ -93,7 +94,7 @@ class ProductViewVM {
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleProductAction(context, product, action),
handleProductAction(context, [product], action),
);
}

View File

@ -95,7 +95,7 @@ class ProjectList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, project, action);
context, [project], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,19 +1,20 @@
import 'dart:async';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/project/project_actions.dart';
import 'package:invoiceninja_flutter/redux/project/project_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/project/project_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/project/project_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/project/project_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/project/project_actions.dart';
import 'package:redux/redux.dart';
class ProjectListBuilder extends StatelessWidget {
const ProjectListBuilder({Key key}) : super(key: key);
@ -83,9 +84,9 @@ class ProjectListVM {
onProjectTap: (context, project) {
store.dispatch(ViewProject(projectId: project.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity project, EntityAction action) =>
handleProjectAction(context, project, action),
onEntityAction: (BuildContext context, List<BaseEntity> projects,
EntityAction action) =>
handleProjectAction(context, projects, action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -100,7 +101,8 @@ class ProjectListVM {
final bool isLoaded;
final Function(BuildContext, ProjectEntity) onProjectTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, ProjectEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<ProjectEntity>, EntityAction)
onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
}

View File

@ -84,9 +84,9 @@ class ProjectViewVM {
userCompany: state.userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, client, action));
handleClientAction(context, clients, action));
} else {
store.dispatch(ViewClient(clientId: client.id, context: context));
}
@ -119,7 +119,7 @@ class ProjectViewVM {
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleProjectAction(context, project, action),
handleProjectAction(context, [project], action),
);
}

View File

@ -49,7 +49,7 @@ class QuoteListVM extends EntityListVM {
Function(BuildContext) onRefreshed,
Function onClearEntityFilterPressed,
Function(BuildContext) onViewEntityFilterPressed,
Function(BuildContext, InvoiceEntity, EntityAction) onEntityAction,
Function(BuildContext, List<InvoiceEntity>, EntityAction) onEntityAction,
}) : super(
state: state,
user: user,
@ -100,8 +100,8 @@ class QuoteListVM extends EntityListVM {
ViewClient(
clientId: state.quoteListState.filterEntityId, context: context)),
onEntityAction:
(BuildContext context, BaseEntity quote, EntityAction action) =>
handleQuoteAction(context, quote, action),
(BuildContext context, List<BaseEntity> quotes, EntityAction action) =>
handleQuoteAction(context, quotes, action),
);
}
}

View File

@ -125,15 +125,15 @@ class QuoteViewVM extends EntityViewVM {
userCompany: state.userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, client, action));
handleClientAction(context, clients, action));
} else {
store.dispatch(ViewClient(clientId: client.id, context: context));
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleQuoteAction(context, quote, action),
handleQuoteAction(context, [quote], action),
onUploadDocument: (BuildContext context, String path) {
final Completer<DocumentEntity> completer = Completer<DocumentEntity>();
final document = DocumentEntity().rebuild((b) => b

View File

@ -110,7 +110,7 @@ class TaskList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, task, action);
context, [task], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,20 +1,21 @@
import 'dart:async';
import 'package:invoiceninja_flutter/redux/project/project_actions.dart';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/project/project_actions.dart';
import 'package:invoiceninja_flutter/redux/task/task_actions.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/ui/task/task_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/task/task_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/task/task_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/task/task_actions.dart';
import 'package:redux/redux.dart';
class TaskListBuilder extends StatelessWidget {
const TaskListBuilder({Key key}) : super(key: key);
@ -97,8 +98,8 @@ class TaskListVM {
store.dispatch(ViewTask(taskId: task.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity task, EntityAction action) =>
handleTaskAction(context, task, action),
(BuildContext context, List<BaseEntity> tasks, EntityAction action) =>
handleTaskAction(context, tasks, action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -114,7 +115,7 @@ class TaskListVM {
final bool isLoaded;
final Function(BuildContext, TaskEntity) onTaskTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, TaskEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<TaskEntity>, EntityAction) onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
}

View File

@ -113,9 +113,9 @@ class TaskViewVM {
userCompany: state.userCompany,
context: context,
entities: [client],
onEntityAction: (BuildContext context, BaseEntity client,
onEntityAction: (BuildContext context, List<BaseEntity> clients,
EntityAction action) =>
handleClientAction(context, client, action));
handleClientAction(context, clients, action));
} else {
store.dispatch(ViewClient(clientId: client.id, context: context));
}
@ -127,9 +127,9 @@ class TaskViewVM {
context: context,
entities: [project],
client: client,
onEntityAction: (BuildContext context, BaseEntity project,
onEntityAction: (BuildContext context, List<BaseEntity> projects,
EntityAction action) =>
handleProjectAction(context, project, action));
handleProjectAction(context, projects, action));
} else {
store.dispatch(ViewProject(projectId: project.id, context: context));
}
@ -141,9 +141,9 @@ class TaskViewVM {
context: context,
entities: [invoice],
client: client,
onEntityAction: (BuildContext context, BaseEntity invoice,
onEntityAction: (BuildContext context, List<BaseEntity> invoices,
EntityAction action) =>
handleInvoiceAction(context, invoice, action));
handleInvoiceAction(context, invoices, action));
} else {
store.dispatch(ViewInvoice(invoiceId: invoice.id, context: context));
}
@ -170,7 +170,7 @@ class TaskViewVM {
}
},
onEntityAction: (BuildContext context, EntityAction action) =>
handleTaskAction(context, task, action),
handleTaskAction(context, [task], action),
);
}

View File

@ -54,7 +54,7 @@ class VendorList extends StatelessWidget {
showDialog();
} else {
viewModel.onEntityAction(
context, vendor, action);
context, [vendor], action);
}
},
onLongPress: () => showDialog(),

View File

@ -1,19 +1,20 @@
import 'dart:async';
import 'package:redux/redux.dart';
import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/client/client_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_selectors.dart';
import 'package:invoiceninja_flutter/ui/vendor/vendor_list.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_selectors.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/vendor/vendor_list.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:redux/redux.dart';
class VendorListBuilder extends StatelessWidget {
const VendorListBuilder({Key key}) : super(key: key);
@ -77,9 +78,9 @@ class VendorListVM {
onVendorTap: (context, vendor) {
store.dispatch(ViewVendor(vendorId: vendor.id, context: context));
},
onEntityAction:
(BuildContext context, BaseEntity vendor, EntityAction action) =>
handleVendorAction(context, vendor, action),
onEntityAction: (BuildContext context, List<BaseEntity> vendors,
EntityAction action) =>
handleVendorAction(context, vendors, action),
onRefreshed: (context) => _handleRefresh(context),
);
}
@ -93,7 +94,7 @@ class VendorListVM {
final bool isLoaded;
final Function(BuildContext, VendorEntity) onVendorTap;
final Function(BuildContext) onRefreshed;
final Function(BuildContext, VendorEntity, EntityAction) onEntityAction;
final Function(BuildContext, List<VendorEntity>, EntityAction) onEntityAction;
final Function onClearEntityFilterPressed;
final Function(BuildContext) onViewEntityFilterPressed;
}

View File

@ -1,19 +1,20 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/data/models/vendor_model.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/ui/ui_actions.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/ui/vendor/vendor_screen.dart';
import 'package:invoiceninja_flutter/ui/vendor/view/vendor_view.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_actions.dart';
import 'package:invoiceninja_flutter/data/models/vendor_model.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/vendor/view/vendor_view.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
class VendorViewScreen extends StatelessWidget {
const VendorViewScreen({Key key}) : super(key: key);
@ -108,7 +109,7 @@ class VendorViewVM {
expense: ExpenseEntity(company: company, vendor: vendor),
context: context)),
onEntityAction: (BuildContext context, EntityAction action) =>
handleVendorAction(context, vendor, action),
handleVendorAction(context, [vendor], action),
);
}