1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { ContextMenuAction } from './context-menu-action-set';
6 import { ContextMenuActionNames } from 'views-components/context-menu/context-menu-action-set';
7 import { sortByProperty } from 'common/array-utils';
9 export enum ContextMenuKind {
10 API_CLIENT_AUTHORIZATION = "ApiClientAuthorization",
11 ROOT_PROJECT = "RootProject",
13 FILTER_GROUP = "FilterGroup",
14 READONLY_PROJECT = "ReadOnlyProject",
15 FROZEN_PROJECT = "FrozenProject",
16 FROZEN_PROJECT_ADMIN = "FrozenProjectAdmin",
17 PROJECT_ADMIN = "ProjectAdmin",
18 FILTER_GROUP_ADMIN = "FilterGroupAdmin",
19 RESOURCE = "Resource",
20 FAVORITE = "Favorite",
22 COLLECTION_FILES = "CollectionFiles",
23 COLLECTION_FILES_MULTIPLE = "CollectionFilesMultiple",
24 READONLY_COLLECTION_FILES = "ReadOnlyCollectionFiles",
25 READONLY_COLLECTION_FILES_MULTIPLE = "ReadOnlyCollectionFilesMultiple",
26 COLLECTION_FILES_NOT_SELECTED = "CollectionFilesNotSelected",
27 COLLECTION_FILE_ITEM = "CollectionFileItem",
28 COLLECTION_DIRECTORY_ITEM = "CollectionDirectoryItem",
29 READONLY_COLLECTION_FILE_ITEM = "ReadOnlyCollectionFileItem",
30 READONLY_COLLECTION_DIRECTORY_ITEM = "ReadOnlyCollectionDirectoryItem",
31 COLLECTION = "Collection",
32 COLLECTION_ADMIN = "CollectionAdmin",
33 READONLY_COLLECTION = "ReadOnlyCollection",
34 OLD_VERSION_COLLECTION = "OldVersionCollection",
35 TRASHED_COLLECTION = "TrashedCollection",
37 RUNNING_PROCESS_ADMIN = "RunningProcessAdmin",
38 PROCESS_ADMIN = "ProcessAdmin",
39 RUNNING_PROCESS_RESOURCE = "RunningProcessResource",
40 PROCESS_RESOURCE = "ProcessResource",
41 READONLY_PROCESS_RESOURCE = "ReadOnlyProcessResource",
42 PROCESS_LOGS = "ProcessLogs",
43 REPOSITORY = "Repository",
45 VIRTUAL_MACHINE = "VirtualMachine",
46 KEEP_SERVICE = "KeepService",
49 GROUP_MEMBER = "GroupMember",
50 PERMISSION_EDIT = "PermissionEdit",
52 WORKFLOW = "Workflow",
53 READONLY_WORKFLOW = "ReadOnlyWorkflow",
54 SEARCH_RESULTS = "SearchResults",
57 const processOrder = [
58 ContextMenuActionNames.VIEW_DETAILS,
59 ContextMenuActionNames.OPEN_IN_NEW_TAB,
60 ContextMenuActionNames.OUTPUTS,
61 ContextMenuActionNames.API_DETAILS,
62 ContextMenuActionNames.EDIT_PROCESS,
63 ContextMenuActionNames.COPY_AND_RERUN_PROCESS,
64 ContextMenuActionNames.MOVE_TO,
65 ContextMenuActionNames.REMOVE,
66 ContextMenuActionNames.ADD_TO_FAVORITES,
67 ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
70 const projectOrder = [
71 ContextMenuActionNames.VIEW_DETAILS,
72 ContextMenuActionNames.OPEN_IN_NEW_TAB,
73 ContextMenuActionNames.COPY_TO_CLIPBOARD,
74 ContextMenuActionNames.OPEN_WITH_3RD_PARTY_CLIENT,
75 ContextMenuActionNames.API_DETAILS,
76 ContextMenuActionNames.NEW_PROJECT,
77 ContextMenuActionNames.EDIT_PROJECT,
78 ContextMenuActionNames.SHARE,
79 ContextMenuActionNames.MOVE_TO,
80 ContextMenuActionNames.REMOVE,
81 ContextMenuActionNames.FREEZE_PROJECT,
82 ContextMenuActionNames.ADD_TO_FAVORITES,
83 ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
86 const collectionOrder = [
87 ContextMenuActionNames.VIEW_DETAILS,
88 ContextMenuActionNames.OPEN_IN_NEW_TAB,
89 ContextMenuActionNames.COPY_TO_CLIPBOARD,
90 ContextMenuActionNames.OPEN_WITH_3RD_PARTY_CLIENT,
91 ContextMenuActionNames.API_DETAILS,
92 ContextMenuActionNames.NEW_COLLECTION,
93 ContextMenuActionNames.EDIT_COLLECTION,
94 ContextMenuActionNames.SHARE,
95 ContextMenuActionNames.MOVE_TO,
96 ContextMenuActionNames.MAKE_A_COPY,
97 ContextMenuActionNames.MOVE_TO_TRASH,
98 ContextMenuActionNames.ADD_TO_FAVORITES,
99 ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
102 const workflowOrder = [
103 ContextMenuActionNames.VIEW_DETAILS,
104 ContextMenuActionNames.OPEN_IN_NEW_TAB,
105 ContextMenuActionNames.COPY_TO_CLIPBOARD,
106 ContextMenuActionNames.API_DETAILS,
107 ContextMenuActionNames.RUN_WORKFLOW,
108 ContextMenuActionNames.REMOVE,
111 const kindToOrder: Record<string, ContextMenuActionNames[]> = {
112 [ContextMenuKind.PROCESS]: processOrder,
113 [ContextMenuKind.PROCESS_ADMIN]: processOrder,
114 [ContextMenuKind.PROCESS_RESOURCE]: processOrder,
115 [ContextMenuKind.RUNNING_PROCESS_ADMIN]: processOrder,
116 [ContextMenuKind.RUNNING_PROCESS_RESOURCE]: processOrder,
118 [ContextMenuKind.PROJECT]: projectOrder,
119 [ContextMenuKind.PROJECT_ADMIN]: projectOrder,
120 [ContextMenuKind.FROZEN_PROJECT]: projectOrder,
121 [ContextMenuKind.FROZEN_PROJECT_ADMIN]: projectOrder,
123 [ContextMenuKind.COLLECTION]: collectionOrder,
124 [ContextMenuKind.COLLECTION_ADMIN]: collectionOrder,
125 [ContextMenuKind.READONLY_COLLECTION]: collectionOrder,
126 [ContextMenuKind.OLD_VERSION_COLLECTION]: collectionOrder,
128 [ContextMenuKind.WORKFLOW]: workflowOrder,
129 [ContextMenuKind.READONLY_WORKFLOW]: workflowOrder,
132 export const sortMenuItems = (menuKind: ContextMenuKind, menuItems: ContextMenuAction[]) => {
134 const preferredOrder = kindToOrder[menuKind];
135 //if no specified order, sort by name
136 if (!preferredOrder) return menuItems.sort(sortByProperty("name"));
138 const bucketMap = new Map();
139 const leftovers: ContextMenuAction[] = [];
141 preferredOrder.forEach((name) => bucketMap.set(name, null));
142 menuItems.forEach((item) => {
143 if (bucketMap.has(item.name)) bucketMap.set(item.name, item);
144 else leftovers.push(item);
147 return Array.from(bucketMap.values()).concat(leftovers).filter((item) => item !== null);