Implemented Bulk for Projects
This commit is contained in:
parent
d251d5a07d
commit
1e68e9731b
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue