fix(SelectMenu): take option-attribute into account to display label

Resolves #1151
This commit is contained in:
Benjamin Canac
2024-01-16 11:16:20 +01:00
parent e116f931b2
commit b9fe74bca5
2 changed files with 21 additions and 4 deletions

View File

@@ -13,7 +13,7 @@ const people = [{
name: 'Tom Cook'
}]
const selected = ref(people[0].name)
const selected = ref(people[0].id)
</script>
<template>
@@ -21,7 +21,7 @@ const selected = ref(people[0].name)
v-model="selected"
:options="people"
placeholder="Select people"
value-attribute="name"
value-attribute="id"
option-attribute="name"
/>
</template>

View File

@@ -36,8 +36,7 @@
</span>
<slot name="label">
<span v-if="multiple && Array.isArray(modelValue) && modelValue.length" :class="uiMenu.label">{{ modelValue.length }} selected</span>
<span v-else-if="!multiple && modelValue" :class="uiMenu.label">{{ ['string', 'number'].includes(typeof modelValue) ? modelValue : modelValue[optionAttribute] }}</span>
<span v-if="label" :class="uiMenu.label">{{ label }}</span>
<span v-else :class="uiMenu.label">{{ placeholder || '&nbsp;' }}</span>
</slot>
@@ -355,6 +354,23 @@ export default defineComponent({
}
})
const label = computed(() => {
if (props.multiple) {
if (Array.isArray(props.modelValue) && props.modelValue.length) {
return `${props.modelValue.length} selected`
} else {
return null
}
} else {
if (props.valueAttribute) {
const option = props.options.find(option => option[props.valueAttribute] === props.modelValue)
return option ? option[props.optionAttribute] : null
} else {
return ['string', 'number'].includes(typeof props.modelValue) ? props.modelValue : props.modelValue[props.optionAttribute]
}
}
})
const selectClass = computed(() => {
const variant = ui.value.color?.[color.value as string]?.[props.variant as string] || ui.value.variant[props.variant]
@@ -509,6 +525,7 @@ export default defineComponent({
popper,
trigger,
container,
label,
isLeading,
isTrailing,
// eslint-disable-next-line vue/no-dupe-keys