Implement Bulk for Invoices

This commit is contained in:
Gianfranco Gasbarri 2019-10-27 13:24:30 +00:00
parent 12018a153c
commit 3a484b26b6
4 changed files with 142 additions and 78 deletions

View File

@ -44,6 +44,32 @@ class InvoiceRepository {
return invoiceResponse.data;
}
Future<List<InvoiceEntity>> 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 + '/invoices/bulk?include=activities';
if (action != null) {
url += '&action=' + action.toString();
}
response = await webClient.put(url, credentials.token,
data: json.encode([ids]));
break;
default:
// Might have other actions in the future
break;
}
final InvoiceListResponse invoiceResponse =
serializers.deserializeWith(InvoiceListResponse.serializer, response);
return invoiceResponse.data.toList();
}
Future<InvoiceEntity> saveData(Credentials credentials, InvoiceEntity invoice,
[EntityAction action]) async {
final data = serializers.serializeWith(InvoiceEntity.serializer, invoice);

View File

@ -214,60 +214,60 @@ class MarkSentInvoiceFailure implements StopSaving {
}
class ArchiveInvoiceRequest implements StartSaving {
ArchiveInvoiceRequest(this.completer, this.invoiceId);
ArchiveInvoiceRequest(this.completer, this.invoiceIds);
final Completer completer;
final String invoiceId;
final List<String> invoiceIds;
}
class ArchiveInvoiceSuccess implements StopSaving, PersistData {
ArchiveInvoiceSuccess(this.invoice);
ArchiveInvoiceSuccess(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class ArchiveInvoiceFailure implements StopSaving {
ArchiveInvoiceFailure(this.invoice);
ArchiveInvoiceFailure(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class DeleteInvoiceRequest implements StartSaving {
DeleteInvoiceRequest(this.completer, this.invoiceId);
DeleteInvoiceRequest(this.completer, this.invoiceIds);
final Completer completer;
final String invoiceId;
final List<String> invoiceIds;
}
class DeleteInvoiceSuccess implements StopSaving, PersistData {
DeleteInvoiceSuccess(this.invoice);
DeleteInvoiceSuccess(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class DeleteInvoiceFailure implements StopSaving {
DeleteInvoiceFailure(this.invoice);
DeleteInvoiceFailure(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class RestoreInvoiceRequest implements StartSaving {
RestoreInvoiceRequest(this.completer, this.invoiceId);
RestoreInvoiceRequest(this.completer, this.invoiceIds);
final Completer completer;
final String invoiceId;
final List<String> invoiceIds;
}
class RestoreInvoiceSuccess implements StopSaving, PersistData {
RestoreInvoiceSuccess(this.invoice);
RestoreInvoiceSuccess(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class RestoreInvoiceFailure implements StopSaving {
RestoreInvoiceFailure(this.invoice);
RestoreInvoiceFailure(this.invoices);
final InvoiceEntity invoice;
final List<InvoiceEntity> invoices;
}
class FilterInvoices {
@ -336,6 +336,7 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
final CompanyEntity company = state.selectedCompany;
final localization = AppLocalization.of(context);
final invoice = invoices.first as InvoiceEntity;
final invoiceIds = invoices.map((invoice) => invoice.id).toList();
switch (action) {
case EntityAction.edit:
@ -375,16 +376,16 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
case EntityAction.restore:
store.dispatch(RestoreInvoiceRequest(
snackBarCompleter(context, localization.restoredInvoice),
invoice.id));
invoiceIds));
break;
case EntityAction.archive:
store.dispatch(ArchiveInvoiceRequest(
snackBarCompleter(context, localization.archivedInvoice),
invoice.id));
invoiceIds));
break;
case EntityAction.delete:
store.dispatch(DeleteInvoiceRequest(
snackBarCompleter(context, localization.deletedInvoice), invoice.id));
snackBarCompleter(context, localization.deletedInvoice), invoiceIds));
break;
case EntityAction.toggleMultiselect:
if (!store.state.invoiceListState.isInMultiselect()) {

View File

@ -137,17 +137,20 @@ Middleware<AppState> _showEmailInvoice() {
Middleware<AppState> _archiveInvoice(InvoiceRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as ArchiveInvoiceRequest;
final origInvoice = store.state.invoiceState.map[action.invoiceId];
repository
.saveData(store.state.credentials, origInvoice, EntityAction.archive)
.then((InvoiceEntity invoice) {
store.dispatch(ArchiveInvoiceSuccess(invoice));
.bulkAction(
store.state.credentials, action.invoiceIds, EntityAction.archive)
.then((List<InvoiceEntity> invoices) {
store.dispatch(ArchiveInvoiceSuccess(invoices));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(ArchiveInvoiceFailure(origInvoice));
final invoices = action.invoiceIds
.map((id) => store.state.invoiceState.map[id])
.toList();
store.dispatch(ArchiveInvoiceFailure(invoices));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -160,18 +163,21 @@ Middleware<AppState> _archiveInvoice(InvoiceRepository repository) {
Middleware<AppState> _deleteInvoice(InvoiceRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as DeleteInvoiceRequest;
final origInvoice = store.state.invoiceState.map[action.invoiceId];
repository
.saveData(store.state.credentials, origInvoice, EntityAction.delete)
.then((InvoiceEntity invoice) {
store.dispatch(DeleteInvoiceSuccess(invoice));
store.dispatch(LoadClient(clientId: invoice.clientId));
.bulkAction(
store.state.credentials, action.invoiceIds, EntityAction.delete)
.then((List<InvoiceEntity> invoices) {
store.dispatch(DeleteInvoiceSuccess(invoices));
store.dispatch(LoadClient(clientId: invoices.first.clientId));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(DeleteInvoiceFailure(origInvoice));
final invoices = action.invoiceIds
.map((id) => store.state.invoiceState.map[id])
.toList();
store.dispatch(DeleteInvoiceFailure(invoices));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -184,18 +190,21 @@ Middleware<AppState> _deleteInvoice(InvoiceRepository repository) {
Middleware<AppState> _restoreInvoice(InvoiceRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as RestoreInvoiceRequest;
final origInvoice = store.state.invoiceState.map[action.invoiceId];
repository
.saveData(store.state.credentials, origInvoice, EntityAction.restore)
.then((InvoiceEntity invoice) {
store.dispatch(RestoreInvoiceSuccess(invoice));
store.dispatch(LoadClient(clientId: invoice.clientId));
.bulkAction(
store.state.credentials, action.invoiceIds, EntityAction.restore)
.then((List<InvoiceEntity> invoices) {
store.dispatch(RestoreInvoiceSuccess(invoices));
store.dispatch(LoadClient(clientId: invoices.first.clientId));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(RestoreInvoiceFailure(origInvoice));
final invoices = action.invoiceIds
.map((id) => store.state.invoiceState.map[id])
.toList();
store.dispatch(RestoreInvoiceFailure(invoices));
if (action.completer != null) {
action.completer.completeError(error);
}

View File

@ -28,10 +28,10 @@ InvoiceItemEntity editInvoiceItem(
}
Reducer<String> dropdownFilterReducer = combineReducers([
TypedReducer<String, FilterInvoiceDropdown>(filterClientDropdownReducer),
TypedReducer<String, FilterInvoiceDropdown>(filterInvoiceDropdownReducer),
]);
String filterClientDropdownReducer(
String filterInvoiceDropdownReducer(
String dropdownFilter, FilterInvoiceDropdown action) {
return action.filter;
}
@ -64,7 +64,7 @@ final editingReducer = combineReducers<InvoiceEntity>([
TypedReducer<InvoiceEntity, DiscardChanges>(_clearEditing),
]);
InvoiceEntity _clearEditing(InvoiceEntity client, dynamic action) {
InvoiceEntity _clearEditing(InvoiceEntity invoice, dynamic action) {
return InvoiceEntity();
}
@ -189,8 +189,7 @@ ListUIState _startListMultiselect(
ListUIState _addToListMultiselect(
ListUIState invoiceListState, AddToInvoiceMultiselect action) {
return invoiceListState
.rebuild((b) => b..selectedIds.add(action.entity.id));
return invoiceListState.rebuild((b) => b..selectedIds.add(action.entity.id));
}
ListUIState _removeFromListMultiselect(
@ -230,75 +229,104 @@ InvoiceState _markSentInvoiceSuccess(
InvoiceState _archiveInvoiceRequest(
InvoiceState invoiceState, ArchiveInvoiceRequest action) {
final invoice = invoiceState.map[action.invoiceId]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
final invoices = action.invoiceIds.map((id) => invoiceState.map[id]).toList();
return invoiceState.rebuild((b) => b..map[action.invoiceId] = invoice);
for (int i = 0; i < invoices.length; i++) {
invoices[i] = invoices[i]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
}
return invoiceState.rebuild((b) {
for (final invoice in invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _archiveInvoiceSuccess(
InvoiceState invoiceState, ArchiveInvoiceSuccess action) {
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _archiveInvoiceFailure(
InvoiceState invoiceState, ArchiveInvoiceFailure action) {
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _deleteInvoiceRequest(
InvoiceState invoiceState, DeleteInvoiceRequest action) {
if (!invoiceState.map.containsKey(action.invoiceId)) {
return invoiceState;
}
final invoices = action.invoiceIds.map((id) => invoiceState.map[id]).toList();
final invoice = invoiceState.map[action.invoiceId].rebuild((b) => b
for (int i = 0; i < invoices.length; i++) {
invoices[i] = invoices[i].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
return invoiceState.rebuild((b) => b..map[action.invoiceId] = invoice);
}
return invoiceState.rebuild((b) {
for (final invoice in invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _deleteInvoiceSuccess(
InvoiceState invoiceState, DeleteInvoiceSuccess action) {
if (!invoiceState.map.containsKey(action.invoice.id)) {
return invoiceState;
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
});
}
InvoiceState _deleteInvoiceFailure(
InvoiceState invoiceState, DeleteInvoiceFailure action) {
if (!invoiceState.map.containsKey(action.invoice.id)) {
return invoiceState;
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
});
}
InvoiceState _restoreInvoiceRequest(
InvoiceState invoiceState, RestoreInvoiceRequest action) {
final invoice = invoiceState.map[action.invoiceId].rebuild((b) => b
final invoices = action.invoiceIds.map((id) => invoiceState.map[id]).toList();
for (int i = 0; i < invoices.length; i++) {
invoices[i] = invoices[i].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
return invoiceState.rebuild((b) => b..map[action.invoiceId] = invoice);
}
return invoiceState.rebuild((b) {
for (final invoice in invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _restoreInvoiceSuccess(
InvoiceState invoiceState, RestoreInvoiceSuccess action) {
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _restoreInvoiceFailure(
InvoiceState invoiceState, RestoreInvoiceFailure action) {
return invoiceState
.rebuild((b) => b..map[action.invoice.id] = action.invoice);
return invoiceState.rebuild((b) {
for (final invoice in action.invoices) {
b.map[invoice.id] = invoice;
}
});
}
InvoiceState _addInvoice(InvoiceState invoiceState, AddInvoiceSuccess action) {