Last active
February 25, 2020 21:52
-
-
Save Blezzoh/1b1cf2ae64fdd427ae716903d0f11256 to your computer and use it in GitHub Desktop.
react-table 7 resizer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from "react"; | |
import { useTable, useSortBy, useFilters, useGlobalFilter, useFlexLayout, useResizeColumns } from "react-table"; | |
import CustomInput from "./CustomInput"; | |
window.Date.prototype.isValid = function () { | |
// An invalid date object returns NaN for getTime() and NaN is the only | |
// object not strictly equal to itself. | |
// eslint-disable-next-line | |
return this.getTime() === this.getTime(); | |
}; | |
// value and onChange function | |
const GlobalFilter = ({ globalFilter, setGlobalFilter }) => { | |
return ( | |
<CustomInput | |
value={globalFilter || ""} | |
onChange={e => { | |
setGlobalFilter(e.target.value || undefined); // Set undefined to remove the filter entirely | |
}} | |
placeholder={`Search All ...`} | |
/> | |
); | |
}; | |
const ColumnFilter = ({ column: { filterValue, setFilter, filter } }) => { | |
return ( | |
<CustomInput | |
value={filterValue || ""} | |
onChange={e => { | |
setFilter(e.target.value || undefined); // Set undefined to remove the filter entirely | |
}} | |
placeholder={`Search ${filter ? filter : ""}...`} | |
/> | |
); | |
}; | |
/** | |
* As in the previous versions, any react table needs colums where at the core we have a field Header, and accessor | |
* As in the previous versions, a react table has data that consist of an array of JSONs | |
*/ | |
const ReactTable = ({ columns, data }) => { | |
// functions to run when a column is filtered depending on the type | |
const filterTypes = { | |
year: (rows, id, filterValue) => { | |
return rows.filter(row => { | |
const rowValue = row.values[id]; | |
return rowValue !== undefined && | |
Number(filterValue) && | |
new Date(rowValue) && | |
new Date(rowValue).isValid() | |
? new Date(rowValue).getFullYear() === Number(filterValue) | |
: true; | |
}); | |
}, | |
text: (rows, id, filterValue) => { | |
return rows.filter(row => { | |
const rowValue = row.values[id]; | |
return rowValue !== undefined | |
? String(rowValue) | |
.toLowerCase() | |
.startsWith(String(filterValue).toLowerCase()) | |
: true; | |
}); | |
} | |
}; | |
const defaultColumn = React.useMemo(() => ({ | |
// Let's set up our default Filter UI | |
Filter: ColumnFilter, | |
minWidth: 40, | |
maxWidth: 400 | |
}), []) | |
const { | |
getTableProps, | |
getTableBodyProps, | |
headerGroups, | |
rows, | |
prepareRow, | |
state, | |
setGlobalFilter, | |
} = useTable( | |
{ | |
columns, | |
data, | |
defaultColumn, | |
filterTypes | |
}, | |
// hooks for filters | |
useFilters, | |
useGlobalFilter, | |
// hook for sorting | |
useSortBy, | |
// hooks for resizing | |
useFlexLayout, | |
useResizeColumns | |
); | |
return ( | |
<div> | |
<div | |
className="p-1 border-0 d-flex justify-content-end" | |
> | |
<GlobalFilter | |
globalFilter={state.globalFilter} | |
setGlobalFilter={setGlobalFilter} | |
/> | |
</div> | |
<div className='table' {...getTableProps()}> | |
<div > | |
{headerGroups.map(headerGroup => ( | |
<div {...headerGroup.getHeaderGroupProps()} className='tr'> | |
{headerGroup.headers.map((column, i) => { | |
// three new addition to column: isSorted, isSortedDesc, getSortByToggleProps | |
const { | |
render, | |
getHeaderProps, | |
isSorted, | |
isSortedDesc, | |
getSortByToggleProps, | |
// filter, | |
canFilter, | |
//resizer | |
isResizing, | |
getResizerProps | |
} = column; | |
const extraClass = isSorted | |
? isSortedDesc | |
? "desc" | |
: "asc" | |
: ""; | |
const {onClick , ...rest} = getHeaderProps(getSortByToggleProps()) | |
console.log('click', onClick, 'rest',rest) | |
return ( | |
<div | |
key={`th-${i}`} | |
className={`${extraClass} th`} | |
{...rest} | |
// getHeaderProps now receives a function | |
> | |
<div onClick={onClick}> | |
{render("Header")} | |
</div> | |
{/* resizer div */} | |
<div | |
{...getResizerProps()} | |
className={`resizer ${isResizing ? 'isResizing' : ''}`} | |
/> | |
{/* Render the columns filter UI */} | |
<div>{canFilter ? render("Filter") : null}</div> | |
</div> | |
); | |
})} | |
</div> | |
))} | |
</div> | |
<div {...getTableBodyProps()}> | |
{rows.map((row, i) => { | |
prepareRow(row); | |
return ( | |
<div {...row.getRowProps()} className="tr"> | |
{row.cells.map(cell => { | |
return ( | |
<div {...cell.getCellProps()} className="td">{cell.render("Cell")}</div> | |
); | |
})} | |
</div> | |
); | |
})} | |
</div> | |
</div> | |
</div> | |
); | |
}; | |
export default ReactTable; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment