@@ -5,7 +5,7 @@ import CPagination from '../pagination/CPagination'
55import CElementCover from '../element-cover/CElementCover'
66import style from './CDataTable.module.css'
77import 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
1111const 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