users-table.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { useState } from 'react'
  2. import {
  3. ColumnDef,
  4. ColumnFiltersState,
  5. RowData,
  6. SortingState,
  7. VisibilityState,
  8. flexRender,
  9. getCoreRowModel,
  10. getFacetedRowModel,
  11. getFacetedUniqueValues,
  12. getFilteredRowModel,
  13. getPaginationRowModel,
  14. getSortedRowModel,
  15. useReactTable,
  16. } from '@tanstack/react-table'
  17. import {
  18. Table,
  19. TableBody,
  20. TableCell,
  21. TableHead,
  22. TableHeader,
  23. TableRow,
  24. } from '@/components/ui/table'
  25. import { User } from '../data/schema'
  26. import { DataTablePagination } from './data-table-pagination'
  27. import { DataTableToolbar } from './data-table-toolbar'
  28. declare module '@tanstack/react-table' {
  29. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  30. interface ColumnMeta<TData extends RowData, TValue> {
  31. className: string
  32. }
  33. }
  34. interface DataTableProps {
  35. columns: ColumnDef<User>[]
  36. data: User[]
  37. }
  38. export function UsersTable({ columns, data }: DataTableProps) {
  39. const [rowSelection, setRowSelection] = useState({})
  40. const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
  41. const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
  42. const [sorting, setSorting] = useState<SortingState>([])
  43. const table = useReactTable({
  44. data,
  45. columns,
  46. state: {
  47. sorting,
  48. columnVisibility,
  49. rowSelection,
  50. columnFilters,
  51. },
  52. enableRowSelection: true,
  53. onRowSelectionChange: setRowSelection,
  54. onSortingChange: setSorting,
  55. onColumnFiltersChange: setColumnFilters,
  56. onColumnVisibilityChange: setColumnVisibility,
  57. getCoreRowModel: getCoreRowModel(),
  58. getFilteredRowModel: getFilteredRowModel(),
  59. getPaginationRowModel: getPaginationRowModel(),
  60. getSortedRowModel: getSortedRowModel(),
  61. getFacetedRowModel: getFacetedRowModel(),
  62. getFacetedUniqueValues: getFacetedUniqueValues(),
  63. })
  64. return (
  65. <div className='space-y-4'>
  66. <DataTableToolbar table={table} />
  67. <div className='rounded-md border'>
  68. <Table>
  69. <TableHeader>
  70. {table.getHeaderGroups().map((headerGroup) => (
  71. <TableRow key={headerGroup.id}>
  72. {headerGroup.headers.map((header) => {
  73. return (
  74. <TableHead
  75. key={header.id}
  76. colSpan={header.colSpan}
  77. className={header.column.columnDef.meta?.className ?? ''}
  78. >
  79. {header.isPlaceholder
  80. ? null
  81. : flexRender(
  82. header.column.columnDef.header,
  83. header.getContext()
  84. )}
  85. </TableHead>
  86. )
  87. })}
  88. </TableRow>
  89. ))}
  90. </TableHeader>
  91. <TableBody>
  92. {table.getRowModel().rows?.length ? (
  93. table.getRowModel().rows.map((row) => (
  94. <TableRow
  95. key={row.id}
  96. data-state={row.getIsSelected() && 'selected'}
  97. >
  98. {row.getVisibleCells().map((cell) => (
  99. <TableCell
  100. key={cell.id}
  101. className={cell.column.columnDef.meta?.className ?? ''}
  102. >
  103. {flexRender(
  104. cell.column.columnDef.cell,
  105. cell.getContext()
  106. )}
  107. </TableCell>
  108. ))}
  109. </TableRow>
  110. ))
  111. ) : (
  112. <TableRow>
  113. <TableCell
  114. colSpan={columns.length}
  115. className='h-24 text-center'
  116. >
  117. No results.
  118. </TableCell>
  119. </TableRow>
  120. )}
  121. </TableBody>
  122. </Table>
  123. </div>
  124. <DataTablePagination table={table} />
  125. </div>
  126. )
  127. }