import styled from '@emotion/styled'; import { ColumnDef, flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, PaginationState, SortingState, useReactTable, } from '@tanstack/react-table'; import { useState } from 'react'; import IconButton from '~/components/common/icon_button'; import { MdKeyboardArrowLeft, MdKeyboardArrowRight, MdKeyboardDoubleArrowLeft, MdKeyboardDoubleArrowRight, } from 'react-icons/md'; import Input from '~/components/common/form/_input'; const TablePageFooter = styled.div({ display: 'flex', gap: '1em', alignItems: 'center', }); const Box = styled(TablePageFooter)({ gap: '0.35em', }); const Resizer = styled.div<{ isResizing: boolean }>( ({ theme, isResizing }) => ({ cursor: 'col-resize', userSelect: 'none', touchAction: 'none', position: 'absolute', right: 0, top: 0, height: '100%', width: '5px', opacity: !isResizing ? 0 : 1, background: !isResizing ? theme.colors.white : theme.colors.primary, '&:hover': { opacity: 0.5, }, }) ); type TableProps = { columns: ColumnDef[]; data: T[]; defaultSorting?: SortingState; }; export default function Table({ columns, data, defaultSorting = [], }: TableProps) { const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10, }); const [sorting, setSorting] = useState(defaultSorting); const table = useReactTable({ data, columns, enableColumnResizing: true, columnResizeMode: 'onChange', state: { pagination, sorting, }, onPaginationChange: setPagination, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), onSortingChange: setSorting, debugTable: true, }); return (
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {table .getRowModel() .rows.slice(0, 10) .map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))}
div > div': { opacity: 0.5, }, }} colSpan={header.colSpan} > {header.isPlaceholder ? null : (
{flexRender( header.column.columnDef.header, header.getContext() )} {{ asc: ' 🔼', desc: ' 🔽', }[header.column.getIsSorted() as string] ?? null} {header.column.getCanResize() && ( )}
)}
{flexRender( cell.column.columnDef.cell, cell.getContext() )}
{table.getPageCount() > 1 && ( table.setPageIndex(0)} disabled={!table.getCanPreviousPage()} > table.previousPage()} disabled={!table.getCanPreviousPage()} > table.nextPage()} disabled={!table.getCanNextPage()} > table.setPageIndex(table.getPageCount() - 1)} disabled={!table.getCanNextPage()} > 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); }} /> )}
); }