Implement Bulk for Invoices
This commit is contained in:
parent
12018a153c
commit
3a484b26b6
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue