ItemFromUri.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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="$fetchState.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 lang="ts">
  17. import { defineComponent, useFetch, useContext, ComputedRef, computed } from '@nuxtjs/composition-api'
  18. import {QUERY_TYPE} from "~/types/enums";
  19. import { Query } from '@vuex-orm/core'
  20. import { Item } from '@vuex-orm/core/dist/src/data/Data'
  21. import ModelsUtils from "~/services/utils/modelsUtils";
  22. import {queryHelper} from "~/services/store/query";
  23. export default defineComponent({
  24. props: {
  25. uri: {
  26. type: String,
  27. required: false,
  28. default: null
  29. },
  30. model: {
  31. type: Function,
  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. setup (props) {
  45. const { $dataProvider } = useContext()
  46. const getIdFromUri = (uri: string) => {
  47. return ModelsUtils.extractIdFromUri(uri)
  48. }
  49. const id = getIdFromUri(props.uri)
  50. useFetch(async () => {
  51. await $dataProvider.invoke({
  52. type: QUERY_TYPE.MODEL,
  53. model: props.model,
  54. id: id
  55. })
  56. })
  57. const item: ComputedRef<Item|null> = computed(() => {
  58. if(id)
  59. return queryHelper.getItem(props.query, id)
  60. else return null
  61. })
  62. return {
  63. item
  64. }
  65. }
  66. })
  67. </script>