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?"
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 >
4653
4754<script >
4855// TODO szűrő, és akár rendezés nyilakkal
49- import { ref } from ' vue' ;
56+ import { computed , ref } from ' vue' ;
5057export 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 >
0 commit comments