Files
Checkmate/client/src/Pages/Checks/Components/ChecksTable.tsx
T

123 lines
2.6 KiB
TypeScript
Raw Normal View History

import {
Table,
Pagination,
StatusLabel,
2026-05-07 09:54:58 -07:00
StatusCodeLabel,
} from "@/Components/design-elements";
2026-01-27 23:05:00 +00:00
import Box from "@mui/material/Box";
2026-02-20 18:13:39 +00:00
import type { Header } from "@/Components/design-elements/Table";
2026-02-11 20:29:50 +00:00
import type { Monitor } from "@/Types/Monitor";
2026-01-27 23:05:00 +00:00
import { useTranslation } from "react-i18next";
import { formatDateWithTz } from "@/Utils/TimeUtils";
2026-01-28 18:45:11 +00:00
import type { Check } from "@/Types/Check";
2026-01-27 23:05:00 +00:00
import type { RootState } from "@/Types/state";
import { useSelector } from "react-redux";
export const ChecksTable = ({
monitors,
2026-01-28 18:45:11 +00:00
checks,
checksCount,
2026-01-27 23:05:00 +00:00
page,
setPage,
rowsPerPage,
setRowsPerPage,
}: {
monitors: Monitor[] | null;
2026-01-28 18:45:11 +00:00
checks: Check[];
checksCount: number;
2026-01-27 23:05:00 +00:00
page: number;
setPage: (page: number) => void;
rowsPerPage: number;
setRowsPerPage: (rowsPerPage: number) => void;
}) => {
const { t } = useTranslation();
const uiTimezone = useSelector((state: RootState) => state.ui.timezone);
2026-05-07 09:54:58 -07:00
const getHeaders = () => {
2026-01-27 23:05:00 +00:00
const headers: Header<Check>[] = [
{
id: "monitorName",
content: t("common.table.headers.monitor"),
render: (row) => {
return (
monitors?.find((monitor) => monitor.id === row.metadata.monitorId)?.name ||
"N/A"
);
},
},
{
id: "status",
content: "Status",
render: (row) => {
2026-02-11 20:29:50 +00:00
return <StatusLabel status={row.status === true ? "up" : "down"} />;
2026-01-27 23:05:00 +00:00
},
},
{
id: "date",
2026-01-28 17:59:11 +00:00
content: t("common.table.headers.dateTime"),
2026-01-27 23:05:00 +00:00
render: (row) => {
return formatDateWithTz(
row.createdAt,
"ddd, MMMM D, YYYY, HH:mm A",
uiTimezone
);
},
},
{
id: "statusCode",
2026-01-28 17:59:11 +00:00
content: t("pages.checks.table.headers.statusCode"),
2026-01-27 23:05:00 +00:00
render: (row) => {
2026-05-07 09:54:58 -07:00
return (
<StatusCodeLabel
statusCode={row.statusCode}
message={row.message}
2026-01-27 23:05:00 +00:00
/>
);
},
},
{
id: "message",
content: t("common.table.headers.message"),
render: (row) => {
return row.message || "N/A";
},
},
];
return headers;
};
2026-05-07 09:54:58 -07:00
const headers = getHeaders();
2026-01-27 23:05:00 +00:00
const handlePageChange = (
_e: React.MouseEvent<HTMLButtonElement> | null,
newPage: number
) => {
setPage(newPage);
};
const handleRowsPerPageChange = (
e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>
) => {
const value = Number(e.target.value);
setPage(0);
setRowsPerPage(value);
};
return (
<Box>
<Table
headers={headers}
data={checks}
2026-01-28 17:59:11 +00:00
emptyViewText={t("pages.checks.table.empty")}
2026-01-27 23:05:00 +00:00
/>
<Pagination
component="div"
2026-01-27 23:17:40 +00:00
count={checksCount}
2026-01-27 23:05:00 +00:00
page={page}
rowsPerPage={rowsPerPage}
onPageChange={handlePageChange}
onRowsPerPageChange={handleRowsPerPageChange}
/>
</Box>
);
};