瀏覽代碼

fix: 角色管理,授权的树形组件,取消勾选叶子节点,父级节点状态错误 (#6680)

Co-authored-by: haiyinlong <haiyinlong@uhigame.com>
Ken Hai 4 周之前
父節點
當前提交
b0d7b177be
共有 1 個文件被更改,包括 34 次插入1 次删除
  1. 34 1
      packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue

+ 34 - 1
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<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));