Merge 'main' into 20382-process-action-menu-cancel
[arvados-workbench2.git] / src / store / context-menu / context-menu-actions.ts
index f846d25ba5089b8abfa859edfecd72d4ff07581f..4cad2962f0f85125260c95ad36dbdf923376f021 100644 (file)
@@ -11,7 +11,7 @@ import { getResource, getResourceWithEditableStatus } from "../resources/resourc
 import { UserResource } from "models/user";
 import { isSidePanelTreeCategory } from "store/side-panel-tree/side-panel-tree-actions";
 import { extractUuidKind, ResourceKind, EditableResource, Resource } from "models/resource";
-import { Process } from "store/processes/process";
+import { Process, isProcessCancelable } from "store/processes/process";
 import { RepositoryResource } from "models/repositories";
 import { SshKeyResource } from "models/ssh-key";
 import { VirtualMachinesResource } from "models/virtual-machines";
@@ -23,6 +23,7 @@ import { GroupContentsResource } from "services/groups-service/groups-service";
 import { LinkResource } from "models/link";
 import { resourceIsFrozen } from "common/frozen-resources";
 import { ProjectResource } from "models/project";
+import { getProcess } from "store/processes/process";
 import { filterCollectionFilesBySelection } from "store/collection-panel/collection-panel-files/collection-panel-files-state";
 
 export const contextMenuActions = unionize({
@@ -69,6 +70,7 @@ export const openContextMenu = (event: React.MouseEvent<HTMLElement>, resource:
 
 export const openCollectionFilesContextMenu =
     (event: React.MouseEvent<HTMLElement>, isWritable: boolean) => (dispatch: Dispatch, getState: () => RootState) => {
+        const isCollectionFileSelected = JSON.stringify(getState().collectionPanelFiles).includes('"selected":true');
         const selectedCount = filterCollectionFilesBySelection(getState().collectionPanelFiles, true).length;
         const multiple = selectedCount > 1;
         dispatch<any>(
@@ -220,6 +222,25 @@ export const openProcessContextMenu = (event: React.MouseEvent<HTMLElement>, pro
     }
 };
 
+export const openRunningProcessContextMenu =
+    (event: React.MouseEvent<HTMLElement>, process: Process) => (dispatch: Dispatch, getState: () => RootState) => {
+        const res = getResource<ProcessResource>(process.containerRequest.uuid)(getState().resources);
+        if (res) {
+            dispatch<any>(
+                openContextMenu(event, {
+                    uuid: res.uuid,
+                    ownerUuid: res.ownerUuid,
+                    kind: ResourceKind.PROCESS,
+                    name: res.name,
+                    description: res.description,
+                    outputUuid: res.outputUuid || "",
+                    workflowUuid: res.properties.template_uuid || "",
+                    menuKind: ContextMenuKind.RUNNING_PROCESS_RESOURCE,
+                })
+            );
+        }
+    };
+
 export const openPermissionEditContextMenu =
     (event: React.MouseEvent<HTMLElement>, link: LinkResource) => (dispatch: Dispatch, getState: () => RootState) => {
         if (link) {
@@ -289,9 +310,13 @@ export const resourceUuidToContextMenuKind =
                     : ContextMenuKind.READONLY_COLLECTION;
             case ResourceKind.PROCESS:
                 return isAdminUser && isEditable
-                    ? ContextMenuKind.PROCESS_ADMIN
+                    ? resource && isProcessCancelable(getProcess(resource.uuid)(getState().resources) as Process)
+                        ? ContextMenuKind.RUNNING_PROCESS_ADMIN
+                        : ContextMenuKind.PROCESS_ADMIN
                     : readonly
                     ? ContextMenuKind.READONLY_PROCESS_RESOURCE
+                    : resource && isProcessCancelable(getProcess(resource.uuid)(getState().resources) as Process)
+                    ? ContextMenuKind.RUNNING_PROCESS_RESOURCE
                     : ContextMenuKind.PROCESS_RESOURCE;
             case ResourceKind.USER:
                 return ContextMenuKind.ROOT_PROJECT;