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