From 43291d7fdd235f01ca88b2f643af19ba4c94e5e9 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 18 May 2026 04:03:08 -0400 Subject: [PATCH] fix(admin): add InteractiveServer render mode to all interactive Blazor pages; fix wrong hub URLs Eight pages were using @onclick handlers, Timers, or HubConnections but had no @rendermode, causing interactivity to be silently dead under static SSR. Added @rendermode RenderMode.InteractiveServer (with the required @using Microsoft.AspNetCore.Components.Web) to: AlarmsHistorian, Certificates, Fleet, Home, Hosts, Reservations, DraftEditor, and ImportEquipment. Also fixed two hub URL bugs: AclsTab and RedundancyTab were connecting to the non-existent /hubs/fleet-status path; corrected to /hubs/fleet which matches the MapHub call in Program.cs. Build: 0 errors, 0 warnings. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Components/Pages/AlarmsHistorian.razor | 2 ++ .../Components/Pages/Certificates.razor | 2 ++ .../Components/Pages/Clusters/AclsTab.razor | 2 +- .../Components/Pages/Clusters/DraftEditor.razor | 2 ++ .../Components/Pages/Clusters/ImportEquipment.razor | 2 ++ .../Components/Pages/Clusters/RedundancyTab.razor | 2 +- .../ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Fleet.razor | 2 ++ .../ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Home.razor | 2 ++ .../ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Hosts.razor | 2 ++ .../Components/Pages/Reservations.razor | 4 +++- 10 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/AlarmsHistorian.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/AlarmsHistorian.razor index c591b86..4f34d37 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/AlarmsHistorian.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/AlarmsHistorian.razor @@ -1,6 +1,8 @@ @page "/alarms/historian" +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services @using ZB.MOM.WW.OtOpcUa.Core.AlarmHistorian +@rendermode RenderMode.InteractiveServer @inject HistorianDiagnosticsService Diag

Alarm historian

diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Certificates.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Certificates.razor index 6c41036..a037bea 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Certificates.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Certificates.razor @@ -1,6 +1,8 @@ @page "/certificates" @attribute [Microsoft.AspNetCore.Authorization.Authorize(Roles = AdminRoles.FleetAdmin)] +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services +@rendermode RenderMode.InteractiveServer @inject CertTrustService Certs @inject AuthenticationStateProvider AuthState @inject ILogger Log diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor index f0a4f3f..a599117 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/AclsTab.razor @@ -223,7 +223,7 @@ else { if (!firstRender || _hub is not null) return; _hub = new HubConnectionBuilder() - .WithUrl(Nav.ToAbsoluteUri("/hubs/fleet-status")) + .WithUrl(Nav.ToAbsoluteUri("/hubs/fleet")) .WithAutomaticReconnect() .Build(); _hub.On("NodeAclChanged", async msg => diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor index d268331..266266c 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/DraftEditor.razor @@ -1,8 +1,10 @@ @page "/clusters/{ClusterId}/draft/{GenerationId:long}" @attribute [Microsoft.AspNetCore.Authorization.Authorize] +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services @using ZB.MOM.WW.OtOpcUa.Configuration.Enums @using ZB.MOM.WW.OtOpcUa.Configuration.Validation +@rendermode RenderMode.InteractiveServer @inject GenerationService GenerationSvc @inject DraftValidationService ValidationSvc @inject NavigationManager Nav diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor index 11fc42a..6401211 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/ImportEquipment.razor @@ -1,7 +1,9 @@ @page "/clusters/{ClusterId}/draft/{GenerationId:long}/import-equipment" @attribute [Microsoft.AspNetCore.Authorization.Authorize] @using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services +@rendermode RenderMode.InteractiveServer @using ZB.MOM.WW.OtOpcUa.Configuration.Entities @using ZB.MOM.WW.OtOpcUa.Configuration.Enums @inject DriverInstanceService DriverSvc diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor index 5b2fa0d..655113d 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Clusters/RedundancyTab.razor @@ -131,7 +131,7 @@ else private async Task ConnectHubAsync() { _hub = new HubConnectionBuilder() - .WithUrl(Nav.ToAbsoluteUri("/hubs/fleet-status")) + .WithUrl(Nav.ToAbsoluteUri("/hubs/fleet")) .WithAutomaticReconnect() .Build(); diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Fleet.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Fleet.razor index 946f598..e258558 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Fleet.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Fleet.razor @@ -1,7 +1,9 @@ @page "/fleet" +@using Microsoft.AspNetCore.Components.Web @using Microsoft.EntityFrameworkCore @using ZB.MOM.WW.OtOpcUa.Configuration @using ZB.MOM.WW.OtOpcUa.Configuration.Entities +@rendermode RenderMode.InteractiveServer @inject IServiceScopeFactory ScopeFactory @implements IDisposable diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Home.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Home.razor index 036637c..4c14634 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Home.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Home.razor @@ -1,6 +1,8 @@ @page "/" +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services @using ZB.MOM.WW.OtOpcUa.Configuration.Entities +@rendermode RenderMode.InteractiveServer @inject ClusterService ClusterSvc @inject GenerationService GenerationSvc @inject NavigationManager Nav diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Hosts.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Hosts.razor index 8164187..e51a631 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Hosts.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Hosts.razor @@ -1,9 +1,11 @@ @page "/hosts" +@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.SignalR.Client @using Microsoft.EntityFrameworkCore @using ZB.MOM.WW.OtOpcUa.Admin.Hubs @using ZB.MOM.WW.OtOpcUa.Admin.Services @using ZB.MOM.WW.OtOpcUa.Configuration.Enums +@rendermode RenderMode.InteractiveServer @inject IServiceScopeFactory ScopeFactory @inject NavigationManager Nav @implements IAsyncDisposable diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Reservations.razor b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Reservations.razor index b2c566b..35e6f89 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Reservations.razor +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Reservations.razor @@ -1,8 +1,10 @@ @page "/reservations" +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.OtOpcUa.Admin.Services @using ZB.MOM.WW.OtOpcUa.Configuration.Entities -@using Microsoft.AspNetCore.Authorization @attribute [Authorize(Policy = "CanPublish")] +@rendermode RenderMode.InteractiveServer @inject ReservationService ReservationSvc

External-ID reservations