Resource.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <UiInputTreeSelect
  3. :model-value="modelValue"
  4. :items="content"
  5. :label="$t(label)"
  6. v-bind="$attrs"
  7. :loading="status === FETCHING_STATUS.PENDING"
  8. :max-visible-chips="maxVisibleChips"
  9. :nb-level="nbLevel"
  10. @update:model-value="$emit('update:modelValue', $event)"
  11. />
  12. </template>
  13. <script setup lang="ts">
  14. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  15. import { FETCHING_STATUS } from '~/types/enum/data'
  16. import type { PropType } from 'vue'
  17. import type ApiResource from '~/models/ApiResource'
  18. import { useI18nUtils } from '~/composables/utils/useI18nUtils'
  19. import ArrayUtils from '~/services/utils/arrayUtils'
  20. const props = defineProps({
  21. modelValue: {
  22. type: Array as PropType<string[]>,
  23. required: true,
  24. },
  25. /**
  26. * ResourceTree qui sera fetch
  27. */
  28. model: {
  29. type: Object as PropType<typeof ApiResource>,
  30. required: true,
  31. },
  32. /**
  33. * Label du champ
  34. * Si non défini, c'est le nom de propriété qui est utilisé
  35. */
  36. label: {
  37. type: String,
  38. required: false,
  39. default: null,
  40. },
  41. /**
  42. * Si true, traduit les items du ResourceTree
  43. */
  44. translate: {
  45. type: Boolean,
  46. default: true,
  47. },
  48. /**
  49. * Si true, trie les items du ResourceTree par ordre alphabétique
  50. */
  51. sort: {
  52. type: Boolean,
  53. default: false,
  54. },
  55. /**
  56. * Nombre de puces maximum à afficher
  57. */
  58. maxVisibleChips: {
  59. type: Number,
  60. required: false,
  61. default: 6,
  62. },
  63. // TODO: revoir si nécessaire
  64. nbLevel: {
  65. type: Number,
  66. required: false,
  67. default: 3,
  68. validator: (value: number) => {
  69. return value > 0 && value <= 3
  70. },
  71. },
  72. })
  73. const i18nUtils = useI18nUtils()
  74. const { fetch } = useEntityFetch()
  75. const { data: tree, status } = fetch(props.model)
  76. const content = computed(
  77. () => {
  78. if (status.value !== FETCHING_STATUS.SUCCESS || !tree.value) {
  79. return []
  80. }
  81. let content = tree.value.content
  82. if (props.translate) {
  83. content = i18nUtils.translateResourceTree(content)
  84. }
  85. if (props.sort) {
  86. content = ArrayUtils.sortResourceTree(content)
  87. }
  88. return content
  89. }
  90. )
  91. </script>
  92. <style scoped lang="scss">
  93. /* No specific styles needed */
  94. </style>