Merge branch '21128-toolbar-context-menu'
[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, 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 { 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 { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions';
18 import { togglePublicFavorite } from "store/public-favorites/public-favorites-actions";
19 import { publicFavoritePanelActions } from "store/public-favorites-panel/public-favorites-action";
20 import { PublicFavoritesState } from 'store/public-favorites/public-favorites-reducer';
21
22 export enum MultiSelectMenuActionNames {
23     ADD_TO_FAVORITES = 'Add to Favorites',
24     MOVE_TO_TRASH = 'Move to trash',
25     ADD_TO_PUBLIC_FAVORITES = 'Add to public favorites',
26     API_DETAILS = 'API Details',
27     CANCEL = 'CANCEL',
28     COPY_AND_RERUN_PROCESS = 'Copy and re-run process',
29     COPY_TO_CLIPBOARD = 'Copy to clipboard',
30     DELETE_WORKFLOW = 'Delete Workflow',
31     EDIT_COLLECTION = 'Edit collection',
32     EDIT_PROJECT = 'Edit project',
33     EDIT_PROCESS = 'Edit process',
34     FREEZE_PROJECT = 'Freeze Project',
35     MAKE_A_COPY = 'Make a copy',
36     MOVE_TO = 'Move to',
37     NEW_PROJECT = 'New project',
38     OPEN_IN_NEW_TAB = 'Open in new tab',
39     OPEN_W_3RD_PARTY_CLIENT = 'Open with 3rd party client',
40     OUTPUTS = 'Outputs',
41     REMOVE = 'Remove',
42     RUN_WORKFLOW = 'Run Workflow',
43     SHARE = 'Share',
44     VIEW_DETAILS = 'View details',
45 };
46
47 export type MultiSelectMenuAction = {
48     name: string;
49     icon: IconType;
50     hasAlts: boolean;
51     altName?: string;
52     altIcon?: IconType;
53     isForMulti: boolean;
54     useAlts?: (uuid: string | null, iconProps: {resources: ResourcesState, favorites: FavoritesState, publicFavorites: PublicFavoritesState}) => boolean;
55     execute(dispatch: Dispatch, resources: ContextMenuResource[], state?: any): void;
56     adminOnly?: boolean;
57 };
58
59 export type MultiSelectMenuActionSet = MultiSelectMenuAction[][];
60
61 const { ADD_TO_FAVORITES, ADD_TO_PUBLIC_FAVORITES, OPEN_IN_NEW_TAB, VIEW_DETAILS, API_DETAILS, SHARE } = MultiSelectMenuActionNames;
62
63 const msToggleFavoriteAction: MultiSelectMenuAction = {
64     name: ADD_TO_FAVORITES,
65     icon: AddFavoriteIcon,
66     hasAlts: true,
67     altName: 'Remove from Favorites',
68     altIcon: RemoveFavoriteIcon,
69     isForMulti: false,
70     useAlts: (uuid: string, iconProps) => {
71         return checkFavorite(uuid, iconProps.favorites);
72     },
73     execute: (dispatch, resources) => {
74         dispatch<any>(toggleFavorite(resources[0])).then(() => {
75             dispatch(favoritePanelActions.REQUEST_ITEMS());
76         });
77     },
78 };
79
80 const msOpenInNewTabMenuAction: MultiSelectMenuAction  = {
81     name: OPEN_IN_NEW_TAB,
82     icon: OpenIcon,
83     hasAlts: false,
84     isForMulti: false,
85     execute: (dispatch, resources) => {
86         dispatch<any>(openInNewTabAction(resources[0]));
87     },
88 };
89
90 const msViewDetailsAction: MultiSelectMenuAction  = {
91     name: VIEW_DETAILS,
92     icon: DetailsIcon,
93     hasAlts: false,
94     isForMulti: false,
95     execute: (dispatch) => {
96         dispatch<any>(toggleDetailsPanel());
97     },
98 };
99
100 const msAdvancedAction: MultiSelectMenuAction  = {
101     name: API_DETAILS,
102     icon: AdvancedIcon,
103     hasAlts: false,
104     isForMulti: false,
105     execute: (dispatch, resources) => {
106         dispatch<any>(openAdvancedTabDialog(resources[0].uuid));
107     },
108 };
109
110 const msShareAction: MultiSelectMenuAction  = {
111     name: SHARE,
112     icon: ShareIcon,
113     hasAlts: false,
114     isForMulti: false,
115     execute: (dispatch, resources) => {
116         dispatch<any>(openSharingDialog(resources[0].uuid));
117     },
118 };
119
120 const msTogglePublicFavoriteAction: MultiSelectMenuAction = {
121     name: ADD_TO_PUBLIC_FAVORITES,
122     icon: PublicFavoriteIcon,
123     hasAlts: true,
124     altName: 'Remove from public favorites',
125     altIcon: PublicFavoriteIcon,
126     isForMulti: false,
127     useAlts: (uuid: string, iconProps) => {
128         return iconProps.publicFavorites[uuid] === true
129     },
130     execute: (dispatch, resources) => {
131         dispatch<any>(togglePublicFavorite(resources[0])).then(() => {
132             dispatch(publicFavoritePanelActions.REQUEST_ITEMS());
133         });
134     },
135 };
136
137 export const msCommonActionSet = [
138     msToggleFavoriteAction,
139     msOpenInNewTabMenuAction,
140     msViewDetailsAction,
141     msAdvancedAction,
142     msShareAction,
143     msTogglePublicFavoriteAction
144 ];