Bug fix: re-render tree when type, masterFiter etc changes.

This commit is contained in:
Tom Butcher 2025-12-27 13:50:17 +00:00
parent 556b16a5dc
commit 38cafdb4a4

View File

@ -47,6 +47,8 @@ const ObjectSelect = ({
const [objectList, setObjectList] = useState([]) const [objectList, setObjectList] = useState([])
const [treeSelectValue, setTreeSelectValue] = useState(null) const [treeSelectValue, setTreeSelectValue] = useState(null)
const [initialLoading, setInitialLoading] = useState(true) const [initialLoading, setInitialLoading] = useState(true)
const [expandedKeys, setExpandedKeys] = useState([])
const [treeVersion, setTreeVersion] = useState(0)
const valueRef = useRef(null) const valueRef = useRef(null)
// Refs to track value changes // Refs to track value changes
@ -211,6 +213,7 @@ const ObjectSelect = ({
objectType={type} objectType={type}
objectData={object} objectData={object}
isEditing={false} isEditing={false}
showHyperlink={false}
style={{ top: '-0.5px' }} style={{ top: '-0.5px' }}
/> />
</div> </div>
@ -246,6 +249,15 @@ const ObjectSelect = ({
value: valueString value: valueString
}) })
var nodeChildren = buildTreeData(
children,
pIdx + 1,
parentKeys.concat(valueString),
newFilterPath
)
if (nodeChildren.length == 0) {
nodeChildren = undefined
}
const modelProperty = getModelProperty(type, property) const modelProperty = getModelProperty(type, property)
return { return {
title: <ObjectProperty {...modelProperty} value={value} />, title: <ObjectProperty {...modelProperty} value={value} />,
@ -257,12 +269,7 @@ const ObjectSelect = ({
filterPath: newFilterPath, filterPath: newFilterPath,
selectable: false, selectable: false,
isLeaf: false, isLeaf: false,
children: buildTreeData( children: nodeChildren
children,
pIdx + 1,
parentKeys.concat(valueString),
newFilterPath
)
} }
}) })
.filter(Boolean) .filter(Boolean)
@ -272,6 +279,7 @@ const ObjectSelect = ({
// --- loadData for async loading on expand --- // --- loadData for async loading on expand ---
const loadData = async (node) => { const loadData = async (node) => {
console.log('loading data for node', node)
// node.property is the property name, node.value is the value key // node.property is the property name, node.value is the value key
if (!node.property) return if (!node.property) return
if (type == 'unknown') return if (type == 'unknown') return
@ -384,24 +392,39 @@ const ObjectSelect = ({
// console.log('fullValue', fullValue) // console.log('fullValue', fullValue)
// Build a new filter from value's properties that are in the properties list // Build a new filter from value's properties that are in the properties list
const valueFilter = { ...filter } const valueFilter = { ...filter }
const pathKeys = []
const parentKeys = []
properties.forEach((prop) => { properties.forEach((prop) => {
if (Object.prototype.hasOwnProperty.call(fullValue, prop)) { if (Object.prototype.hasOwnProperty.call(fullValue, prop)) {
const filterValue = fullValue[prop] const filterValue = fullValue[prop]
let valueString = filterValue
if ( if (
filterValue && filterValue &&
typeof filterValue === 'object' && typeof filterValue === 'object' &&
filterValue._id filterValue._id
) { ) {
valueFilter[prop] = filterValue._id valueFilter[prop] = filterValue._id
valueString = filterValue._id
} else if (filterValue?.name) { } else if (filterValue?.name) {
valueFilter[prop] = filterValue.name valueFilter[prop] = filterValue.name
valueString = filterValue.name
} else if (Array.isArray(filterValue)) { } else if (Array.isArray(filterValue)) {
valueFilter[prop] = filterValue.join(',') valueFilter[prop] = filterValue.join(',')
valueString = filterValue.join(',')
} else { } else {
valueFilter[prop] = filterValue valueFilter[prop] = filterValue
valueString = filterValue
} }
// Build the path key for this property level
const nodeKey = parentKeys
.concat(prop + ':' + valueString)
.join('-')
pathKeys.push(nodeKey)
parentKeys.push(valueString)
} }
}) })
// Expand the path to the object
setExpandedKeys(pathKeys)
// Fetch with the new filter // Fetch with the new filter
handleFetchObjectsProperties(valueFilter) handleFetchObjectsProperties(valueFilter)
// console.log('setting treeSelectValue', valueRef.current._id) // console.log('setting treeSelectValue', valueRef.current._id)
@ -462,6 +485,8 @@ const ObjectSelect = ({
setObjectPropertiesTree({}) setObjectPropertiesTree({})
setObjectList([]) setObjectList([])
setTreeData([]) setTreeData([])
setTreeVersion((v) => v + 1)
setExpandedKeys([])
setInitialized(false) setInitialized(false)
onTreeSelectChange(null) onTreeSelectChange(null)
setTreeSelectValue(null) setTreeSelectValue(null)
@ -529,8 +554,11 @@ const ObjectSelect = ({
// --- Main TreeSelect UI --- // --- Main TreeSelect UI ---
return ( return (
<TreeSelect <TreeSelect
key={treeVersion}
treeDataSimpleMode={false} treeDataSimpleMode={false}
treeDefaultExpandAll={true} treeDefaultExpandAll={true}
treeExpandedKeys={expandedKeys}
onTreeExpand={setExpandedKeys}
treeData={treeData} treeData={treeData}
showSearch={showSearch} showSearch={showSearch}
multiple={multiple} multiple={multiple}