Skip to content

Instantly share code, notes, and snippets.

@Blezzoh
Last active February 25, 2020 21:52
Show Gist options
  • Save Blezzoh/1b1cf2ae64fdd427ae716903d0f11256 to your computer and use it in GitHub Desktop.
Save Blezzoh/1b1cf2ae64fdd427ae716903d0f11256 to your computer and use it in GitHub Desktop.
react-table 7 resizer
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