X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/5627bf1a83323d2b0364cb069564998eb8c6ca7a..7437e0b4a85480fc6ca977488a5bb501e7fa1e3e:/src/store/resources/resources.ts diff --git a/src/store/resources/resources.ts b/src/store/resources/resources.ts index add4efef..696a1362 100644 --- a/src/store/resources/resources.ts +++ b/src/store/resources/resources.ts @@ -2,11 +2,46 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { Resource } from "~/models/resource"; -import { ResourceKind } from '../../models/resource'; +import { Resource, EditableResource } from "~/models/resource"; +import { ResourceKind } from '~/models/resource'; +import { ProjectResource } from "~/models/project"; +import { GroupResource } from "~/models/group"; export type ResourcesState = { [key: string]: Resource }; +const getResourceWritableBy = (state: ResourcesState, id: string, userUuid: string): string[] => { + if (!id) { + return []; + } + + if (id === userUuid) { + return [userUuid]; + } + + const resource = (state[id] as ProjectResource); + + if (!resource) { + return []; + } + + const { writableBy } = resource; + + return writableBy || getResourceWritableBy(state, resource.ownerUuid, userUuid); +}; + +export const getResourceWithEditableStatus = (id: string, userUuid?: string) => + (state: ResourcesState): T | undefined => { + if (state[id] === undefined) { return; } + + const resource = JSON.parse(JSON.stringify(state[id] as T)); + + if (resource) { + resource.isEditable = userUuid ? getResourceWritableBy(state, id, userUuid).indexOf(userUuid) > -1 : false; + } + + return resource; + }; + export const getResource = (id: string) => (state: ResourcesState): T | undefined => state[id] as T; @@ -19,7 +54,7 @@ export const setResource = (id: string, data: T) => export const deleteResource = (id: string) => (state: ResourcesState) => { - const newState = {...state}; + const newState = { ...state }; delete newState[id]; return newState; }; @@ -28,10 +63,14 @@ export const filterResources = (filter: (resource: Resource) => boolean) => (state: ResourcesState) => Object .keys(state) - .map(id => getResource(id)(state)) + .reduce((resources, id) => { + const resource = getResource(id)(state); + return resource + ? [...resources, resource] + : resources; + }, []) .filter(filter); export const filterResourcesByKind = (kind: ResourceKind) => (state: ResourcesState) => filterResources(resource => resource.kind === kind)(state); -