From 00a9630e299646c162be64001dbbe013bb5ee51c Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 31 Jan 2025 10:06:28 -0800 Subject: [PATCH 1/5] Add reusable TimeFrameHeader component --- .../MonitorTimeFrameHeader/index.jsx | 72 +++++++++++++++++++ .../MonitorTimeFrameHeader/skeleton.jsx | 23 ++++++ 2 files changed, 95 insertions(+) create mode 100644 Client/src/Components/MonitorTimeFrameHeader/index.jsx create mode 100644 Client/src/Components/MonitorTimeFrameHeader/skeleton.jsx diff --git a/Client/src/Components/MonitorTimeFrameHeader/index.jsx b/Client/src/Components/MonitorTimeFrameHeader/index.jsx new file mode 100644 index 000000000..e43d63494 --- /dev/null +++ b/Client/src/Components/MonitorTimeFrameHeader/index.jsx @@ -0,0 +1,72 @@ +import { Stack, Typography, Button, ButtonGroup } from "@mui/material"; +import { useTheme } from "@emotion/react"; +import SkeletonLayout from "./skeleton"; +import PropTypes from "prop-types"; + +const MonitorTimeFrameHeader = ({ + shouldRender = true, + hasDateRange = true, + dateRange, + setDateRange, +}) => { + const theme = useTheme(); + + if (!shouldRender) { + return ; + } + + let timeFramePicker = null; + + if (hasDateRange) { + timeFramePicker = ( + + + + + + ); + } + + return ( + + + Showing statistics for past{" "} + {dateRange === "day" ? "24 hours" : dateRange === "week" ? "7 days" : "30 days"}. + + {timeFramePicker} + + ); +}; + +MonitorTimeFrameHeader.propTypes = { + shouldRender: PropTypes.bool, + hasDateRange: PropTypes.bool, + dateRange: PropTypes.string, + setDateRange: PropTypes.func, +}; + +export default MonitorTimeFrameHeader; diff --git a/Client/src/Components/MonitorTimeFrameHeader/skeleton.jsx b/Client/src/Components/MonitorTimeFrameHeader/skeleton.jsx new file mode 100644 index 000000000..d7c395d54 --- /dev/null +++ b/Client/src/Components/MonitorTimeFrameHeader/skeleton.jsx @@ -0,0 +1,23 @@ +import { Stack, Skeleton } from "@mui/material"; + +const SkeletonLayout = () => { + return ( + + + + + ); +}; + +export default SkeletonLayout; From 4d8f0b72873bfeeadf654faeafd8a170677f6fe5 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 31 Jan 2025 10:06:57 -0800 Subject: [PATCH 2/5] conditionally render time frame picker --- .../Components/MonitorStatusHeader/ConfigButton/index.jsx | 7 ++++--- Client/src/Components/MonitorStatusHeader/index.jsx | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Client/src/Components/MonitorStatusHeader/ConfigButton/index.jsx b/Client/src/Components/MonitorStatusHeader/ConfigButton/index.jsx index fc6407f31..c966abf33 100644 --- a/Client/src/Components/MonitorStatusHeader/ConfigButton/index.jsx +++ b/Client/src/Components/MonitorStatusHeader/ConfigButton/index.jsx @@ -3,7 +3,7 @@ import { useTheme } from "@emotion/react"; import { useNavigate } from "react-router-dom"; import SettingsIcon from "../../../assets/icons/settings-bold.svg?react"; import PropTypes from "prop-types"; -const ConfigButton = ({ shouldRender, monitorId }) => { +const ConfigButton = ({ shouldRender = true, monitorId, path }) => { const theme = useTheme(); const navigate = useNavigate(); @@ -14,7 +14,7 @@ const ConfigButton = ({ shouldRender, monitorId }) => { - - - - - ); -}; - -TimeFramePicker.propTypes = { - shouldRender: PropTypes.bool, - dateRange: PropTypes.string, - setDateRange: PropTypes.func, -}; - -export default TimeFramePicker; diff --git a/Client/src/Pages/Uptime/Details/Components/TimeFramePicker/skeleton.jsx b/Client/src/Pages/Uptime/Details/Components/TimeFramePicker/skeleton.jsx deleted file mode 100644 index d7c395d54..000000000 --- a/Client/src/Pages/Uptime/Details/Components/TimeFramePicker/skeleton.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import { Stack, Skeleton } from "@mui/material"; - -const SkeletonLayout = () => { - return ( - - - - - ); -}; - -export default SkeletonLayout; From 0b3cd9ed174f5ddc0daa96ca8f5511f97775d357 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Fri, 31 Jan 2025 10:07:59 -0800 Subject: [PATCH 5/5] Add empty veiw to PageSpeed Details, fix config path --- Client/src/Pages/PageSpeed/Details/index.jsx | 34 ++++++++++++++++---- Client/src/Pages/Uptime/Details/index.jsx | 6 ++-- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/Client/src/Pages/PageSpeed/Details/index.jsx b/Client/src/Pages/PageSpeed/Details/index.jsx index 6fa4aa82c..c52c1c817 100644 --- a/Client/src/Pages/PageSpeed/Details/index.jsx +++ b/Client/src/Pages/PageSpeed/Details/index.jsx @@ -1,10 +1,12 @@ // Components -import { Stack, Typography, Skeleton } from "@mui/material"; +import { Stack, Typography } from "@mui/material"; import Breadcrumbs from "../../../Components/Breadcrumbs"; +import MonitorTimeFrameHeader from "../../../Components/MonitorTimeFrameHeader"; import MonitorStatusHeader from "../../../Components/MonitorStatusHeader"; import PageSpeedStatusBoxes from "./Components/PageSpeedStatusBoxes"; import PageSpeedAreaChart from "./Components/PageSpeedAreaChart"; import PerformanceReport from "./Components/PerformanceReport"; +import GenericFallback from "../../../Components/GenericFallback"; // Utils import { useTheme } from "@emotion/react"; import { useIsAdmin } from "../../../Hooks/useIsAdmin"; @@ -41,10 +43,28 @@ const PageSpeedDetails = () => { setMetrics((prev) => ({ ...prev, [id]: !prev[id] })); }; + // Empty view, displayed when loading is complete and there are no checks + if (!isLoading && monitor?.checks?.length === 0) { + return ( + + + + + There is no history for this monitor yet. + + + ); + } + return ( { shouldRender={!isLoading} monitor={monitor} /> - - Showing statistics for past 24 hours. - + + { { monitor={monitor} certificateExpiry={certificateExpiry} /> -