import Paper from "@mui/material/Paper"; import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; import IconButton from "@mui/material/IconButton"; import LastPageIcon from "@mui/icons-material/LastPage"; import FirstPageIcon from "@mui/icons-material/FirstPage"; import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft"; import KeyboardArrowRight from "@mui/icons-material/KeyboardArrowRight"; import Box from "@mui/material/Box"; import TablePagination from "@mui/material/TablePagination"; import type { TablePaginationProps } from "@mui/material/TablePagination"; import { useTheme } from "@mui/material/styles"; import { useMediaQuery } from "@mui/material"; export type Header = { id: number | string; content: React.ReactNode; onClick?: (event: React.MouseEvent, row: T) => void; render: (row: T) => React.ReactNode; }; type DataTableProps = { headers: Header[]; data: T[]; onRowClick?: (row: T) => void; }; export function DataTable< T extends { id?: string | number; _id?: string | number; onRowClick?: (row: T) => void; }, >({ headers, data, onRowClick }: DataTableProps) { const theme = useTheme(); if (data.length === 0 || headers.length === 0) return
No data
; return ( {headers.map((header, idx) => { return ( {header.content} ); })} {data.map((row) => { const key = row.id || row._id || Math.random(); return ( (onRowClick ? onRowClick(row) : null)} > {headers.map((header, index) => { return ( header.onClick!(e, row) : undefined } > {header.render(row)} ); })} ); })}
); } interface TablePaginationActionsProps { count: number; page: number; rowsPerPage: number; onPageChange: (event: React.MouseEvent, newPage: number) => void; } function TablePaginationActions(props: TablePaginationActionsProps) { const theme = useTheme(); const { count, page, rowsPerPage, onPageChange } = props; const handleFirstPageButtonClick = (event: React.MouseEvent) => { onPageChange(event, 0); }; const handleBackButtonClick = (event: React.MouseEvent) => { onPageChange(event, page - 1); }; const handleNextButtonClick = (event: React.MouseEvent) => { onPageChange(event, page + 1); }; const handleLastPageButtonClick = (event: React.MouseEvent) => { onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1)); }; return ( {theme.direction === "rtl" ? : } {theme.direction === "rtl" ? : } = Math.ceil(count / rowsPerPage) - 1} aria-label="next page" > {theme.direction === "rtl" ? : } = Math.ceil(count / rowsPerPage) - 1} aria-label="last page" > {theme.direction === "rtl" ? : } ); } export const Pagination: React.FC = ({ ...props }) => { const isSmall = useMediaQuery((theme: any) => theme.breakpoints.down("sm")); const theme = useTheme(); return ( ); };