From 8c218c9006fd1c6caa75c1f637c4fb79cf14dc0b Mon Sep 17 00:00:00 2001 From: Jonathan Payne Date: Fri, 27 Mar 2026 11:14:44 -0400 Subject: [PATCH] OpenConceptLab/ocl_issues#2149 | Fix hierarchy using HEAD data when viewing source version Hierarchy tree expansion was always fetching children from HEAD because it used item.url directly (which the API returns without version info). Now constructs versioned URLs using the baseURL from the search context. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../search/ConceptHierarchyResultsTable.jsx | 20 ++++++++++++++++--- src/components/search/Search.jsx | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/search/ConceptHierarchyResultsTable.jsx b/src/components/search/ConceptHierarchyResultsTable.jsx index ae0d28df..93c5ccf9 100644 --- a/src/components/search/ConceptHierarchyResultsTable.jsx +++ b/src/components/search/ConceptHierarchyResultsTable.jsx @@ -37,7 +37,18 @@ const getValue = (item, column) => { return value } -const Row = ({ item, columns, isSelected, onSelectChange, containerOnSelectChange, selectedList, level }) => { +const getVersionedChildrenURL = (item, baseURL) => { + if(!baseURL) + return item.url + 'children/' + // baseURL is like /users/foo/sources/Bar/1.0/concepts/ + // item.url is like /users/foo/sources/Bar/concepts/FOOD_001/ + // We need: /users/foo/sources/Bar/1.0/concepts/FOOD_001/children/ + const conceptsSuffix = item.url.replace(/^.*\/concepts\//, 'concepts/').replace(/\/$/, '') + const sourcePrefix = baseURL.replace(/concepts\/.*$/, '') + return sourcePrefix + conceptsSuffix + '/children/' +} + +const Row = ({ item, columns, isSelected, onSelectChange, containerOnSelectChange, selectedList, level, baseURL }) => { const [open, setOpen] = React.useState(false); const [children, setChildren] = React.useState([]); const [selected, setSelected] = React.useState(isSelected); @@ -77,7 +88,8 @@ const Row = ({ item, columns, isSelected, onSelectChange, containerOnSelectChang const fetchChildren = () => { if(!fetched) { - APIService.new().overrideURL(item.url).appendToUrl('children/').get().then(response => { + const childrenURL = getVersionedChildrenURL(item, baseURL) + APIService.new().overrideURL(childrenURL).get().then(response => { setChildren(response.data || []) setFetched(true) }) @@ -136,6 +148,7 @@ const Row = ({ item, columns, isSelected, onSelectChange, containerOnSelectChang containerOnSelectChange={containerOnSelectChange} columns={columns} level={level + 1} + baseURL={baseURL} /> )) ) @@ -152,7 +165,7 @@ const Row = ({ item, columns, isSelected, onSelectChange, containerOnSelectChang const ConceptHierarchyResultsTable = ({ results, onPageChange, onSelect, onSelectChange, viewFields, - onCreateSimilarClick, onCreateMappingClick + onCreateSimilarClick, onCreateMappingClick, baseURL }) => { const [selectedList, setSelectedList] = React.useState([]); const resourceDefinition = CONCEPTS_DEFINITION; @@ -236,6 +249,7 @@ const ConceptHierarchyResultsTable = ({ containerOnSelectChange={onSelectChange} columns={columns} level={0} + baseURL={baseURL} /> )) } diff --git a/src/components/search/Search.jsx b/src/components/search/Search.jsx index 218b9e3c..1768b3c6 100644 --- a/src/components/search/Search.jsx +++ b/src/components/search/Search.jsx @@ -937,6 +937,7 @@ class Search extends React.Component { onCreateMappingClick={onCreateMappingClick} viewFields={viewFields} onSelect={onSelect} + baseURL={this.prepareBaseURL()} /> : ( isTable ?