Enum.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <!--
  2. Liste déroulante dédiée à l'affichage d'objets Enum
  3. @see https://vuetifyjs.com/en/components/selects/
  4. -->
  5. <template>
  6. <main>
  7. <v-skeleton-loader
  8. v-if="$fetchState.pending"
  9. type="list-item"
  10. loading
  11. />
  12. <v-select
  13. v-else
  14. :label="$t(label_field)"
  15. :value="data"
  16. :items="items"
  17. item-text="label"
  18. item-value="value"
  19. :rules="rules"
  20. :disabled="readonly"
  21. :error="error"
  22. @change="onChange($event)"
  23. />
  24. </main>
  25. </template>
  26. <script lang="ts">
  27. import {defineComponent, ref, useContext, useFetch, Ref} from '@nuxtjs/composition-api'
  28. import { EnumChoices } from '~/types/interfaces'
  29. import { QUERY_TYPE } from '~/types/enums'
  30. import {$useError} from "~/composables/form/useError";
  31. export default defineComponent({
  32. props: {
  33. enumType: {
  34. type: String,
  35. required: true
  36. },
  37. label: {
  38. type: String,
  39. required: false,
  40. default: null
  41. },
  42. field: {
  43. type: String,
  44. required: false,
  45. default: null
  46. },
  47. data: {
  48. type: String,
  49. required: false,
  50. default: null
  51. },
  52. readonly: {
  53. type: Boolean,
  54. required: false
  55. },
  56. rules: {
  57. type: Array,
  58. required: false,
  59. default: () => []
  60. }
  61. },
  62. setup (props, {emit}) {
  63. const labelField = props.label ?? props.field
  64. const { enumType } = props
  65. const { $dataProvider } = useContext()
  66. const {error, onChange} = $useError(props.field, emit)
  67. const items: Ref<Array<EnumChoices>> = ref([])
  68. useFetch(async () => {
  69. items.value = await $dataProvider.invoke({
  70. type: QUERY_TYPE.ENUM,
  71. enumType
  72. })
  73. })
  74. return {
  75. items,
  76. label_field: labelField,
  77. error,
  78. onChange
  79. }
  80. }
  81. })
  82. </script>
  83. <style scoped>
  84. </style>