21128: disabled trash button during async op Arvados-DCO-1.1-Signed-off-by: Lisa...
[arvados-workbench2.git] / src / views-components / multiselect-toolbar / ms-menu-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 { IconType } from 'components/icon/icon';
7 import { ResourcesState } from 'store/resources/resources';
8 import { FavoritesState } from 'store/favorites/favorites-reducer';
9 import { ContextMenuResource } from 'store/context-menu/context-menu-actions';
10 import { AddFavoriteIcon, AdvancedIcon, DetailsIcon, FolderSharedIcon, Link, OpenIcon, PublicFavoriteIcon, RemoveFavoriteIcon, ShareIcon } from 'components/icon/icon';
11 import { checkFavorite } from 'store/favorites/favorites-reducer';
12 import { toggleFavorite } from 'store/favorites/favorites-actions';
13 import { favoritePanelActions } from 'store/favorite-panel/favorite-panel-action';
14 import { copyToClipboardAction, openInNewTabAction } from 'store/open-in-new-tab/open-in-new-tab.actions';
15 import { toggleDetailsPanel } from 'store/details-panel/details-panel-action';
16 import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab';
17 import { openWebDavS3InfoDialog } from 'store/collections/collection-info-actions';
18 import { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions';
19 import { togglePublicFavorite } from "store/public-favorites/public-favorites-actions";
20 import { publicFavoritePanelActions } from "store/public-favorites-panel/public-favorites-action";
21 import { PublicFavoritesState } from 'store/public-favorites/public-favorites-reducer';
22
23 export enum MultiSelectMenuActionNames {
24     ADD_TO_FAVORITES = 'Add to Favorites',
25     ADD_TO_TRASH = 'Add to Trash',
26     ADD_TO_PUBLIC_FAVORITES = 'Add to public favorites',
27     API_DETAILS = 'API Details',
28     COPY_AND_RERUN_PROCESS = 'Copy and re-run process',
29     COPY_TO_CLIPBOARD = 'Copy to clipboard',
30     DELETE_WORKFLOW = 'Delete Worflow',
31     EDIT_PPROJECT = 'Edit project',
32     FREEZE_PROJECT = 'Freeze Project',
33     MAKE_A_COPY = 'Make a copy',
34     MOVE_TO = 'Move to',
35     NEW_PROJECT = 'New project',
36     OPEN_IN_NEW_TAB = 'Open in new tab',
37     OPEN_W_3RD_PARTY_CLIENT = 'Open with 3rd party client',
38     REMOVE = 'Remove',
39     RUN_WORKFLOW = 'Run Workflow',
40     SHARE = 'Share',
41     VIEW_DETAILS = 'View details',
42 };
43
44 export type MultiSelectMenuAction = {
45     name: string;
46     icon: IconType;
47     hasAlts: boolean;
48     altName?: string;
49     altIcon?: IconType;
50     isForMulti: boolean;
51     useAlts?: (uuid: string, iconProps: {resources: ResourcesState, favorites: FavoritesState, publicFavorites: PublicFavoritesState}) => boolean;
52     execute(dispatch: Dispatch, resources: ContextMenuResource[], state?: any): void;
53     adminOnly?: boolean;
54 };
55
56 export type MultiSelectMenuActionSet = MultiSelectMenuAction[][];
57
58 const { ADD_TO_FAVORITES, ADD_TO_PUBLIC_FAVORITES, OPEN_IN_NEW_TAB, COPY_TO_CLIPBOARD, VIEW_DETAILS, API_DETAILS, OPEN_W_3RD_PARTY_CLIENT, SHARE } = MultiSelectMenuActionNames;
59
60 const msToggleFavoriteAction: MultiSelectMenuAction = {
61     name: ADD_TO_FAVORITES,
62     icon: AddFavoriteIcon,
63     hasAlts: true,
64     altName: 'Remove from Favorites',
65     altIcon: RemoveFavoriteIcon,
66     isForMulti: false,
67     useAlts: (uuid, iconProps) => {
68         return checkFavorite(uuid, iconProps.favorites);
69     },
70     execute: (dispatch, resources) => {
71         dispatch<any>(toggleFavorite(resources[0])).then(() => {
72             dispatch(favoritePanelActions.REQUEST_ITEMS());
73         });
74     },
75 };
76
77 const msOpenInNewTabMenuAction: MultiSelectMenuAction  = {
78     name: OPEN_IN_NEW_TAB,
79     icon: OpenIcon,
80     hasAlts: false,
81     isForMulti: false,
82     execute: (dispatch, resources) => {
83         dispatch<any>(openInNewTabAction(resources[0]));
84     },
85 };
86
87 const msCopyToClipboardMenuAction: MultiSelectMenuAction  = {
88     name: COPY_TO_CLIPBOARD,
89     icon: Link,
90     hasAlts: false,
91     isForMulti: false,
92     execute: (dispatch, resources) => {
93         dispatch<any>(copyToClipboardAction(resources));
94     },
95 };
96
97 const msViewDetailsAction: MultiSelectMenuAction  = {
98     name: VIEW_DETAILS,
99     icon: DetailsIcon,
100     hasAlts: false,
101     isForMulti: false,
102     execute: (dispatch) => {
103         dispatch<any>(toggleDetailsPanel());
104     },
105 };
106
107 const msAdvancedAction: MultiSelectMenuAction  = {
108     name: API_DETAILS,
109     icon: AdvancedIcon,
110     hasAlts: false,
111     isForMulti: false,
112     execute: (dispatch, resources) => {
113         dispatch<any>(openAdvancedTabDialog(resources[0].uuid));
114     },
115 };
116
117 const msOpenWith3rdPartyClientAction: MultiSelectMenuAction  = {
118     name: OPEN_W_3RD_PARTY_CLIENT,
119     icon: FolderSharedIcon,
120     hasAlts: false,
121     isForMulti: false,
122     execute: (dispatch, resources) => {
123         dispatch<any>(openWebDavS3InfoDialog(resources[0].uuid));
124     },
125 };
126
127 const msShareAction: MultiSelectMenuAction  = {
128     name: SHARE,
129     icon: ShareIcon,
130     hasAlts: false,
131     isForMulti: false,
132     execute: (dispatch, resources) => {
133         dispatch<any>(openSharingDialog(resources[0].uuid));
134     },
135 };
136
137 const msTogglePublicFavoriteAction: MultiSelectMenuAction = {
138     name: ADD_TO_PUBLIC_FAVORITES,
139     icon: PublicFavoriteIcon,
140     hasAlts: true,
141     altName: 'Remove from public favorites',
142     altIcon: PublicFavoriteIcon,
143     isForMulti: false,
144     useAlts: (uuid: string, iconProps) => {
145         return iconProps.publicFavorites[uuid] === true
146     },
147     execute: (dispatch, resources) => {
148         dispatch<any>(togglePublicFavorite(resources[0])).then(() => {
149             dispatch(publicFavoritePanelActions.REQUEST_ITEMS());
150         });
151     },
152 };
153
154 export const msCommonActionSet = [
155     msToggleFavoriteAction,
156     msOpenInNewTabMenuAction,
157     msCopyToClipboardMenuAction,
158     msViewDetailsAction,
159     msAdvancedAction,
160     msOpenWith3rdPartyClientAction,
161     msShareAction,
162     msTogglePublicFavoriteAction
163 ];