X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/dee0cb67a02c25f0f3174681579d0898d880caa3..9555a2020771863c2e4f6b8802bd6850efb37713:/src/store/tree-picker/tree-picker-actions.ts diff --git a/src/store/tree-picker/tree-picker-actions.ts b/src/store/tree-picker/tree-picker-actions.ts index 1ec49141e3..5d12b419eb 100644 --- a/src/store/tree-picker/tree-picker-actions.ts +++ b/src/store/tree-picker/tree-picker-actions.ts @@ -7,6 +7,7 @@ import { TreeNode, initTreeNode, getNodeDescendants, TreeNodeStatus, getNode, Tr import { createCollectionFilesTree } from "~/models/collection-file"; import { Dispatch } from 'redux'; import { RootState } from '~/store/store'; +import { getUserUuid } from "~/common/getuser"; import { ServiceRepository } from '~/services/services'; import { FilterBuilder } from '~/services/api/filter-builder'; import { pipe, values } from 'lodash/fp'; @@ -20,6 +21,7 @@ import { mapTree } from '../../models/tree'; import { LinkResource, LinkClass } from "~/models/link"; import { mapTreeValues } from "~/models/tree"; import { sortFilesTree } from "~/services/collection-service/collection-service-files-response"; +import { GroupClass, GroupResource } from "~/models/group"; export const treePickerActions = unionize({ LOAD_TREE_PICKER_NODE: ofType<{ id: string, pickerId: string }>(), @@ -99,11 +101,12 @@ interface LoadProjectParams { pickerId: string; includeCollections?: boolean; includeFiles?: boolean; + includeFilterGroups?: boolean; loadShared?: boolean; } export const loadProject = (params: LoadProjectParams) => async (dispatch: Dispatch, _: () => RootState, services: ServiceRepository) => { - const { id, pickerId, includeCollections = false, includeFiles = false, loadShared = false } = params; + const { id, pickerId, includeCollections = false, includeFiles = false, includeFilterGroups = false, loadShared = false } = params; dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id, pickerId })); @@ -119,7 +122,12 @@ export const loadProject = (params: LoadProjectParams) => dispatch(receiveTreePickerData({ id, pickerId, - data: items, + data: items.filter((item) => { + if (!includeFilterGroups && (item as GroupResource).groupClass && (item as GroupResource).groupClass === GroupClass.FILTER) { + return false; + } + return true; + }), extractNodeData: item => ({ id: item.uuid, value: item, @@ -162,7 +170,7 @@ export const loadCollection = (id: string, pickerId: string) => export const initUserProject = (pickerId: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const uuid = services.authService.getUuid(); + const uuid = getUserUuid(getState()); if (uuid) { dispatch(receiveTreePickerData({ id: '', @@ -178,7 +186,7 @@ export const initUserProject = (pickerId: string) => }; export const loadUserProject = (pickerId: string, includeCollections = false, includeFiles = false) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const uuid = services.authService.getUuid(); + const uuid = getUserUuid(getState()); if (uuid) { dispatch(loadProject({ id: uuid, pickerId, includeCollections, includeFiles })); } @@ -235,25 +243,31 @@ interface LoadFavoritesProjectParams { includeFiles?: boolean; } -export const loadFavoritesProject = (params: LoadFavoritesProjectParams) => +export const loadFavoritesProject = (params: LoadFavoritesProjectParams, + options: { showOnlyOwned: boolean, showOnlyWritable: boolean } = { showOnlyOwned: true, showOnlyWritable: false }) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { const { pickerId, includeCollections = false, includeFiles = false } = params; - const uuid = services.authService.getUuid(); + const uuid = getUserUuid(getState()); if (uuid) { - const filters = pipe( (fb: FilterBuilder) => includeCollections - ? fb.addIsA('headUuid', [ResourceKind.PROJECT, ResourceKind.COLLECTION]) - : fb.addIsA('headUuid', [ResourceKind.PROJECT]), + ? fb.addIsA('head_uuid', [ResourceKind.PROJECT, ResourceKind.COLLECTION]) + : fb.addIsA('head_uuid', [ResourceKind.PROJECT]), fb => fb.getFilters(), )(new FilterBuilder()); - const { items } = await services.favoriteService.list(uuid, { filters }); + const { items } = await services.favoriteService.list(uuid, { filters }, options.showOnlyOwned); dispatch(receiveTreePickerData({ id: 'Favorites', pickerId, - data: items, + data: items.filter((item) => { + if (options.showOnlyWritable && (item as GroupResource).writableBy && (item as GroupResource).writableBy.indexOf(uuid) === -1) { + return false; + } + + return true; + }), extractNodeData: item => ({ id: item.uuid, value: item, @@ -270,38 +284,35 @@ export const loadFavoritesProject = (params: LoadFavoritesProjectParams) => export const loadPublicFavoritesProject = (params: LoadFavoritesProjectParams) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { const { pickerId, includeCollections = false, includeFiles = false } = params; - const uuidPrefix = getState().config.uuidPrefix; - const uuid = `${uuidPrefix}-j7d0g-fffffffffffffff`; - if (uuid) { + const uuidPrefix = getState().auth.config.uuidPrefix; + const publicProjectUuid = `${uuidPrefix}-j7d0g-publicfavorites`; - const filters = pipe( - (fb: FilterBuilder) => includeCollections - ? fb.addIsA('headUuid', [ResourceKind.PROJECT, ResourceKind.COLLECTION]) - : fb.addIsA('headUuid', [ResourceKind.PROJECT]), - fb => fb - .addEqual('linkClass', LinkClass.STAR) - .addEqual('ownerUuid', uuid) - .addLike('name', '') - .getFilters(), - )(new FilterBuilder()); + const filters = pipe( + (fb: FilterBuilder) => includeCollections + ? fb.addIsA('head_uuid', [ResourceKind.PROJECT, ResourceKind.COLLECTION]) + : fb.addIsA('head_uuid', [ResourceKind.PROJECT]), + fb => fb + .addEqual('link_class', LinkClass.STAR) + .addEqual('owner_uuid', publicProjectUuid) + .getFilters(), + )(new FilterBuilder()); - const { items } = await services.linkService.list({ filters }); + const { items } = await services.linkService.list({ filters }); - dispatch(receiveTreePickerData({ - id: 'Public Favorites', - pickerId, - data: items, - extractNodeData: item => ({ - id: item.headUuid, - value: item, - status: item.headKind === ResourceKind.PROJECT + dispatch(receiveTreePickerData({ + id: 'Public Favorites', + pickerId, + data: items, + extractNodeData: item => ({ + id: item.headUuid, + value: item, + status: item.headKind === ResourceKind.PROJECT + ? TreeNodeStatus.INITIAL + : includeFiles ? TreeNodeStatus.INITIAL - : includeFiles - ? TreeNodeStatus.INITIAL - : TreeNodeStatus.LOADED - }), - })); - } + : TreeNodeStatus.LOADED + }), + })); }; export const receiveTreePickerProjectsData = (id: string, projects: ProjectResource[], pickerId: string) => @@ -319,7 +330,8 @@ export const loadProjectTreePickerProjects = (id: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id, pickerId: TreePickerId.PROJECTS })); - const ownerUuid = id.length === 0 ? services.authService.getUuid() || '' : id; + + const ownerUuid = id.length === 0 ? getUserUuid(getState()) || '' : id; const { items } = await services.projectService.list(buildParams(ownerUuid)); dispatch(receiveTreePickerProjectsData(id, items, TreePickerId.PROJECTS)); @@ -327,7 +339,7 @@ export const loadProjectTreePickerProjects = (id: string) => export const loadFavoriteTreePickerProjects = (id: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const parentId = services.authService.getUuid() || ''; + const parentId = getUserUuid(getState()) || ''; if (id === '') { dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id: parentId, pickerId: TreePickerId.FAVORITES })); @@ -343,7 +355,7 @@ export const loadFavoriteTreePickerProjects = (id: string) => export const loadPublicFavoriteTreePickerProjects = (id: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const parentId = services.authService.getUuid() || ''; + const parentId = getUserUuid(getState()) || ''; if (id === '') { dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id: parentId, pickerId: TreePickerId.PUBLIC_FAVORITES })); @@ -360,10 +372,10 @@ export const loadPublicFavoriteTreePickerProjects = (id: string) => const buildParams = (ownerUuid: string) => { return { filters: new FilterBuilder() - .addEqual('ownerUuid', ownerUuid) + .addEqual('owner_uuid', ownerUuid) .getFilters(), order: new OrderBuilder() .addAsc('name') .getOrder() }; -}; \ No newline at end of file +};