Skip to content

Commit

Permalink
feat: CDataTable: add cleaner prop
Browse files Browse the repository at this point in the history
  • Loading branch information
woothu committed Jul 24, 2020
1 parent 2b134aa commit d0dba67
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/index.d.ts
Expand Up @@ -303,6 +303,7 @@ interface CDataTable {
columnFilter?: boolean | object;
tableFilterValue?: string;
tableFilter?: boolean | object;
cleaner?: boolean | Function;
addTableClasses?: string | Array<any> | object;
size?: string;
dark?: boolean;
Expand Down
64 changes: 50 additions & 14 deletions src/table/CDataTable.js
Expand Up @@ -5,7 +5,7 @@ import CPagination from '../pagination/CPagination'
import CElementCover from '../element-cover/CElementCover'
import style from './CDataTable.module.css'
import CIcon from '@coreui/icons-react'
import { cilArrowTop, cilBan } from '@coreui/icons'
import { cilArrowTop, cilBan, cilFilterX } from '@coreui/icons'

//component - CoreUI / CTable
const CDataTable = props => {
Expand Down Expand Up @@ -37,6 +37,7 @@ const CDataTable = props => {
columnFilter,
tableFilterValue,
tableFilter,
cleaner,
addTableClasses,
size,
dark,
Expand Down Expand Up @@ -185,6 +186,15 @@ const CDataTable = props => {
}
}

const clean = () => {
setTableFilterState('')
setColumnFilterState({})
setSorterState({
column: "",
asc: true
})
}

// computed

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

const isFiltered = tableFilterState || sorterState.column ||
Object.values(columnFilterState).join('')

const cleanerProps = {
content: cilFilterX,
className: `ml-2 ${isFiltered ? 'text-danger' : 'transparent'}`,
role: isFiltered ? 'button' : null,
tabIndex: isFiltered ? 0 : null,
}

// watch
useMemo(() => setPerPageItems(itemsPerPage), [itemsPerPage])

Expand Down Expand Up @@ -384,26 +404,41 @@ const CDataTable = props => {
<React.Fragment>
<div ref={innerRef}>
{
(itemsPerPageSelect || tableFilter) &&
(itemsPerPageSelect || tableFilter || cleaner) &&
<div className="row my-2 mx-0">
{
tableFilter &&
(tableFilter || cleaner) &&
<div className="col-sm-6 form-inline p-0">
<label className="mr-2">{tableFilterData.label}</label>
<input
className="form-control"
type="text"
placeholder={tableFilterData.placeholder}
onInput={(e)=>{tableFilterChange(e.target.value, 'input')}}
onChange={(e)=>{tableFilterChange(e.target.value, 'change')}}
value={tableFilterState || ''}
aria-label="table filter input"
/>
{
tableFilter &&
<>
<label className="mr-2">{tableFilterData.label}</label>
<input
className="form-control"
type="text"
placeholder={tableFilterData.placeholder}
onInput={(e)=>{tableFilterChange(e.target.value, 'input')}}
onChange={(e)=>{tableFilterChange(e.target.value, 'change')}}
value={tableFilterState || ''}
aria-label="table filter input"
/>
</>
}
{
cleaner && (
typeof cleaner === 'function' ? cleaner(clean, isFiltered, cleanerProps) :
<CIcon
{...cleanerProps}
onClick={clean}
/>
)
}

</div>
}
{
itemsPerPageSelect &&
<div className={'col-sm-6 p-0' + (!tableFilter && 'offset-sm-6')}>
<div className={'col-sm-6 p-0' + (!(tableFilter || cleaner) && 'offset-sm-6')}>
<div className="form-inline justify-content-sm-end">
<label className="mr-2">{paginationSelect.label}</label>
<select
Expand Down Expand Up @@ -585,6 +620,7 @@ CDataTable.propTypes = {
columnFilter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
tableFilterValue: PropTypes.string,
tableFilter: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
cleaner: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
addTableClasses: PropTypes.oneOfType([PropTypes.string, PropTypes.array, PropTypes.object]),
size: PropTypes.string,
dark: PropTypes.bool,
Expand Down

0 comments on commit d0dba67

Please sign in to comment.