diff --git a/Client/src/Pages/Uptime/Details/Components/ChartBoxes/EmptyView.jsx b/Client/src/Pages/Uptime/Details/Components/ChartBoxes/EmptyView.jsx new file mode 100644 index 000000000..b6fee789f --- /dev/null +++ b/Client/src/Pages/Uptime/Details/Components/ChartBoxes/EmptyView.jsx @@ -0,0 +1,20 @@ +// Components +import { Typography, Box } from "@mui/material"; +import PropTypes from "prop-types"; + +const EmptyView = ({ message = "No Data", size = "h2" }) => { + return ( + + + {message} + + + ); +}; + +EmptyView.propTypes = { + message: PropTypes.string, + size: PropTypes.oneOf(['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'body1', 'body2']) +}; + +export default EmptyView; \ No newline at end of file diff --git a/Client/src/Pages/Uptime/Details/Components/ChartBoxes/index.jsx b/Client/src/Pages/Uptime/Details/Components/ChartBoxes/index.jsx index 3e5a66570..f3c74ab0d 100644 --- a/Client/src/Pages/Uptime/Details/Components/ChartBoxes/index.jsx +++ b/Client/src/Pages/Uptime/Details/Components/ChartBoxes/index.jsx @@ -8,6 +8,7 @@ import UpBarChart from "../Charts/UpBarChart"; import DownBarChart from "../Charts/DownBarChart"; import ResponseGaugeChart from "../Charts/ResponseGaugeChart"; import SkeletonLayout from "./skeleton"; +import EmptyView from "./EmptyView"; // Utils import { formatDateWithTz } from "../../../../../Utils/timeUtils"; import PropTypes from "prop-types"; @@ -36,6 +37,83 @@ const ChartBoxes = ({ totalUpChecks + totalDownChecks > 0 ? totalUpChecks + totalDownChecks : 1; const groupedUptimePercentage = (totalUpChecks / denominator) * 100; + const renderUptime = () => { + const upCheck = monitor?.groupedUpChecks?.reduce((count, checkGroup) => count + checkGroup.totalChecks, 0); + if (!hoveredUptimeData && !upCheck) { + return ; + } + return ( + <> + + Total Checks + + {hoveredUptimeData !== null + ? hoveredUptimeData.totalChecks + : upCheck} + + {hoveredUptimeData !== null && hoveredUptimeData.time !== null && ( + + {formatDateWithTz(hoveredUptimeData._id, dateFormat, uiTimezone)} + + )} + + + + {hoveredUptimeData !== null ? "Avg Response Time" : "Uptime Percentage"} + + + {hoveredUptimeData !== null + ? Math.floor(hoveredUptimeData?.avgResponseTime ?? 0) + : Math.floor(groupedUptimePercentage)} + + {hoveredUptimeData !== null ? " ms" : " %"} + + + + + ); + }; + + const renderIncidents = () => { + const downChecks = monitor?.groupedDownChecks?.reduce((count, checkGroup) => count + checkGroup.totalChecks, 0); + if (!downChecks && !hoveredIncidentsData) { + return ; + } + return ( + + + {hoveredIncidentsData !== null + ? hoveredIncidentsData.totalChecks + : downChecks} + + {hoveredIncidentsData !== null && hoveredIncidentsData.time !== null && ( + + {formatDateWithTz(hoveredIncidentsData._id, dateFormat, uiTimezone)} + + )} + + ); + } + + const renderResponseTime = () => { + if (!monitor?.avgResponseTime) { + return ; + } + return ; + }; + return ( - - Total Checks - - {hoveredUptimeData !== null - ? hoveredUptimeData.totalChecks - : (monitor?.groupedUpChecks?.reduce((count, checkGroup) => { - return count + checkGroup.totalChecks; - }, 0) ?? 0)} - - {hoveredUptimeData !== null && hoveredUptimeData.time !== null && ( - - {formatDateWithTz(hoveredUptimeData._id, dateFormat, uiTimezone)} - - )} - - - - {hoveredUptimeData !== null ? "Avg Response Time" : "Uptime Percentage"} - - - {hoveredUptimeData !== null - ? Math.floor(hoveredUptimeData?.avgResponseTime ?? 0) - : Math.floor(groupedUptimePercentage)} - - {hoveredUptimeData !== null ? " ms" : " %"} - - - + {renderUptime()} } header="Incidents" > - - {hoveredIncidentsData !== null || - (monitor?.groupedDownChecks?.reduce((count, checkGroup) => count + checkGroup.totalChecks, 0) > 0) ? ( - // Original layout for when incidents exist - - - {hoveredIncidentsData !== null - ? hoveredIncidentsData.totalChecks - : monitor?.groupedDownChecks?.reduce((count, checkGroup) => count + checkGroup.totalChecks, 0)} - - {hoveredIncidentsData !== null && hoveredIncidentsData.time !== null && ( - - {formatDateWithTz(hoveredIncidentsData._id, dateFormat, uiTimezone)} - - )} - - ) : ( - // Centered layout for "No incidents" message - - - Great. No incidents, yet! - - - )} + + {renderIncidents()} } header="Average Response Time" > - + {renderResponseTime()} );