DataTable.vue 1017 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <!--
  2. Template de base d'un tableau interactif
  3. @see https://vuetifyjs.com/en/components/data-tables/
  4. -->
  5. <template>
  6. <v-col cols="12" sm="12">
  7. <v-data-table :headers="headersWithItem" :items="items" class="elevation-1">
  8. <template
  9. v-for="(header, index) in headersWithItem"
  10. :key="index"
  11. #[header.item]="slotProps"
  12. >
  13. <slot :name="header.item" v-bind="slotProps">
  14. {{ slotProps.item[header.value] }}
  15. </slot>
  16. </template>
  17. </v-data-table>
  18. </v-col>
  19. </template>
  20. <script setup lang="ts">
  21. interface TableHeader {
  22. value: string
  23. item?: string
  24. [key: string]: unknown
  25. }
  26. const props = defineProps({
  27. items: {
  28. type: Array,
  29. required: true,
  30. },
  31. headers: {
  32. type: Array as PropType<TableHeader[]>,
  33. required: true,
  34. },
  35. })
  36. const { headers } = toRefs(props)
  37. const headersWithItem = computed(() => {
  38. return headers.value.map((header: TableHeader) => {
  39. header.item = 'item.' + header.value
  40. return header
  41. })
  42. })
  43. </script>