DataTable.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <!--
  2. Tableau interactif
  3. @see https://vuetifyjs.com/en/components/data-tables/
  4. -->
  5. <template>
  6. <v-col
  7. cols="12"
  8. sm="12"
  9. >
  10. <v-data-table
  11. :headers="headersWithItem"
  12. :items="entries"
  13. :server-items-length="totalEntries"
  14. :loading="$fetchState.pending"
  15. class="elevation-1"
  16. >
  17. <template v-for="header in headersWithItem" #[header.item]="props">
  18. <slot :name="header.item" v-bind="props">
  19. {{ props.item[header.value] }}
  20. </slot>
  21. </template>
  22. <template #item.actions="{ item }">
  23. <v-icon
  24. small
  25. class="mr-2"
  26. @click="editItem(item)"
  27. >
  28. mdi-pencil
  29. </v-icon>
  30. <v-icon
  31. small
  32. @click="deleteItem(item)"
  33. >
  34. mdi-delete
  35. </v-icon>
  36. </template>
  37. </v-data-table>
  38. </v-col>
  39. </template>
  40. <script lang="ts">
  41. import { defineComponent, ref, useContext, useFetch, computed, toRefs, Ref } from '@nuxtjs/composition-api'
  42. import { Query } from '@vuex-orm/core'
  43. import { AnyJson } from '~/types/interfaces'
  44. import { queryHelper } from '~/services/store/query'
  45. import { QUERY_TYPE } from '~/types/enums'
  46. export default defineComponent({
  47. props: {
  48. rootModel: {
  49. type: Function,
  50. required: true
  51. },
  52. rootId: {
  53. type: Number,
  54. required: true
  55. },
  56. model: {
  57. type: Function,
  58. required: true
  59. },
  60. query: {
  61. type: Object as () => Query,
  62. required: true
  63. },
  64. headers: {
  65. type: Array,
  66. required: true
  67. }
  68. },
  69. setup (props) {
  70. const { rootModel, rootId, model, headers, query } = toRefs(props)
  71. const headersWithItem = computed(() => {
  72. return headers.value.map((header:any) => {
  73. header.item = 'item.' + header.value
  74. return header
  75. })
  76. })
  77. const totalEntries:Ref<number> = ref(0)
  78. const entries:Ref<Array<AnyJson>> = ref(Array<AnyJson>())
  79. const { $dataProvider } = useContext()
  80. useFetch(async () => {
  81. await $dataProvider.invoke({
  82. type: QUERY_TYPE.MODEL,
  83. model: model.value,
  84. rootModel: rootModel.value,
  85. rootId: rootId.value
  86. })
  87. entries.value = queryHelper.getFlattenEntries(query.value)
  88. totalEntries.value = entries.value.length
  89. })
  90. const itemId:Ref<number> = ref(0)
  91. const editItem = (item: AnyJson) => {
  92. itemId.value = item.id
  93. }
  94. return {
  95. entries,
  96. totalEntries,
  97. headersWithItem,
  98. editItem,
  99. itemId
  100. }
  101. }
  102. })
  103. </script>