Summary
Surface the banned-IP data exposed by the API in #276 in the admin panel, so operators can see and manually release bans without touching the HAProxy socket directly.
Scope
- A dashboard
StatCard (tone error/warning) showing the current banned-IP count, wired into use-dashboard-stats.ts and DashboardPage.tsx.
- A dedicated banned-IPs list page: a
SectionCard + DataTable (columns: IP, reason, banned-at, expires-at, an unban Button), following the filters+table+pagination pattern already used in LogsPage.tsx.
- A
use-banned-ips.ts data-fetching hook (mirroring use-logs.ts/use-vhosts.ts).
- New route + nav entry (
src/app/routes.ts, src/app/router.tsx, NavBar.tsx).
- Frontend tests (Vitest + Testing Library) for the hook, the table, and the unban action.
Depends on
Related to #176
Summary
Surface the banned-IP data exposed by the API in #276 in the admin panel, so operators can see and manually release bans without touching the HAProxy socket directly.
Scope
StatCard(toneerror/warning) showing the current banned-IP count, wired intouse-dashboard-stats.tsandDashboardPage.tsx.SectionCard+DataTable(columns: IP, reason, banned-at, expires-at, an unbanButton), following the filters+table+pagination pattern already used inLogsPage.tsx.use-banned-ips.tsdata-fetching hook (mirroringuse-logs.ts/use-vhosts.ts).src/app/routes.ts,src/app/router.tsx,NavBar.tsx).Depends on
Related to #176