Skip to content

Commit d0dba67

Browse files
committed
feat: CDataTable: add cleaner prop
1 parent 2b134aa commit d0dba67

File tree

2 files changed

+51
-14
lines changed

2 files changed

+51
-14
lines changed

src/index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ interface CDataTable {
303303
columnFilter?: boolean | object;
304304
tableFilterValue?: string;
305305
tableFilter?: boolean | object;
306+
cleaner?: boolean | Function;
306307
addTableClasses?: string | Array<any> | object;
307308
size?: string;
308309
dark?: boolean;

src/table/CDataTable.js

+50-14
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import CPagination from '../pagination/CPagination'
55
import CElementCover from '../element-cover/CElementCover'
66
import style from './CDataTable.module.css'
77
import CIcon from '@coreui/icons-react'
8-
import { cilArrowTop, cilBan } from '@coreui/icons'
8+
import { cilArrowTop, cilBan, cilFilterX } from '@coreui/icons'
99

1010
//component - CoreUI / CTable
1111
const CDataTable = props => {
@@ -37,6 +37,7 @@ const CDataTable = props => {
3737
columnFilter,
3838
tableFilterValue,
3939
tableFilter,
40+
cleaner,
4041
addTableClasses,
4142
size,
4243
dark,
@@ -185,6 +186,15 @@ const CDataTable = props => {
185186
}
186187
}
187188

189+
const clean = () => {
190+
setTableFilterState('')
191+
setColumnFilterState({})
192+
setSorterState({
193+
column: "",
194+
asc: true
195+
})
196+
}
197+
188198
// computed
189199

190200
const genCols = Object.keys(passedItems[0] || {}).filter(el => el.charAt(0) !== '_')
@@ -322,6 +332,16 @@ const CDataTable = props => {
322332
return customValues.noItems || 'No items'
323333
})()
324334

335+
const isFiltered = tableFilterState || sorterState.column ||
336+
Object.values(columnFilterState).join('')
337+
338+
const cleanerProps = {
339+
content: cilFilterX,
340+
className: `ml-2 ${isFiltered ? 'text-danger' : 'transparent'}`,
341+
role: isFiltered ? 'button' : null,
342+
tabIndex: isFiltered ? 0 : null,
343+
}
344+
325345
// watch
326346
useMemo(() => setPerPageItems(itemsPerPage), [itemsPerPage])
327347

@@ -384,26 +404,41 @@ const CDataTable = props => {
384404
<React.Fragment>
385405
<div ref={innerRef}>
386406
{
387-
(itemsPerPageSelect || tableFilter) &&
407+
(itemsPerPageSelect || tableFilter || cleaner) &&
388408
<div className="row my-2 mx-0">
389409
{
390-
tableFilter &&
410+
(tableFilter || cleaner) &&
391411
<div className="col-sm-6 form-inline p-0">
392-
<label className="mr-2">{tableFilterData.label}</label>
393-
<input
394-
className="form-control"
395-
type="text"
396-
placeholder={tableFilterData.placeholder}
397-
onInput={(e)=>{tableFilterChange(e.target.value, 'input')}}
398-
onChange={(e)=>{tableFilterChange(e.target.value, 'change')}}
399-
value={tableFilterState || ''}
400-
aria-label="table filter input"
401-
/>
412+
{
413+
tableFilter &&
414+
<>
415+
<label className="mr-2">{tableFilterData.label}</label>
416+
<input
417+
className="form-control"
418+
type="text"
419+
placeholder={tableFilterData.placeholder}
420+
onInput={(e)=>{tableFilterChange(e.target.value, 'input')}}
421+
onChange={(e)=>{tableFilterChange(e.target.value, 'change')}}
422+
value={tableFilterState || ''}
423+
aria-label="table filter input"
424+
/>
425+
</>
426+
}
427+
{
428+
cleaner && (
429+
typeof cleaner === 'function' ? cleaner(clean, isFiltered, cleanerProps) :
430+
<CIcon
431+
{...cleanerProps}
432+
onClick={clean}
433+
/>
434+
)
435+
}
436+
402437
</div>
403438
}
404439
{
405440
itemsPerPageSelect &&
406-
<div className={'col-sm-6 p-0' + (!tableFilter && 'offset-sm-6')}>
441+
<div className={'col-sm-6 p-0' + (!(tableFilter || cleaner) && 'offset-sm-6')}>
407442
<div className="form-inline justify-content-sm-end">
408443
<label className="mr-2">{paginationSelect.label}</label>
409444
<select
@@ -585,6 +620,7 @@ CDataTable.propTypes = {
585620
columnFilter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
586621
tableFilterValue: PropTypes.string,
587622
tableFilter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
623+
cleaner: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
588624
addTableClasses: PropTypes.oneOfType([PropTypes.string, PropTypes.array, PropTypes.object]),
589625
size: PropTypes.string,
590626
dark: PropTypes.bool,

0 commit comments

Comments
 (0)