From eb4bce3e49ca561f633d27fc8a83a724345b1311 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Wed, 17 Jun 2026 20:44:34 -0400 Subject: [PATCH] =?UTF-8?q?refactor(kpi):=20K13/K15=20trend=20review=20fix?= =?UTF-8?q?ups=20=E2=80=94=20per-metric=20isolation,=20disable-during-load?= =?UTF-8?q?=20+=20logging,=20loading-flag=20finally,=20test=20coverage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Pages/Audit/AuditLogPage.razor | 4 +- .../Pages/Audit/AuditLogPage.razor.cs | 52 +++++++++---- .../Components/Pages/Monitoring/Health.razor | 1 + .../Notifications/NotificationKpis.razor | 76 ++++++++++++------- .../Pages/SiteCalls/SiteCallsReport.razor.cs | 30 +++++--- .../Pages/HealthPageTests.cs | 5 +- .../Pages/NotificationKpisPageTests.cs | 38 ++++++++++ 7 files changed, 151 insertions(+), 55 deletions(-) diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor index 8d0a0612..bbf9e444 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor @@ -31,12 +31,12 @@
diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor.cs b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor.cs index dfce1c10..17e69792 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Audit/AuditLogPage.razor.cs @@ -2,6 +2,7 @@ using System.Globalization; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Logging; using ZB.MOM.WW.ScadaBridge.CentralUI.Services; using ZB.MOM.WW.ScadaBridge.Commons.Types.Audit; using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums; @@ -56,6 +57,10 @@ public partial class AuditLogPage : IDisposable /// [Inject] private IKpiHistoryQueryService KpiHistory { get; set; } = null!; + /// Logger for the best-effort Trends panel — a degraded series fetch + /// is logged at warning level so the silent fallback is still observable. + [Inject] private ILogger Logger { get; set; } = null!; + private AuditLogQueryFilter? _currentFilter; private AuditEventView? _selectedEvent; private bool _drawerOpen; @@ -271,6 +276,13 @@ public partial class AuditLogPage : IDisposable /// Whether the Trends panel is expanded (open by default). private bool _trendsOpen = true; + /// + /// True while a window's series are being (re)fetched — disables the 24h/7d + /// window toggle buttons so a mid-flight click cannot stack overlapping loads + /// (mirrors the K13/K14 trend pages). + /// + private bool _trendsLoading; + /// Active window in hours — 24 (default) or 168 (7 days). private int _windowHours = 24; @@ -297,25 +309,35 @@ public partial class AuditLogPage : IDisposable /// private async Task LoadTrendsAsync() { - var toUtc = DateTime.UtcNow; - var fromUtc = toUtc - TimeSpan.FromHours(_windowHours); - - foreach (var (metric, _, _) in TrendMetrics) + _trendsLoading = true; + try { - try + var toUtc = DateTime.UtcNow; + var fromUtc = toUtc - TimeSpan.FromHours(_windowHours); + + foreach (var (metric, _, _) in TrendMetrics) { - var points = await KpiHistory.GetSeriesAsync( - KpiSources.AuditLog, metric, KpiScopes.Global, scopeKey: null, - fromUtc, toUtc); - _trendSeries[metric] = new TrendSeries(points, IsAvailable: true, ErrorMessage: null); - } - catch (Exception) - { - // Best-effort: degrade this chart only, keep the rest of the page alive. - _trendSeries[metric] = new TrendSeries( - Points: null, IsAvailable: false, ErrorMessage: "Trend data unavailable."); + try + { + var points = await KpiHistory.GetSeriesAsync( + KpiSources.AuditLog, metric, KpiScopes.Global, scopeKey: null, + fromUtc, toUtc); + _trendSeries[metric] = new TrendSeries(points, IsAvailable: true, ErrorMessage: null); + } + catch (Exception ex) + { + // Best-effort: degrade this chart only, keep the rest of the page + // alive — but log the failure so the silent fallback is observable. + Logger.LogWarning(ex, "Failed to load Audit Log KPI trend series for metric {Metric}.", metric); + _trendSeries[metric] = new TrendSeries( + Points: null, IsAvailable: false, ErrorMessage: "Trend data unavailable."); + } } } + finally + { + _trendsLoading = false; + } } /// Returns the rendered state for a metric, defaulting to available-empty. diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor index 9ecc5ebd..a2381855 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Components/Pages/Monitoring/Health.razor @@ -92,6 +92,7 @@