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; 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, Future<InvoiceEntity> saveData(Credentials credentials, InvoiceEntity invoice,
[EntityAction action]) async { [EntityAction action]) async {
final data = serializers.serializeWith(InvoiceEntity.serializer, invoice); final data = serializers.serializeWith(InvoiceEntity.serializer, invoice);

View File

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

View File

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

View File

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