From 78de3b9c008dbab08408797ed783a28e27f8aecb Mon Sep 17 00:00:00 2001 From: Lisa Knox Date: Thu, 29 Feb 2024 13:58:20 -0500 Subject: [PATCH] 21357: favorites displays correct names Arvados-DCO-1.1-Signed-off-by: Lisa Knox --- .../workbench2/src/common/link-update-name.ts | 55 +++++++++++++++++++ .../side-panel-tree-actions.ts | 13 ++++- .../tree-picker/tree-picker.ts | 2 +- 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 services/workbench2/src/common/link-update-name.ts diff --git a/services/workbench2/src/common/link-update-name.ts b/services/workbench2/src/common/link-update-name.ts new file mode 100644 index 0000000000..c2e00e1d0b --- /dev/null +++ b/services/workbench2/src/common/link-update-name.ts @@ -0,0 +1,55 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import { LinkResource } from 'models/link'; +import { Dispatch } from 'redux'; +import { RootState } from 'store/store'; +import { ServiceRepository } from 'services/services'; +import { getResourceService } from 'services/services'; +import { Resource, extractUuidKind } from 'models/resource'; + +type NameableResource = Resource & { name?: string }; + +export const verifyAndUpdateLinkName = async (link: LinkResource, dispatch: Dispatch, getState: () => RootState, services: ServiceRepository):Promise => { + //check if head resource is already in the store + let headResource: Resource | undefined = getState().resources[link.headUuid]; + if (!headResource) { + headResource = await fetchResource(link.headUuid)(dispatch, getState, services); + if(!headResource) { + console.error('Could not verify link', link); + return link.name; + } + } + + if (validateLinkNameProp(link, headResource) === true) return link.name; + + const updatedLink = updateLinkNameProp(link, headResource); + + return updatedLink.name; +}; + +const fetchResource = (uuid: string, showErrors?: boolean) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + try { + const kind = extractUuidKind(uuid); + const service = getResourceService(kind)(services); + if (service) { + const resource = await service.get(uuid, showErrors); + return resource; + } + } catch(e) { + console.error(e); + } + return undefined; +}; + +const validateLinkNameProp = (link: LinkResource, head: NameableResource) => { + if(!link.name || link.name !== head.name) return false; + return true; +}; + +const updateLinkNameProp = (link: LinkResource, head: NameableResource) => { + const updatedLink = {...link}; + if(head.name) updatedLink.name = head.name; + return updatedLink; +} 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 3fad5f587a..5b85d8c6dc 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 @@ -17,6 +17,7 @@ import { ResourceKind } from 'models/resource'; import { CategoriesListReducer } from 'common/plugintypes'; import { pluginConfig } from 'plugins'; import { LinkClass } from 'models/link'; +import { verifyAndUpdateLinkName } from 'common/link-update-name'; export enum SidePanelTreeCategory { PROJECTS = 'Home Projects', @@ -144,7 +145,11 @@ export const loadFavoritesTree = () => async (dispatch: Dispatch, getState: () = limit: SIDEPANEL_TREE_NODE_LIMIT, }; - const { items } = await services.linkService.list(params); + let items = (await services.linkService.list(params)).items; + for(let item of items) { + const verifiedName = await verifyAndUpdateLinkName(item, dispatch, getState, services); + item.name = verifiedName; + } dispatch( treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ @@ -174,7 +179,11 @@ export const loadPublicFavoritesTree = () => async (dispatch: Dispatch, getState limit: SIDEPANEL_TREE_NODE_LIMIT, }; - const { items } = await services.linkService.list(params); + let items = (await services.linkService.list(params)).items; + for(let item of items) { + const verifiedName = await verifyAndUpdateLinkName(item, dispatch, getState, services); + item.name = verifiedName; + } dispatch( treePickerActions.LOAD_TREE_PICKER_NODE_SUCCESS({ diff --git a/services/workbench2/src/views-components/tree-picker/tree-picker.ts b/services/workbench2/src/views-components/tree-picker/tree-picker.ts index a6fdfefec9..1b6d2a26fd 100644 --- a/services/workbench2/src/views-components/tree-picker/tree-picker.ts +++ b/services/workbench2/src/views-components/tree-picker/tree-picker.ts @@ -70,7 +70,7 @@ const treePickerToTreeItems = (tree: Ttree, resources: ResourcesState) => const resource = resources[node.id]; return { active: node.active, - data: resource ? { ...resource, name: node.value.name || node.value } : undefined || node.value, + data: resource ? { ...resource, name: node.value.name || node.value } : node.value, id: node.id, items: items.length > 0 ? items : undefined, open: node.expanded, -- 2.30.2