Skip to content

Commit d139db7

Browse files
authored
Merge pull request bluewave-labs#3512 from SkyKingPX/feat/improved-status-bar-messages
Improve status bar messages on public status pages
2 parents f12a96c + e60dbb9 commit d139db7

3 files changed

Lines changed: 105 additions & 12 deletions

File tree

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
* text=auto
2+
* text eol=lf

client/src/Pages/StatusPage/Status/Components/StatusBar.tsx

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,115 @@
1-
import { AlertTriangle, CircleCheck } from "lucide-react";
1+
import {
2+
AlertTriangle,
3+
CircleCheck,
4+
CircleX,
5+
Loader,
6+
PauseCircle,
7+
ShieldAlert,
8+
Wrench,
9+
} from "lucide-react";
210
import Stack from "@mui/material/Stack";
311
import Typography from "@mui/material/Typography";
412

513
import { useTranslation } from "react-i18next";
6-
import type { Theme } from "@mui/material";
714
import { useTheme } from "@mui/material";
8-
import type { Monitor } from "@/Types/Monitor";
15+
import type { Theme } from "@mui/material";
16+
import type { Monitor, MonitorStatus } from "@/Types/Monitor";
17+
18+
interface StatusDisplay {
19+
icon: JSX.Element;
20+
msg?: string;
21+
color?: string;
22+
}
923

1024
const getMonitorStatus = (monitors: Monitor[], theme: Theme, t: Function) => {
11-
const monitorsStatus: Record<string, any> = {
25+
const monitorsStatus: StatusDisplay = {
1226
icon: <AlertTriangle size={24} />,
1327
};
1428

15-
if (monitors.every((monitor) => monitor.status === "up")) {
29+
// Handle empty monitors array
30+
if (monitors.length === 0) {
31+
monitorsStatus.msg = t("pages.statusPages.statusBar.noMonitors");
32+
monitorsStatus.color = theme.palette.warning.main;
33+
monitorsStatus.icon = <CircleX size={24} />;
34+
return monitorsStatus;
35+
}
36+
37+
const allOf = (...statuses: MonitorStatus[]) =>
38+
monitors.every((m) => statuses.includes(m.status));
39+
const someOf = (...statuses: MonitorStatus[]) =>
40+
monitors.some((m) => statuses.includes(m.status));
41+
const noneOf = (...statuses: MonitorStatus[]) =>
42+
monitors.every((m) => !statuses.includes(m.status));
43+
44+
// All monitors in a single state
45+
if (allOf("up")) {
1646
monitorsStatus.msg = t("pages.statusPages.statusBar.allUp");
1747
monitorsStatus.color = theme.palette.success.main;
1848
monitorsStatus.icon = <CircleCheck size={24} />;
19-
return monitorsStatus;
20-
} else if (monitors.every((monitor) => monitor.status === "down")) {
49+
} else if (allOf("breached")) {
50+
monitorsStatus.msg = t("pages.statusPages.statusBar.allBreached");
51+
monitorsStatus.color = theme.palette.error.main;
52+
monitorsStatus.icon = <ShieldAlert size={24} />;
53+
} else if (allOf("maintenance")) {
54+
monitorsStatus.msg = t("pages.statusPages.statusBar.allMaintenance");
55+
monitorsStatus.color = theme.palette.warning.main;
56+
monitorsStatus.icon = <Wrench size={24} />;
57+
} else if (allOf("down")) {
2158
monitorsStatus.msg = t("pages.statusPages.statusBar.allDown");
2259
monitorsStatus.color = theme.palette.error.main;
23-
return monitorsStatus;
24-
} else if (monitors.some((monitor) => monitor.status === "down")) {
60+
monitorsStatus.icon = <CircleX size={24} />;
61+
} else if (allOf("paused")) {
62+
monitorsStatus.msg = t("pages.statusPages.statusBar.allPaused");
63+
monitorsStatus.color = theme.palette.warning.main;
64+
monitorsStatus.icon = <PauseCircle size={24} />;
65+
} else if (allOf("initializing")) {
66+
monitorsStatus.msg = t("pages.statusPages.statusBar.allInitializing");
67+
monitorsStatus.color = theme.palette.warning.main;
68+
monitorsStatus.icon = <Loader size={24} />;
69+
70+
// Breached takes highest priority in mixed states
71+
} else if (someOf("breached") && someOf("down")) {
72+
monitorsStatus.msg = t("pages.statusPages.statusBar.breachedAndDown");
73+
monitorsStatus.color = theme.palette.error.main;
74+
monitorsStatus.icon = <ShieldAlert size={24} />;
75+
} else if (someOf("breached")) {
76+
monitorsStatus.msg = t("pages.statusPages.statusBar.breached");
77+
monitorsStatus.color = theme.palette.error.main;
78+
monitorsStatus.icon = <ShieldAlert size={24} />;
79+
80+
// Maintenance combinations
81+
} else if (someOf("maintenance") && someOf("down")) {
82+
monitorsStatus.msg = t("pages.statusPages.statusBar.maintenanceAndDown");
83+
monitorsStatus.color = theme.palette.error.main;
84+
monitorsStatus.icon = <Wrench size={24} />;
85+
} else if (someOf("maintenance") && noneOf("down")) {
86+
monitorsStatus.msg = t("pages.statusPages.statusBar.maintenance");
87+
monitorsStatus.color = theme.palette.warning.main;
88+
monitorsStatus.icon = <Wrench size={24} />;
89+
90+
// Degraded (some down, no maintenance/breached)
91+
} else if (someOf("down")) {
2592
monitorsStatus.msg = t("pages.statusPages.statusBar.degraded");
2693
monitorsStatus.color = theme.palette.warning.main;
27-
return monitorsStatus;
94+
monitorsStatus.icon = <AlertTriangle size={24} />;
95+
96+
// Some Paused
97+
} else if (someOf("paused")) {
98+
monitorsStatus.msg = t("pages.statusPages.statusBar.partiallyPaused");
99+
monitorsStatus.color = theme.palette.warning.main;
100+
monitorsStatus.icon = <PauseCircle size={24} />;
101+
102+
// Initializing
103+
} else if (someOf("initializing")) {
104+
monitorsStatus.msg = t("pages.statusPages.statusBar.initializing");
105+
monitorsStatus.color = theme.palette.info.main;
106+
monitorsStatus.icon = <Loader size={24} />;
28107
} else {
29108
monitorsStatus.msg = t("pages.statusPages.statusBar.unknown");
30109
monitorsStatus.color = theme.palette.warning.main;
31-
return monitorsStatus;
32110
}
111+
112+
return monitorsStatus;
33113
};
34114

35115
interface StatusBarProps {

client/src/locales/en.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1208,9 +1208,20 @@
12081208
}
12091209
},
12101210
"statusBar": {
1211-
"allDown": "All systems are down",
12121211
"allUp": "All systems operational",
1212+
"allBreached": "All systems have exceeded thresholds",
1213+
"allMaintenance": "All systems are under maintenance",
1214+
"allDown": "All systems are down",
1215+
"allPaused": "All systems are paused",
1216+
"allInitializing": "All systems are initializing",
1217+
"breachedAndDown": "Some systems have exceeded thresholds and are down",
1218+
"breached": "Some systems have exceeded thresholds",
12131219
"degraded": "Some systems are experiencing issues",
1220+
"maintenanceAndDown": "Some systems are down during maintenance",
1221+
"maintenance": "Some systems are under maintenance",
1222+
"partiallyPaused": "Some systems are paused",
1223+
"initializing": "Some systems are initializing",
1224+
"noMonitors": "No monitors have been configured",
12141225
"unknown": "Unable to determine system status"
12151226
},
12161227
"table": {

0 commit comments

Comments
 (0)