21357: favorites displays correct names Arvados-DCO-1.1-Signed-off-by: Lisa Knox...
authorLisa Knox <lisaknox83@gmail.com>
Thu, 29 Feb 2024 18:58:20 +0000 (13:58 -0500)
committerLisa Knox <lisaknox83@gmail.com>
Thu, 29 Feb 2024 18:58:20 +0000 (13:58 -0500)
services/workbench2/src/common/link-update-name.ts [new file with mode: 0644]
services/workbench2/src/store/side-panel-tree/side-panel-tree-actions.ts
services/workbench2/src/views-components/tree-picker/tree-picker.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 (file)
index 0000000..c2e00e1
--- /dev/null
@@ -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<string> => {
+  //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;
+}
index 3fad5f587a3c41586784987d4925ae01a39d2134..5b85d8c6dc4995b02c85be9445f703870b9b4aa4 100644 (file)
@@ -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({
index a6fdfefec9d21d013f72a6e87ffe3ecbc6ca83fe..1b6d2a26fd0dff5dbbeb2d7442c83c9af945419a 100644 (file)
@@ -70,7 +70,7 @@ const treePickerToTreeItems = (tree: Ttree<any>, 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,