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
33 lines
1.5 KiB
Plaintext
33 lines
1.5 KiB
Plaintext
@* Root Blazor component for the fused OtOpcUa.Host. Static-rendered shell; child components
|
|
opt into InteractiveServer on a per-component basis (the auth-related <Routes/> stays
|
|
non-interactive so cookie SignInAsync still runs while ASP.NET owns the HTTP response).
|
|
|
|
Vendored Bootstrap 5 lives in this RCL's wwwroot/lib/bootstrap; the RCL static-asset
|
|
pipeline maps it under /_content/ZB.MOM.WW.OtOpcUa.AdminUI/... — no public-CDN dependency
|
|
so air-gapped fleet deployments keep working (Admin-010). *@
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>OtOpcUa Admin</title>
|
|
<base href="/"/>
|
|
<link rel="stylesheet" href="_content/ZB.MOM.WW.OtOpcUa.AdminUI/lib/bootstrap/css/bootstrap.min.css"/>
|
|
<ThemeHead />
|
|
<link rel="stylesheet" href="_content/ZB.MOM.WW.OtOpcUa.AdminUI/css/site.css"/>
|
|
<HeadOutlet/>
|
|
</head>
|
|
<body>
|
|
@* No AdditionalAssemblies: the Secrets.Ui RCL's routable page is NOT routed directly in this
|
|
host — Pages/Secrets.razor wraps it so the route can carry this host's per-page
|
|
@rendermode (lmxopcua#483); registering the RCL routes too would make /admin/secrets
|
|
ambiguous. *@
|
|
<Routes />
|
|
<script src="_content/ZB.MOM.WW.OtOpcUa.AdminUI/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
|
|
<ThemeScripts />
|
|
<script src="_content/ZB.MOM.WW.OtOpcUa.AdminUI/js/monaco-init.js"></script>
|
|
<script src="_framework/blazor.web.js"></script>
|
|
</body>
|
|
</html>
|