AutocompleteWithEnum.vue 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <template>
  2. <UiInputAutocomplete
  3. :model-value="modelValue"
  4. :field="field"
  5. :items="items"
  6. :is-loading="pending"
  7. :return-object="false"
  8. item-title="label"
  9. item-value="value"
  10. @update:model-value="$emit('update:model-value', $event)"
  11. />
  12. </template>
  13. <script setup lang="ts">
  14. import {useEnumFetch} from "~/composables/data/useEnumFetch";
  15. import ArrayUtils from "~/services/utils/arrayUtils";
  16. import {ComputedRef} from "@vue/reactivity";
  17. import {Enum} from "~/types/data";
  18. import {PropType} from "@vue/runtime-core";
  19. const props = defineProps({
  20. modelValue: {
  21. type: String as PropType<string | null>,
  22. required: false,
  23. default: null
  24. },
  25. enumName: {
  26. type: String,
  27. required: true
  28. },
  29. field: {
  30. type: String,
  31. required: false,
  32. default: null
  33. },
  34. label: {
  35. type: String,
  36. required: false,
  37. default: null
  38. }
  39. })
  40. const { fetch } = useEnumFetch()
  41. const { data: enumItems, pending } = fetch(props.enumName)
  42. const items: ComputedRef<Array<Enum>> = computed(() => {
  43. if (!enumItems.value) {
  44. return []
  45. }
  46. return ArrayUtils.sortObjectsByProp(enumItems.value, 'label') as Array<Enum>
  47. })
  48. </script>
  49. <style scoped lang="scss">
  50. </style>