Skip to content

Commit aa66ae9

Browse files
committed
Added rowClicked (event), graphic fixes
1 parent a44aecf commit aa66ae9

File tree

5 files changed

+43
-18
lines changed

5 files changed

+43
-18
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ data retrieves the field value
8585
| --- | --- |
8686
| updateSortable | emit the sortable field/fields |
8787
| changePage | emit the page change |
88-
| checkRow | emit the row item |
88+
| checkRow | emit the row item when user click on row checkbox |
89+
| rowClicked | emit the row item when user click on row |
90+
91+
##### Notes
92+
93+
##### Any __@click__ event of elements within the row triggers the rowClicked event, to get around this we need to __use @click.stop to prevent the propagation of the event__
8994

9095
<hr>
9196

@@ -94,7 +99,7 @@ data retrieves the field value
9499

95100
| Props | Description |
96101
| --- | --- |
97-
| key | Th Title |
102+
| key | th Title |
98103
| label | index of value |
99104
| sortable | the default setting is false, if set to true a symbol appears for sorting |
100105
| thStyle | used for overwrite the th style |

dev/App.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
<template>
22
<div class="pb-36">
3-
43
<div class="flex max-w-2xl mx-auto mb-10 space-x-4 sm:mt-10">
5-
<div class="flex flex-col items-center flex-grow">
4+
<div class="flex flex-col flex-grow">
65
<div class="font-semibold mb-2">
76
Tailwind Vue DataTable
87
<span class="text-xs font-light">by BitTheCat</span>
@@ -18,6 +17,6 @@
1817
<script>
1918
import { defineComponent } from 'vue';
2019
export default defineComponent({
21-
name: 'App',
20+
name: 'App',
2221
});
2322
</script>

dev/TableShow.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
<template>
22
<div>
33
<div class="mb-3">
4-
<span class="text-xs "> Simple </span>
4+
<span class="text-xs"> Simple </span>
55
<TVTable
66
ref="tvtTableSimple"
77
:items="cloneItems"
88
:fields="fieldsSimple"
99
enable-check
1010
@check-row="checkRow"
11+
@row-clicked="checkRow"
1112
/>
1213
</div>
1314
<hr>
@@ -24,10 +25,11 @@
2425
enable-check
2526
@change-page="changePage"
2627
@check-row="checkRow"
28+
@row-clicked="checkRow"
2729
>
2830
<template #cell:username="row">
2931
{{ row.item.emoji }} - {{ row.item.username }}
30-
<input id="checkbox" :checked="row.item._showDetails" type="checkbox" @change="row.toggleDetails(row.item)" />
32+
<input id="checkbox" :checked="row.item._showDetails" type="checkbox" @click.stop="row.toggleDetails(row.item)" />
3133
</template>
3234

3335
<template #row-details>
@@ -96,7 +98,6 @@ const items = ref([
9698
username: 'cat',
9799
98100
emoji: '🐈',
99-
_showDetails: true
100101
},
101102
{
102103
id: '2',

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.4",
3+
"version": "0.1.5",
44
"keywords": [
55
"tailwindcss",
66
"vue",

src/components/TVTable.vue

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@
5252
</tr>
5353
</thead>
5454
<tbody class="px-2 py-1.5 text-left text-xs font-medium border">
55-
<template v-for="(item) in items" :key="item.label">
55+
<template v-for="(item, index) in items" :key="item.label">
5656
<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"
57+
class="divide-x divide-y last:border-b-0 px-2 py-1.5 text-left text-xs font-medium border hover:bg-gray-400/50"
58+
:class="index % 2 ? 'bg-gray-300/50' : 'bg-gray-100/50'"
59+
@click="rowClicked(item)"
5860
>
5961
<td
6062
v-if="enableCheck"
6163
:key="`check_${item.label}`"
6264
class="px-2 py-1.5 align-top lg:table-cell last:border-b-0"
6365
>
64-
<input id="checkbox" v-model="selectedRow" :value="item" type="checkbox" @change="emit('checkRow', item)" />
66+
<input id="checkbox" v-model="selectedRows" :value="item" type="checkbox" @click.stop="emit('checkRow', item)" />
6567
</td>
6668

6769
<td
@@ -81,10 +83,13 @@
8183
</slot>
8284
</td>
8385
</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>
86+
<tr
87+
v-if="item._showDetails"
88+
:class="index % 2 ? 'bg-gray-300/50' : 'bg-gray-100/50'"
89+
>
90+
<td :colspan="enableCheck ? fields.length + 1 : fields.length">
91+
<slot name="row-details" :item="item" />
92+
</td>
8893
</tr>
8994
</template>
9095
</tbody>
@@ -132,7 +137,12 @@ const props = defineProps({
132137
enableCheck: Boolean,
133138
})
134139
135-
const emit = defineEmits(['updateSortable', 'changePage', 'checkRow'])
140+
const emit = defineEmits([
141+
'updateSortable',
142+
'changePage',
143+
'checkRow',
144+
'rowClicked'
145+
])
136146
137147
138148
const localTotalRows = computed(() => {
@@ -152,7 +162,17 @@ const toggleDetails = (value) => {
152162
}
153163
154164
const sortable = ref({})
155-
const selectedRow = ref([])
165+
const selectedRows = ref([])
166+
167+
const rowClicked = (item) => {
168+
if (selectedRows.value.includes(item)) {
169+
let index = selectedRows.value.indexOf(item)
170+
selectedRows.value.splice(index, 1)
171+
} else {
172+
selectedRows.value.push(item)
173+
}
174+
emit('rowClicked', item)
175+
}
156176
157177
const updateSortable = (key, sort) => {
158178
props.multipleSortable

0 commit comments

Comments
 (0)