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 }) => (
)
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 (
)
}