Skip to content

Commit 2b134aa

Browse files
committed
refactor: CDataTable: disable filtering and sorting on non data columns
1 parent 407201e commit 2b134aa

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

src/table/CDataTable.js

+18-15
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,15 @@ const CDataTable = props => {
9595

9696
const headerClass = i => fields && fields[i]._classes && fields[i]._classes
9797

98-
const isSortable = i => sorter && fields && fields[i].sorter !== false
98+
const isSortable = i => {
99+
const isDataColumn = itemsDataColumns.includes(rawColumnNames[i])
100+
return sorter && fields && fields[i].sorter !== false && isDataColumn
101+
}
102+
103+
const isFilterable = (colName, index) => {
104+
const haveEnabledFilter = (!fields || fields[index].filter !== false)
105+
return itemsDataColumns.includes(colName) && haveEnabledFilter
106+
}
99107

100108
const headerStyles = (index) => {
101109
let style = { verticalAlign: 'middle', overflow: 'hidden' }
@@ -179,23 +187,18 @@ const CDataTable = props => {
179187

180188
// computed
181189

182-
const generatedColumnNames = (() => {
183-
return Object.keys(passedItems[0] || {}).filter(el => el.charAt(0) !== '_')
184-
})()
190+
const genCols = Object.keys(passedItems[0] || {}).filter(el => el.charAt(0) !== '_')
185191

186-
const rawColumnNames = (()=>{
187-
if (fields) {
188-
return fields.map(el => el.key || el)
189-
}
190-
return generatedColumnNames
191-
})()
192+
const rawColumnNames = fields ? fields.map(el => el.key || el) : genCols
193+
194+
const itemsDataColumns = rawColumnNames.filter(name => genCols.includes(name))
192195

193196
useMemo(() => {
194197
compData.columnFiltered++
195198
}, [
196199
JSON.stringify(columnFilter),
197200
JSON.stringify(columnFilterState),
198-
rawColumnNames.join(''),
201+
itemsDataColumns.join(''),
199202
compData.changeItems
200203
])
201204

@@ -206,7 +209,7 @@ const CDataTable = props => {
206209
}
207210
Object.entries(columnFilterState).forEach(([key, value]) => {
208211
const columnFilter = String(value).toLowerCase()
209-
if (columnFilter && rawColumnNames.includes(key)) {
212+
if (columnFilter && itemsDataColumns.includes(key)) {
210213
items = items.filter(item => {
211214
return String(item[key]).toLowerCase().includes(columnFilter)
212215
})
@@ -223,7 +226,7 @@ const CDataTable = props => {
223226
const filter = tableFilterState.toLowerCase()
224227
const hasFilter = (item) => String(item).toLowerCase().includes(filter)
225228
items = items.filter(item => {
226-
return rawColumnNames.filter(key => hasFilter(item[key])).length
229+
return itemsDataColumns.filter(key => hasFilter(item[key])).length
227230
})
228231
return items
229232
}, [
@@ -234,7 +237,7 @@ const CDataTable = props => {
234237

235238
const sortedItems = useMemo(() => {
236239
const col = sorterState.column
237-
if (!col || !rawColumnNames.includes(col) || sorter.external) {
240+
if (!col || !itemsDataColumns.includes(col) || sorter.external) {
238241
onFilteredItemsChange && onFilteredItemsChange(tableFiltered)
239242
return tableFiltered
240243
}
@@ -443,7 +446,7 @@ const CDataTable = props => {
443446
return (
444447
<th className={classNames(headerClass(index))} key={index}>
445448
{ columnFilterSlot[`${rawColumnNames[index]}`] ||
446-
( fields && fields[index].filter !== false &&
449+
( isFilterable(colName, index) &&
447450
<input
448451
className="form-control form-control-sm"
449452
onInput={e=>{columnFilterEvent(colName, e.target.value, 'input')}}

0 commit comments

Comments
 (0)