21448: initial sorting algo in place Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa...
authorLisa Knox <lisaknox83@gmail.com>
Thu, 28 Mar 2024 17:37:54 +0000 (13:37 -0400)
committerLisa Knox <lisaknox83@gmail.com>
Thu, 28 Mar 2024 17:37:54 +0000 (13:37 -0400)
services/workbench2/src/common/menu-item-sort.ts [new file with mode: 0644]
services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
services/workbench2/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
services/workbench2/src/views-components/context-menu/context-menu.tsx

diff --git a/services/workbench2/src/common/menu-item-sort.ts b/services/workbench2/src/common/menu-item-sort.ts
new file mode 100644 (file)
index 0000000..6cf8c9f
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { ContextMenuAction } from '../views-components/context-menu/context-menu-action-set';
+import { ContextMenuActionNames } from 'views-components/context-menu/context-menu-action-set';
+
+const {
+    ACCOUNT_SETTINGS,
+    ACTIVATE_USER,
+    ADD_TO_FAVORITES,
+    ADD_TO_PUBLIC_FAVORITES,
+    ATTRIBUTES,
+    API_DETAILS,
+    CANCEL,
+    COPY_AND_RERUN_PROCESS,
+    COPY_ITEM_INTO_EXISTING_COLLECTION,
+    COPY_ITEM_INTO_NEW_COLLECTION,
+    COPY_SELECTED_INTO_EXISTING_COLLECTION,
+    COPY_SELECTED_INTO_SEPARATE_COLLECTIONS,
+    COPY_SELECTED_INTO_NEW_COLLECTION,
+    COPY_TO_CLIPBOARD,
+    DEACTIVATE_USER,
+    DELETE_WORKFLOW,
+    DOWNLOAD,
+    EDIT_COLLECTION,
+    EDIT_PROCESS,
+    EDIT_PROJECT,
+    FREEZE_PROJECT,
+    HOME_PROJECT,
+    LOGIN_AS_USER,
+    MAKE_A_COPY,
+    MANAGE,
+    MOVE_ITEM_INTO_EXISTING_COLLECTION,
+    MOVE_ITEM_INTO_NEW_COLLECTION,
+    MOVE_SELECTED_INTO_EXISTING_COLLECTION,
+    MOVE_SELECTED_INTO_NEW_COLLECTION,
+    MOVE_SELECTED_INTO_SEPARATE_COLLECTIONS,
+    MOVE_TO,
+    MOVE_TO_TRASH,
+    NEW_COLLECTION,
+    NEW_PROJECT,
+    OPEN_IN_NEW_TAB,
+    OPEN_WITH_3RD_PARTY_CLIENT,
+    OUTPUTS,
+    PROVENANCE_GRAPH,
+    READ,
+    REMOVE,
+    REMOVE_SELECTED,
+    RENAME,
+    RESTORE,
+    RESTORE_VERSION,
+    RUN_WORKFLOW,
+    SELECT_ALL,
+    SETUP_USER,
+    SHARE,
+    UNSELECT_ALL,
+    VIEW_DETAILS,
+    WRITE,
+} = ContextMenuActionNames;
+
+const processOrder = [VIEW_DETAILS, OPEN_IN_NEW_TAB, OUTPUTS, API_DETAILS, EDIT_PROCESS, COPY_AND_RERUN_PROCESS, MOVE_TO, REMOVE, ADD_TO_FAVORITES, ADD_TO_PUBLIC_FAVORITES];
+
+const kindToOrder: Record<string, ContextMenuActionNames[]> = {
+    "ProcessResource": processOrder,
+};
+
+export const sortMenuItems = (menuKind:string, menuItems: ContextMenuAction[]) => {
+    const order = kindToOrder[menuKind] || [];
+    const bucketMap = new Map();
+    order.forEach((name) => bucketMap.set(name, null));
+    menuItems.forEach((item) => {if (bucketMap.has(item.name)) bucketMap.set(item.name, item)});
+    console.log(Array.from(bucketMap.values()));
+};
\ No newline at end of file
index 7b44d675a2e461ea82f7b5a96bf57c289c51e633..ae22050f3337dad7d602b4067f25be5e6f6ef014 100644 (file)
@@ -15,7 +15,7 @@ import { getResource } from "store/resources/resources";
 import { ResourcesState } from "store/resources/resources";
 import { MultiSelectMenuAction, MultiSelectMenuActionSet } from "views-components/multiselect-toolbar/ms-menu-actions";
 import { ContextMenuAction, ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
-import { multiselectActionsFilters, TMultiselectActionsFilters, msMenuResourceKind } from "./ms-toolbar-action-filters";
+import { multiselectActionsFilters, TMultiselectActionsFilters } from "./ms-toolbar-action-filters";
 import { kindToActionSet, findActionByName } from "./ms-kind-action-differentiator";
 import { msToggleTrashAction } from "views-components/multiselect-toolbar/ms-project-action-set";
 import { copyToClipboardAction } from "store/open-in-new-tab/open-in-new-tab.actions";
@@ -34,6 +34,7 @@ import { Process } from "store/processes/process";
 import { PublicFavoritesState } from "store/public-favorites/public-favorites-reducer";
 import { isExactlyOneSelected } from "store/multiselect/multiselect-actions";
 import { IntersectionObserverWrapper } from "./ms-toolbar-overflow-wrapper";
+import { ContextMenuKind } from "views-components/context-menu/context-menu";
 
 const WIDTH_TRANSITION = 150
 
@@ -211,7 +212,7 @@ function filterActions(actionArray: MultiSelectMenuActionSet, filters: Set<strin
     return actionArray[0].filter(action => filters.has(action.name as string));
 }
 
-const resourceToMsResourceKind = (uuid: string, resources: ResourcesState, user: User | null, readonly = false): (msMenuResourceKind | ResourceKind) | undefined => {
+const resourceToMsResourceKind = (uuid: string, resources: ResourcesState, user: User | null, readonly = false): (ContextMenuKind | ResourceKind) | undefined => {
     if (!user) return;
     const resource = getResourceWithEditableStatus<GroupResource & EditableResource>(uuid, user.uuid)(resources);
     const { isAdmin } = user;
@@ -223,18 +224,18 @@ const resourceToMsResourceKind = (uuid: string, resources: ResourcesState, user:
     switch (kind) {
         case ResourceKind.PROJECT:
             if (isFrozen) {
-                return isAdmin ? msMenuResourceKind.FROZEN_PROJECT_ADMIN : msMenuResourceKind.FROZEN_PROJECT;
+                return isAdmin ? ContextMenuKind.FROZEN_PROJECT_ADMIN : ContextMenuKind.FROZEN_PROJECT;
             }
 
             return isAdmin && !readonly
                 ? resource && resource.groupClass !== GroupClass.FILTER
-                    ? msMenuResourceKind.PROJECT_ADMIN
-                    : msMenuResourceKind.FILTER_GROUP_ADMIN
+                    ? ContextMenuKind.PROJECT_ADMIN
+                    : ContextMenuKind.FILTER_GROUP_ADMIN
                 : isEditable
                 ? resource && resource.groupClass !== GroupClass.FILTER
-                    ? msMenuResourceKind.PROJECT
-                    : msMenuResourceKind.FILTER_GROUP
-                : msMenuResourceKind.READONLY_PROJECT;
+                    ? ContextMenuKind.PROJECT
+                    : ContextMenuKind.FILTER_GROUP
+                : ContextMenuKind.READONLY_PROJECT;
         case ResourceKind.COLLECTION:
             const c = getResource<CollectionResource>(uuid)(resources);
             if (c === undefined) {
@@ -243,30 +244,30 @@ const resourceToMsResourceKind = (uuid: string, resources: ResourcesState, user:
             const isOldVersion = c.uuid !== c.currentVersionUuid;
             const isTrashed = c.isTrashed;
             return isOldVersion
-                ? msMenuResourceKind.OLD_VERSION_COLLECTION
+                ? ContextMenuKind.OLD_VERSION_COLLECTION
                 : isTrashed && isEditable
-                ? msMenuResourceKind.TRASHED_COLLECTION
+                ? ContextMenuKind.TRASHED_COLLECTION
                 : isAdmin && isEditable
-                ? msMenuResourceKind.COLLECTION_ADMIN
+                ? ContextMenuKind.COLLECTION_ADMIN
                 : isEditable
-                ? msMenuResourceKind.COLLECTION
-                : msMenuResourceKind.READONLY_COLLECTION;
+                ? ContextMenuKind.COLLECTION
+                : ContextMenuKind.READONLY_COLLECTION;
         case ResourceKind.PROCESS:
             return isAdmin && isEditable
                 ? resource && isProcessCancelable(getProcess(resource.uuid)(resources) as Process)
-                    ? msMenuResourceKind.RUNNING_PROCESS_ADMIN
-                    : msMenuResourceKind.PROCESS_ADMIN
+                    ? ContextMenuKind.RUNNING_PROCESS_ADMIN
+                    : ContextMenuKind.PROCESS_ADMIN
                 : readonly
-                ? msMenuResourceKind.READONLY_PROCESS_RESOURCE
+                ? ContextMenuKind.READONLY_PROCESS_RESOURCE
                 : resource && isProcessCancelable(getProcess(resource.uuid)(resources) as Process)
-                ? msMenuResourceKind.RUNNING_PROCESS_RESOURCE
-                : msMenuResourceKind.PROCESS_RESOURCE;
+                ? ContextMenuKind.RUNNING_PROCESS_RESOURCE
+                : ContextMenuKind.PROCESS_RESOURCE;
         case ResourceKind.USER:
-            return msMenuResourceKind.ROOT_PROJECT;
+            return ContextMenuKind.ROOT_PROJECT;
         case ResourceKind.LINK:
-            return msMenuResourceKind.LINK;
+            return ContextMenuKind.LINK;
         case ResourceKind.WORKFLOW:
-            return isEditable ? msMenuResourceKind.WORKFLOW : msMenuResourceKind.READONLY_WORKFLOW;
+            return isEditable ? ContextMenuKind.WORKFLOW : ContextMenuKind.READONLY_WORKFLOW;
         default:
             return;
     }
index b34cc22cb9ab05934e4ff6568527091ee9dce45a..a5498e7a5357ccf22180badf17449618433fcba1 100644 (file)
@@ -16,54 +16,7 @@ import {
 import { msProcessActionSet, msCommonProcessActionFilter, msAdminProcessActionFilter, msRunningProcessActionFilter } from 'views-components/multiselect-toolbar/ms-process-action-set';
 import { msWorkflowActionSet, msWorkflowActionFilter, msReadOnlyWorkflowActionFilter } from 'views-components/multiselect-toolbar/ms-workflow-action-set';
 import { ResourceKind } from 'models/resource';
-
-export enum msMenuResourceKind {
-    API_CLIENT_AUTHORIZATION = 'ApiClientAuthorization',
-    ROOT_PROJECT = 'RootProject',
-    PROJECT = 'Project',
-    FILTER_GROUP = 'FilterGroup',
-    READONLY_PROJECT = 'ReadOnlyProject',
-    FROZEN_PROJECT = 'FrozenProject',
-    FROZEN_PROJECT_ADMIN = 'FrozenProjectAdmin',
-    PROJECT_ADMIN = 'ProjectAdmin',
-    FILTER_GROUP_ADMIN = 'FilterGroupAdmin',
-    RESOURCE = 'Resource',
-    FAVORITE = 'Favorite',
-    TRASH = 'Trash',
-    COLLECTION_FILES = 'CollectionFiles',
-    COLLECTION_FILES_MULTIPLE = 'CollectionFilesMultiple',
-    READONLY_COLLECTION_FILES = 'ReadOnlyCollectionFiles',
-    READONLY_COLLECTION_FILES_MULTIPLE = 'ReadOnlyCollectionFilesMultiple',
-    COLLECTION_FILES_NOT_SELECTED = 'CollectionFilesNotSelected',
-    COLLECTION_FILE_ITEM = 'CollectionFileItem',
-    COLLECTION_DIRECTORY_ITEM = 'CollectionDirectoryItem',
-    READONLY_COLLECTION_FILE_ITEM = 'ReadOnlyCollectionFileItem',
-    READONLY_COLLECTION_DIRECTORY_ITEM = 'ReadOnlyCollectionDirectoryItem',
-    COLLECTION = 'Collection',
-    COLLECTION_ADMIN = 'CollectionAdmin',
-    READONLY_COLLECTION = 'ReadOnlyCollection',
-    OLD_VERSION_COLLECTION = 'OldVersionCollection',
-    TRASHED_COLLECTION = 'TrashedCollection',
-    PROCESS = 'Process',
-    RUNNING_PROCESS_ADMIN = 'RunningProcessAdmin',
-    PROCESS_ADMIN = 'ProcessAdmin',
-    RUNNING_PROCESS_RESOURCE = 'RunningProcessResource',
-    PROCESS_RESOURCE = 'ProcessResource',
-    READONLY_PROCESS_RESOURCE = 'ReadOnlyProcessResource',
-    PROCESS_LOGS = 'ProcessLogs',
-    REPOSITORY = 'Repository',
-    SSH_KEY = 'SshKey',
-    VIRTUAL_MACHINE = 'VirtualMachine',
-    KEEP_SERVICE = 'KeepService',
-    USER = 'User',
-    GROUPS = 'Group',
-    GROUP_MEMBER = 'GroupMember',
-    PERMISSION_EDIT = 'PermissionEdit',
-    LINK = 'Link',
-    WORKFLOW = 'Workflow',
-    READONLY_WORKFLOW = 'ReadOnlyWorkflow',
-    SEARCH_RESULTS = 'SearchResults',
-}
+import { ContextMenuKind } from 'views-components/context-menu/context-menu';
 
 const {
     COLLECTION,
@@ -82,7 +35,7 @@ const {
     FILTER_GROUP_ADMIN,
     WORKFLOW,
     READONLY_WORKFLOW,
-} = msMenuResourceKind;
+} = ContextMenuKind;
 
 export type TMultiselectActionsFilters = Record<string, [MultiSelectMenuActionSet, Set<string>]>;
 
index aeb69de7624bf3e27a82f7a911f7de1d57e03d4c..565785c11e2aa55462fa7e76f0baf6bb75beedfc 100644 (file)
@@ -11,6 +11,7 @@ import { ContextMenuActionSet, ContextMenuAction } from "./context-menu-action-s
 import { Dispatch } from "redux";
 import { memoize } from "lodash";
 import { sortByProperty } from "common/array-utils";
+import { sortMenuItems } from "common/menu-item-sort";
 
 type DataProps = Pick<ContextMenuProps, "anchorEl" | "items" | "open"> & { resource?: ContextMenuResource };