19231: Add smaller page sizes (10 and 20 items) to load faster
[arvados-workbench2.git] / src / store / resources / resources.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { Resource, EditableResource } from "models/resource";
6 import { ResourceKind } from 'models/resource';
7 import { ProjectResource } from "models/project";
8 import { GroupResource } from "models/group";
9
10 export type ResourcesState = { [key: string]: Resource };
11
12 const getResourceWritableBy = (state: ResourcesState, id: string, userUuid: string): string[] => {
13     if (!id) {
14         return [];
15     }
16
17     if (id === userUuid) {
18         return [userUuid];
19     }
20
21     const resource = (state[id] as ProjectResource);
22
23     if (!resource) {
24         return [];
25     }
26
27     const { writableBy } = resource;
28
29     return writableBy || getResourceWritableBy(state, resource.ownerUuid, userUuid);
30 };
31
32 export const getResourceWithEditableStatus = <T extends EditableResource & GroupResource>(id: string, userUuid?: string) =>
33     (state: ResourcesState): T | undefined => {
34         if (state[id] === undefined) { return; }
35
36         const resource = JSON.parse(JSON.stringify(state[id] as T));
37
38         if (resource) {
39             resource.isEditable = userUuid ? getResourceWritableBy(state, id, userUuid).indexOf(userUuid) > -1 : false;
40         }
41
42         return resource;
43     };
44
45 export const getResource = <T extends Resource = Resource>(id: string) =>
46     (state: ResourcesState): T | undefined =>
47         state[id] as T;
48
49 export const setResource = <T extends Resource>(id: string, data: T) =>
50     (state: ResourcesState) => ({
51         ...state,
52         [id]: data
53     });
54
55 export const deleteResource = (id: string) =>
56     (state: ResourcesState) => {
57         const newState = { ...state };
58         delete newState[id];
59         return newState;
60     };
61
62 export const filterResources = (filter: (resource: Resource) => boolean) =>
63     (state: ResourcesState) =>
64         Object
65             .keys(state)
66             .reduce((resources, id) => {
67                 const resource = getResource(id)(state);
68                 return resource
69                     ? [...resources, resource]
70                     : resources;
71             }, [])
72             .filter(filter);
73
74 export const filterResourcesByKind = (kind: ResourceKind) =>
75     (state: ResourcesState) =>
76         filterResources(resource => resource.kind === kind)(state);