X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/9ee35a64c605f116aec71f78c65b54730d6e1076..bf6ffb898a38a806ea0dd98daca7b3801923b62f:/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 308d5e88..3e239fee 100644 --- a/src/store/context-menu/context-menu-actions.ts +++ b/src/store/context-menu/context-menu-actions.ts @@ -2,22 +2,25 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { unionize, ofType, UnionOf } from '~/common/unionize'; +import { unionize, ofType, UnionOf } from 'common/unionize'; import { ContextMenuPosition } from "./context-menu-reducer"; -import { ContextMenuKind } from '~/views-components/context-menu/context-menu'; +import { ContextMenuKind } from 'views-components/context-menu/context-menu'; import { Dispatch } from 'redux'; -import { RootState } from '~/store/store'; +import { RootState } from 'store/store'; 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, 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 { ProcessResource } from '~/models/process'; +import { UserResource } from 'models/user'; +import { isSidePanelTreeCategory } from 'store/side-panel-tree/side-panel-tree-actions'; +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 { ProcessResource } from 'models/process'; +import { CollectionResource } from 'models/collection'; +import { GroupClass, GroupResource } from 'models/group'; +import { GroupContentsResource } from 'services/groups-service/groups-service'; +import { LinkResource } from 'models/link'; export const contextMenuActions = unionize({ OPEN_CONTEXT_MENU: ofType<{ position: ContextMenuPosition, resource: ContextMenuResource }>(), @@ -32,11 +35,13 @@ export type ContextMenuResource = { ownerUuid: string; description?: string; kind: ResourceKind, - menuKind: ContextMenuKind; + menuKind: ContextMenuKind | string; isTrashed?: boolean; isEditable?: boolean; outputUuid?: string; workflowUuid?: string; + storageClassesDesired?: string[]; + properties?: { [key: string]: string | string[] }; }; export const isKeyboardClick = (event: React.MouseEvent) => event.nativeEvent.detail === 0; @@ -63,6 +68,7 @@ export const openCollectionFilesContextMenu = (event: React.MouseEvent, })); }; -export const openComputeNodeContextMenu = (event: React.MouseEvent, resourceUuid: string) => - (dispatch: Dispatch) => { - dispatch(openContextMenu(event, { - name: '', - uuid: resourceUuid, - ownerUuid: '', - kind: ResourceKind.NODE, - menuKind: ContextMenuKind.NODE - })); - }; - export const openApiClientAuthorizationContextMenu = (event: React.MouseEvent, resourceUuid: string) => (dispatch: Dispatch) => { @@ -156,17 +151,17 @@ export const openRootProjectContextMenu = (event: React.MouseEvent, export const openProjectContextMenu = (event: React.MouseEvent, resourceUuid: string) => (dispatch: Dispatch, getState: () => RootState) => { - const { isAdmin, uuid: userUuid } = getState().auth.user!; - const res = getResourceWithEditableStatus(resourceUuid, userUuid)(getState().resources); - const menuKind = resourceKindToContextMenuKind(resourceUuid, isAdmin, (res || {} as EditableResource).isEditable); + const res = getResource(resourceUuid)(getState().resources); + const menuKind = dispatch(resourceUuidToContextMenuKind(resourceUuid)); if (res && menuKind) { dispatch(openContextMenu(event, { name: res.name, uuid: res.uuid, kind: res.kind, menuKind, + description: res.description, ownerUuid: res.ownerUuid, - isTrashed: res.isTrashed + isTrashed: ('isTrashed' in res) ? res.isTrashed : false, })); } }; @@ -194,36 +189,81 @@ export const openProcessContextMenu = (event: React.MouseEvent, pro name: res.name, description: res.description, outputUuid: res.outputUuid || '', - workflowUuid: res.properties.workflowUuid || '', - menuKind: ContextMenuKind.PROCESS + workflowUuid: res.properties.template_uuid || '', + menuKind: ContextMenuKind.PROCESS_RESOURCE })); } }; -export const resourceKindToContextMenuKind = (uuid: string, isAdmin?: boolean, isEditable?: boolean) => { - const kind = extractUuidKind(uuid); - switch (kind) { - case ResourceKind.PROJECT: - return !isAdmin - ? isEditable - ? ContextMenuKind.PROJECT - : ContextMenuKind.READONLY_PROJECT - : ContextMenuKind.PROJECT_ADMIN; - case ResourceKind.COLLECTION: - return !isAdmin - ? isEditable - ? ContextMenuKind.COLLECTION - : ContextMenuKind.READONLY_COLLECTION - : ContextMenuKind.COLLECTION_ADMIN; - case ResourceKind.PROCESS: - return !isAdmin - ? ContextMenuKind.PROCESS_RESOURCE - : ContextMenuKind.PROCESS_ADMIN; - case ResourceKind.USER: - return ContextMenuKind.ROOT_PROJECT; - case ResourceKind.LINK: - return ContextMenuKind.LINK; - default: - return; - } -}; +export const openPermissionEditContextMenu = (event: React.MouseEvent, link: LinkResource) => + (dispatch: Dispatch, getState: () => RootState) => { + if (link) { + dispatch(openContextMenu(event, { + name: link.name, + uuid: link.uuid, + kind: link.kind, + menuKind: ContextMenuKind.PERMISSION_EDIT, + ownerUuid: link.ownerUuid, + })); + } + }; + +export const openUserContextMenu = (event: React.MouseEvent, user: UserResource) => + (dispatch: Dispatch, getState: () => RootState) => { + dispatch(openContextMenu(event, { + name: '', + uuid: user.uuid, + ownerUuid: user.ownerUuid, + kind: user.kind, + menuKind: ContextMenuKind.USER + })); + }; + +export const resourceUuidToContextMenuKind = (uuid: string, readonly = false) => + (dispatch: Dispatch, getState: () => RootState) => { + const { isAdmin: isAdminUser, uuid: userUuid } = getState().auth.user!; + const kind = extractUuidKind(uuid); + const resource = getResourceWithEditableStatus(uuid, userUuid)(getState().resources); + + const isEditable = (isAdminUser || (resource || {} as EditableResource).isEditable) && !readonly; + switch (kind) { + case ResourceKind.PROJECT: + return (isAdminUser && !readonly) + ? (resource && resource.groupClass !== GroupClass.FILTER) + ? ContextMenuKind.PROJECT_ADMIN + : ContextMenuKind.FILTER_GROUP_ADMIN + : isEditable + ? (resource && resource.groupClass !== GroupClass.FILTER) + ? ContextMenuKind.PROJECT + : ContextMenuKind.FILTER_GROUP + : ContextMenuKind.READONLY_PROJECT; + case ResourceKind.COLLECTION: + const c = getResource(uuid)(getState().resources); + if (c === undefined) { return; } + const isOldVersion = c.uuid !== c.currentVersionUuid; + const isTrashed = c.isTrashed; + return isOldVersion + ? ContextMenuKind.OLD_VERSION_COLLECTION + : (isTrashed && isEditable) + ? ContextMenuKind.TRASHED_COLLECTION + : (isAdminUser && !readonly) + ? ContextMenuKind.COLLECTION_ADMIN + : isEditable + ? ContextMenuKind.COLLECTION + : ContextMenuKind.READONLY_COLLECTION; + case ResourceKind.PROCESS: + return (isAdminUser && !readonly) + ? ContextMenuKind.PROCESS_ADMIN + : readonly + ? ContextMenuKind.READONLY_PROCESS_RESOURCE + : ContextMenuKind.PROCESS_RESOURCE; + case ResourceKind.USER: + return ContextMenuKind.ROOT_PROJECT; + case ResourceKind.LINK: + return ContextMenuKind.LINK; + case ResourceKind.WORKFLOW: + return ContextMenuKind.WORKFLOW; + default: + return; + } + };