Fix Failures tooltip wording; move Service Health to top of Server tab

Task 2: rename 'Failures:' label to 'Failed Attempts:' and update tooltip
to 'Total failed authentication attempts currently tracked by fail2ban
across all active jails' — more accurate than 'Currently failing IPs'.

Task 3: move <ServerHealthSection /> to the top of ServerTab so users
see connectivity status before scrolling through all settings fields.
This commit was merged in pull request #2.
This commit is contained in:
2026-03-16 19:48:39 +01:00
parent e7834a888e
commit 5b7d1a4360
4 changed files with 14 additions and 6 deletions

View File

@@ -30,7 +30,9 @@ This document breaks the entire BanGUI project into development stages, ordered
--- ---
### 2. Dashboard — Improve "Failures" Tooltip ### ~~2. Dashboard — Improve "Failures" Tooltip~~ ✅ Done
**Implemented:** In `frontend/src/components/ServerStatusBar.tsx`, changed the `Failures:` label to `Failed Attempts:` and updated the tooltip from `"Currently failing IPs"` to `"Total failed authentication attempts currently tracked by fail2ban across all active jails"`. Updated `ServerStatusBar.test.tsx` to assert the new label text.
**Problem:** The `ServerStatusBar` shows a "Failures: 42" counter with the tooltip `"Currently failing IPs"`. In fail2ban terminology *failures* are individual **failed authentication attempts** tracked in the fail2ban DB, not the number of unique IPs that failed. The current wording is ambiguous and misleading — users may think it means broken connections or error states. **Problem:** The `ServerStatusBar` shows a "Failures: 42" counter with the tooltip `"Currently failing IPs"`. In fail2ban terminology *failures* are individual **failed authentication attempts** tracked in the fail2ban DB, not the number of unique IPs that failed. The current wording is ambiguous and misleading — users may think it means broken connections or error states.
@@ -42,7 +44,9 @@ This document breaks the entire BanGUI project into development stages, ordered
--- ---
### 3. Config → Server Tab — Move "Service Health" to Top ### ~~3. Config → Server Tab — Move "Service Health" to Top~~ ✅ Done
**Implemented:** In `frontend/src/components/config/ServerTab.tsx`, moved `<ServerHealthSection />` from the end of the JSX return to be the first element rendered inside the tab container, before all settings fields.
**Problem:** In the Config page → Server tab, the `Service Health` panel (`ServerHealthSection`) is rendered at the bottom of the tab, after all settings sections (log level, log target, DB purge settings, map thresholds, reload/restart buttons). This means users must scroll past all editable fields to check service connectivity status, even though the health status is the most critical piece of context — it indicates whether the server is reachable at all. **Problem:** In the Config page → Server tab, the `Service Health` panel (`ServerHealthSection`) is rendered at the bottom of the tab, after all settings sections (log level, log target, DB purge settings, map thresholds, reload/restart buttons). This means users must scroll past all editable fields to check service connectivity status, even though the health status is the most critical piece of context — it indicates whether the server is reachable at all.

View File

@@ -139,9 +139,9 @@ export function ServerStatusBar(): React.JSX.Element {
</div> </div>
</Tooltip> </Tooltip>
<Tooltip content="Currently failing IPs" relationship="description"> <Tooltip content="Total failed authentication attempts currently tracked by fail2ban across all active jails" relationship="description">
<div className={styles.statGroup}> <div className={styles.statGroup}>
<Text size={200}>Failures:</Text> <Text size={200}>Failed Attempts:</Text>
<Text size={200} className={styles.statValue}> <Text size={200} className={styles.statValue}>
{status.total_failures} {status.total_failures}
</Text> </Text>

View File

@@ -136,6 +136,8 @@ describe("ServerStatusBar", () => {
expect(screen.getByText("4")).toBeInTheDocument(); expect(screen.getByText("4")).toBeInTheDocument();
expect(screen.getByText("21")).toBeInTheDocument(); expect(screen.getByText("21")).toBeInTheDocument();
expect(screen.getByText("99")).toBeInTheDocument(); expect(screen.getByText("99")).toBeInTheDocument();
// Verify the "Failed Attempts:" label (renamed from "Failures:").
expect(screen.getByText("Failed Attempts:")).toBeInTheDocument();
}); });
it("renders an error message when the status fetch fails", () => { it("renders an error message when the status fetch fails", () => {

View File

@@ -219,6 +219,10 @@ export function ServerTab(): React.JSX.Element {
return ( return (
<div> <div>
{/* Service Health & Log Viewer section — shown first so users can
immediately see whether fail2ban is reachable before editing settings. */}
<ServerHealthSection />
<div className={styles.sectionCard}> <div className={styles.sectionCard}>
<div style={{ marginBottom: tokens.spacingVerticalS }}> <div style={{ marginBottom: tokens.spacingVerticalS }}>
<AutoSaveIndicator <AutoSaveIndicator
@@ -412,8 +416,6 @@ export function ServerTab(): React.JSX.Element {
</div> </div>
) : null} ) : null}
{/* Service Health & Log Viewer section */}
<ServerHealthSection />
</div> </div>
); );
} }