Skip to content

Commit 638a555

Browse files
committed
✨ Make BaseTable sortable
1 parent 088e062 commit 638a555

File tree

3 files changed

+68
-21
lines changed

3 files changed

+68
-21
lines changed

src/components/UI/BaseTable.vue

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div v-if="data" class="table-responsive">
2+
<div v-if="sortedData" class="table-responsive">
33
<base-dialog
44
:show="!!delId"
55
title="Biztosan törölni akarod?"
@@ -15,25 +15,32 @@
1515
<table class="table table-hover">
1616
<thead>
1717
<tr>
18-
<th scope="col">#</th>
19-
<th v-for="head in headers" :key="head" scope="col">{{ head }}</th>
20-
<th v-if="editable">SZERK</th>
21-
<th v-if="deletable">TÖR</th>
18+
<th v-for="head in headers" :key="head" scope="col" @click="setSort(head)">
19+
<span class="mr-2">{{ head }}</span>
20+
<fa-icon v-if="sort === head && type === 1" icon="caret-up"></fa-icon>
21+
<fa-icon v-else-if="sort === head" icon="caret-down"></fa-icon>
22+
</th>
23+
<th v-if="editable || deletable"></th>
2224
</tr>
2325
</thead>
2426
<tbody>
25-
<tr v-for="(row, i) in data" :key="i">
26-
<td scope="row">{{ i + 1 }}</td>
27+
<tr v-for="(row, i) in sortedData" :key="i">
2728
<td v-for="head in headers" :key="head + i">
2829
{{ row[head] ? row[head] : row[head] === 0 ? 0 : '-' }}
2930
</td>
30-
<td v-if="editable" class="text-center">
31-
<base-button type="outline-warning btn-sm" @click="edit(row[editable])">
31+
<td v-if="editable || deletable" class="text-center">
32+
<base-button
33+
v-if="editable"
34+
type="outline-warning btn-sm mx-1"
35+
@click="edit(row[editable])"
36+
>
3237
<fa-icon icon="edit"></fa-icon>
3338
</base-button>
34-
</td>
35-
<td v-if="deletable" class="text-center">
36-
<base-button type="outline-danger btn-sm" @click="delId = row[editable]">
39+
<base-button
40+
v-if="deletable"
41+
type="outline-danger btn-sm"
42+
@click="delId = row[editable]"
43+
>
3744
<fa-icon :icon="['far', 'trash-alt']"></fa-icon>
3845
</base-button>
3946
</td>
@@ -46,7 +53,7 @@
4653

4754
<script>
4855
// TODO szűrő, és akár rendezés nyilakkal
49-
import { ref } from 'vue';
56+
import { computed, ref } from 'vue';
5057
export default {
5158
name: 'BaseTable',
5259
props: {
@@ -58,7 +65,7 @@ export default {
5865
emits: ['edit', 'delete'],
5966
setup(props, context) {
6067
const delId = ref(0);
61-
const headers = ref([]);
68+
const headers = ref(['#']);
6269
function getHeaders() {
6370
for (const x of props.data) {
6471
for (const y in x) {
@@ -76,7 +83,33 @@ export default {
7683
delId.value = 0;
7784
}
7885
79-
return { headers, getHeaders, edit, del, delId };
86+
const sortedData = computed(() => {
87+
let ret = [];
88+
props.data.forEach((item, index) => {
89+
ret.push({ ...item, '#': index + 1 });
90+
});
91+
if (sort.value) {
92+
ret = ret.sort((a, b) => {
93+
return a[sort.value] === b[sort.value]
94+
? 0
95+
: a[sort.value] > b[sort.value]
96+
? type.value
97+
: -1 * type.value;
98+
});
99+
}
100+
return ret;
101+
});
102+
103+
const sort = ref();
104+
const type = ref(1);
105+
function setSort(head) {
106+
if (sort.value !== head) {
107+
sort.value = head;
108+
type.value = 1;
109+
} else type.value = type.value === 1 ? -1 : 1;
110+
}
111+
112+
return { headers, getHeaders, edit, del, delId, sort, setSort, type, sortedData };
80113
},
81114
watch: {
82115
data() {
@@ -87,10 +120,20 @@ export default {
87120
</script>
88121

89122
<style lang="scss" scoped>
90-
td {
91-
vertical-align: middle;
92-
}
93-
th {
94-
text-align: center;
123+
table {
124+
user-select: none;
125+
-webkit-user-select: none;
126+
-ms-user-select: none;
127+
td {
128+
vertical-align: middle;
129+
}
130+
th {
131+
vertical-align: middle;
132+
text-align: center;
133+
span,
134+
svg {
135+
cursor: pointer;
136+
}
137+
}
95138
}
96139
</style>

src/components/admin/AdminUser.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default {
3737
id: user.id,
3838
Név: user.name,
3939
'E-mail cím': user.email,
40-
Jogosultság: user.role < 6 ? roleEnum[user.role] : user.role,
40+
Jogosultság: `${user.role} ${roleEnum[user.role] ? '- ' + roleEnum[user.role] : ''}`,
4141
'Létrehozás dátuma': moment(user.createdAt)
4242
.locale('hu')
4343
.format('ll'),

src/config/fontawesome.config.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
faAngleDoubleLeft,
1616
faAngleDoubleRight,
1717
faEdit,
18+
faCaretUp,
19+
faCaretDown,
1820
} from '@fortawesome/free-solid-svg-icons';
1921

2022
library.add(
@@ -35,6 +37,8 @@ library.add(
3537
faAngleDoubleRight,
3638
faEdit,
3739
faTrashAlt,
40+
faCaretUp,
41+
faCaretDown,
3842
);
3943

4044
// $ npm i --save @fortawesome/free-brands-svg-icons //. fab

0 commit comments

Comments
 (0)