From a17d97c34931066c23e1c2686bd8c552edc84a82 Mon Sep 17 00:00:00 2001 From: Ivan Vydrin Date: Sat, 12 Sep 2026 14:13:56 +0300 Subject: [PATCH] Harden dashboard interaction and recovery --- CHANGELOG.md | 8 + .../Components/App.razor | 3 + .../Components/HealthieDashboard.razor | 55 +++--- .../Components/HealthieDashboard.razor.cs | 164 ++++++++++++++++-- .../Services/DashboardStateHandoff.cs | 3 +- .../Services/HealthieDashboardService.cs | 4 +- src/Healthie.Dashboard/wwwroot/healthie.css | 41 ++++- src/Healthie.Dashboard/wwwroot/healthie.js | 65 +++++++ .../DashboardGroupingTests.cs | 32 +++- tests/Healthie.Tests.E2E/DashboardTests.cs | 29 +++- tests/Healthie.Tests.E2E/SampleAppFixture.cs | 24 ++- .../DashboardComponentLifecycleTests.cs | 92 ++++++++++ 12 files changed, 470 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94060dd..928b8c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ### Fixed +- The dashboard event-log and about dialogs now move focus inside, keep keyboard focus contained, + close with Escape, and restore focus to the control that opened them. +- Dashboard checker rows now expose selection as a real button alongside their action buttons, + removing nested interactive controls while preserving whole-row pointer selection. +- A dashboard state-provider failure now shows a recoverable unavailable state with a retry action + instead of looking like an empty installation with no registered checkers. +- The Blazor sample now keeps the dashboard stylesheet in its static host head, preventing an + unstyled flash while the interactive head reconnects on a slow network. - HTTP checker display names and result messages now omit URI user information, query strings, and fragments, server-controlled reason phrases, and transport exception details, preventing embedded credentials and tokens from reaching stored history, alerts, logs, or the dashboard while requests diff --git a/samples/Healthie.Sample.BlazorUI/Components/App.razor b/samples/Healthie.Sample.BlazorUI/Components/App.razor index 56289b4..a4eaa13 100644 --- a/samples/Healthie.Sample.BlazorUI/Components/App.razor +++ b/samples/Healthie.Sample.BlazorUI/Components/App.razor @@ -9,6 +9,9 @@ reset that stops a pale frame being drawn around the dashboard -- did nothing. *@ + @* Keep the dashboard styled while the interactive HeadOutlet reconnects on a slow network. *@ + diff --git a/src/Healthie.Dashboard/Components/HealthieDashboard.razor b/src/Healthie.Dashboard/Components/HealthieDashboard.razor index 1eb3b7e..45bb011 100644 --- a/src/Healthie.Dashboard/Components/HealthieDashboard.razor +++ b/src/Healthie.Dashboard/Components/HealthieDashboard.razor @@ -7,6 +7,7 @@ @inject HealthieThemeState ThemeState @inject PersistentComponentState PersistedState @inject DashboardStateHandoff Handoff +@inject IJSRuntime JS @Options.DashboardTitle @@ -96,7 +97,7 @@ + @onclick="ToggleAboutAsync">? @@ -143,16 +144,17 @@ *@ @if (_showLog) { - + -