Collection.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <!-- Permet de requêter une subResource et de donner son contenu à un slot -->
  2. <template>
  3. <main>
  4. <v-skeleton-loader v-if="pending" :type="loaderType" />
  5. <div v-else>
  6. <!-- Content -->
  7. <slot name="list.item" v-bind="{items}" />
  8. <!-- New button -->
  9. <v-btn v-if="newLink" class="theme-primary float-right">
  10. <NuxtLink :to="newLink" class="no-decoration">
  11. <v-icon>fa-plus-circle</v-icon>
  12. <span>{{$t('add')}}</span>
  13. </NuxtLink>
  14. </v-btn>
  15. </div>
  16. <slot />
  17. </main>
  18. </template>
  19. <script setup lang="ts">
  20. import {computed, ComputedRef, toRefs, ToRefs} from "@vue/reactivity";
  21. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  22. import {Collection} from "~/types/data";
  23. const props = defineProps({
  24. model: {
  25. type: Object,
  26. required: true
  27. },
  28. parent: {
  29. type: Object,
  30. required: false
  31. },
  32. loaderType: {
  33. type: String,
  34. required: false,
  35. default: 'text'
  36. },
  37. newLink: {
  38. type: String,
  39. required: false
  40. }
  41. })
  42. const { model, parent }: ToRefs = toRefs(props)
  43. const { fetchCollection } = useEntityFetch()
  44. const { data: collection, pending } = await fetchCollection(model.value, parent.value)
  45. const items: ComputedRef<Collection> = computed(() => collection.value ?? { items: [], pagination: {}, totalItems: 0 })
  46. </script>