From 3230781538495574de6ec18c1adeb69231e42413 Mon Sep 17 00:00:00 2001 From: "CG.gatspy" Date: Fri, 27 Jun 2025 19:09:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20[vben-tree]=E5=A2=9E=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AEdisabled=20(#6343)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: [vben-tree]增加数据disabled * Update packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: Jin Mao <50581550+jinmao88@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../ui-kit/shadcn-ui/src/ui/tree/tree.vue | 90 ++++++++++++++----- .../ui-kit/shadcn-ui/src/ui/tree/types.ts | 2 + 2 files changed, 69 insertions(+), 23 deletions(-) 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 03117b363..339d96541 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 @@ -23,6 +23,7 @@ const props = withDefaults(defineProps(), { defaultExpandedKeys: () => [], defaultExpandedLevel: 0, disabled: false, + disabledField: 'disabled', expanded: () => [], iconField: 'icon', labelField: 'label', @@ -101,16 +102,37 @@ function updateTreeValue() { if (val === undefined) { treeValue.value = undefined; } else { - treeValue.value = Array.isArray(val) - ? val.map((v) => getItemByValue(v)) - : getItemByValue(val); + if (Array.isArray(val)) { + const filteredValues = val.filter((v) => { + const item = getItemByValue(v); + return item && !get(item, props.disabledField); + }); + treeValue.value = filteredValues.map((v) => getItemByValue(v)); + + if (filteredValues.length !== val.length) { + modelValue.value = filteredValues; + } + } else { + const item = getItemByValue(val); + if (item && !get(item, props.disabledField)) { + treeValue.value = item; + } else { + treeValue.value = undefined; + modelValue.value = undefined; + } + } } } function updateModelValue(val: Arrayable>) { - modelValue.value = Array.isArray(val) - ? val.map((v) => get(v, props.valueField)) - : get(val, props.valueField); + if (Array.isArray(val)) { + const filteredVal = val.filter((v) => !get(v, props.disabledField)); + modelValue.value = filteredVal.map((v) => get(v, props.valueField)); + } else { + if (val && !get(val, props.disabledField)) { + modelValue.value = get(val, props.valueField); + } + } } function expandToLevel(level: number) { @@ -149,10 +171,18 @@ function collapseAll() { expanded.value = []; } +function isNodeDisabled(item: FlattenedItem>) { + return props.disabled || get(item.value, props.disabledField); +} + function onToggle(item: FlattenedItem>) { emits('expand', item); } function onSelect(item: FlattenedItem>, isSelected: boolean) { + if (isNodeDisabled(item)) { + return; + } + if ( !props.checkStrictly && props.multiple && @@ -224,28 +254,34 @@ defineExpose({ :class=" cn('cursor-pointer', getNodeClass?.(item), { 'data-[selected]:bg-accent': !multiple, - 'cursor-not-allowed': disabled, + 'cursor-not-allowed': isNodeDisabled(item), }) " v-bind=" Object.assign(item.bind, { - onfocus: disabled ? 'this.blur()' : undefined, + onfocus: isNodeDisabled(item) ? 'this.blur()' : undefined, + disabled: isNodeDisabled(item), }) " @select=" - (event) => { + (event: any) => { + if (isNodeDisabled(item)) { + event.preventDefault(); + event.stopPropagation(); + return; + } if (event.detail.originalEvent.type === 'click') { event.preventDefault(); } - !disabled && onSelect(item, event.detail.isSelected); + onSelect(item, event.detail.isSelected); } " @toggle=" - (event) => { + (event: any) => { if (event.detail.originalEvent.type === 'click') { event.preventDefault(); } - !disabled && onToggle(item); + !isNodeDisabled(item) && onToggle(item); } " class="tree-node focus:ring-grass8 my-0.5 flex items-center rounded px-2 py-1 outline-none focus:ring-2" @@ -266,24 +302,32 @@ defineExpose({
diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts index 5c394f0da..97b091390 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts @@ -22,6 +22,8 @@ export interface TreeProps { defaultValue?: Arrayable; /** 禁用 */ disabled?: boolean; + /** 禁用字段名 */ + disabledField?: string; /** 自定义节点类名 */ getNodeClass?: (item: FlattenedItem>) => string; iconField?: string;