Skip to content

Commit a44aecf

Browse files
committed
Added Row Details
1 parent 759197e commit a44aecf

File tree

4 files changed

+69
-36
lines changed

4 files changed

+69
-36
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ import { TVTable } from '@bitthecat/tailwind-vue-data-table'
3333
- Select row column (with checkbox) ✔️
3434

3535
<img src="https://github.com/BitTheCat/tailwind-vue-data-table/blob/main/assets/tvtable_checkbox.jpg"/>
36-
- Row detail
36+
- Row detail ✔️
37+
3738
- Row Clicked event
39+
3840
- ...
3941
<hr>
4042

@@ -98,4 +100,5 @@ data retrieves the field value
98100
| thStyle | used for overwrite the th style |
99101
| tdStyle | used for overwrite the td style |
100102
| thClass | used for overwrite the th class |
101-
| tdClass | used for overwrite the td class |
103+
| tdClass | used for overwrite the td class |
104+
| _showDetails | used for show row details (default false) |

dev/TableShow.vue

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
<div class="mb-3">
44
<span class="text-xs "> Simple </span>
55
<TVTable
6-
:items="items"
6+
ref="tvtTableSimple"
7+
:items="cloneItems"
78
:fields="fieldsSimple"
9+
enable-check
10+
@check-row="checkRow"
811
/>
912
</div>
1013
<hr>
1114
<div>
1215
<span class="text-xs">With Props</span>
1316
<TVTable
17+
ref="tvtTableProps"
1418
v-model:currentPage="currentPage"
1519
:items="filterItems"
1620
:fields="fields"
@@ -21,8 +25,13 @@
2125
@change-page="changePage"
2226
@check-row="checkRow"
2327
>
24-
<template #cell:username="{ item }">
25-
{{ item.emoji }} - {{ item.username }}
28+
<template #cell:username="row">
29+
{{ row.item.emoji }} - {{ row.item.username }}
30+
<input id="checkbox" :checked="row.item._showDetails" type="checkbox" @change="row.toggleDetails(row.item)" />
31+
</template>
32+
33+
<template #row-details>
34+
ROW-DETAILS ROW-DETAILS ROW-DETAILS
2635
</template>
2736
</TVTable>
2837
Selected:
@@ -54,7 +63,7 @@ const fields = ref([
5463
thStyle: 'background: lightblue',
5564
thClass: 'text-white',
5665
tdClass: 'text-center',
57-
sortable: true
66+
sortable: true,
5867
},
5968
{
6069
label: 'email',
@@ -86,7 +95,8 @@ const items = ref([
8695
id: '1',
8796
username: 'cat',
8897
89-
emoji: '🐈'
98+
emoji: '🐈',
99+
_showDetails: true
90100
},
91101
{
92102
id: '2',
@@ -108,13 +118,15 @@ const perPage = ref(2)
108118
109119
const filterItems = ref(items.value.slice(0, 1 * perPage.value))
110120
121+
const cloneItems = JSON.parse(JSON.stringify(items.value))
122+
111123
const changePage = (values) => {
112124
filterItems.value = items.value.slice(values.from, values.to)
113125
}
114126
115127
const selectRow = ref([])
128+
116129
const checkRow = (value) => {
117-
console.log(selectRow.value.includes(value))
118130
if (selectRow.value.includes(value)) {
119131
let index = selectRow.value.indexOf(value)
120132
selectRow.value.splice(index, 1)

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@bitthecat/tailwind-vue-data-table",
3-
"version": "0.1.3",
3+
"version": "0.1.4",
44
"keywords": [
55
"tailwindcss",
66
"vue",

src/components/TVTable.vue

Lines changed: 45 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,31 +52,41 @@
5252
</tr>
5353
</thead>
5454
<tbody class="px-2 py-1.5 text-left text-xs font-medium border">
55-
<tr
56-
v-for="(item) in items"
57-
:key="item.label"
58-
class="divide-x divide-y last:border-b-0 px-2 py-1.5 text-left text-xs font-medium border odd:bg-gray-300/50 even:bg-gray-100/50 hover:bg-gray-400/50"
59-
>
60-
<td
61-
v-if="enableCheck"
62-
:key="`check_${item.label}`"
63-
class="px-2 py-1.5 align-top lg:table-cell last:border-b-0"
55+
<template v-for="(item) in items" :key="item.label">
56+
<tr
57+
class="divide-x divide-y last:border-b-0 px-2 py-1.5 text-left text-xs font-medium border odd:bg-gray-300/50 even:bg-gray-100/50 hover:bg-gray-400/50"
6458
>
65-
<input id="checkbox" v-model="selectedRow" :value="item" type="checkbox" @change="emit('checkRow', item)" />
66-
</td>
59+
<td
60+
v-if="enableCheck"
61+
:key="`check_${item.label}`"
62+
class="px-2 py-1.5 align-top lg:table-cell last:border-b-0"
63+
>
64+
<input id="checkbox" v-model="selectedRow" :value="item" type="checkbox" @change="emit('checkRow', item)" />
65+
</td>
6766

68-
<td
69-
v-for="field in fields"
70-
:key="field.key"
71-
class="px-2 py-1.5 align-top lg:table-cell last:border-b-0"
72-
:class="field.tdClass"
73-
:style="field.tdStyle"
74-
>
75-
<slot :item="item" :data="getField(item, field.key)" :name="`cell:${field.label}`">
76-
{{ getField(item, field.key) }}
77-
</slot>
78-
</td>
79-
</tr>
67+
<td
68+
v-for="field in fields"
69+
:key="field.key"
70+
class="px-2 py-1.5 align-top lg:table-cell last:border-b-0"
71+
:class="field.tdClass"
72+
:style="field.tdStyle"
73+
>
74+
<slot
75+
:name="`cell:${field.label}`"
76+
:item="item"
77+
:data="getField(item, field.key)"
78+
:toggle-details="toggleDetails"
79+
>
80+
{{ getField(item, field.key, '') }}
81+
</slot>
82+
</td>
83+
</tr>
84+
<tr v-if="item._showDetails">
85+
<td :colspan="enableCheck ? fields.length + 1 : fields.length">
86+
<slot name="row-details" :item="item" />
87+
</td>
88+
</tr>
89+
</template>
8090
</tbody>
8191
</table>
8292

@@ -89,7 +99,7 @@
8999
</template>
90100

91101
<script setup>
92-
import {defineComponent, ref, watch} from 'vue';
102+
import {computed, defineComponent, ref, watch} from 'vue';
93103
import TVPagination from './TVPagination.vue';
94104
95105
defineComponent({
@@ -124,13 +134,21 @@ const props = defineProps({
124134
125135
const emit = defineEmits(['updateSortable', 'changePage', 'checkRow'])
126136
127-
const localTotalRows = ref(props.totalRows || props.items.length || 0)
137+
138+
const localTotalRows = computed(() => {
139+
return props.totalRows || props.items.length || 0
140+
})
141+
128142
const fromRow = ref(0)
129143
const toRow = ref(0)
130144
const localCurrentPage = ref(props.currentPage)
131145
132-
const getField = (item, field) => {
133-
return item[field]
146+
const getField = (item, field, def) => {
147+
return item[field] || def
148+
}
149+
150+
const toggleDetails = (value) => {
151+
return value._showDetails = !value._showDetails
134152
}
135153
136154
const sortable = ref({})

0 commit comments

Comments
 (0)