import type { HTMLAttributes } from "react"; import { flexRender, type RowData, type Table as TableInstance, } from "@tanstack/react-table"; import { ChevronLeftIcon, ChevronRightIcon, DoubleArrowLeftIcon, DoubleArrowRightIcon, } from "@radix-ui/react-icons"; import { Button, Checkbox, Label, cn } from "@common/components"; declare module "@tanstack/react-table" { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface ColumnMeta { align?: "left" | "center" | "right"; rowSpan?: number; } } type GridViewDataTableProps = { table: TableInstance; variant?: "default" | "secondary" | "line"; className?: HTMLAttributes["className"]; viewPagination?: boolean; onRowClick?: (row: T) => void; }; function GridViewDataTable({ table, className, viewPagination, onRowClick, }: GridViewDataTableProps) { return (
e.stopPropagation()} onCheckedChange={(checked) => table.toggleAllPageRowsSelected(!!checked) } />
{table.getRowModel().rows.map((row) => (
onRowClick?.(row.original)} className={cn( "overflow-hidden rounded-md border border-border bg-background p-4 shadow-md", onRowClick && "cursor-pointer hover:bg-accent", )} > {row.getVisibleCells().map((cell) => { const { meta } = cell.column.columnDef; return (
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); })}
))}
{viewPagination && }
); } function Pagination({ table }: { table: TableInstance }) { const pageCount = table.getPageCount(); const currentPage = table.getState().pagination.pageIndex; const maxVisiblePages = 10; // 한 번에 보여줄 최대 페이지 수 let startPage = Math.max(0, currentPage - maxVisiblePages / 2); // 시작 페이지 const endPage = Math.min(pageCount, startPage + maxVisiblePages); // 끝 페이지 if (endPage - startPage < maxVisiblePages) { startPage = Math.max(0, endPage - maxVisiblePages); } const pageNumbers = Array(endPage - startPage) .fill(0) .map((_, i) => startPage + i); return (
{pageNumbers.map((pageNumber) => ( ))}
); } export { GridViewDataTable };