From 71bd1fa28f6ef1690c5ebfb023e374c547099bc4 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sun, 25 Jan 2026 15:56:15 +0000 Subject: [PATCH] time range header --- .../v2/common/controls/HeaderTimeRange.tsx | 70 +++++++++++++++++++ client/src/Components/v2/common/index.ts | 1 + client/src/Pages/Uptime/Details/index.tsx | 32 ++++----- 3 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 client/src/Components/v2/common/controls/HeaderTimeRange.tsx diff --git a/client/src/Components/v2/common/controls/HeaderTimeRange.tsx b/client/src/Components/v2/common/controls/HeaderTimeRange.tsx new file mode 100644 index 000000000..3ca27ffbc --- /dev/null +++ b/client/src/Components/v2/common/controls/HeaderTimeRange.tsx @@ -0,0 +1,70 @@ +import Stack from "@mui/material/Stack"; +import Typography from "@mui/material/Typography"; +import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; +import ToggleButton from "@mui/material/ToggleButton"; +import { useTheme } from "@mui/material/styles"; + +interface MonitorTimeFrameHeaderProps { + isLoading?: boolean; + hasDateRange?: boolean; + dateRange: string; + setDateRange: (dateRange: string) => void; +} + +export const HeaderTimeRange = ({ + isLoading = false, + hasDateRange = true, + dateRange, + setDateRange, +}: MonitorTimeFrameHeaderProps) => { + const theme = useTheme(); + + const handleChange = ( + _event: React.MouseEvent, + newValue: string | null + ) => { + if (newValue !== null) { + setDateRange(newValue); + } + }; + + let timeFramePicker = null; + + if (hasDateRange) { + timeFramePicker = ( + + Recent + Day + Week + Month + + ); + } + + return ( + + + Showing statistics for past{" "} + {dateRange === "recent" + ? "2 hours" + : dateRange === "day" + ? "24 hours" + : dateRange === "week" + ? "7 days" + : "30 days"} + . + + {timeFramePicker} + + ); +}; diff --git a/client/src/Components/v2/common/index.ts b/client/src/Components/v2/common/index.ts index 16baac7fe..d0d1262b7 100644 --- a/client/src/Components/v2/common/index.ts +++ b/client/src/Components/v2/common/index.ts @@ -3,3 +3,4 @@ export * from "../common/charts/HeatmapResponseTime"; export * from "../common/charts/HeatmapResponseTimeTooltip"; export * from "../common/controls/HeaderCreate"; export * from "../common/controls/HeaderMonitorControls"; +export * from "../common/controls/HeaderTimeRange"; diff --git a/client/src/Pages/Uptime/Details/index.tsx b/client/src/Pages/Uptime/Details/index.tsx index cdb69b5cd..7e88fde2b 100644 --- a/client/src/Pages/Uptime/Details/index.tsx +++ b/client/src/Pages/Uptime/Details/index.tsx @@ -1,5 +1,5 @@ import { BasePage } from "@/Components/v2/design-elements"; -import { HeaderMonitorControls } from "@/Components/v2/common"; +import { HeaderMonitorControls, HeaderTimeRange } from "@/Components/v2/common"; import { useIsAdmin } from "@/Hooks/useIsAdmin"; import { useState, useMemo } from "react"; @@ -62,7 +62,13 @@ const UptimeDetailsPage = () => { if (!certificateData?.certificateDate) { return undefined; } - return formatDateWithTz(certificateData.certificateDate, certificateDateFormat, uiTimezone) ?? "N/A"; + return ( + formatDateWithTz( + certificateData.certificateDate, + certificateDateFormat, + uiTimezone + ) ?? "N/A" + ); }, [certificateData, uiTimezone]); const checksUrl = useMemo(() => { @@ -87,22 +93,6 @@ const UptimeDetailsPage = () => { const checks = checksData?.checks ?? []; const checksCount = checksData?.checksCount ?? 0; - // TODO: Add UI components here - // Placeholder to consume all data fetching results - console.log({ - monitorIsLoading, - monitorError, - refetchMonitor, - monitorStats, - checksIsLoading, - checksError, - checks, - checksCount, - setPage, - setRowsPerPage, - setDateRange, - }); - return ( { monitorStats={monitorStats} certificateExpiry={certificateExpiry} /> + ); };