diff --git a/src/components/ui/DataTable.tsx b/src/components/ui/DataTable.tsx index 25c267ff..015d2b68 100644 --- a/src/components/ui/DataTable.tsx +++ b/src/components/ui/DataTable.tsx @@ -1,76 +1,113 @@ +"use client"; import { - Card, - Table, - TableBody, - TableCell, - TableContainer, - TableHead, - TableRow, - Typography, - Box + Box, + Card, + Pagination, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, } from "@mui/material"; import { ReactNode } from "react"; +import { usePathname, useRouter, useSearchParams } from "next/navigation"; -type Column = { - id: string; - label: string; - align?: "left" | "right" | "center"; - width?: string | number; - render?: (row: T) => ReactNode; +export type Column = { + id: string; + label: string; + align?: "left" | "right" | "center"; + width?: string | number; + render?: (row: T) => ReactNode; }; type DataTableProps = { - columns: Column[]; - data: T[]; - keyField: keyof T; - emptyMessage?: string; - loading?: boolean; + columns: Column[]; + data: T[]; + keyField: keyof T; + emptyMessage?: string; + loading?: boolean; + pagination?: { + total: number; + page: number; + perPage: number; + }; }; export function DataTable({ - columns, - data, - keyField, - emptyMessage = "No data available", - loading = false + columns, + data, + keyField, + emptyMessage = "No data available", + loading = false, + pagination, }: DataTableProps) { - return ( - - - - - {columns.map((col) => ( - - {col.label} - - ))} - - - - {data.length === 0 && !loading ? ( - - - {emptyMessage} - - - ) : ( - data.map((row) => ( - - {columns.map((col) => ( - - {col.render ? col.render(row) : (row as any)[col.id]} - - ))} - - )) - )} - -
-
- ); + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + const pageCount = pagination + ? Math.ceil(pagination.total / pagination.perPage) + : 0; + + function handlePageChange(_: React.ChangeEvent, page: number) { + const params = new URLSearchParams(searchParams.toString()); + params.set("page", String(page)); + router.push(`${pathname}?${params.toString()}`); + } + + return ( + + + + + + {columns.map((col) => ( + + {col.label} + + ))} + + + + {data.length === 0 && !loading ? ( + + + {emptyMessage} + + + ) : ( + data.map((row) => ( + + {columns.map((col) => ( + + {col.render ? col.render(row) : (row as Record)[col.id] as ReactNode} + + ))} + + )) + )} + +
+
+ + {pagination && pageCount > 1 && ( + + + + )} +
+ ); }