e5fc34d8ebe6f3ecc7f5824a0534105e72b42ba0
[arvados-workbench2.git] / src / store / projects / project-update-actions.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { Dispatch } from "redux";
6 import {
7     change,
8     FormErrors,
9     formValueSelector,
10     initialize,
11     reset,
12     startSubmit,
13     stopSubmit
14 } from 'redux-form';
15 import { RootState } from "store/store";
16 import { dialogActions } from "store/dialog/dialog-actions";
17 import {
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";
28
29 export interface ProjectUpdateFormDialogData {
30     uuid: string;
31     name: string;
32     users?: Participant[];
33     description?: string;
34     properties?: ProjectProperties;
35 }
36
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);
40
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} }));
45     };
46
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));
51         try {
52             const updatedProject = await services.projectService.update(
53                 uuid,
54                 {
55                     name: project.name,
56                     description: project.description,
57                     properties: project.properties,
58                 });
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;
63         } catch (e) {
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));
67             }
68             return ;
69         }
70     };
71
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;
77         dispatch(change(
78             PROJECT_UPDATE_FORM_NAME,
79             'properties',
80             addProperty(properties, key, value)));
81     };
82
83 export const removePropertyFromUpdateProjectForm = (key: string, value: string) =>
84     (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
85         const properties = { ...PROJECT_UPDATE_FORM_SELECTOR(getState(), 'properties') };
86         dispatch(change(
87             PROJECT_UPDATE_FORM_NAME,
88             'properties',
89             deleteProperty(properties, key, value)));
90     };