X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/31d87f7d0812a2da0c74340c196a4f0b4a9f6b12..25216cc7acedc987c26a159f0b640210c0ef101e:/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 876cb95108..da560e1ecd 100644 --- a/src/store/context-menu/context-menu-actions.ts +++ b/src/store/context-menu/context-menu-actions.ts @@ -2,25 +2,24 @@ // // 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 { 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 { getProjectPanelCurrentUuid } from '~/store/project-panel/project-panel-action'; +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'; export const contextMenuActions = unionize({ OPEN_CONTEXT_MENU: ofType<{ position: ContextMenuPosition, resource: ContextMenuResource }>(), @@ -35,7 +34,7 @@ export type ContextMenuResource = { ownerUuid: string; description?: string; kind: ResourceKind, - menuKind: ContextMenuKind; + menuKind: ContextMenuKind | string; isTrashed?: boolean; isEditable?: boolean; outputUuid?: string; @@ -168,7 +167,7 @@ export const openProjectContextMenu = (event: React.MouseEvent, res kind: res.kind, menuKind, ownerUuid: res.ownerUuid, - isTrashed: ('isTrashed' in res) ? res.isTrashed: false, + isTrashed: ('isTrashed' in res) ? res.isTrashed : false, })); } }; @@ -202,32 +201,23 @@ export const openProcessContextMenu = (event: React.MouseEvent, pro } }; -export const resourceUuidToContextMenuKind = (uuid: string) => +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); - // When viewing the contents of a filter group, all contents should be treated as read only. - let inFilterGroup = false; - const projectUuid = getProjectPanelCurrentUuid(getState()); - if (projectUuid !== undefined) { - const project = getResource(projectUuid)(getState().resources); - if (project) { - if (project.groupClass === GroupClass.FILTER) { - inFilterGroup = true; - } - } - } - const isEditable = (isAdminUser || (resource || {} as EditableResource).isEditable) && !inFilterGroup; + const isEditable = (isAdminUser || (resource || {} as EditableResource).isEditable) && !readonly; switch (kind) { case ResourceKind.PROJECT: - return (isAdminUser && !inFilterGroup) - ? (resource && resource.groupClass === GroupClass.PROJECT) + return (isAdminUser && !readonly) + ? (resource && resource.groupClass !== GroupClass.FILTER) ? ContextMenuKind.PROJECT_ADMIN - : ContextMenuKind.READONLY_PROJECT + : ContextMenuKind.FILTER_GROUP_ADMIN : isEditable - ? ContextMenuKind.PROJECT + ? (resource && resource.groupClass !== GroupClass.FILTER) + ? ContextMenuKind.PROJECT + : ContextMenuKind.FILTER_GROUP : ContextMenuKind.READONLY_PROJECT; case ResourceKind.COLLECTION: const c = getResource(uuid)(getState().resources); @@ -238,17 +228,17 @@ export const resourceUuidToContextMenuKind = (uuid: string) => ? ContextMenuKind.OLD_VERSION_COLLECTION : (isTrashed && isEditable) ? ContextMenuKind.TRASHED_COLLECTION - : (isAdminUser && !inFilterGroup) + : (isAdminUser && !readonly) ? ContextMenuKind.COLLECTION_ADMIN : isEditable ? ContextMenuKind.COLLECTION : ContextMenuKind.READONLY_COLLECTION; case ResourceKind.PROCESS: - return (isAdminUser && !inFilterGroup) + return (isAdminUser && !readonly) ? ContextMenuKind.PROCESS_ADMIN - : isEditable - ? ContextMenuKind.PROCESS_RESOURCE - : ContextMenuKind.READONLY_PROCESS_RESOURCE; + : readonly + ? ContextMenuKind.READONLY_PROCESS_RESOURCE + : ContextMenuKind.PROCESS_RESOURCE; case ResourceKind.USER: return ContextMenuKind.ROOT_PROJECT; case ResourceKind.LINK: