axp-ui/src/components/FieldSelect.vue

60 lines
1.4 KiB
Vue
Raw Normal View History

2023-09-20 14:09:22 +03:00
<script lang="ts">
2023-10-18 12:03:56 +03:00
import type { TUiFieldWrapperProps } from './FieldWrapper.vue'
2023-07-11 10:38:21 +03:00
2023-10-18 12:03:56 +03:00
export type TUiFieldSelectProps = TUiFieldWrapperProps & {
2023-09-20 14:09:22 +03:00
modelValue?: string | string[] | number | number[]
options?: { text: string; value: string | number }[]
2023-07-28 13:10:15 +03:00
multiple?: boolean
2023-09-20 14:09:22 +03:00
}
export type TUiFieldSelectEmits = {
(e: 'input', v: Event): void
(e: 'update:model-value', v?: string | string[] | number | number[]): void
(e: 'update:error', v?: string): void
}
</script>
<script setup lang="ts">
import UiFieldWrapper from './FieldWrapper.vue'
// Props.
const props = defineProps<TUiFieldSelectProps>()
// Emits.
const emit = defineEmits<TUiFieldSelectEmits>()
2023-07-11 10:38:21 +03:00
2023-09-20 14:09:22 +03:00
// Handlers.
const inputHandler = (val: Event) => {
emit('input', val)
emit('update:error')
2023-07-11 10:38:21 +03:00
2023-09-20 14:09:22 +03:00
if (val.target instanceof HTMLSelectElement) {
emit('update:model-value', val.target.value)
} else {
emit('update:model-value')
}
}
2023-07-11 10:38:21 +03:00
</script>
<template>
2023-09-20 14:09:22 +03:00
<ui-field-wrapper
:label="props.label"
:error="props.error"
:disabled="props.disabled"
:readonly="props.readonly"
:description="props.description"
2023-07-27 15:36:52 +03:00
class="ui-field-select"
2023-09-20 14:09:22 +03:00
>
<select
:value="props.modelValue"
:multiple="props.multiple"
:disabled="props.disabled || props.readonly"
@input="inputHandler"
>
<option v-for="item in props.options" :value="item.value">
{{ item.text }}
</option>
</select>
</ui-field-wrapper>
2023-07-11 10:38:21 +03:00
</template>