Implemented Bulk for Projects

This commit is contained in:
Gianfranco Gasbarri 2019-11-03 19:09:46 +00:00
parent d251d5a07d
commit 1e68e9731b
4 changed files with 138 additions and 59 deletions

View File

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

View File

@ -149,60 +149,60 @@ class SaveProjectFailure implements StopSaving {
}
class ArchiveProjectRequest implements StartSaving {
ArchiveProjectRequest(this.completer, this.projectId);
ArchiveProjectRequest(this.completer, this.projectIds);
final Completer completer;
final String projectId;
final List<String> projectIds;
}
class ArchiveProjectSuccess implements StopSaving, PersistData {
ArchiveProjectSuccess(this.project);
ArchiveProjectSuccess(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class ArchiveProjectFailure implements StopSaving {
ArchiveProjectFailure(this.project);
ArchiveProjectFailure(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class DeleteProjectRequest implements StartSaving {
DeleteProjectRequest(this.completer, this.projectId);
DeleteProjectRequest(this.completer, this.projectIds);
final Completer completer;
final String projectId;
final List<String> projectIds;
}
class DeleteProjectSuccess implements StopSaving, PersistData {
DeleteProjectSuccess(this.project);
DeleteProjectSuccess(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class DeleteProjectFailure implements StopSaving {
DeleteProjectFailure(this.project);
DeleteProjectFailure(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class RestoreProjectRequest implements StartSaving {
RestoreProjectRequest(this.completer, this.projectId);
RestoreProjectRequest(this.completer, this.projectIds);
final Completer completer;
final String projectId;
final List<String> projectIds;
}
class RestoreProjectSuccess implements StopSaving, PersistData {
RestoreProjectSuccess(this.project);
RestoreProjectSuccess(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class RestoreProjectFailure implements StopSaving {
RestoreProjectFailure(this.project);
RestoreProjectFailure(this.projects);
final ProjectEntity project;
final List<ProjectEntity> projects;
}
class FilterProjects {
@ -258,6 +258,7 @@ void handleProjectAction(
final state = store.state;
final CompanyEntity company = state.selectedCompany;
final project = projects.first as ProjectEntity;
final projectIds = projects.map((project) => project.id).toList();
switch (action) {
case EntityAction.edit:
@ -288,19 +289,19 @@ void handleProjectAction(
store.dispatch(RestoreProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).restoredProject),
project.id));
projectIds));
break;
case EntityAction.archive:
store.dispatch(ArchiveProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).archivedProject),
project.id));
projectIds));
break;
case EntityAction.delete:
store.dispatch(DeleteProjectRequest(
snackBarCompleter(
context, AppLocalization.of(context).deletedProject),
project.id));
projectIds));
break;
case EntityAction.toggleMultiselect:
if (!store.state.projectListState.isInMultiselect()) {

View File

@ -112,17 +112,21 @@ Middleware<AppState> _viewProjectList() {
Middleware<AppState> _archiveProject(ProjectRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as ArchiveProjectRequest;
final origProject = store.state.projectState.map[action.projectId];
repository
.saveData(store.state.credentials, origProject, EntityAction.archive)
.then((ProjectEntity project) {
store.dispatch(ArchiveProjectSuccess(project));
.bulkAction(
store.state.credentials, action.projectIds, EntityAction.archive)
.then((List<ProjectEntity> projects) {
store.dispatch(ArchiveProjectSuccess(projects));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(ArchiveProjectFailure(origProject));
final projects = action.projectIds
.map((id) => store.state.projectState.map[id])
.toList();
store.dispatch(ArchiveProjectFailure(projects));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -135,17 +139,21 @@ Middleware<AppState> _archiveProject(ProjectRepository repository) {
Middleware<AppState> _deleteProject(ProjectRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as DeleteProjectRequest;
final origProject = store.state.projectState.map[action.projectId];
repository
.saveData(store.state.credentials, origProject, EntityAction.delete)
.then((ProjectEntity project) {
store.dispatch(DeleteProjectSuccess(project));
.bulkAction(
store.state.credentials, action.projectIds, EntityAction.delete)
.then((List<ProjectEntity> projects) {
store.dispatch(DeleteProjectSuccess(projects));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(DeleteProjectFailure(origProject));
final projects = action.projectIds
.map((id) => store.state.projectState.map[id])
.toList();
store.dispatch(DeleteProjectFailure(projects));
if (action.completer != null) {
action.completer.completeError(error);
}
@ -158,17 +166,21 @@ Middleware<AppState> _deleteProject(ProjectRepository repository) {
Middleware<AppState> _restoreProject(ProjectRepository repository) {
return (Store<AppState> store, dynamic dynamicAction, NextDispatcher next) {
final action = dynamicAction as RestoreProjectRequest;
final origProject = store.state.projectState.map[action.projectId];
repository
.saveData(store.state.credentials, origProject, EntityAction.restore)
.then((ProjectEntity project) {
store.dispatch(RestoreProjectSuccess(project));
.bulkAction(
store.state.credentials, action.projectIds, EntityAction.restore)
.then((List<ProjectEntity> projects) {
store.dispatch(RestoreProjectSuccess(projects));
if (action.completer != null) {
action.completer.complete(null);
}
}).catchError((Object error) {
print(error);
store.dispatch(RestoreProjectFailure(origProject));
final projects = action.projectIds
.map((id) => store.state.projectState.map[id])
.toList();
store.dispatch(RestoreProjectFailure(projects));
if (action.completer != null) {
action.completer.completeError(error);
}

View File

@ -166,63 +166,103 @@ final projectsReducer = combineReducers<ProjectState>([
ProjectState _archiveProjectRequest(
ProjectState projectState, ArchiveProjectRequest action) {
final project = projectState.map[action.projectId]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
final projects = action.projectIds.map((id) => projectState.map[id]).toList();
return projectState.rebuild((b) => b..map[action.projectId] = project);
for (int i = 0; i < projects.length; i++) {
projects[i] = projects[i]
.rebuild((b) => b..archivedAt = DateTime.now().millisecondsSinceEpoch);
}
return projectState.rebuild((b) {
for (final project in projects) {
b.map[project.id] = project;
}
});
}
ProjectState _archiveProjectSuccess(
ProjectState projectState, ArchiveProjectSuccess action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _archiveProjectFailure(
ProjectState projectState, ArchiveProjectFailure action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _deleteProjectRequest(
ProjectState projectState, DeleteProjectRequest action) {
final project = projectState.map[action.projectId].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
final projects = action.projectIds.map((id) => projectState.map[id]).toList();
return projectState.rebuild((b) => b..map[action.projectId] = project);
for (int i = 0; i < projects.length; i++) {
projects[i] = projects[i].rebuild((b) => b
..archivedAt = DateTime.now().millisecondsSinceEpoch
..isDeleted = true);
}
return projectState.rebuild((b) {
for (final project in projects) {
b.map[project.id] = project;
}
});
}
ProjectState _deleteProjectSuccess(
ProjectState projectState, DeleteProjectSuccess action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _deleteProjectFailure(
ProjectState projectState, DeleteProjectFailure action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _restoreProjectRequest(
ProjectState projectState, RestoreProjectRequest action) {
final project = projectState.map[action.projectId].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
return projectState.rebuild((b) => b..map[action.projectId] = project);
final projects = action.projectIds.map((id) => projectState.map[id]).toList();
for (int i = 0; i < projects.length; i++) {
projects[i] = projects[i].rebuild((b) => b
..archivedAt = null
..isDeleted = false);
}
return projectState.rebuild((b) {
for (final project in projects) {
b.map[project.id] = project;
}
});
}
ProjectState _restoreProjectSuccess(
ProjectState projectState, RestoreProjectSuccess action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _restoreProjectFailure(
ProjectState projectState, RestoreProjectFailure action) {
return projectState
.rebuild((b) => b..map[action.project.id] = action.project);
return projectState.rebuild((b) {
for (final project in action.projects) {
b.map[project.id] = project;
}
});
}
ProjectState _addProject(ProjectState projectState, AddProjectSuccess action) {