Enum.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. @change="$emit('update', $event, field)"
  22. />
  23. </main>
  24. </template>
  25. <script lang="ts">
  26. import { defineComponent, ref, useContext, useFetch, Ref } from '@nuxtjs/composition-api'
  27. import { EnumChoices } from '~/types/interfaces'
  28. import { QUERY_TYPE } from '~/types/enums'
  29. export default defineComponent({
  30. props: {
  31. enumType: {
  32. type: String,
  33. required: true
  34. },
  35. label: {
  36. type: String,
  37. required: false,
  38. default: null
  39. },
  40. field: {
  41. type: String,
  42. required: false,
  43. default: null
  44. },
  45. data: {
  46. type: String,
  47. required: false,
  48. default: null
  49. },
  50. readonly: {
  51. type: Boolean,
  52. required: false
  53. },
  54. rules: {
  55. type: Array,
  56. required: false,
  57. default: () => []
  58. }
  59. },
  60. setup (props) {
  61. const labelField = props.label ?? props.field
  62. const { enumType } = props
  63. const { $dataProvider } = useContext()
  64. const items: Ref<Array<EnumChoices>> = ref([])
  65. useFetch(async () => {
  66. items.value = await $dataProvider.invoke({
  67. type: QUERY_TYPE.ENUM,
  68. enumType
  69. })
  70. })
  71. return {
  72. items,
  73. label_field: labelField
  74. }
  75. }
  76. })
  77. </script>
  78. <style scoped>
  79. </style>