@@ -23,6 +23,7 @@ const props = withDefaults(defineProps<TreeProps>(), {
23
23
defaultExpandedKeys : () => [],
24
24
defaultExpandedLevel: 0 ,
25
25
disabled: false ,
26
+ disabledField: ' disabled' ,
26
27
expanded : () => [],
27
28
iconField: ' icon' ,
28
29
labelField: ' label' ,
@@ -101,16 +102,37 @@ function updateTreeValue() {
101
102
if (val === undefined ) {
102
103
treeValue .value = undefined ;
103
104
} 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
+ }
107
124
}
108
125
}
109
126
110
127
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
+ }
114
136
}
115
137
116
138
function expandToLevel(level : number ) {
@@ -149,10 +171,18 @@ function collapseAll() {
149
171
expanded .value = [];
150
172
}
151
173
174
+ function isNodeDisabled(item : FlattenedItem <Recordable <any >>) {
175
+ return props .disabled || get (item .value , props .disabledField );
176
+ }
177
+
152
178
function onToggle(item : FlattenedItem <Recordable <any >>) {
153
179
emits (' expand' , item );
154
180
}
155
181
function onSelect(item : FlattenedItem <Recordable <any >>, isSelected : boolean ) {
182
+ if (isNodeDisabled (item )) {
183
+ return ;
184
+ }
185
+
156
186
if (
157
187
! props .checkStrictly &&
158
188
props .multiple &&
@@ -224,28 +254,34 @@ defineExpose({
224
254
:class ="
225
255
cn('cursor-pointer', getNodeClass?.(item), {
226
256
'data-[selected]:bg-accent': !multiple,
227
- 'cursor-not-allowed': disabled ,
257
+ 'cursor-not-allowed': isNodeDisabled(item) ,
228
258
})
229
259
"
230
260
v-bind ="
231
261
Object.assign(item.bind, {
232
- onfocus: disabled ? 'this.blur()' : undefined,
262
+ onfocus: isNodeDisabled(item) ? 'this.blur()' : undefined,
263
+ disabled: isNodeDisabled(item),
233
264
})
234
265
"
235
266
@select ="
236
- (event) => {
267
+ (event: any) => {
268
+ if (isNodeDisabled(item)) {
269
+ event.preventDefault();
270
+ event.stopPropagation();
271
+ return;
272
+ }
237
273
if (event.detail.originalEvent.type === 'click') {
238
274
event.preventDefault();
239
275
}
240
- !disabled && onSelect(item, event.detail.isSelected);
276
+ onSelect(item, event.detail.isSelected);
241
277
}
242
278
"
243
279
@toggle ="
244
- (event) => {
280
+ (event: any ) => {
245
281
if (event.detail.originalEvent.type === 'click') {
246
282
event.preventDefault();
247
283
}
248
- !disabled && onToggle(item);
284
+ !isNodeDisabled(item) && onToggle(item);
249
285
}
250
286
"
251
287
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({
266
302
</div >
267
303
<Checkbox
268
304
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) "
272
308
@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();
276
316
}
277
317
"
278
318
/>
279
319
<div
280
320
class =" flex items-center gap-1 pl-2"
281
321
@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();
287
331
}
288
332
"
289
333
>
0 commit comments