Skip to content

Commit 3230781

Browse files
gatspyjinmao88coderabbitai[bot]
authored
feat: [vben-tree]增加数据disabled (#6343)
* 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>
1 parent e7fd0e3 commit 3230781

File tree

2 files changed

+69
-23
lines changed

2 files changed

+69
-23
lines changed

packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue

Lines changed: 67 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const props = withDefaults(defineProps<TreeProps>(), {
2323
defaultExpandedKeys: () => [],
2424
defaultExpandedLevel: 0,
2525
disabled: false,
26+
disabledField: 'disabled',
2627
expanded: () => [],
2728
iconField: 'icon',
2829
labelField: 'label',
@@ -101,16 +102,37 @@ function updateTreeValue() {
101102
if (val === undefined) {
102103
treeValue.value = undefined;
103104
} else {
104-
treeValue.value = Array.isArray(val)
105-
? val.map((v) => getItemByValue(v))
106-
: getItemByValue(val);
105+
if (Array.isArray(val)) {
106+
const filteredValues = val.filter((v) => {
107+
const item = getItemByValue(v);
108+
return item && !get(item, props.disabledField);
109+
});
110+
treeValue.value = filteredValues.map((v) => getItemByValue(v));
111+
112+
if (filteredValues.length !== val.length) {
113+
modelValue.value = filteredValues;
114+
}
115+
} else {
116+
const item = getItemByValue(val);
117+
if (item && !get(item, props.disabledField)) {
118+
treeValue.value = item;
119+
} else {
120+
treeValue.value = undefined;
121+
modelValue.value = undefined;
122+
}
123+
}
107124
}
108125
}
109126
110127
function updateModelValue(val: Arrayable<Recordable<any>>) {
111-
modelValue.value = Array.isArray(val)
112-
? val.map((v) => get(v, props.valueField))
113-
: get(val, props.valueField);
128+
if (Array.isArray(val)) {
129+
const filteredVal = val.filter((v) => !get(v, props.disabledField));
130+
modelValue.value = filteredVal.map((v) => get(v, props.valueField));
131+
} else {
132+
if (val && !get(val, props.disabledField)) {
133+
modelValue.value = get(val, props.valueField);
134+
}
135+
}
114136
}
115137
116138
function expandToLevel(level: number) {
@@ -149,10 +171,18 @@ function collapseAll() {
149171
expanded.value = [];
150172
}
151173
174+
function isNodeDisabled(item: FlattenedItem<Recordable<any>>) {
175+
return props.disabled || get(item.value, props.disabledField);
176+
}
177+
152178
function onToggle(item: FlattenedItem<Recordable<any>>) {
153179
emits('expand', item);
154180
}
155181
function onSelect(item: FlattenedItem<Recordable<any>>, isSelected: boolean) {
182+
if (isNodeDisabled(item)) {
183+
return;
184+
}
185+
156186
if (
157187
!props.checkStrictly &&
158188
props.multiple &&
@@ -224,28 +254,34 @@ defineExpose({
224254
:class="
225255
cn('cursor-pointer', getNodeClass?.(item), {
226256
'data-[selected]:bg-accent': !multiple,
227-
'cursor-not-allowed': disabled,
257+
'cursor-not-allowed': isNodeDisabled(item),
228258
})
229259
"
230260
v-bind="
231261
Object.assign(item.bind, {
232-
onfocus: disabled ? 'this.blur()' : undefined,
262+
onfocus: isNodeDisabled(item) ? 'this.blur()' : undefined,
263+
disabled: isNodeDisabled(item),
233264
})
234265
"
235266
@select="
236-
(event) => {
267+
(event: any) => {
268+
if (isNodeDisabled(item)) {
269+
event.preventDefault();
270+
event.stopPropagation();
271+
return;
272+
}
237273
if (event.detail.originalEvent.type === 'click') {
238274
event.preventDefault();
239275
}
240-
!disabled && onSelect(item, event.detail.isSelected);
276+
onSelect(item, event.detail.isSelected);
241277
}
242278
"
243279
@toggle="
244-
(event) => {
280+
(event: any) => {
245281
if (event.detail.originalEvent.type === 'click') {
246282
event.preventDefault();
247283
}
248-
!disabled && onToggle(item);
284+
!isNodeDisabled(item) && onToggle(item);
249285
}
250286
"
251287
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({
266302
</div>
267303
<Checkbox
268304
v-if="multiple"
269-
:checked="isSelected"
270-
:disabled="disabled"
271-
:indeterminate="isIndeterminate"
305+
:checked="isSelected && !isNodeDisabled(item)"
306+
:disabled="isNodeDisabled(item)"
307+
:indeterminate="isIndeterminate && !isNodeDisabled(item)"
272308
@click="
273-
() => {
274-
!disabled && handleSelect();
275-
// onSelect(item, !isSelected);
309+
(event: MouseEvent) => {
310+
if (isNodeDisabled(item)) {
311+
event.preventDefault();
312+
event.stopPropagation();
313+
return;
314+
}
315+
handleSelect();
276316
}
277317
"
278318
/>
279319
<div
280320
class="flex items-center gap-1 pl-2"
281321
@click="
282-
(_event) => {
283-
// $event.stopPropagation();
284-
// $event.preventDefault();
285-
!disabled && handleSelect();
286-
// onSelect(item, !isSelected);
322+
(event: MouseEvent) => {
323+
if (isNodeDisabled(item)) {
324+
event.preventDefault();
325+
event.stopPropagation();
326+
return;
327+
}
328+
event.stopPropagation();
329+
event.preventDefault();
330+
handleSelect();
287331
}
288332
"
289333
>

packages/@core/ui-kit/shadcn-ui/src/ui/tree/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export interface TreeProps {
2222
defaultValue?: Arrayable<number | string>;
2323
/** 禁用 */
2424
disabled?: boolean;
25+
/** 禁用字段名 */
26+
disabledField?: string;
2527
/** 自定义节点类名 */
2628
getNodeClass?: (item: FlattenedItem<Recordable<any>>) => string;
2729
iconField?: string;

0 commit comments

Comments
 (0)