ItemFromUri.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <!--
  2. Espace permettant de récupérer un item via une uri et de gérer son affichage via un slot
  3. -->
  4. <template>
  5. <main>
  6. <v-skeleton-loader v-if="pending" :type="loaderType" />
  7. <div v-else>
  8. <slot name="item.text" v-bind="{ item }" />
  9. </div>
  10. <slot />
  11. </main>
  12. </template>
  13. <script setup lang="ts">
  14. // TODO: renommer en EntityFromUri? voir si ce component est encore nécessaire, ou si ça ne peut pas être une méthode de l'entity manager
  15. import type { Query } from 'pinia-orm'
  16. import { computed } from 'vue'
  17. import type { ComputedRef } from 'vue'
  18. import UrlUtils from '~/services/utils/urlUtils'
  19. import { useEntityFetch } from '~/composables/data/useEntityFetch'
  20. import type ApiResource from '~/models/ApiResource'
  21. const props = defineProps({
  22. uri: {
  23. type: String,
  24. required: false,
  25. default: null,
  26. },
  27. model: {
  28. type: Object,
  29. required: true,
  30. },
  31. query: {
  32. type: Object as () => Query,
  33. required: true,
  34. },
  35. loaderType: {
  36. type: String,
  37. required: false,
  38. default: 'text',
  39. },
  40. })
  41. const id = UrlUtils.extractIdFromUri(props.uri)
  42. if (id === null) {
  43. throw new Error('Uri parsing error : no id found')
  44. }
  45. const { fetch } = useEntityFetch()
  46. const { data, pending } = fetch(props.model, id)
  47. const item: ComputedRef<ApiResource | null> = computed(() => {
  48. return data.value
  49. })
  50. </script>