ItemFromUri.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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
  7. v-if="pending"
  8. :type="loaderType"
  9. />
  10. <div v-else>
  11. <slot name="item.text" v-bind="{item}" />
  12. </div>
  13. <slot />
  14. </main>
  15. </template>
  16. <script setup lang="ts">
  17. // 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
  18. import {Query} from "pinia-orm";
  19. import UrlUtils from "~/services/utils/urlUtils";
  20. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  21. import {computed} from "@vue/reactivity";
  22. import type {ComputedRef} from "@vue/reactivity";
  23. import ApiResource from "~/models/ApiResource";
  24. const props = defineProps({
  25. uri: {
  26. type: String,
  27. required: false,
  28. default: null
  29. },
  30. model: {
  31. type: Object,
  32. required: true
  33. },
  34. query: {
  35. type: Object as () => Query,
  36. required: true
  37. },
  38. loaderType: {
  39. type: String,
  40. required: false,
  41. default: 'text'
  42. }
  43. })
  44. const id = UrlUtils.extractIdFromUri(props.uri)
  45. if (id === null) {
  46. throw new Error('Uri parsing error : no id found')
  47. }
  48. const { fetch } = useEntityFetch()
  49. const { data, pending } = fetch(props.model, id)
  50. const item: ComputedRef<ApiResource|null> = computed(() => {
  51. return data.value
  52. })
  53. </script>