1
1
<template >
2
2
<div >
3
- <div v-if =" itemsPerPageSelect || tableFilter" class =" row my-2 mx-0" >
3
+ <div
4
+ v-if =" itemsPerPageSelect || haveFilterOption"
5
+ class =" row my-2 mx-0"
6
+ >
4
7
<div
5
8
class =" col-sm-6 form-inline p-0"
6
- v-if =" tableFilter "
9
+ v-if =" haveFilterOption "
7
10
>
8
- <label class =" mr-2" >{{tableFilterData.label}}</label >
9
- <input
10
- class =" form-control"
11
- type =" text"
12
- :placeholder =" tableFilterData.placeholder"
13
- @input =" tableFilterChange($event.target.value, 'input')"
14
- @change =" tableFilterChange($event.target.value, 'change')"
15
- :value =" tableFilterState"
16
- aria-label =" table filter input"
17
- >
11
+ <template v-if =" tableFilter " >
12
+ <label class =" mr-2" >{{tableFilterData.label}}</label >
13
+ <input
14
+ class =" form-control"
15
+ type =" text"
16
+ :placeholder =" tableFilterData.placeholder"
17
+ @input =" tableFilterChange($event.target.value, 'input')"
18
+ @change =" tableFilterChange($event.target.value, 'change')"
19
+ :value =" tableFilterState"
20
+ aria-label =" table filter input"
21
+ >
22
+ </template >
23
+ <slot name =" cleaner" :clean =" clean" :isFiltered =" isFiltered" >
24
+ <template v-if =" cleaner " >
25
+ <CIcon
26
+ v-if =" cleaner"
27
+ v-bind =" cleanerProps"
28
+ @click.native =" clean"
29
+ />
30
+ </template >
31
+ </slot >
18
32
</div >
19
33
20
34
<div
21
35
v-if =" itemsPerPageSelect"
22
36
class =" col-sm-6 p-0"
23
- :class =" { 'offset-sm-6': !tableFilter }"
37
+ :class =" { 'offset-sm-6': !haveFilterOption }"
24
38
>
25
39
<div class =" form-inline justify-content-sm-end" >
26
40
<label class =" mr-2" >{{paginationSelect.label}}</label >
40
54
{{number}}
41
55
</option >
42
56
</select >
43
- <CIcon
44
- v-if =" cleaner"
45
- v-bind =" cleanerProps"
46
- @click.native =" clean"
47
- />
57
+
48
58
</div >
49
59
</div >
50
60
</div >
76
86
width =" 18"
77
87
:content =" $options.icons.cilArrowTop"
78
88
:class =" iconClasses(index)"
79
- aria-label =" change column sorting"
89
+ : aria-label =" ` change column: '${name}' sorting` "
80
90
/>
81
91
</slot >
82
92
</th >
88
98
<th :class =" headerClass(index)" :key =" index" >
89
99
<slot :name =" `${rawColumnNames[index]}-filter`" >
90
100
<input
91
- v-if =" !fields || fields[index].filter !== false"
101
+ v-if =" itemsDataColumns.includes(colName) &&
102
+ (!fields || fields[index].filter !== false)"
92
103
class =" form-control form-control-sm"
93
104
@input =" columnFilterEvent(colName, $event.target.value, 'input')"
94
105
@change =" columnFilterEvent(colName, $event.target.value, 'change')"
95
106
:value =" columnFilterState[colName]"
96
- :aria-label =" `column name: ${colName} filter input`"
107
+ :aria-label =" `column name: ' ${colName}' filter input`"
97
108
/>
98
109
</slot >
99
110
</th >
@@ -275,7 +286,7 @@ export default {
275
286
loading: Boolean ,
276
287
clickableRows: Boolean ,
277
288
noItemsView: Object ,
278
- cleaner: [ Boolean , Object ]
289
+ cleaner: Boolean
279
290
},
280
291
data () {
281
292
return {
@@ -351,6 +362,11 @@ export default {
351
362
})
352
363
return items
353
364
},
365
+ itemsDataColumns () {
366
+ return this .rawColumnNames .filter (name => {
367
+ return this .generatedColumnNames .includes (name)
368
+ })
369
+ },
354
370
tableFiltered () {
355
371
let items = this .columnFiltered
356
372
if (! this .tableFilterState || (this .tableFilter && this .tableFilter .external )) {
@@ -359,7 +375,7 @@ export default {
359
375
const filter = this .tableFilterState .toLowerCase ()
360
376
const hasFilter = (item ) => String (item).toLowerCase ().includes (filter)
361
377
items = items .filter (item => {
362
- return this .rawColumnNames .filter (key => hasFilter (item[key])).length
378
+ return this .itemsDataColumns .filter (key => hasFilter (item[key])).length
363
379
})
364
380
return items
365
381
},
@@ -454,17 +470,21 @@ export default {
454
470
}
455
471
return customValues .noItems || ' No items'
456
472
},
473
+ isFiltered () {
474
+ return this .tableFilterState ||
475
+ Object .values (this .columnFilterState ).join (' ' ) ||
476
+ this .sorterState .column
477
+ },
457
478
cleanerProps () {
458
- if (typeof this .cleaner === ' object' ) {
459
- return this .cleaner
460
- }
461
- const isFiltered = this .tableFilterState ||
462
- Object .keys (this .columnFilterState ).length ||
463
- this .sorterState .column
464
479
return {
465
480
content: this .$options .icons .cilFilterX ,
466
- class: ` ml-2 ${ isFiltered ? ' text-danger' : ' transparent' } `
481
+ class: ` ml-2 ${ this .isFiltered ? ' text-danger' : ' transparent' } ` ,
482
+ role: this .isFiltered ? ' button' : null ,
483
+ tabindex: this .isFiltered ? 0 : null ,
467
484
}
485
+ },
486
+ haveFilterOption () {
487
+ return this .tableFilter || this .cleaner || this .$scopedSlots .cleaner
468
488
}
469
489
},
470
490
methods: {
@@ -518,7 +538,9 @@ export default {
518
538
return classes
519
539
},
520
540
isSortable (index ) {
521
- return this .sorter && (! this .fields || this .fields [index].sorter !== false )
541
+ return this .sorter &&
542
+ (! this .fields || this .fields [index].sorter !== false ) &&
543
+ this .itemsDataColumns .includes (this .rawColumnNames [index])
522
544
},
523
545
headerClass (index ) {
524
546
const fields = this .fields
0 commit comments