Enum.vue 2.0 KB

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