FormSelect.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script setup>
  2. import { useIdGenerator, useValidationErrorIdGenerator } from '@/composables/helpers'
  3. const props = defineProps({
  4. modelValue: [String, Number, Boolean],
  5. label: {
  6. type: String,
  7. default: ''
  8. },
  9. fieldName: {
  10. type: String,
  11. default: '',
  12. required: true
  13. },
  14. fieldError: [String],
  15. options: {
  16. type: Array,
  17. required: true
  18. },
  19. help: {
  20. type: String,
  21. default: ''
  22. },
  23. isIndented: Boolean,
  24. isDisabled: Boolean,
  25. idSuffix: {
  26. type: String,
  27. default: ''
  28. },
  29. })
  30. const selected = ref(props.modelValue)
  31. const { inputId } = useIdGenerator('select', props.fieldName + props.idSuffix)
  32. const { valErrorId } = useValidationErrorIdGenerator(props.fieldName)
  33. const legendId = useIdGenerator('legend', props.fieldName + props.idSuffix).inputId
  34. </script>
  35. <template>
  36. <div class="field is-flex">
  37. <div v-if="isIndented" class="mx-2 pr-1" :style="{ 'opacity': isDisabled ? '0.5' : '1' }">
  38. <FontAwesomeIcon class="has-text-grey" :icon="['fas', 'chevron-right']" transform="rotate-135"/>
  39. </div>
  40. <div>
  41. <label :for="inputId" class="label" v-html="$t(label)" :style="{ 'opacity': isDisabled ? '0.5' : '1' }"></label>
  42. <div class="control">
  43. <div class="select">
  44. <select
  45. :id="inputId"
  46. v-model="selected"
  47. v-on:change="$emit('update:modelValue', $event.target.value)"
  48. :disabled="isDisabled"
  49. :aria-describedby="help ? legendId : undefined"
  50. :aria-invalid="fieldError != undefined"
  51. :aria-errormessage="fieldError != undefined ? valErrorId : undefined"
  52. >
  53. <option v-for="option in options" :value="option.value">{{ $t(option.text) }}</option>
  54. </select>
  55. </div>
  56. </div>
  57. <FieldError v-if="fieldError != undefined" :error="fieldError" :field="fieldName" />
  58. <p :id="legendId" class="help" v-html="$t(help)" v-if="help"></p>
  59. </div>
  60. </div>
  61. </template>