5f72ff851d
The Secrets.Ui RCL's routable page was routed directly, but this host's router is deliberately static (cookie SignInAsync needs SSR) with per-page @rendermode opt-in - a directive the RCL page cannot carry, because the other three family hosts render it under a globally interactive router where a nested render mode throws. Routing straight to the RCL page therefore rendered /admin/secrets with no circuit: it displayed, but every @onclick was silently dead. Fix: a host-side wrapper page (Pages/SecretsAdmin.razor) now owns /admin/secrets, carries the standard per-page InteractiveServer render mode, re-states the RCL page's own authorization policy (the router only enforces [Authorize] on the routed component, which is now the wrapper), and renders the RCL page as an ordinary child. The RCL assembly is de-registered from both AdditionalAssemblies sites (router + endpoint) so the route is unambiguous. Guards: SecretsPageWiringTests pins the render mode (the #483 regression), route parity with the RCL page, and policy parity; the page census in PageAuthorizationGuardTests classifies the new page and admits the secrets:manage policy. AdminUI.Tests 665/665. Live-verified on the rebuilt docker-dev rig with Playwright: /_blazor circuit negotiated on /admin/secrets and Add secret opens the editor (before the fix: zero interactive markers, no circuit, dead click). Closes #483. Claude-Session: https://claude.ai/code/session_01BL2Vu1ESDQ9SCN4gVKkdts
21 lines
1.2 KiB
Plaintext
21 lines
1.2 KiB
Plaintext
@page "/admin/secrets"
|
|
@attribute [Authorize(Policy = ZB.MOM.WW.Secrets.Ui.SecretsAuthorization.ManagePolicy)]
|
|
@rendermode RenderMode.InteractiveServer
|
|
@using ZB.MOM.WW.Secrets.Ui
|
|
|
|
@* Host-side wrapper for the ZB.MOM.WW.Secrets.Ui secrets page (lmxopcua#483).
|
|
|
|
This host's <Routes/> is deliberately static (cookie SignInAsync needs SSR), so every
|
|
interactive page opts in per-page with @rendermode — a directive the RCL's own routable
|
|
SecretsPage cannot carry, because the other three family hosts render it under a globally
|
|
interactive router where a nested render mode throws. Routing straight to the RCL page
|
|
therefore produced a statically-rendered, dead page here: no circuit, @onclick inert.
|
|
|
|
So this wrapper owns the /admin/secrets route in THIS host (the RCL assembly is no longer
|
|
passed to either AdditionalAssemblies registration — doing both would make the route
|
|
ambiguous), carries the standard per-page render mode, re-states the RCL page's own
|
|
authorization policy (the router only enforces [Authorize] on the routed page itself,
|
|
which is now this one), and renders the RCL page as an ordinary child component. *@
|
|
|
|
<SecretsPage />
|