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