DataTable.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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="collection.items"
  13. :server-items-length="collection.pagination.totalItems"
  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 setup lang="ts">
  41. import {ref, Ref, toRefs} from "@vue/reactivity";
  42. import {AnyJson} from "~/types/enum/data";
  43. import {useEntityFetch} from "~/composables/data/useEntityFetch";
  44. import ApiResource from "~/models/ApiResource";
  45. const props = defineProps({
  46. parent: {
  47. type: Object,
  48. required: true
  49. },
  50. model: {
  51. type: Object,
  52. required: true
  53. },
  54. headers: {
  55. type: Array,
  56. required: true
  57. }
  58. })
  59. const { parent, model, headers } = toRefs(props)
  60. const headersWithItem = computed(() => {
  61. return headers.value.map((header:any) => {
  62. header.item = 'item.' + header.value
  63. return header
  64. })
  65. })
  66. const totalEntries: Ref<number> = ref(0)
  67. const entries: Ref<Array<AnyJson>> = ref(Array<AnyJson>())
  68. const { fetchCollection } = useEntityFetch()
  69. const { data: collection, pending } = await fetchCollection(model.value as typeof ApiResource, parent.value as ApiResource)
  70. const itemId: Ref<number> = ref(0)
  71. const editItem = (item: AnyJson) => {
  72. itemId.value = item.id
  73. }
  74. </script>