From 73dc4a9cd48fb6008fea07bc07d47eb17d116200 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 4 May 2026 21:58:22 +0200 Subject: [PATCH] refactor: finish route-first shell --- README.md | 45 +++++++------ RpgRoller/App_Data/rpgroller.development.db | Bin 0 -> 327680 bytes RpgRoller/Components/Pages/AdminPage.razor | 6 +- .../Components/Pages/CampaignsPage.razor | 6 +- .../Pages/HomeControls/CampaignLogPanel.razor | 61 +++++++----------- .../HomeControls/CampaignLogPanel.razor.cs | 2 - .../Pages/HomeControls/CharacterPanel.razor | 38 ++++------- .../HomeControls/CharacterPanel.razor.cs | 2 - RpgRoller/Components/Pages/PlayPage.razor | 6 +- .../Pages/PlayWorkspaceContent.razor | 2 - RpgRoller/Components/Pages/Workspace.razor.cs | 51 ++++++--------- .../Components/Pages/WorkspacePageContext.cs | 8 +-- .../Components/Pages/WorkspaceRouteView.razor | 21 ++++++ TASKS.md | 7 +- 14 files changed, 127 insertions(+), 128 deletions(-) create mode 100644 RpgRoller/App_Data/rpgroller.development.db create mode 100644 RpgRoller/Components/Pages/WorkspaceRouteView.razor diff --git a/README.md b/README.md index b4fe76b..94ff240 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ RpgRoller is an ASP.NET Core and Blazor Server app for lightweight tabletop camp - `RpgRoller.Tests/`: xUnit coverage for API behavior, services, hosting, payload budgets, and persistence and migration paths - `RpgRoller.sln`: solution used by local development and repo scripts - `POSTMORTEM.md`: architecture analysis of the May 2026 Firefox and RoboForm failure in the authenticated workspace -- `TASKS.md`: the current execution plan for the approved frontend routing rewrite +- `TASKS.md`: the completed execution log for the route-first authenticated shell rewrite Test layout: @@ -36,14 +36,17 @@ Backend: Frontend: -- `RpgRoller/Components/App.razor`: current HTML shell and the request-time branch that decides whether `/` serves the static auth page or the interactive app +- `RpgRoller/Components/App.razor`: HTML shell that serves the static `/login` auth document or the interactive route set based on request path - `RpgRoller/Components/Routes.razor`: Blazor router and layout hookup - `RpgRoller/Components/Layout/MainLayout.razor`: default layout - `RpgRoller/Components/Pages/LoginPage.razor`: route marker for the static `/login` auth document - `RpgRoller/Components/Pages/PlayPage.razor`, `CampaignsPage.razor`, and `AdminPage.razor`: authenticated route entry points for the interactive workspace - `RpgRoller/Components/Pages/AuthenticatedPageBase.cs`: shared logout-to-`/login` redirect helper for authenticated route pages -- `RpgRoller/Components/Pages/Workspace.razor`: authenticated workspace UI with play, campaign management, admin, toasts, and modals -- `RpgRoller/Components/Pages/Workspace.razor.cs`: workspace composition root, lifecycle, coordinator wiring, JS-invokable entry points, and menu item construction +- `RpgRoller/Components/Pages/Workspace.razor`: authenticated shell with shared header, health banner, toast stack, and route-owned body slot +- `RpgRoller/Components/Pages/Workspace.razor.cs`: shell composition root, coordinator wiring, route initialization entry point, JS-invokable state-event hooks, and menu item construction +- `RpgRoller/Components/Pages/WorkspaceRouteView.razor`: route-local first-render bootstrapper that initializes the interactive workspace after the page mounts +- `RpgRoller/Components/Pages/PlayWorkspaceContent.razor`, `CampaignsWorkspaceContent.razor`, and `AdminWorkspaceContent.razor`: route-owned authenticated page subtrees +- `RpgRoller/Components/Pages/CharacterManagementModals.razor`: shared create and edit character modals used by play and campaign-management routes - `RpgRoller/Components/Pages/WorkspaceState.cs`: workspace UI state plus pure computed and formatting projections used directly by the Razor view - `RpgRoller/Components/Pages/WorkspaceSessionCoordinator.cs`, `WorkspaceCampaignCoordinator.cs`, `WorkspaceCampaignScopeCoordinator.cs`, `WorkspacePlayCoordinator.cs`, `WorkspaceAdminCoordinator.cs`, `WorkspaceLiveStateController.cs`, `WorkspaceFeedbackService.cs`, and `WorkspaceToast.cs`: session bootstrap, campaign scope, play and log, admin, live update, and toast concerns used by `Workspace` - `RpgRoller/Components/Pages/HomeControls/StaticAuthPage.razor`: plain HTML login and registration page used at `/login` @@ -55,8 +58,8 @@ Frontend: Current repo note: -- `POSTMORTEM.md` documents why the current authenticated workspace architecture is fragile and why the next major frontend change is a route-first rewrite of the authenticated shell. -- `TASKS.md` is the authoritative execution plan for that rewrite and must be kept current while the work proceeds. +- `POSTMORTEM.md` documents why the previous authenticated workspace architecture was fragile under Firefox plus RoboForm. +- `TASKS.md` records the route-first rewrite that addressed that architecture. ## Runtime and Persistence @@ -95,26 +98,29 @@ Rolemaster support: ## Current Frontend Architecture -The current frontend is in an intermediate state that was created while mitigating the Firefox and RoboForm failure documented in `POSTMORTEM.md`. +The frontend now uses a route-first authenticated shell that keeps the anonymous auth document outside the interactive Blazor subtree. -Today, `/` is an auth-aware entry redirect: +`/` is an auth-aware entry redirect: - anonymous `GET /` redirects to `/login` - authenticated `GET /` redirects to `/play` -- `RpgRoller/Components/App.razor` still decides between the static `/login` document and the interactive route set based on the request path, not auth state +- `RpgRoller/Components/App.razor` serves the static `/login` document or the interactive route set based on the request path, not auth state -Inside the authenticated app, `/play`, `/campaigns`, and `/admin` are now real Blazor routes, and the hamburger menu navigates between those URLs. The interactive shell is still structurally transitional, because `Workspace.razor` continues to own all three major authenticated subtrees behind one component. +Inside the authenticated app, `/play`, `/campaigns`, and `/admin` are real Blazor routes, and the hamburger menu navigates between those URLs. `Workspace.razor` is now a shared shell only. Each authenticated route owns its own main content subtree through a route-specific component. -This architecture works functionally but remains structurally fragile because: +Interactive bootstrap is now route-local: -- the HTML shell still branches on request path to keep `/login` static -- the authenticated workspace still performs staged startup in `OnAfterRenderAsync` -- the app coordinates state across Blazor component state, browser `sessionStorage`, `fetch`, and SSE during early startup -- the shared `Workspace` component still conditionally renders play, campaign management, and admin DOM instead of letting each route own its own subtree +- `WorkspaceRouteView.razor` performs the first-render JS-dependent session initialization for the authenticated route that mounted +- `Workspace.razor.cs` no longer uses `OnAfterRenderAsync` as the shell bootstrap orchestrator +- play-specific post-render behavior is limited to page-local controls such as log auto-scroll and modal autofocus inside child components -## Approved Rewrite Direction +Remaining architectural constraints are deliberate: -The approved remediation direction is a route-first authenticated shell: +- `/login` stays plain HTML plus JavaScript so the anonymous auth path avoids Blazor form ownership entirely +- authenticated reads and writes still depend on JS interop-backed `fetch`, so first interactive initialization must still happen after mount +- live updates still use SSE and route-aware synchronization, with `/play` as the only route that keeps the play log and selected character sheet live + +## Route-First Authenticated Shell - `/` becomes an auth-aware entry point that redirects to `/login` or `/play` - `/login` hosts the anonymous auth experience @@ -123,7 +129,7 @@ The approved remediation direction is a route-first authenticated shell: - SSE and heavy play bootstrap stay scoped to `/play` - the large `Workspace` component is split so each route owns a smaller, more stable subtree -This rewrite is not complete yet. Follow `TASKS.md` for the execution plan. +This rewrite is complete. See `TASKS.md` for the execution history and milestone notes. ## Local Development @@ -184,9 +190,10 @@ SQLite migration rule: ## Frontend Runtime -- The UI currently runs as Blazor Server with interactive components for the authenticated workspace and a plain HTML plus JavaScript auth page for anonymous users at `/`. +- The UI runs as Blazor Server for authenticated routes and as plain HTML plus JavaScript for the anonymous `/login` document. - Static assets are linked through Blazor's `@Assets[...]` pipeline for fingerprinted cache-busting URLs. - Workspace reads are resolved through API requests in `WorkspaceQueryService`; browser interop stays focused on auth forms, session storage, SSE wiring, and small DOM helpers. +- Interactive authenticated startup begins in `WorkspaceRouteView.razor` after first render because `RpgRollerApiClient` still depends on JS interop-backed `fetch`. - Live workspace refresh compares separate roster, per-character sheet, and log versions so unrelated changes do not trigger full reloads. - Campaign log data is loaded in bounded slices: campaign summaries, one selected roster, one selected character sheet, and a 25-row incremental log window from `/api/campaigns/{campaignId}/log/page`. - Log rows return compact summary data first and lazy-load full detail from `/api/rolls/{rollId}` when expanded. diff --git a/RpgRoller/App_Data/rpgroller.development.db b/RpgRoller/App_Data/rpgroller.development.db new file mode 100644 index 0000000000000000000000000000000000000000..4a7aaffb127c17ea70b1733c4a69e9d0f41910ca GIT binary patch literal 327680 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 - + + + + + diff --git a/RpgRoller/Components/Pages/CampaignsPage.razor b/RpgRoller/Components/Pages/CampaignsPage.razor index 27a2bea..4fc0200 100644 --- a/RpgRoller/Components/Pages/CampaignsPage.razor +++ b/RpgRoller/Components/Pages/CampaignsPage.razor @@ -2,6 +2,10 @@ @inherits AuthenticatedPageBase - + + + + + diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor index 89c260e..3ca8f78 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor +++ b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor @@ -82,43 +82,30 @@
- @if (EnableCustomRollComposer) - { -
-
- - @CustomRollStatusText -
-
- - -
-

@CustomRollHelpText

- @if (HasCustomRollError) - { - - } -
- } - else - { -
-
- Custom roll - @CustomRollStatusText -
-

Loading roll composer...

+
+
+ + @CustomRollStatusText
- } +
+ + +
+

@CustomRollHelpText

+ @if (HasCustomRollError) + { + + } +
diff --git a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs index c90030e..768fa1b 100644 --- a/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/CampaignLogPanel.razor.cs @@ -171,8 +171,6 @@ public partial class CampaignLogPanel [Parameter] public string RollVisibility { get; set; } = "public"; - [Parameter] public bool EnableCustomRollComposer { get; set; } - [Parameter] public bool IsMutating { get; set; } [Parameter] public EventCallback CustomRollCreated { get; set; } diff --git a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor index 309b014..d1e64d0 100644 --- a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor +++ b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor @@ -49,34 +49,20 @@
- @if (EnableInteractiveControls) - { - - - } - else - { -

Loading skill controls...

- } + +
- @if (EnableInteractiveControls) - { - - - } - else - { -

Visibility: @(RollVisibility == "private" ? "Private" : "Public")

- } + +
@{ diff --git a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor.cs b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor.cs index 6f1a848..12b07c6 100644 --- a/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor.cs +++ b/RpgRoller/Components/Pages/HomeControls/CharacterPanel.razor.cs @@ -370,8 +370,6 @@ public partial class CharacterPanel [Parameter] public string RollVisibility { get; set; } = "public"; - [Parameter] public bool EnableInteractiveControls { get; set; } - [Parameter] public EventCallback RollVisibilityChanged { get; set; } [Parameter] public Func OwnerLabel { get; set; } = _ => string.Empty; diff --git a/RpgRoller/Components/Pages/PlayPage.razor b/RpgRoller/Components/Pages/PlayPage.razor index 7ad3c1d..3ce76cf 100644 --- a/RpgRoller/Components/Pages/PlayPage.razor +++ b/RpgRoller/Components/Pages/PlayPage.razor @@ -2,6 +2,10 @@ @inherits AuthenticatedPageBase - + + + + + diff --git a/RpgRoller/Components/Pages/PlayWorkspaceContent.razor b/RpgRoller/Components/Pages/PlayWorkspaceContent.razor index a2735bb..2e0754a 100644 --- a/RpgRoller/Components/Pages/PlayWorkspaceContent.razor +++ b/RpgRoller/Components/Pages/PlayWorkspaceContent.razor @@ -12,7 +12,6 @@ SelectedCharacterSkillGroups="Workspace.State.PlaySelectedCharacterSkillGroups" SelectedCampaignRulesetId="@(Workspace.State.PlaySelectedCampaign?.RulesetId ?? string.Empty)" RollVisibility="Workspace.State.RollVisibility" - EnableInteractiveControls="Workspace.EnableCharacterControls" RollVisibilityChanged="Workspace.Session.OnRollVisibilityChangedAsync" OwnerLabel="Workspace.State.OwnerLabel" SkillDefinitionLabel="Workspace.State.SkillDefinitionLabel" @@ -38,7 +37,6 @@ SelectedCharacterName="@(Workspace.State.PlaySelectedCharacter?.Name)" SelectedCampaignRulesetId="@(Workspace.State.PlaySelectedCampaign?.RulesetId ?? string.Empty)" RollVisibility="Workspace.State.RollVisibility" - EnableCustomRollComposer="Workspace.EnableCustomRollComposer" IsMutating="Workspace.State.IsMutating" ToggleRollDetailRequested="Workspace.Play.ToggleRollDetailAsync" ResolveRollDetail="Workspace.Play.ResolveRollDetail" diff --git a/RpgRoller/Components/Pages/Workspace.razor.cs b/RpgRoller/Components/Pages/Workspace.razor.cs index 1ebf58f..c330b19 100644 --- a/RpgRoller/Components/Pages/Workspace.razor.cs +++ b/RpgRoller/Components/Pages/Workspace.razor.cs @@ -14,34 +14,6 @@ public partial class Workspace : IAsyncDisposable State.IsScreenMenuOpen = false; } - protected override async Task OnAfterRenderAsync(bool firstRender) - { - State.HasInteractiveRenderStarted = true; - if (firstRender) - { - await Session.InitializeAsync(); - HasSessionInitialized = true; - await InvokeAsync(StateHasChanged); - return; - } - - if (!HasSessionInitialized) - return; - - if (!EnableCharacterControls) - { - EnableCharacterControls = true; - await InvokeAsync(StateHasChanged); - return; - } - - if (EnableCustomRollComposer) - return; - - EnableCustomRollComposer = true; - await InvokeAsync(StateHasChanged); - } - [JSInvokable] public Task OnStateEventReceived(CampaignStateSnapshot state) { @@ -126,6 +98,22 @@ public partial class Workspace : IAsyncDisposable return InvokeAsync(StateHasChanged); } + private Task InitializeRouteAsync() + { + return InitializationTask ??= InitializeRouteCoreAsync(); + } + + private async Task InitializeRouteCoreAsync() + { + if (HasSessionInitialized) + return; + + State.HasInteractiveRenderStarted = true; + await Session.InitializeAsync(); + HasSessionInitialized = true; + await RequestRefreshAsync(); + } + private static bool IsStaticRenderInteropException(InvalidOperationException exception) { return exception.Message.Contains("statically rendered", StringComparison.OrdinalIgnoreCase); @@ -145,16 +133,14 @@ public partial class Workspace : IAsyncDisposable private WorkspaceState State { get; } = new(); private bool HasSessionInitialized { get; set; } - private bool EnableCharacterControls { get; set; } - private bool EnableCustomRollComposer { get; set; } private bool IsPlayRoute => Route == WorkspaceRoute.Play; private bool IsCampaignsRoute => Route == WorkspaceRoute.Campaigns; private bool IsAdminRoute => Route == WorkspaceRoute.Admin; private string AppCssClass => IsPlayRoute ? "rr-app app-play" : "rr-app"; private WorkspacePageContext PageContext => new(State, Play, Campaigns, Admin, Scope, Session, - RequestRefreshAsync, EnableCharacterControls, EnableCustomRollComposer, AdminDatabaseDownloadUrl, - HeaderMenuItems, IsPlayRoute, IsCampaignsRoute, IsAdminRoute); + InitializeRouteAsync, HasSessionInitialized, RequestRefreshAsync, AdminDatabaseDownloadUrl, HeaderMenuItems, + IsPlayRoute, IsCampaignsRoute, IsAdminRoute); private WorkspaceCampaignScopeCoordinator Scope => m_Scope ??= new(State, Feedback, JS, WorkspaceQuery, () => IsPlayRoute, Play.EnsureSelectedCharacterActiveAsync, Play.RefreshSelectedCharacterSheetAsync, @@ -231,4 +217,5 @@ public partial class Workspace : IAsyncDisposable private WorkspaceCampaignScopeCoordinator? m_Scope; private WorkspaceSessionCoordinator? m_Session; + private Task? InitializationTask { get; set; } } \ No newline at end of file diff --git a/RpgRoller/Components/Pages/WorkspacePageContext.cs b/RpgRoller/Components/Pages/WorkspacePageContext.cs index 3ddd2c8..02806b2 100644 --- a/RpgRoller/Components/Pages/WorkspacePageContext.cs +++ b/RpgRoller/Components/Pages/WorkspacePageContext.cs @@ -9,9 +9,9 @@ public sealed class WorkspacePageContext( WorkspaceAdminCoordinator admin, WorkspaceCampaignScopeCoordinator scope, WorkspaceSessionCoordinator session, + Func initializeRouteAsync, + bool hasSessionInitialized, Func requestRefreshAsync, - bool enableCharacterControls, - bool enableCustomRollComposer, string adminDatabaseDownloadUrl, IReadOnlyList headerMenuItems, bool isPlayRoute, @@ -24,9 +24,9 @@ public sealed class WorkspacePageContext( public WorkspaceAdminCoordinator Admin { get; } = admin; public WorkspaceCampaignScopeCoordinator Scope { get; } = scope; public WorkspaceSessionCoordinator Session { get; } = session; + public Func InitializeRouteAsync { get; } = initializeRouteAsync; + public bool HasSessionInitialized { get; } = hasSessionInitialized; public Func RequestRefreshAsync { get; } = requestRefreshAsync; - public bool EnableCharacterControls { get; } = enableCharacterControls; - public bool EnableCustomRollComposer { get; } = enableCustomRollComposer; public string AdminDatabaseDownloadUrl { get; } = adminDatabaseDownloadUrl; public IReadOnlyList HeaderMenuItems { get; } = headerMenuItems; public bool IsPlayRoute { get; } = isPlayRoute; diff --git a/RpgRoller/Components/Pages/WorkspaceRouteView.razor b/RpgRoller/Components/Pages/WorkspaceRouteView.razor new file mode 100644 index 0000000..80d024c --- /dev/null +++ b/RpgRoller/Components/Pages/WorkspaceRouteView.razor @@ -0,0 +1,21 @@ +@using Microsoft.AspNetCore.Components + +@if (Workspace.HasSessionInitialized) +{ + @ChildContent(Workspace) +} + +@code { + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + return; + + await Workspace.InitializeRouteAsync(); + await InvokeAsync(StateHasChanged); + } + + [Parameter, EditorRequired] public WorkspacePageContext Workspace { get; set; } = null!; + + [Parameter, EditorRequired] public RenderFragment ChildContent { get; set; } = null!; +} diff --git a/TASKS.md b/TASKS.md index c947bc0..c02ac2c 100644 --- a/TASKS.md +++ b/TASKS.md @@ -21,7 +21,7 @@ The change is complete when a human can run the app, open `/`, observe the corre - [x] (2026-05-04) Introduced real authenticated routes for `/play`, `/campaigns`, and `/admin` while preserving the shared `Workspace` behavior behind those routes. - [x] (2026-05-04) Removed `screen` as a `sessionStorage` routing mechanism and replaced menu actions with URL navigation. - [x] (2026-05-04 21:42Z) Split the large `Workspace` render tree into a shared shell plus route-owned play, campaign-management, and admin content components, and kept the Selenium route and DOM-wrap coverage green after the split. -- [ ] Reduce `OnAfterRenderAsync` to the smallest practical scope and keep staged startup out of the authenticated shell root. +- [x] (2026-05-04 21:58Z) Removed shell-level `OnAfterRenderAsync` bootstrapping, moved the JS-dependent authenticated startup into a route-owned `WorkspaceRouteView`, removed shell-owned staged control renders, restored the missing development database fixture, and updated README to describe the completed route-first architecture. - [x] (2026-05-04) Updated host tests, Selenium smoke tests, and docs so the real-route model is the documented and verified Milestone 2 behavior. ## Surprises & Discoveries @@ -41,6 +41,9 @@ The change is complete when a human can run the app, open `/`, observe the corre - Observation: the repository-wide backend suite currently contains a missing-fixture failure unrelated to the route-first rewrite. Evidence: `dotnet test RpgRoller.Tests/RpgRoller.Tests.csproj --collect:"XPlat Code Coverage" --settings RpgRoller.Tests/coverlet.runsettings` failed in `HostingCoverageTests.InitializeRpgRollerState_MigratesCopiedDevelopmentDatabaseAndPreservesD6Rolling` because `RpgRoller/App_Data/rpgroller.development.db` is not present in the worktree. +- Observation: once the route-owned components controlled their own modal and page subtree rendering, the extra shell-owned play-control staging was no longer necessary for the DOM-wrap smoke coverage. + Evidence: after moving authenticated startup into a route-owned wrapper and rendering play controls directly, `node ./scripts/run-selenium.js` still passed the extension-like DOM-wrap coverage against `/play`. + - Observation: the locally installed Snap Firefox build on this machine is viable for Selenium through `geckodriver`, but not for Playwright protocol control. Evidence: Playwright stalled during the `-juggler-pipe` handshake, while a `geckodriver` plus Selenium session against `/snap/firefox/current/usr/lib/firefox/firefox` completed the same Milestone 1 verification successfully. @@ -82,6 +85,8 @@ After Milestone 2, the authenticated shell now has first-class `/play`, `/campai After Milestone 3, `Workspace.razor` is now a shell that owns shared chrome, health state, and toast feedback, while the play, campaign-management, and admin DOM each live in route-owned components supplied by `/play`, `/campaigns`, and `/admin`. The route split preserved the host tests and full Selenium smoke coverage, including the DOM-wrap regression case, but the final startup path is still staged through `Workspace.razor.cs` and remains the next target for Milestone 4. +After Milestone 4, authenticated startup is now triggered by a route-owned wrapper instead of `Workspace.razor.cs`, the shared shell no longer uses `OnAfterRenderAsync`, and the play route renders its controls directly without shell-driven follow-up batches. The route-first rewrite is now functionally complete: host tests pass, the Selenium smoke suite passes, and the restored development-database fixture lets the backend coverage suite validate the full repo behavior again. + This section must be updated after each major milestone. When the implementation is complete, summarize which parts of the old workspace architecture were fully removed, which compatibility constraints remain, and whether the final startup path still depends on any multi-batch structural rendering. ## Context and Orientation