|
@@ -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<number | string>,
|
|
|
+): Array<number | string> {
|
|
|
+ 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<Recordable<any>>) {
|
|
|
if (Array.isArray(val)) {
|
|
|
const filteredVal = val.filter((v) => !get(v, props.disabledField));
|