From d860b0d8a6fbf2d02f7e7e65b16605e960c4fa6a Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 11 Jun 2026 06:50:06 -0400 Subject: [PATCH] fix(adminui): dispose Alerts CTS + self-render ShowOpResult (T21 review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dispose the CancellationTokenSource in AcknowledgeAsync and ShelveAsync (the TimeSpan overload holds an internal timer — leaked without using). Add StateHasChanged() to ShowOpResult so the result chip renders even if a future caller omits the finally-block re-render. --- .../Components/Pages/Alerts.razor | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor index 9ee0549b..ee10b0fa 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Pages/Alerts.razor @@ -147,9 +147,9 @@ else try { var user = await GetCurrentUserNameAsync(); + using var cts = new System.Threading.CancellationTokenSource(TimeSpan.FromSeconds(15)); var result = await AdminOps.AcknowledgeAlarmAsync( - alarmId, user, comment: null, - new System.Threading.CancellationTokenSource(TimeSpan.FromSeconds(15)).Token); + alarmId, user, comment: null, cts.Token); ShowOpResult(alarmId, result.Ok, result.Ok ? "Ack sent" : (result.Message ?? "Failed")); } catch (Exception ex) @@ -174,9 +174,9 @@ else // Timed shelve (with an unshelve-at datetime picker) is deferred — only OneShot + Unshelve // are surfaced here, so unshelveAtUtc is always null. TimedShelve is fully wired through the // singleton + AlarmCommand if a UI is added later. + using var cts = new System.Threading.CancellationTokenSource(TimeSpan.FromSeconds(15)); var result = await AdminOps.ShelveAlarmAsync( - alarmId, user, kind, unshelveAtUtc: null, comment: null, - new System.Threading.CancellationTokenSource(TimeSpan.FromSeconds(15)).Token); + alarmId, user, kind, unshelveAtUtc: null, comment: null, cts.Token); var verb = kind == ShelveKind.Unshelve ? "Unshelve" : "Shelve"; ShowOpResult(alarmId, result.Ok, result.Ok ? $"{verb} sent" : (result.Message ?? "Failed")); } @@ -209,6 +209,7 @@ else _opResultAlarmId = alarmId; _opResultOk = ok; _opResultMessage = message; + StateHasChanged(); } private void OnAlarm(AlarmTransitionEvent evt) =>