FormToggle.vue 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <script setup>
  2. import { useIdGenerator } from '@/composables/helpers'
  3. import { UseColorMode } from '@vueuse/components'
  4. const props = defineProps({
  5. modelValue: [String, Number, Boolean],
  6. choices: {
  7. type: Array,
  8. required: true
  9. },
  10. fieldName: {
  11. type: String,
  12. required: true
  13. },
  14. fieldError: [String],
  15. hasOffset: Boolean,
  16. isDisabled: Boolean,
  17. label: {
  18. type: String,
  19. default: ''
  20. },
  21. help: {
  22. type: String,
  23. default: ''
  24. },
  25. })
  26. // defines what events our component emits
  27. const emit = defineEmits(['update:modelValue'])
  28. function setRadio(event) {
  29. emit('update:modelValue', event)
  30. }
  31. </script>
  32. <template>
  33. <div class="field" :class="{ 'pt-3': hasOffset }" role="radiogroup"
  34. :aria-labelledby="useIdGenerator('label',fieldName).inputId">
  35. <label v-if="label" :id="useIdGenerator('label',fieldName).inputId" class="label" v-html="$t(label)" />
  36. <div class="is-toggle buttons">
  37. <UseColorMode v-slot="{ mode }">
  38. <button
  39. v-for="choice in choices"
  40. :key="choice.value"
  41. :id="useIdGenerator('button',fieldName+choice.value).inputId"
  42. role="radio"
  43. type="button"
  44. class="button"
  45. :aria-checked="modelValue===choice.value"
  46. :disabled="isDisabled"
  47. :class="{
  48. 'is-link': modelValue===choice.value,
  49. 'is-dark': mode==='dark',
  50. 'is-multiline': choice.legend,
  51. }"
  52. v-on:click.stop="setRadio(choice.value)"
  53. :title="choice.title? choice.title:''">
  54. <input
  55. :id="useIdGenerator('radio',choice.value).inputId"
  56. type="radio"
  57. class="is-hidden"
  58. :checked="modelValue===choice.value"
  59. :value="choice.value"
  60. :disabled="isDisabled" />
  61. <span v-if="choice.legend" v-html="$t(choice.legend)" class="is-block is-size-7" />
  62. <FontAwesomeIcon :icon="['fas',choice.icon]" v-if="choice.icon" class="mr-2" /> {{ $t(choice.text) }}
  63. </button>
  64. </UseColorMode>
  65. </div>
  66. <FieldError v-if="fieldError != undefined" :error="fieldError" :field="fieldName" />
  67. <p class="help" v-html="$t(help)" v-if="help" />
  68. </div>
  69. </template>