| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- import { useState } from 'react'
- import {
- ColumnDef,
- ColumnFiltersState,
- RowData,
- SortingState,
- VisibilityState,
- flexRender,
- getCoreRowModel,
- getFacetedRowModel,
- getFacetedUniqueValues,
- getFilteredRowModel,
- getPaginationRowModel,
- getSortedRowModel,
- useReactTable,
- } from '@tanstack/react-table'
- import {
- Table,
- TableBody,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
- } from '@/components/ui/table'
- import { User } from '../data/schema'
- import { DataTablePagination } from './data-table-pagination'
- import { DataTableToolbar } from './data-table-toolbar'
- declare module '@tanstack/react-table' {
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- interface ColumnMeta<TData extends RowData, TValue> {
- className: string
- }
- }
- interface DataTableProps {
- columns: ColumnDef<User>[]
- data: User[]
- }
- export function UsersTable({ columns, data }: DataTableProps) {
- const [rowSelection, setRowSelection] = useState({})
- const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
- const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
- const [sorting, setSorting] = useState<SortingState>([])
- const table = useReactTable({
- data,
- columns,
- state: {
- sorting,
- columnVisibility,
- rowSelection,
- columnFilters,
- },
- enableRowSelection: true,
- onRowSelectionChange: setRowSelection,
- onSortingChange: setSorting,
- onColumnFiltersChange: setColumnFilters,
- onColumnVisibilityChange: setColumnVisibility,
- getCoreRowModel: getCoreRowModel(),
- getFilteredRowModel: getFilteredRowModel(),
- getPaginationRowModel: getPaginationRowModel(),
- getSortedRowModel: getSortedRowModel(),
- getFacetedRowModel: getFacetedRowModel(),
- getFacetedUniqueValues: getFacetedUniqueValues(),
- })
- return (
- <div className='space-y-4'>
- <DataTableToolbar table={table} />
- <div className='rounded-md border'>
- <Table>
- <TableHeader>
- {table.getHeaderGroups().map((headerGroup) => (
- <TableRow key={headerGroup.id}>
- {headerGroup.headers.map((header) => {
- return (
- <TableHead
- key={header.id}
- colSpan={header.colSpan}
- className={header.column.columnDef.meta?.className ?? ''}
- >
- {header.isPlaceholder
- ? null
- : flexRender(
- header.column.columnDef.header,
- header.getContext()
- )}
- </TableHead>
- )
- })}
- </TableRow>
- ))}
- </TableHeader>
- <TableBody>
- {table.getRowModel().rows?.length ? (
- table.getRowModel().rows.map((row) => (
- <TableRow
- key={row.id}
- data-state={row.getIsSelected() && 'selected'}
- >
- {row.getVisibleCells().map((cell) => (
- <TableCell
- key={cell.id}
- className={cell.column.columnDef.meta?.className ?? ''}
- >
- {flexRender(
- cell.column.columnDef.cell,
- cell.getContext()
- )}
- </TableCell>
- ))}
- </TableRow>
- ))
- ) : (
- <TableRow>
- <TableCell
- colSpan={columns.length}
- className='h-24 text-center'
- >
- No results.
- </TableCell>
- </TableRow>
- )}
- </TableBody>
- </Table>
- </div>
- <DataTablePagination table={table} />
- </div>
- )
- }
|