generated from Luis/nextjs-python-web-template
74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import React from "react";
|
|
import Table from "@mui/material/Table";
|
|
import TableBody from "@mui/material/TableBody";
|
|
import TableContainer from "@mui/material/TableContainer";
|
|
import TableHead from "@mui/material/TableHead";
|
|
import TableRow from "@mui/material/TableRow";
|
|
import Paper from "@mui/material/Paper";
|
|
|
|
import { NoDataOverlay } from "@/components/noDataOverlay";
|
|
import { StyledTableCell, StyledTableRow } from "./style";
|
|
import { ICustomTable, CustomTableConfiguration } from "@/types";
|
|
import { Checkbox, Skeleton } from "@mui/material";
|
|
|
|
const CustomTable = ({ configuration, data, loading }: ICustomTable) => {
|
|
if (loading)
|
|
return <Skeleton variant="rectangular" animation="wave" height={200} />;
|
|
|
|
// display empty icon in case there is no data
|
|
if (!data || data.length === 0)
|
|
return <NoDataOverlay label="No Activity yet" />;
|
|
|
|
const renderTableCell = (
|
|
value: any,
|
|
cellKey: string,
|
|
render?: (param: any) => void | undefined,
|
|
) => {
|
|
let renderedValue = value;
|
|
|
|
// cover use case if the data is an array
|
|
if (Array.isArray(value)) renderedValue = value.join(", ");
|
|
|
|
// cover use case if the data is an boolean
|
|
if (typeof value === "boolean")
|
|
renderedValue = <Checkbox disabled checked={value} />;
|
|
|
|
// cover use case if we want to render a component
|
|
if (render) renderedValue = render(value);
|
|
|
|
return (
|
|
<StyledTableCell key={cellKey} align="left">
|
|
{renderedValue}
|
|
</StyledTableCell>
|
|
);
|
|
};
|
|
|
|
return (
|
|
<TableContainer component={Paper}>
|
|
<Table sx={{ minWidth: 700 }} aria-label="customized table">
|
|
<TableHead>
|
|
<TableRow>
|
|
{configuration.map((header: CustomTableConfiguration) => (
|
|
<StyledTableCell key={header.key}>{header.label}</StyledTableCell>
|
|
))}
|
|
</TableRow>
|
|
</TableHead>
|
|
<TableBody>
|
|
{data.map((data: any, rowIndex: number) => (
|
|
<StyledTableRow key={rowIndex}>
|
|
{configuration.map((column: CustomTableConfiguration) => {
|
|
const cellValue: any = data[column.key];
|
|
const cellKey = column.key;
|
|
const renderComponent = column?.render;
|
|
return renderTableCell(cellValue, cellKey, renderComponent);
|
|
})}
|
|
</StyledTableRow>
|
|
))}
|
|
</TableBody>
|
|
</Table>
|
|
</TableContainer>
|
|
);
|
|
};
|
|
|
|
export default CustomTable;
|