X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e4b54c3b5d99c99553e319ead28c3aa8dcd6eecc..33c03ae3c79936cc1a69129f07fba33fe2d28fd8:/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 657d65b7..3fa5187a 100644 --- a/src/store/tree-picker/tree-picker-actions.ts +++ b/src/store/tree-picker/tree-picker-actions.ts @@ -4,8 +4,10 @@ import { unionize, ofType, UnionOf } from "~/common/unionize"; import { TreeNode, initTreeNode, getNodeDescendants, TreeNodeStatus, getNode, TreePickerId, Tree } from '~/models/tree'; +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'; @@ -16,6 +18,9 @@ import { ProjectsTreePickerItem } from '~/views-components/projects-tree-picker/ import { OrderBuilder } from '~/services/api/order-builder'; import { ProjectResource } from '~/models/project'; 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"; export const treePickerActions = unionize({ LOAD_TREE_PICKER_NODE: ofType<{ id: string, pickerId: string }>(), @@ -37,6 +42,7 @@ export const getProjectsTreePickerIds = (pickerId: string) => ({ home: `${pickerId}_home`, shared: `${pickerId}_shared`, favorites: `${pickerId}_favorites`, + publicFavorites: `${pickerId}_publicFavorites` }); export const getAllNodes = (pickerId: string, filter = (node: TreeNode) => true) => (state: TreePicker) => @@ -64,10 +70,11 @@ export const getSelectedNodes = (pickerId: string) => (state: TreePicker) export const initProjectsTreePicker = (pickerId: string) => async (dispatch: Dispatch, _: () => RootState, services: ServiceRepository) => { - const { home, shared, favorites } = getProjectsTreePickerIds(pickerId); + const { home, shared, favorites, publicFavorites } = getProjectsTreePickerIds(pickerId); dispatch(initUserProject(home)); dispatch(initSharedProject(shared)); dispatch(initFavoritesProject(favorites)); + dispatch(initPublicFavoritesProject(publicFavorites)); }; interface ReceiveTreePickerDataParams { @@ -136,7 +143,10 @@ export const loadCollection = (id: string, pickerId: string) => const node = getNode(id)(picker); if (node && 'kind' in node.value && node.value.kind === ResourceKind.COLLECTION) { - const filesTree = await services.collectionService.files(node.value.portableDataHash); + const files = await services.collectionService.files(node.value.portableDataHash); + const tree = createCollectionFilesTree(files); + const sorted = sortFilesTree(tree); + const filesTree = mapTreeValues(services.collectionService.extendFileURL)(sorted); dispatch( treePickerActions.APPEND_TREE_PICKER_NODE_SUBTREE({ @@ -153,7 +163,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: '', @@ -169,7 +179,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 })); } @@ -205,6 +215,21 @@ export const initFavoritesProject = (pickerId: string) => })); }; +export const PUBLIC_FAVORITES_PROJECT_ID = 'Public Favorites'; +export const initPublicFavoritesProject = (pickerId: string) => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + dispatch(receiveTreePickerData({ + id: '', + pickerId, + data: [{ uuid: PUBLIC_FAVORITES_PROJECT_ID, name: PUBLIC_FAVORITES_PROJECT_ID }], + extractNodeData: value => ({ + id: value.uuid, + status: TreeNodeStatus.INITIAL, + value, + }), + })); + }; + interface LoadFavoritesProjectParams { pickerId: string; includeCollections?: boolean; @@ -214,13 +239,12 @@ interface LoadFavoritesProjectParams { export const loadFavoritesProject = (params: LoadFavoritesProjectParams) => 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()); @@ -243,6 +267,40 @@ 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().auth.config.uuidPrefix; + const publicProjectUuid = `${uuidPrefix}-j7d0g-publicfavorites`; + + 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 }); + + 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 + : TreeNodeStatus.LOADED + }), + })); + }; + export const receiveTreePickerProjectsData = (id: string, projects: ProjectResource[], pickerId: string) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { dispatch(treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ @@ -258,7 +316,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)); @@ -266,7 +325,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 })); @@ -280,13 +339,29 @@ export const loadFavoriteTreePickerProjects = (id: string) => }; +export const loadPublicFavoriteTreePickerProjects = (id: string) => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const parentId = getUserUuid(getState()) || ''; + + if (id === '') { + dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id: parentId, pickerId: TreePickerId.PUBLIC_FAVORITES })); + const { items } = await services.favoriteService.list(parentId); + dispatch(receiveTreePickerProjectsData(parentId, items as ProjectResource[], TreePickerId.PUBLIC_FAVORITES)); + } else { + dispatch(treePickerActions.LOAD_TREE_PICKER_NODE({ id, pickerId: TreePickerId.PUBLIC_FAVORITES })); + const { items } = await services.projectService.list(buildParams(id)); + dispatch(receiveTreePickerProjectsData(id, items, TreePickerId.PUBLIC_FAVORITES)); + } + + }; + 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 +};