c394ea904d4ec77edbc10f7aa56ffa4827be2fc1
[arvados.git] / src / views-components / multiselect-toolbar / ms-project-action-set.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { MultiSelectMenuAction, MultiSelectMenuActionSet, MultiSelectMenuActionNames, msCommonActionSet } from 'views-components/multiselect-toolbar/ms-menu-actions';
6 import { openMoveProjectDialog } from 'store/projects/project-move-actions';
7 import { toggleProjectTrashed } from 'store/trash/trash-actions';
8 import {
9     FreezeIcon,
10     MoveToIcon,
11     NewProjectIcon,
12     RenameIcon,
13     UnfreezeIcon,
14 } from 'components/icon/icon';
15 import { RestoreFromTrashIcon, TrashIcon, FolderSharedIcon, Link } from 'components/icon/icon';
16 import { getResource } from 'store/resources/resources';
17 import { openProjectCreateDialog } from 'store/projects/project-create-actions';
18 import { openProjectUpdateDialog } from 'store/projects/project-update-actions';
19 import { freezeProject, unfreezeProject } from 'store/projects/project-lock-actions';
20 import { openWebDavS3InfoDialog } from 'store/collections/collection-info-actions';
21 import { copyToClipboardAction } from 'store/open-in-new-tab/open-in-new-tab.actions';
22
23 const {
24     ADD_TO_FAVORITES,
25     OPEN_IN_NEW_TAB,
26     COPY_TO_CLIPBOARD,
27     VIEW_DETAILS,
28     API_DETAILS,
29     OPEN_W_3RD_PARTY_CLIENT,
30     EDIT_PROJECT,
31     SHARE,
32     MOVE_TO,
33     MOVE_TO_TRASH,
34     FREEZE_PROJECT,
35     NEW_PROJECT,
36 } = MultiSelectMenuActionNames;
37
38 const msCopyToClipboardMenuAction: MultiSelectMenuAction  = {
39     name: COPY_TO_CLIPBOARD,
40     icon: Link,
41     hasAlts: false,
42     isForMulti: false,
43     execute: (dispatch, resources) => {
44         dispatch<any>(copyToClipboardAction(resources));
45     },
46 };
47
48 const msEditProjectAction: MultiSelectMenuAction = {
49     name: EDIT_PROJECT,
50     icon: RenameIcon,
51     hasAlts: false,
52     isForMulti: false,
53     execute: (dispatch, resources) => {
54         dispatch<any>(openProjectUpdateDialog(resources[0]));
55     },
56 };
57
58 const msMoveToAction: MultiSelectMenuAction = {
59     name: MOVE_TO,
60     icon: MoveToIcon,
61     hasAlts: false,
62     isForMulti: true,
63     execute: (dispatch, resource) => {
64         dispatch<any>(openMoveProjectDialog(resource[0]));
65     },
66 };
67
68 const msOpenWith3rdPartyClientAction: MultiSelectMenuAction  = {
69     name: OPEN_W_3RD_PARTY_CLIENT,
70     icon: FolderSharedIcon,
71     hasAlts: false,
72     isForMulti: false,
73     execute: (dispatch, resources) => {
74         dispatch<any>(openWebDavS3InfoDialog(resources[0].uuid));
75     },
76 };
77
78 export const msToggleTrashAction: MultiSelectMenuAction = {
79     name: MOVE_TO_TRASH,
80     icon: TrashIcon,
81     hasAlts: true,
82     altName: 'Restore from Trash',
83     altIcon: RestoreFromTrashIcon,
84     isForMulti: true,
85     useAlts: (uuid, iconProps) => {
86         return uuid ? (getResource(uuid)(iconProps.resources) as any).isTrashed : false;
87     },
88     execute: (dispatch, resources) => {
89         for (const resource of [...resources]) {
90             dispatch<any>(toggleProjectTrashed(resource.uuid, resource.ownerUuid, resource.isTrashed!!, resources.length > 1));
91         }
92     },
93 };
94
95 const msFreezeProjectAction: MultiSelectMenuAction = {
96     name: FREEZE_PROJECT,
97     icon: FreezeIcon,
98     hasAlts: true,
99     altName: 'Unfreeze Project',
100     altIcon: UnfreezeIcon,
101     isForMulti: false,
102     useAlts: (uuid, iconProps) => {
103         return uuid ? !!(getResource(uuid)(iconProps.resources) as any).frozenByUuid : false;
104     },
105     execute: (dispatch, resources) => {
106         if ((resources[0] as any).frozenByUuid) {
107             dispatch<any>(unfreezeProject(resources[0].uuid));
108         } else {
109             dispatch<any>(freezeProject(resources[0].uuid));
110         }
111     },
112 };
113
114 const msNewProjectAction: MultiSelectMenuAction = {
115     name: NEW_PROJECT,
116     icon: NewProjectIcon,
117     hasAlts: false,
118     isForMulti: false,
119     execute: (dispatch, resources): void => {
120         dispatch<any>(openProjectCreateDialog(resources[0].uuid));
121     },
122 };
123
124 export const msProjectActionSet: MultiSelectMenuActionSet = [
125     [
126         ...msCommonActionSet,
127         msEditProjectAction,
128         msMoveToAction,
129         msToggleTrashAction,
130         msNewProjectAction,
131         msFreezeProjectAction,
132         msOpenWith3rdPartyClientAction,
133         msCopyToClipboardMenuAction
134     ],
135 ];
136
137 export const msCommonProjectActionFilter = new Set<string>([
138     ADD_TO_FAVORITES,
139     MOVE_TO_TRASH,
140     API_DETAILS,
141     COPY_TO_CLIPBOARD,
142     EDIT_PROJECT,
143     FREEZE_PROJECT,
144     MOVE_TO,
145     NEW_PROJECT,
146     OPEN_IN_NEW_TAB,
147     OPEN_W_3RD_PARTY_CLIENT,
148     SHARE,
149     VIEW_DETAILS,
150 ]);
151 export const msReadOnlyProjectActionFilter = new Set<string>([ADD_TO_FAVORITES, API_DETAILS, COPY_TO_CLIPBOARD, OPEN_IN_NEW_TAB, OPEN_W_3RD_PARTY_CLIENT, VIEW_DETAILS,]);
152 export const msFrozenProjectActionFilter = new Set<string>([ADD_TO_FAVORITES, API_DETAILS, COPY_TO_CLIPBOARD, OPEN_IN_NEW_TAB, OPEN_W_3RD_PARTY_CLIENT, VIEW_DETAILS, SHARE, FREEZE_PROJECT])
153 export const msFilterGroupActionFilter = new Set<string>([ADD_TO_FAVORITES, API_DETAILS, COPY_TO_CLIPBOARD, OPEN_IN_NEW_TAB, OPEN_W_3RD_PARTY_CLIENT, VIEW_DETAILS, SHARE, MOVE_TO_TRASH, EDIT_PROJECT, MOVE_TO])