ItemFromUri.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 le l'entity manager
  18. import {Query} from "pinia-orm";
  19. import Url from "~/services/utils/url";
  20. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  21. import {object} from "@ucast/core";
  22. import {computed, ComputedRef} from "@vue/reactivity";
  23. import {schema} from "@pinia-orm/normalizr";
  24. import ApiResource from "~/models/ApiResource";
  25. const props = defineProps({
  26. uri: {
  27. type: String,
  28. required: false,
  29. default: null
  30. },
  31. model: {
  32. type: Object,
  33. required: true
  34. },
  35. query: {
  36. type: Object as () => Query,
  37. required: true
  38. },
  39. loaderType: {
  40. type: String,
  41. required: false,
  42. default: 'text'
  43. }
  44. })
  45. const id = Url.extractIdFromUri(props.uri)
  46. if (id === null) {
  47. throw new Error('Uri parsing error : no id found')
  48. }
  49. const { fetch } = useEntityFetch()
  50. const { data, pending } = fetch(props.model, id)
  51. const item: ComputedRef<ApiResource|null> = computed(() => {
  52. return data.value
  53. })
  54. </script>