admins-table.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useEffect, useState } from 'react'
  2. import {
  3. type SortingState,
  4. flexRender,
  5. getCoreRowModel,
  6. getSortedRowModel,
  7. useReactTable,
  8. } from '@tanstack/react-table'
  9. import { type Admin } from '@/types/admins.types'
  10. import { type Pagination } from '@/types/common.types'
  11. import { cn } from '@/lib/utils'
  12. import { type NavigateFn, useTableUrlState } from '@/hooks/use-table-url-state'
  13. import {
  14. Table,
  15. TableBody,
  16. TableCell,
  17. TableHead,
  18. TableHeader,
  19. TableRow,
  20. } from '@/components/ui/table'
  21. import { DataTablePagination } from '@/components/data-table'
  22. import { adminsColumns as columns } from './admins-columns'
  23. type AdminsTableProps = {
  24. data: Admin[]
  25. paginationData?: Pagination
  26. search: Record<string, unknown>
  27. navigate: NavigateFn
  28. }
  29. export function AdminsTable({
  30. data,
  31. paginationData,
  32. search,
  33. navigate,
  34. }: AdminsTableProps) {
  35. const [sorting, setSorting] = useState<SortingState>([])
  36. const { pagination, onPaginationChange, ensurePageInRange } =
  37. useTableUrlState({
  38. search,
  39. navigate,
  40. pagination: { defaultPage: 1, defaultPageSize: 10 },
  41. globalFilter: { enabled: false },
  42. })
  43. // eslint-disable-next-line react-hooks/incompatible-library
  44. const table = useReactTable({
  45. data,
  46. columns,
  47. state: { sorting, pagination },
  48. pageCount: paginationData?.last_page ?? -1,
  49. manualPagination: true,
  50. onPaginationChange,
  51. onSortingChange: setSorting,
  52. getCoreRowModel: getCoreRowModel(),
  53. getSortedRowModel: getSortedRowModel(),
  54. })
  55. useEffect(() => {
  56. ensurePageInRange(table.getPageCount())
  57. }, [table, ensurePageInRange])
  58. return (
  59. <div className='flex flex-1 flex-col gap-4'>
  60. <div className='overflow-hidden rounded-md border'>
  61. <Table>
  62. <TableHeader>
  63. {table.getHeaderGroups().map((headerGroup) => (
  64. <TableRow key={headerGroup.id} className='group/row'>
  65. {headerGroup.headers.map((header) => (
  66. <TableHead
  67. key={header.id}
  68. colSpan={header.colSpan}
  69. className='bg-background group-hover/row:bg-muted'
  70. >
  71. {header.isPlaceholder
  72. ? null
  73. : flexRender(
  74. header.column.columnDef.header,
  75. header.getContext()
  76. )}
  77. </TableHead>
  78. ))}
  79. </TableRow>
  80. ))}
  81. </TableHeader>
  82. <TableBody>
  83. {table.getRowModel().rows.length ? (
  84. table.getRowModel().rows.map((row) => (
  85. <TableRow key={row.id} className='group/row'>
  86. {row.getVisibleCells().map((cell) => (
  87. <TableCell
  88. key={cell.id}
  89. className={cn(
  90. 'bg-background group-hover/row:bg-muted',
  91. cell.column.columnDef.meta?.className,
  92. cell.column.columnDef.meta?.tdClassName
  93. )}
  94. >
  95. {flexRender(
  96. cell.column.columnDef.cell,
  97. cell.getContext()
  98. )}
  99. </TableCell>
  100. ))}
  101. </TableRow>
  102. ))
  103. ) : (
  104. <TableRow>
  105. <TableCell
  106. colSpan={columns.length}
  107. className='h-24 text-center'
  108. >
  109. نتیجه‌ای یافت نشد.
  110. </TableCell>
  111. </TableRow>
  112. )}
  113. </TableBody>
  114. </Table>
  115. </div>
  116. <DataTablePagination table={table} className='mt-auto' />
  117. </div>
  118. )
  119. }