X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/59329caeae17903b97b90b167df5a8122a0c9d95..7776b799eed223b9318443c1e319e01957a8fb45:/src/store/context-menu/context-menu-actions.ts diff --git a/src/store/context-menu/context-menu-actions.ts b/src/store/context-menu/context-menu-actions.ts index e9b08a84..308d5e88 100644 --- a/src/store/context-menu/context-menu-actions.ts +++ b/src/store/context-menu/context-menu-actions.ts @@ -7,18 +7,17 @@ import { ContextMenuPosition } from "./context-menu-reducer"; import { ContextMenuKind } from '~/views-components/context-menu/context-menu'; import { Dispatch } from 'redux'; import { RootState } from '~/store/store'; -import { getResource } from '../resources/resources'; +import { getResource, getResourceWithEditableStatus } from '../resources/resources'; import { ProjectResource } from '~/models/project'; import { UserResource } from '~/models/user'; import { isSidePanelTreeCategory } from '~/store/side-panel-tree/side-panel-tree-actions'; -import { extractUuidKind, ResourceKind } from '~/models/resource'; +import { extractUuidKind, ResourceKind, EditableResource } from '~/models/resource'; import { Process } from '~/store/processes/process'; import { RepositoryResource } from '~/models/repositories'; import { SshKeyResource } from '~/models/ssh-key'; import { VirtualMachinesResource } from '~/models/virtual-machines'; import { KeepServiceResource } from '~/models/keep-services'; -import { NodeResource } from '~/models/node'; -import { ApiClientAuthorization } from '~/models/api-client-authorization'; +import { ProcessResource } from '~/models/process'; export const contextMenuActions = unionize({ OPEN_CONTEXT_MENU: ofType<{ position: ContextMenuPosition, resource: ContextMenuResource }>(), @@ -35,7 +34,9 @@ export type ContextMenuResource = { kind: ResourceKind, menuKind: ContextMenuKind; isTrashed?: boolean; - index?: number + isEditable?: boolean; + outputUuid?: string; + workflowUuid?: string; }; export const isKeyboardClick = (event: React.MouseEvent) => event.nativeEvent.detail === 0; @@ -55,7 +56,7 @@ export const openContextMenu = (event: React.MouseEvent, resource: ); }; -export const openCollectionFilesContextMenu = (event: React.MouseEvent) => +export const openCollectionFilesContextMenu = (event: React.MouseEvent, isWritable: boolean) => (dispatch: Dispatch, getState: () => RootState) => { const isCollectionFileSelected = JSON.stringify(getState().collectionPanelFiles).includes('"selected":true'); dispatch(openContextMenu(event, { @@ -63,7 +64,11 @@ export const openCollectionFilesContextMenu = (event: React.MouseEvent, })); }; -export const openComputeNodeContextMenu = (event: React.MouseEvent, computeNode: NodeResource) => +export const openComputeNodeContextMenu = (event: React.MouseEvent, resourceUuid: string) => (dispatch: Dispatch) => { dispatch(openContextMenu(event, { name: '', - uuid: computeNode.uuid, - ownerUuid: computeNode.ownerUuid, + uuid: resourceUuid, + ownerUuid: '', kind: ResourceKind.NODE, menuKind: ContextMenuKind.NODE })); }; -export const openApiClientAuthorizationContextMenu = - (event: React.MouseEvent, apiClientAuthorization: ApiClientAuthorization) => +export const openApiClientAuthorizationContextMenu = + (event: React.MouseEvent, resourceUuid: string) => (dispatch: Dispatch) => { dispatch(openContextMenu(event, { name: '', - uuid: apiClientAuthorization.uuid, - ownerUuid: apiClientAuthorization.ownerUuid, + uuid: resourceUuid, + ownerUuid: '', kind: ResourceKind.API_CLIENT_AUTHORIZATION, menuKind: ContextMenuKind.API_CLIENT_AUTHORIZATION })); @@ -149,15 +154,17 @@ export const openRootProjectContextMenu = (event: React.MouseEvent, } }; -export const openProjectContextMenu = (event: React.MouseEvent, projectUuid: string) => +export const openProjectContextMenu = (event: React.MouseEvent, resourceUuid: string) => (dispatch: Dispatch, getState: () => RootState) => { - const res = getResource(projectUuid)(getState().resources); - if (res) { + const { isAdmin, uuid: userUuid } = getState().auth.user!; + const res = getResourceWithEditableStatus(resourceUuid, userUuid)(getState().resources); + const menuKind = resourceKindToContextMenuKind(resourceUuid, isAdmin, (res || {} as EditableResource).isEditable); + if (res && menuKind) { dispatch(openContextMenu(event, { name: res.name, uuid: res.uuid, kind: res.kind, - menuKind: ContextMenuKind.PROJECT, + menuKind, ownerUuid: res.ownerUuid, isTrashed: res.isTrashed })); @@ -178,26 +185,40 @@ export const openSidePanelContextMenu = (event: React.MouseEvent, i export const openProcessContextMenu = (event: React.MouseEvent, process: Process) => (dispatch: Dispatch, getState: () => RootState) => { - const resource = { - uuid: process.containerRequest.uuid, - ownerUuid: process.containerRequest.ownerUuid, - kind: ResourceKind.PROCESS, - name: process.containerRequest.name, - description: process.containerRequest.description, - menuKind: ContextMenuKind.PROCESS - }; - dispatch(openContextMenu(event, resource)); + const res = getResource(process.containerRequest.uuid)(getState().resources); + if (res) { + dispatch(openContextMenu(event, { + uuid: res.uuid, + ownerUuid: res.ownerUuid, + kind: ResourceKind.PROCESS, + name: res.name, + description: res.description, + outputUuid: res.outputUuid || '', + workflowUuid: res.properties.workflowUuid || '', + menuKind: ContextMenuKind.PROCESS + })); + } }; -export const resourceKindToContextMenuKind = (uuid: string) => { +export const resourceKindToContextMenuKind = (uuid: string, isAdmin?: boolean, isEditable?: boolean) => { const kind = extractUuidKind(uuid); switch (kind) { case ResourceKind.PROJECT: - return ContextMenuKind.PROJECT; + return !isAdmin + ? isEditable + ? ContextMenuKind.PROJECT + : ContextMenuKind.READONLY_PROJECT + : ContextMenuKind.PROJECT_ADMIN; case ResourceKind.COLLECTION: - return ContextMenuKind.COLLECTION_RESOURCE; + return !isAdmin + ? isEditable + ? ContextMenuKind.COLLECTION + : ContextMenuKind.READONLY_COLLECTION + : ContextMenuKind.COLLECTION_ADMIN; case ResourceKind.PROCESS: - return ContextMenuKind.PROCESS_RESOURCE; + return !isAdmin + ? ContextMenuKind.PROCESS_RESOURCE + : ContextMenuKind.PROCESS_ADMIN; case ResourceKind.USER: return ContextMenuKind.ROOT_PROJECT; case ResourceKind.LINK: