Enum.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <UiInputAutocomplete
  3. :model-value="modelValue"
  4. :field="field"
  5. :items="items"
  6. :is-loading="status==='pending'"
  7. :return-object="false"
  8. item-title="label"
  9. item-value="value"
  10. :variant="variant"
  11. @update:model-value="$emit('update:model-value', $event)"
  12. />
  13. </template>
  14. <script setup lang="ts">
  15. import type { ComputedRef, PropType } from 'vue'
  16. import { useEnumFetch } from '~/composables/data/useEnumFetch'
  17. import ArrayUtils from '~/services/utils/arrayUtils'
  18. import type { Enum } from '~/types/data'
  19. const emit = defineEmits(['update:model-value'])
  20. const props = defineProps({
  21. modelValue: {
  22. type: String as PropType<string | null>,
  23. required: false,
  24. default: null,
  25. },
  26. enumName: {
  27. type: String,
  28. required: true,
  29. },
  30. field: {
  31. type: String,
  32. required: false,
  33. default: null,
  34. },
  35. label: {
  36. type: String,
  37. required: false,
  38. default: null,
  39. },
  40. /**
  41. * @see https://vuetifyjs.com/en/api/v-autocomplete/#props-variant
  42. */
  43. variant: {
  44. type: String as PropType<
  45. | 'filled'
  46. | 'outlined'
  47. | 'plain'
  48. | 'underlined'
  49. | 'solo'
  50. | 'solo-inverted'
  51. | 'solo-filled'
  52. | undefined
  53. >,
  54. required: false,
  55. default: 'outlined',
  56. },
  57. })
  58. const { fetch } = useEnumFetch()
  59. const { data: enumItems, status } = fetch(props.enumName)
  60. const items: ComputedRef<Array<Enum>> = computed(() => {
  61. if (!enumItems.value) {
  62. return []
  63. }
  64. return ArrayUtils.sortObjectsByProp(enumItems.value, 'label') as Array<Enum>
  65. })
  66. // Nettoyer les données lors du démontage du composant
  67. onBeforeUnmount(() => {
  68. // Nettoyer les références du store si nécessaire
  69. if (process.client) {
  70. clearNuxtData(props.enumName)
  71. // Forcer le garbage collection des objets Parameters
  72. enumItems.value = null
  73. }
  74. })
  75. </script>
  76. <style scoped lang="scss"></style>