X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/cb73538f0851cea402a0544861966c2515a24b5b..2c736f0babb3862b4d77210e3340473a1cf42082:/services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts diff --git a/services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts b/services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts index 44dfe86938..d900c77abb 100644 --- a/services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts +++ b/services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts @@ -16,7 +16,8 @@ import { OrderBuilder } from 'services/api/order-builder'; import { ResourceKind } from 'models/resource'; import { CategoriesListReducer } from 'common/plugintypes'; import { pluginConfig } from 'plugins'; -import { LinkClass } from 'models/link'; +import { LinkClass, LinkResource } from 'models/link'; +import { verifyAndUpdateLinks } from 'common/link-update-name'; export enum SidePanelTreeCategory { PROJECTS = 'Home Projects', @@ -24,6 +25,7 @@ export enum SidePanelTreeCategory { PUBLIC_FAVORITES = 'Public Favorites', SHARED_WITH_ME = 'Shared with me', ALL_PROCESSES = 'All Processes', + INSTANCE_TYPES = 'Instance Types', SHELL_ACCESS = 'Shell Access', GROUPS = 'Groups', TRASH = 'Trash', @@ -53,6 +55,7 @@ let SIDE_PANEL_CATEGORIES: string[] = [ SidePanelTreeCategory.PUBLIC_FAVORITES, SidePanelTreeCategory.SHARED_WITH_ME, SidePanelTreeCategory.ALL_PROCESSES, + SidePanelTreeCategory.INSTANCE_TYPES, SidePanelTreeCategory.SHELL_ACCESS, SidePanelTreeCategory.GROUPS, SidePanelTreeCategory.TRASH @@ -98,9 +101,12 @@ export const loadSidePanelTreeProjects = (projectUuid: string) => const treePicker = getTreePicker(SIDE_PANEL_TREE)(getState().treePicker); const node = treePicker ? getNode(projectUuid)(treePicker) : undefined; if (projectUuid === SidePanelTreeCategory.PUBLIC_FAVORITES) { - await dispatch(loadPublicFavoritesTree()); + const unverifiedPubFaves = await dispatch(loadPublicFavoritesTree()); + verifyAndUpdateLinkNames(unverifiedPubFaves, dispatch, getState, services); } else if (projectUuid === SidePanelTreeCategory.FAVORITES) { - await dispatch(loadFavoritesTree()); + const unverifiedFaves = await dispatch(loadFavoritesTree()); + await setFaves(unverifiedFaves, dispatch, getState, services); + verifyAndUpdateLinkNames(unverifiedFaves, dispatch, getState, services); } else if (node || projectUuid !== '') { await dispatch(loadProject(projectUuid)); } @@ -120,7 +126,7 @@ const loadProject = (projectUuid: string) => }; const { items } = await services.projectService.list(params); - + dispatch(treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ id: projectUuid, pickerId: SIDE_PANEL_TREE, @@ -148,11 +154,50 @@ export const loadFavoritesTree = () => async (dispatch: Dispatch, getState: () = treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ id: SidePanelTreeCategory.FAVORITES, pickerId: SIDE_PANEL_TREE, - nodes: items.map(item => initTreeNode({ id: item.headUuid, value: item })), + nodes: items.map(item => initTreeNode({ id: item.headUuid, value: item.name })), }) ); - dispatch(resourcesActions.SET_RESOURCES(items)); + return items; +}; + +const setFaves = async(links: LinkResource[], dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + + const uuids = links.map(it => it.headUuid); + const groupItems: Promise = services.groupsService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .getFilters() + }); + const collectionItems: Promise = services.collectionService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .getFilters() + }); + const processItems: Promise = services.containerRequestService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .getFilters() + }); + + const resolvedItems = await Promise.all([groupItems, collectionItems, processItems]); + + const responseItems = resolvedItems.reduce((acc, response) => acc.concat(response.items), []); + + //setting resources here so they won't be re-fetched in validation step + dispatch(resourcesActions.SET_RESOURCES(responseItems)); +}; + +const verifyAndUpdateLinkNames = async (links: LinkResource[], dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const verfifiedLinks = await verifyAndUpdateLinks(links, dispatch, getState, services); + + dispatch( + treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ + id: SidePanelTreeCategory.FAVORITES, + pickerId: SIDE_PANEL_TREE, + nodes: verfifiedLinks.map(item => initTreeNode({ id: item.headUuid, value: item })), + }) + ); }; export const loadPublicFavoritesTree = () => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { @@ -174,15 +219,44 @@ export const loadPublicFavoritesTree = () => async (dispatch: Dispatch, getState const { items } = await services.linkService.list(params); + const uuids = items.map(it => it.headUuid); + const groupItems: Promise = services.groupsService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .addIsA("uuid", typeFilters) + .getFilters() + }); + const collectionItems: Promise = services.collectionService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .addIsA("uuid", typeFilters) + .getFilters() + }); + const processItems: Promise = services.containerRequestService.list({ + filters: new FilterBuilder() + .addIn("uuid", uuids) + .addIsA("uuid", typeFilters) + .getFilters() + }); + + const resolvedItems = await Promise.all([groupItems, collectionItems, processItems]); + + const responseItems = resolvedItems.reduce((acc, response) => acc.concat(response.items), []); + + const filteredItems = items.filter(item => responseItems.some(responseItem => responseItem.uuid === item.headUuid)); + dispatch( treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ id: SidePanelTreeCategory.PUBLIC_FAVORITES, pickerId: SIDE_PANEL_TREE, - nodes: items.map(item => initTreeNode({ id: item.headUuid, value: item })), + nodes: filteredItems.map(item => initTreeNode({ id: item.headUuid, value: item })), }) ); - dispatch(resourcesActions.SET_RESOURCES(items)); + //setting resources here so they won't be re-fetched in validation step + dispatch(resourcesActions.SET_RESOURCES(responseItems)); + + return filteredItems; }; export const activateSidePanelTreeItem = (id: string) =>