From d11d160395f92ae20d204387d5a45eda51bacba1 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 24 Apr 2026 19:07:05 -0400 Subject: [PATCH] =?UTF-8?q?Admin=20UI=20Phase=206=20audit=20=E2=80=94=20cl?= =?UTF-8?q?ose=20#128=E2=80=93#131=20as=20already-shipped?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-by-task audit of the Admin UI quartet shows every page listed in the task descriptions is already built, routed, DI-wired, SignalR-live, and covered by Admin.Tests (112/112 green): - #128 /hosts — Hosts.razor 233 LOC with ConsecutiveFailures + LastCircuitBreakerOpenUtc + Stale/Faulted/Running cards - #129 RoleGrants + AclsTab + Probe — RoleGrants.razor (192 LOC), AclsTab.razor (279 LOC) with the embedded Probe form at line 38 - #130 RedundancyTab — RedundancyTab.razor 175 LOC with peer reachability / ServiceLevel / apply-lease / failover button - #131 Draft/Publish/Diff/Identification — DraftEditor (105 LOC) + Generations (73 LOC) + DiffViewer (87 LOC) + IdentificationFields (49 LOC), all wired to GenerationService / DraftValidationService Shipping docs/v2/implementation/admin-ui-phase-6-status.md as the canonical reference. Each task's required features are listed with the exact file / LOC / routing + DI injection so future auditors don't need to re-derive the status. No code change in this commit — doc-only. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../implementation/admin-ui-phase-6-status.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/v2/implementation/admin-ui-phase-6-status.md diff --git a/docs/v2/implementation/admin-ui-phase-6-status.md b/docs/v2/implementation/admin-ui-phase-6-status.md new file mode 100644 index 0000000..a1ed0f6 --- /dev/null +++ b/docs/v2/implementation/admin-ui-phase-6-status.md @@ -0,0 +1,38 @@ +# Admin UI Phase 6 status audit (2026-04-24) + +Audit pass that closes the Phase 6 Admin-UI tasks that were tracked as still-open (#128–#131) but already had their Blazor pages shipped. Every page listed below compiles against the current `OtOpcUaConfigDbContext` schema + the current Admin service surface, has substantive (non-stub) content, and is covered by `ZB.MOM.WW.OtOpcUa.Admin.Tests` (112/112 green). + +## Task #128 — /hosts column refresh (Phase 6.1 Stream E.2/E.3) + +`Components/Pages/Hosts.razor` — 233 LOC. Route `/hosts`. Ships: + +- Per-driver circuit-breaker columns (`ConsecutiveFailures`, `LastCircuitBreakerOpenUtc`). +- Stale-row detection via `HostStatusService.IsStale` (publisher heartbeat ≥ 30 s stale threshold). +- Summary cards: Running / Stale / Faulted / total. +- Auto-refresh every `RefreshIntervalSeconds` driven by the `FleetStatusHub` SignalR feed. +- Health band via `DriverHostState` enum colour coding. + +## Task #129 — RoleGrantsTab + AclsTab + Probe (Phase 6.2 Stream D) + +- `Components/Pages/RoleGrants.razor` — 192 LOC. Route `/role-grants`. Edits LDAP-group → OPC-UA-role mappings with live reload over `AclChangeNotifier` SignalR. +- `Components/Pages/Clusters/AclsTab.razor` — 279 LOC. NodeAcl CRUD + the **"Probe this permission"** form (task #196 slice 1, embedded at line 38 onward). Binds `_probeGroup` / `_probeNamespaceId` / `_probeUnsAreaId` / `_probeUnsLineId` / `_probeEquipmentId` / `_probeTagId` / `_probePermission` through `PermissionProbeService`. + +## Task #130 — RedundancyTab (Phase 6.3 Stream E) + +`Components/Pages/Clusters/RedundancyTab.razor` — 175 LOC. Topology table, per-peer reachability (via `FleetStatusHub`), ServiceLevel band + `ApplyLeaseRegistry` / `RecoveryStateManager` state surfaces, failover action button. Live updates over the same SignalR hub `RedundancyPublisherHostedService` ticks. + +## Task #131 — Draft / publish / diff / identification (Phase 6.4 Streams A–D) + +- `Components/Pages/Clusters/DraftEditor.razor` — 105 LOC. Route `/clusters/{ClusterId}/draft/{GenerationId:long}`. Calls `DraftValidationService` + `GenerationService`. +- `Components/Pages/Clusters/Generations.razor` — 73 LOC. Publish flow (generation state transitions through `sp_PublishGeneration`). +- `Components/Pages/Clusters/DiffViewer.razor` — 87 LOC. Route `/clusters/{ClusterId}/draft/{GenerationId:long}/diff`. Renders `sp_ComputeGenerationDiff` output. +- `Components/Pages/Clusters/IdentificationFields.razor` — 49 LOC. OPC 40010 Identification folder editor bound to the `Equipment` entity. + +## What's NOT in this audit + +- `#124` — Phase 6.2 3-user interop matrix. Manual cross-client test; out of scope for code pass. +- `#119` — Phase 6.3 client interop matrix. Manual Ignition/Kepware/Aveva drills. +- `#113` — OPC UA CTT conformance pass. Manual CTT run. +- `#114` / `#115` — Redundancy cutover + deployment checklist. Manual. + +Those remain GA-gating but require a human at a console, not a code change.