Merge branch 'main' into 21224-project-details
[arvados.git] / services / workbench2 / src / views-components / context-menu / menu-item-sort.ts
index f321b5ed763347f7d152d2783c6a53b564fd9375..0e06be1685aef6b8bf3e3d707aca51d4eab45e74 100644 (file)
@@ -4,11 +4,14 @@
 
 import { ContextMenuAction } from './context-menu-action-set';
 import { ContextMenuActionNames } from 'views-components/context-menu/context-menu-action-set';
-import { sortByProperty } from 'common/array-utils'; 
+import { sortByProperty } from 'common/array-utils';
+import { horizontalMenuDivider, verticalMenuDivider } from './actions/context-menu-divider';
+import { MultiSelectMenuAction } from 'views-components/multiselect-toolbar/ms-menu-actions';
 
 export enum ContextMenuKind {
     API_CLIENT_AUTHORIZATION = "ApiClientAuthorization",
     ROOT_PROJECT = "RootProject",
+    ROOT_PROJECT_ADMIN = "RootProjectAdmin",
     PROJECT = "Project",
     FILTER_GROUP = "FilterGroup",
     READONLY_PROJECT = "ReadOnlyProject",
@@ -45,6 +48,7 @@ export enum ContextMenuKind {
     VIRTUAL_MACHINE = "VirtualMachine",
     KEEP_SERVICE = "KeepService",
     USER = "User",
+    USER_DETAILS = "UserDetails",
     GROUPS = "Group",
     GROUP_MEMBER = "GroupMember",
     PERMISSION_EDIT = "PermissionEdit",
@@ -52,17 +56,22 @@ export enum ContextMenuKind {
     WORKFLOW = "Workflow",
     READONLY_WORKFLOW = "ReadOnlyWorkflow",
     SEARCH_RESULTS = "SearchResults",
+    MULTI = "Multi",
 }
 
+
+
 const processOrder = [
     ContextMenuActionNames.VIEW_DETAILS,
     ContextMenuActionNames.OPEN_IN_NEW_TAB,
     ContextMenuActionNames.OUTPUTS,
     ContextMenuActionNames.API_DETAILS,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.EDIT_PROCESS,
     ContextMenuActionNames.COPY_AND_RERUN_PROCESS,
-    ContextMenuActionNames.MOVE_TO,
+    ContextMenuActionNames.CANCEL,
     ContextMenuActionNames.REMOVE,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.ADD_TO_FAVORITES,
     ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
 ];
@@ -70,14 +79,16 @@ const processOrder = [
 const projectOrder = [
     ContextMenuActionNames.VIEW_DETAILS,
     ContextMenuActionNames.OPEN_IN_NEW_TAB,
-    ContextMenuActionNames.COPY_TO_CLIPBOARD,
+    ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD,
     ContextMenuActionNames.OPEN_WITH_3RD_PARTY_CLIENT,
     ContextMenuActionNames.API_DETAILS,
+    ContextMenuActionNames.DIVIDER,
+    ContextMenuActionNames.SHARE,
     ContextMenuActionNames.NEW_PROJECT,
     ContextMenuActionNames.EDIT_PROJECT,
-    ContextMenuActionNames.SHARE,
     ContextMenuActionNames.MOVE_TO,
-    ContextMenuActionNames.REMOVE,
+    ContextMenuActionNames.MOVE_TO_TRASH,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.FREEZE_PROJECT,
     ContextMenuActionNames.ADD_TO_FAVORITES,
     ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
@@ -86,15 +97,16 @@ const projectOrder = [
 const collectionOrder = [
     ContextMenuActionNames.VIEW_DETAILS,
     ContextMenuActionNames.OPEN_IN_NEW_TAB,
-    ContextMenuActionNames.COPY_TO_CLIPBOARD,
+    ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD,
     ContextMenuActionNames.OPEN_WITH_3RD_PARTY_CLIENT,
     ContextMenuActionNames.API_DETAILS,
-    ContextMenuActionNames.NEW_COLLECTION,
-    ContextMenuActionNames.EDIT_COLLECTION,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.SHARE,
+    ContextMenuActionNames.EDIT_COLLECTION,
     ContextMenuActionNames.MOVE_TO,
     ContextMenuActionNames.MAKE_A_COPY,
     ContextMenuActionNames.MOVE_TO_TRASH,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.ADD_TO_FAVORITES,
     ContextMenuActionNames.ADD_TO_PUBLIC_FAVORITES,
 ];
@@ -102,16 +114,27 @@ const collectionOrder = [
 const workflowOrder = [
     ContextMenuActionNames.VIEW_DETAILS,
     ContextMenuActionNames.OPEN_IN_NEW_TAB,
-    ContextMenuActionNames.COPY_TO_CLIPBOARD,
+    ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD,
     ContextMenuActionNames.API_DETAILS,
+    ContextMenuActionNames.DIVIDER,
     ContextMenuActionNames.RUN_WORKFLOW,
-    ContextMenuActionNames.REMOVE,
+    ContextMenuActionNames.DELETE_WORKFLOW,
 ]
 
+const defaultMultiOrder = [
+    ContextMenuActionNames.MOVE_TO,
+    ContextMenuActionNames.MAKE_A_COPY,
+    ContextMenuActionNames.MOVE_TO_TRASH,
+];
+
 const kindToOrder: Record<string, ContextMenuActionNames[]> = {
+    [ContextMenuKind.MULTI]: defaultMultiOrder,
+
     [ContextMenuKind.PROCESS]: processOrder,
     [ContextMenuKind.PROCESS_ADMIN]: processOrder,
     [ContextMenuKind.PROCESS_RESOURCE]: processOrder,
+    [ContextMenuKind.RUNNING_PROCESS_ADMIN]: processOrder,
+    [ContextMenuKind.RUNNING_PROCESS_RESOURCE]: processOrder,
 
     [ContextMenuKind.PROJECT]: projectOrder,
     [ContextMenuKind.PROJECT_ADMIN]: projectOrder,
@@ -127,7 +150,12 @@ const kindToOrder: Record<string, ContextMenuActionNames[]> = {
     [ContextMenuKind.READONLY_WORKFLOW]: workflowOrder,
 };
 
-export const sortMenuItems = (menuKind: ContextMenuKind, menuItems: ContextMenuAction[]) => {
+export const menuDirection = {
+    VERTICAL: 'vertical',
+    HORIZONTAL: 'horizontal'
+}
+
+export const sortMenuItems = (menuKind: ContextMenuKind, menuItems: ContextMenuAction[], orthagonality: string): ContextMenuAction[] | MultiSelectMenuAction[] => {
 
     const preferredOrder = kindToOrder[menuKind];
     //if no specified order, sort by name
@@ -136,8 +164,18 @@ export const sortMenuItems = (menuKind: ContextMenuKind, menuItems: ContextMenuA
     const bucketMap = new Map();
     const leftovers: ContextMenuAction[] = [];
 
-    preferredOrder.forEach((name) => bucketMap.set(name, null));
-    menuItems.forEach((item) => {
+    // if we have multiple dividers, we need each of them to have a different "name" property
+    let count = 0;
+
+    preferredOrder.forEach((name) => {
+        if (name === ContextMenuActionNames.DIVIDER) {
+            count++;
+            bucketMap.set(`${name}-${count}`, orthagonality === menuDirection.VERTICAL ? verticalMenuDivider : horizontalMenuDivider)
+        } else {
+            bucketMap.set(name, null)
+        }
+    });
+    [...menuItems].forEach((item) => {
         if (bucketMap.has(item.name)) bucketMap.set(item.name, item);
         else leftovers.push(item);
     });