Skip to content

Commit 027489d

Browse files
committed
fix(VSelects): recognize empty string as no value
1 parent 54e430f commit 027489d

File tree

5 files changed

+13
-9
lines changed

5 files changed

+13
-9
lines changed

packages/vuetify/src/components/VAutocomplete/VAutocomplete.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,14 @@ export const VAutocomplete = genericComponent<new <
148148
const selectionIndex = shallowRef(-1)
149149
const color = computed(() => vTextFieldRef.value?.color)
150150
const label = computed(() => menu.value ? props.closeText : props.openText)
151-
const { items, transformIn, transformOut } = useItems(props)
151+
const { items, transformIn, transformOut, emptyValues } = useItems(props)
152152
const { textColorClasses, textColorStyles } = useTextColor(color)
153153
const search = useProxiedModel(props, 'search', '')
154154
const model = useProxiedModel(
155155
props,
156156
'modelValue',
157157
[],
158-
v => transformIn(v === null ? [null] : wrapInArray(v)),
158+
v => transformIn(v === null ? [null] : wrapInArray(v, emptyValues)),
159159
v => {
160160
const transformed = transformOut(v)
161161
return props.multiple ? transformed : (transformed[0] ?? null)
@@ -385,7 +385,7 @@ export const VAutocomplete = genericComponent<new <
385385
} else {
386386
if (!props.multiple && search.value == null) model.value = []
387387
menu.value = false
388-
if (!model.value.some(({ title }) => title === search.value)) search.value = ''
388+
search.value = ''
389389
selectionIndex.value = -1
390390
}
391391
})

packages/vuetify/src/components/VCombobox/VCombobox.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export const VCombobox = genericComponent<new <
159159
props,
160160
'modelValue',
161161
[],
162-
v => transformIn(wrapInArray(v)),
162+
v => transformIn(wrapInArray(v, [''])),
163163
v => {
164164
const transformed = transformOut(v)
165165
return props.multiple ? transformed : (transformed[0] ?? null)

packages/vuetify/src/components/VSelect/VSelect.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,12 @@ export const VSelect = genericComponent<new <
151151
_menu.value = v
152152
},
153153
})
154-
const { items, transformIn, transformOut } = useItems(props)
154+
const { items, transformIn, transformOut, emptyValues } = useItems(props)
155155
const model = useProxiedModel(
156156
props,
157157
'modelValue',
158158
[],
159-
v => transformIn(v === null ? [null] : wrapInArray(v)),
159+
v => transformIn(v === null ? [null] : wrapInArray(v, emptyValues)),
160160
v => {
161161
const transformed = transformOut(v)
162162
return props.multiple ? transformed : (transformed[0] ?? null)

packages/vuetify/src/composables/list-items.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,8 @@ export function useItems (props: ItemProps) {
120120
: value.map(({ value }) => value)
121121
}
122122

123-
return { items, transformIn, transformOut }
123+
const emptyValues = ['', null, undefined]
124+
.filter(v => !items.value.some(item => item.value === v))
125+
126+
return { items, transformIn, transformOut, emptyValues }
124127
}

packages/vuetify/src/util/helpers.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,11 +389,12 @@ export function arrayDiff (a: any[], b: any[]): any[] {
389389

390390
type IfAny<T, Y, N> = 0 extends (1 & T) ? Y : N;
391391
export function wrapInArray<T> (
392-
v: T | null | undefined
392+
v: T | null | undefined,
393+
emptyValues: any[] = []
393394
): T extends readonly any[]
394395
? IfAny<T, T[], T>
395396
: NonNullable<T>[] {
396-
return v == null
397+
return v == null || emptyValues.includes(v)
397398
? []
398399
: Array.isArray(v)
399400
? v as any : [v]

0 commit comments

Comments
 (0)