diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue index c6c4df7d..3e497c51 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue @@ -103,10 +103,15 @@ function updateTreeValue() { treeValue.value = undefined; } else { if (Array.isArray(val)) { - const filteredValues = val.filter((v) => { + let filteredValues = val.filter((v) => { const item = getItemByValue(v); return item && !get(item, props.disabledField); }); + + if (!props.checkStrictly && props.autoCheckParent) { + filteredValues = processParentSelection(filteredValues); + } + treeValue.value = filteredValues.map((v) => getItemByValue(v)); if (filteredValues.length !== val.length) { @@ -123,7 +128,35 @@ function updateTreeValue() { } } } +function processParentSelection( + selectedValues: Array, +): Array { + if (props.checkStrictly) return selectedValues; + const result = [...selectedValues]; + + for (let i = result.length - 1; i >= 0; i--) { + const currentValue = result[i]; + if (currentValue === undefined) continue; + const currentItem = getItemByValue(currentValue); + + if (!currentItem) continue; + + const children = get(currentItem, props.childrenField); + if (Array.isArray(children) && children.length > 0) { + const hasSelectedChildren = children.some((child) => { + const childValue = get(child, props.valueField); + return result.includes(childValue); + }); + + if (!hasSelectedChildren) { + result.splice(i, 1); + } + } + } + + return result; +} function updateModelValue(val: Arrayable>) { if (Array.isArray(val)) { const filteredVal = val.filter((v) => !get(v, props.disabledField));