1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { Dispatch } from "redux";
15 import { RootState } from "store/store";
16 import { dialogActions } from "store/dialog/dialog-actions";
18 getCommonResourceServiceError,
19 CommonResourceServiceError
20 } from "services/common-service/common-resource-service";
21 import { ServiceRepository } from "services/services";
22 import { projectPanelActions } from 'store/project-panel/project-panel-action';
23 import { GroupClass } from "models/group";
24 import { Participant } from "views-components/sharing-dialog/participant-select";
25 import { ResourcePropertiesFormData } from "views-components/resource-properties-form/resource-properties-form";
26 import { addProperty, deleteProperty } from "lib/resource-properties";
27 import { ProjectProperties } from "./project-create-actions";
29 export interface ProjectUpdateFormDialogData {
32 users?: Participant[];
34 properties?: ProjectProperties;
37 export const PROJECT_UPDATE_FORM_NAME = 'projectUpdateFormName';
38 export const PROJECT_UPDATE_PROPERTIES_FORM_NAME = 'projectUpdatePropertiesFormName';
39 export const PROJECT_UPDATE_FORM_SELECTOR = formValueSelector(PROJECT_UPDATE_FORM_NAME);
41 export const openProjectUpdateDialog = (resource: ProjectUpdateFormDialogData) =>
42 (dispatch: Dispatch, getState: () => RootState) => {
43 dispatch(initialize(PROJECT_UPDATE_FORM_NAME, resource));
44 dispatch(dialogActions.OPEN_DIALOG({ id: PROJECT_UPDATE_FORM_NAME, data: {sourcePanel: GroupClass.PROJECT} }));
47 export const updateProject = (project: ProjectUpdateFormDialogData) =>
48 async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
49 const uuid = project.uuid || '';
50 dispatch(startSubmit(PROJECT_UPDATE_FORM_NAME));
52 const updatedProject = await services.projectService.update(
56 description: project.description,
57 properties: project.properties,
59 dispatch(projectPanelActions.REQUEST_ITEMS());
60 dispatch(reset(PROJECT_UPDATE_FORM_NAME));
61 dispatch(dialogActions.CLOSE_DIALOG({ id: PROJECT_UPDATE_FORM_NAME }));
62 return updatedProject;
64 const error = getCommonResourceServiceError(e);
65 if (error === CommonResourceServiceError.UNIQUE_NAME_VIOLATION) {
66 dispatch(stopSubmit(PROJECT_UPDATE_FORM_NAME, { name: 'Project with the same name already exists.' } as FormErrors));
72 export const addPropertyToUpdateProjectForm = (data: ResourcePropertiesFormData) =>
73 (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
74 const properties = { ...PROJECT_UPDATE_FORM_SELECTOR(getState(), 'properties') };
75 const key = data.keyID || data.key;
76 const value = data.valueID || data.value;
78 PROJECT_UPDATE_FORM_NAME,
80 addProperty(properties, key, value)));
83 export const removePropertyFromUpdateProjectForm = (key: string, value: string) =>
84 (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
85 const properties = { ...PROJECT_UPDATE_FORM_SELECTOR(getState(), 'properties') };
87 PROJECT_UPDATE_FORM_NAME,
89 deleteProperty(properties, key, value)));