15768: project multimove works Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox...
[arvados-workbench2.git] / src / views-components / context-menu / action-sets / project-action-set.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { ContextMenuActionSet } from "../context-menu-action-set";
6 import { NewProjectIcon, RenameIcon, MoveToIcon, DetailsIcon, AdvancedIcon, OpenIcon, Link, FolderSharedIcon } from "components/icon/icon";
7 import { ToggleFavoriteAction } from "../actions/favorite-action";
8 import { toggleFavorite } from "store/favorites/favorites-actions";
9 import { favoritePanelActions } from "store/favorite-panel/favorite-panel-action";
10 import { openMoveProjectDialog } from "store/projects/project-move-actions";
11 import { openProjectCreateDialog } from "store/projects/project-create-actions";
12 import { openProjectUpdateDialog } from "store/projects/project-update-actions";
13 import { ToggleTrashAction } from "views-components/context-menu/actions/trash-action";
14 import { toggleProjectTrashed } from "store/trash/trash-actions";
15 import { ShareIcon } from "components/icon/icon";
16 import { openSharingDialog } from "store/sharing-dialog/sharing-dialog-actions";
17 import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab";
18 import { toggleDetailsPanel } from "store/details-panel/details-panel-action";
19 import { copyToClipboardAction, openInNewTabAction } from "store/open-in-new-tab/open-in-new-tab.actions";
20 import { openWebDavS3InfoDialog } from "store/collections/collection-info-actions";
21 import { ToggleLockAction } from "../actions/lock-action";
22 import { freezeProject, unfreezeProject } from "store/projects/project-lock-actions";
23
24 export const toggleFavoriteAction = {
25     component: ToggleFavoriteAction,
26     name: "ToggleFavoriteAction",
27     execute: (dispatch, resources) => {
28         resources.forEach(resource =>
29             dispatch(toggleFavorite(resource)).then(() => {
30                 dispatch(favoritePanelActions.REQUEST_ITEMS());
31             })
32         );
33     },
34 };
35
36 export const openInNewTabMenuAction = {
37     icon: OpenIcon,
38     name: "Open in new tab",
39     execute: (dispatch, resources) => {
40         resources.forEach(resource => dispatch(openInNewTabAction(resource)));
41     },
42 };
43
44 export const copyToClipboardMenuAction = {
45     icon: Link,
46     name: "Copy to clipboard",
47     execute: (dispatch, resources) => {
48         dispatch(copyToClipboardAction(resources));
49     },
50 };
51
52 export const viewDetailsAction = {
53     icon: DetailsIcon,
54     name: "View details",
55     execute: dispatch => {
56         dispatch(toggleDetailsPanel());
57     },
58 };
59
60 export const advancedAction = {
61     icon: AdvancedIcon,
62     name: "API Details",
63     execute: (dispatch, resources) => {
64         resources.forEach(resource => dispatch(openAdvancedTabDialog(resource.uuid)));
65     },
66 };
67
68 export const openWith3rdPartyClientAction = {
69     icon: FolderSharedIcon,
70     name: "Open with 3rd party client",
71     execute: (dispatch, resources) => {
72         resources.forEach(resource => dispatch(openWebDavS3InfoDialog(resource.uuid)));
73     },
74 };
75
76 export const editProjectAction = {
77     icon: RenameIcon,
78     name: "Edit project",
79     execute: (dispatch, resources) => {
80         resources.forEach(resource => dispatch(openProjectUpdateDialog(resource)));
81     },
82 };
83
84 export const shareAction = {
85     icon: ShareIcon,
86     name: "Share",
87     execute: (dispatch, processes) => {
88         processes.forEach(process => dispatch(openSharingDialog(process.uuid)));
89     },
90 };
91
92 export const moveToAction = {
93     icon: MoveToIcon,
94     name: "Move to",
95     execute: (dispatch, resources) => {
96         dispatch(openMoveProjectDialog(resources));
97     },
98 };
99
100 export const toggleTrashAction = {
101     component: ToggleTrashAction,
102     name: "ToggleTrashAction",
103     execute: (dispatch, resources) => {
104         resources.forEach(resource => dispatch(toggleProjectTrashed(resource.uuid, resource.ownerUuid, resource.isTrashed!!, resources.length > 1)));
105     },
106 };
107
108 export const freezeProjectAction = {
109     component: ToggleLockAction,
110     name: "ToggleLockAction",
111     execute: (dispatch, resources) => {
112         resources.forEach(resource => {
113             if (resource.isFrozen) {
114                 dispatch(unfreezeProject(resource.uuid));
115             } else {
116                 dispatch(freezeProject(resource.uuid));
117             }
118         });
119     },
120 };
121
122 export const newProjectAction: any = {
123     icon: NewProjectIcon,
124     name: "New project",
125     execute: (dispatch, resource): void => {
126         dispatch(openProjectCreateDialog(resource.uuid));
127     },
128 };
129
130 export const readOnlyProjectActionSet: ContextMenuActionSet = [
131     [toggleFavoriteAction, openInNewTabMenuAction, copyToClipboardMenuAction, viewDetailsAction, advancedAction, openWith3rdPartyClientAction],
132 ];
133
134 export const filterGroupActionSet: ContextMenuActionSet = [
135     [
136         toggleFavoriteAction,
137         openInNewTabMenuAction,
138         copyToClipboardMenuAction,
139         viewDetailsAction,
140         advancedAction,
141         openWith3rdPartyClientAction,
142         editProjectAction,
143         shareAction,
144         moveToAction,
145         toggleTrashAction,
146     ],
147 ];
148
149 export const frozenActionSet: ContextMenuActionSet = [
150     [
151         shareAction,
152         toggleFavoriteAction,
153         openInNewTabMenuAction,
154         copyToClipboardMenuAction,
155         viewDetailsAction,
156         advancedAction,
157         openWith3rdPartyClientAction,
158         freezeProjectAction,
159     ],
160 ];
161
162 export const projectActionSet: ContextMenuActionSet = [
163     [
164         toggleFavoriteAction,
165         openInNewTabMenuAction,
166         copyToClipboardMenuAction,
167         viewDetailsAction,
168         advancedAction,
169         openWith3rdPartyClientAction,
170         editProjectAction,
171         shareAction,
172         moveToAction,
173         toggleTrashAction,
174         newProjectAction,
175         freezeProjectAction,
176     ],
177 ];