Skip to content

Commit 83ac6ce

Browse files
committed
Added first version of data table
1 parent 5890db4 commit 83ac6ce

File tree

17 files changed

+4224
-1
lines changed

17 files changed

+4224
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

README.md

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,63 @@
1-
# tailwind-vue-data-table
1+
# Tailwind Vue Data Table
2+
3+
<img src="tvdatatable.jpg"/>
4+
5+
### Next additions
6+
- Select row column (with checkbox)
7+
- Row detail
8+
- ...
9+
<hr>
10+
11+
## Table
12+
### Props
13+
14+
| Props | Default | Description |
15+
| --- | --- | --- |
16+
| multipleSortable | false | enables multiple sortable for table header |
17+
### Slots
18+
19+
| Props | Description |
20+
| --- | --- |
21+
| items | table data |
22+
| fields | data fields |
23+
| #cell:FIELD_NAME | used for overwrite |
24+
25+
26+
slot 'cell:' has item or data props
27+
28+
item retrieves the row value
29+
30+
``` html
31+
<template #cell:username="{ item }">
32+
{{ item.emoji }} - {{ item.username }}
33+
</template>
34+
```
35+
36+
data retrieves the field value
37+
38+
``` html
39+
<template #cell:username="{ data }">
40+
{{ data }}
41+
</template>
42+
```
43+
44+
### Events
45+
46+
| Event | Description |
47+
| --- | --- |
48+
| updateSortable | emit the sortable field/fields |
49+
50+
<hr>
51+
52+
## Fields
53+
### Props
54+
55+
| Props | Description |
56+
| --- | --- |
57+
| key | Th Title |
58+
| label | index of value |
59+
| sortable | the default setting is false, if set to true a symbol appears for sorting |
60+
| thStyle | used for overwrite the th style |
61+
| tdStyle | used for overwrite the td style |
62+
| thClass | used for overwrite the th class |
63+
| tdClass | used for overwrite the td class |

dev/App.vue

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<template>
2+
<div class="pb-36">
3+
4+
<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">
6+
<div class="font-semibold mb-2">
7+
Tailwind Vue DataTable
8+
<span class="text-xs font-light">by BitTheCat</span>
9+
</div>
10+
<div>
11+
<router-view />
12+
</div>
13+
</div>
14+
</div>
15+
</div>
16+
</template>
17+
18+
<script>
19+
import { defineComponent } from 'vue';
20+
export default defineComponent({
21+
name: 'App',
22+
});
23+
</script>

dev/Table.vue

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<template>
2+
<div class="grid gap-4">
3+
<span class="text-xs"> Simple </span>
4+
<TVDataTable
5+
:items="items"
6+
:fields="fieldsSimple"
7+
>
8+
</TVDataTable>
9+
10+
<hr>
11+
12+
<span class="text-xs">With Props</span>
13+
<TVDataTable
14+
:items="items"
15+
:fields="fields"
16+
multiple-sortable
17+
>
18+
<template #cell:username="{ item }">
19+
{{ item.emoji }} - {{ item.username }}
20+
</template>
21+
</TVDataTable>
22+
23+
24+
</div>
25+
</template>
26+
27+
<script setup>
28+
import { defineComponent, ref } from 'vue';
29+
import TVDataTable from '../src/components/TVDataTable.vue';
30+
31+
defineComponent({
32+
name: 'Table',
33+
})
34+
35+
const fields = ref([
36+
{
37+
label: 'id',
38+
key: 'id',
39+
thStyle: 'width: 30px',
40+
sortable: true
41+
},
42+
{
43+
label: 'username',
44+
key: 'username',
45+
thStyle: 'background: lightblue',
46+
thClass: 'text-white',
47+
tdClass: 'text-center',
48+
sortable: true
49+
},
50+
{
51+
label: 'email',
52+
key: 'email',
53+
tdClass: 'bg-indigo-300'
54+
},
55+
])
56+
57+
const fieldsSimple = ref([
58+
{
59+
label: 'id',
60+
key: 'id',
61+
sortable: true
62+
},
63+
{
64+
label: 'username',
65+
key: 'username',
66+
sortable: true
67+
},
68+
{
69+
label: 'email',
70+
key: 'email',
71+
},
72+
])
73+
74+
75+
const items = ref([
76+
{
77+
id: '1',
78+
username: 'cat',
79+
80+
emoji: '🐈'
81+
},
82+
{
83+
id: '2',
84+
username: 'dog',
85+
86+
emoji: '🐕'
87+
},
88+
{
89+
id: '3',
90+
username: 'bird',
91+
92+
emoji: '🐦'
93+
},
94+
])
95+
96+
</script>

dev/main.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import '../src/css/app.css';
2+
import { createApp } from 'vue';
3+
4+
import App from './App.vue';
5+
6+
import router from './router';
7+
8+
const app = createApp(App);
9+
10+
app.use(router);
11+
12+
app.mount('#app');

dev/router.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { createRouter, createWebHistory } from 'vue-router';
2+
3+
import Table from './Table.vue'
4+
5+
const routes = [
6+
{ path: '/', component: Table },
7+
];
8+
9+
const router = createRouter({
10+
history: createWebHistory(),
11+
routes,
12+
});
13+
14+
export default router;

index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>Tailwind Vue DataTable</title>
7+
</head>
8+
<body>
9+
<div id="app"></div>
10+
<script type="module" src="/dev/main.ts"></script>
11+
</body>
12+
</html>

0 commit comments

Comments
 (0)