X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/7437e0b4a85480fc6ca977488a5bb501e7fa1e3e..407d1f609f40e8a7d21cf5846690b63706befaa4:/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 225538859a..f8049a5c53 100644 --- a/src/store/context-menu/context-menu-actions.ts +++ b/src/store/context-menu/context-menu-actions.ts @@ -18,8 +18,11 @@ import { VirtualMachinesResource } from '~/models/virtual-machines'; import { KeepServiceResource } from '~/models/keep-services'; import { ProcessResource } from '~/models/process'; import { CollectionResource } from '~/models/collection'; -import { GroupResource } from '~/models/group'; +import { GroupClass, GroupResource } from '~/models/group'; import { GroupContentsResource } from '~/services/groups-service/groups-service'; +import { getProjectPanelCurrentUuid } from '~/store/project-panel/project-panel-action'; +import { matchProjectRoute } from '~/routes/routes'; +import { RouterState } from "react-router-redux"; export const contextMenuActions = unionize({ OPEN_CONTEXT_MENU: ofType<{ position: ContextMenuPosition, resource: ContextMenuResource }>(), @@ -201,19 +204,39 @@ export const openProcessContextMenu = (event: React.MouseEvent, pro } }; +export const isProjectRoute = (router: RouterState) => { + const pathname = router.location ? router.location.pathname : ''; + const matchProject = matchProjectRoute(pathname); + return Boolean(matchProject); +}; + export const resourceUuidToContextMenuKind = (uuid: string) => (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; + + // When viewing the contents of a filter group, all contents should be treated as read only. + let inFilterGroup = false; + const { router } = getState(); + if (isProjectRoute(router)) { + const projectUuid = getProjectPanelCurrentUuid(getState()); + if (projectUuid !== undefined) { + const project = getResource(projectUuid)(getState().resources); + if (project && project.groupClass === GroupClass.FILTER) { + inFilterGroup = true; + } + } + } + + const isEditable = (isAdminUser || (resource || {} as EditableResource).isEditable) && !inFilterGroup; switch (kind) { case ResourceKind.PROJECT: - return !isAdminUser - ? isEditable + return (isAdminUser && !inFilterGroup) + ? ContextMenuKind.PROJECT_ADMIN + : isEditable ? ContextMenuKind.PROJECT - : ContextMenuKind.READONLY_PROJECT - : ContextMenuKind.PROJECT_ADMIN; + : ContextMenuKind.READONLY_PROJECT; case ResourceKind.COLLECTION: const c = getResource(uuid)(getState().resources); if (c === undefined) { return; } @@ -223,15 +246,17 @@ export const resourceUuidToContextMenuKind = (uuid: string) => ? ContextMenuKind.OLD_VERSION_COLLECTION : (isTrashed && isEditable) ? ContextMenuKind.TRASHED_COLLECTION - : isAdminUser + : (isAdminUser && !inFilterGroup) ? ContextMenuKind.COLLECTION_ADMIN : isEditable ? ContextMenuKind.COLLECTION : ContextMenuKind.READONLY_COLLECTION; case ResourceKind.PROCESS: - return !isAdminUser - ? ContextMenuKind.PROCESS_RESOURCE - : ContextMenuKind.PROCESS_ADMIN; + return (isAdminUser && !inFilterGroup) + ? ContextMenuKind.PROCESS_ADMIN + : inFilterGroup + ? ContextMenuKind.READONLY_PROCESS_RESOURCE + : ContextMenuKind.PROCESS_RESOURCE; case ResourceKind.USER: return ContextMenuKind.ROOT_PROJECT; case ResourceKind.LINK: