import React, { useState, useEffect, useMemo, memo } from 'react' import { useSelector } from 'react-redux' import { flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table' import './EmployeeList.css' const simpleSearch = (rows, columns, query) => { if (!query) { return rows } return rows.filter((row) => { return columns.some((column) => { const value = row.values[column.accessor] return String(value).toLowerCase().includes(query.toLowerCase()) }) }) } const Pagination = ({ table }) => (
Page
{table.getState().pagination.pageIndex + 1} of{' '} {table.getPageCount()}
Go to page: { const page = e.target.value ? Number(e.target.value) - 1 : 0 table.setPageIndex(page) }} className="border p-1 rounded w-16" />
) const EmployeeTableHeader = ({ table }) => ( {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( {header.isPlaceholder ? null : (
{flexRender( header.column.columnDef.header, header.getContext() )} {{ asc: ' 🔼', desc: ' 🔽', }[header.column.getIsSorted()] ?? null}
)} ))} ))} ) const EmployeeTableBody = ({ table }) => ( {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender( cell.column.columnDef.cell, cell.getContext() )} ))} ))} ) const DebouncedInput = ({ value: initialValue, onChange, debounce = 500, ...props }) => { const [value, setValue] = useState(initialValue) useEffect(() => { setValue(initialValue) }, [initialValue]) useEffect(() => { const timeout = setTimeout(() => { onChange(value) }, debounce) return () => clearTimeout(timeout) }, [value, debounce, onChange]) return ( setValue(e.target.value)} /> ) } const EnhancedDebouncedInput = memo(DebouncedInput) export default function EmployeeTable() { const employees = useSelector((state) => state.employee.employees) const [sorting, setSorting] = useState([]) const [globalFilter, setGlobalFilter] = useState('') const columns = useMemo( () => [ { accessorKey: 'firstName', accessor: 'firstName', header: 'First Name', enableGlobalFilter: true, }, { accessorKey: 'lastName', accessor: 'lastName', header: 'Last Name', enableGlobalFilter: true, }, { accessorKey: 'dateOfBirth', accessor: 'dateOfBirth', header: 'Date of Birth', enableGlobalFilter: true, }, { accessorKey: 'startDate', accessor: 'startDate', header: 'Start Date', enableGlobalFilter: true, }, { accessorKey: 'department', accessor: 'department', header: 'Department', enableGlobalFilter: true, }, { accessorKey: 'street', accessor: 'street', header: 'Street', enableGlobalFilter: true, }, { accessorKey: 'city', accessor: 'city', header: 'City', enableGlobalFilter: true, }, { accessorKey: 'state', accessor: 'state', header: 'State', enableGlobalFilter: true, }, { accessorKey: 'zipCode', accessor: 'zipCode', header: 'Zip Code', enableGlobalFilter: true, }, ], [] ) const table = useReactTable({ data: employees, columns, globalFilterFn: simpleSearch, state: { sorting, globalFilter, }, enableGlobalFilter: true, getColumnCanGlobalFilter: true, onSortingChange: setSorting, onGlobalFilterChange: setGlobalFilter, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), }) return (
Add an employee
) }