SubResource.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <!-- Permet de requêter une subResource et de donner son contenu à un slot -->
  2. <template>
  3. <main>
  4. <v-skeleton-loader
  5. v-if="$fetchState.pending"
  6. :type="loaderType"
  7. />
  8. <div v-else>
  9. <slot name="list.item" v-bind="{items}" />
  10. <v-btn v-if="newLink" class="ot_white--text ot_green float-right">
  11. <NuxtLink :to="newLink" class="no-decoration">
  12. <v-icon>fa-plus-circle</v-icon>
  13. <span>{{$t('add')}}</span>
  14. </NuxtLink>
  15. </v-btn>
  16. </div>
  17. <slot />
  18. </main>
  19. </template>
  20. <script lang="ts">
  21. import {
  22. defineComponent, computed, useContext, useFetch, toRefs, ToRefs, ComputedRef
  23. } from '@nuxtjs/composition-api'
  24. import { Query } from '@vuex-orm/core'
  25. import { Collection } from '@vuex-orm/core/dist/src/data/Data'
  26. import { queryHelper } from '~/services/store/query'
  27. import { QUERY_TYPE } from '~/types/enums'
  28. export default defineComponent({
  29. props: {
  30. rootModel: {
  31. type: Function,
  32. required: true
  33. },
  34. rootId: {
  35. type: Number,
  36. required: true
  37. },
  38. model: {
  39. type: Function,
  40. required: true
  41. },
  42. query: {
  43. type: Object as () => Query,
  44. required: true
  45. },
  46. loaderType: {
  47. type: String,
  48. required: false,
  49. default: 'text'
  50. },
  51. newLink: {
  52. type: String,
  53. required: false
  54. }
  55. },
  56. setup (props) {
  57. const { rootModel, rootId, model, query }: ToRefs = toRefs(props)
  58. const { $dataProvider } = useContext()
  59. useFetch(async () => {
  60. await $dataProvider.invoke({
  61. type: QUERY_TYPE.MODEL,
  62. model: model.value,
  63. rootModel: rootModel.value,
  64. rootId: rootId.value
  65. })
  66. })
  67. const items: ComputedRef<Collection> = computed(() => queryHelper.getCollection(query.value))
  68. return {
  69. items
  70. }
  71. }
  72. })
  73. </script>