Claude: changes for issue #84 #86

Merged
Grandiras merged 1 commit from claude/issue-84 into main 2026-08-14 16:05:21 +00:00
Collaborator

Closes #84.

Closes #84.
Replay the entrance when the route swaps the board under a live page
All checks were successful
CI / build (pull_request) Successful in 37s
c4b1f4f8e2
Switching board left the board blank until you reloaded, and the cause was
the entrance gate rather than the switcher: it is two halves and only one of
them was being reset.

js/auth-enter.js hooks pushState/replaceState, so every change of path drops
`data-board-entered` — which puts `.board > .column` back to `opacity: 0` —
and then waits for the page to call `playBoard` again. BoardPage's own
`_entrancePlayed` is component state, and Blazor *reuses* the component
across `/board/3` -> `/board/7`: same page, different parameter. So the flag
was still set, the callback never came, and the switched-to board rendered
invisible until auth-enter.js's 5 s unblock timer gave up. The URL and the
header were right the whole time, which is why it read as "the switcher does
not work" rather than as a missing animation.

Both halves now reset together: `_entrancePlayed = false` goes in
OnParametersSetAsync beside the rest of the outgoing board's state. Calendar
has the identical shape on `/calendar/board/{id}` and gets the same line.

boards.spec.js asserts the columns and the calendar's rows are actually
painted after a switch, on a 3 s deadline so it cannot pass by waiting the
unblock timer out. The existing assertions could not catch this: the URL and
the switcher's label are both derived from the URL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Collaborator

🤖 Reviewing this PR — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 Reviewing this PR — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/226); the reply will link the full session transcript. 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/pr-86/run-226.md) — updating every ~5 minutes while the task runs.
claude-reviewer left a comment

Verdict: approve — no blocking issues found.

Small, well-targeted fix. Both BoardPage.razor and Calendar.razor reset _entrancePlayed = false in OnParametersSetAsync, alongside the other per-board state (_columns/_cards, filters, open dialog) that's already cleared there when the route parameter changes without the component being torn down.

Traced this end-to-end against js/auth-enter.js (unchanged in this PR): its pushState/replaceState hooks already reset the JS-side played/shownAlready flags and remove data-board-entered/data-calendar-entered on a path change, hiding the columns/rows again via the existing CSS rules (html.js:not([data-board-entered]) .board > .column, etc.). But the C# _entrancePlayed guard in OnAfterRenderAsync was never reset, so after a board switch the component never called playBoard/playCalendar again — leaving the freshly-hidden content stuck until the JS's own 5s UNBLOCK_MS fallback timer revealed it. That matches the symptom described ("need to refresh after using the board switcher"). The fix is exactly the missing half.

The new e2e assertions (expectVisibleSoon in boards.spec.js) poll getComputedStyle(...).opacity on .board > .column and .calendar-week with a 3s deadline, comfortably under the 5s unblock timer, so the test would genuinely fail pre-fix rather than passing on the fallback. Selectors match the CSS hiding rules and the JS's own query selectors. The CLAUDE.md addition accurately describes the two-halves reasoning. No correctness issues found.


⏱ 0m 54s · 9 turns · tokens: 66.4k in / 4.3k out (+525.9k cache-read)
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. Small, well-targeted fix. Both `BoardPage.razor` and `Calendar.razor` reset `_entrancePlayed = false` in `OnParametersSetAsync`, alongside the other per-board state (`_columns`/`_cards`, filters, open dialog) that's already cleared there when the route parameter changes without the component being torn down. Traced this end-to-end against `js/auth-enter.js` (unchanged in this PR): its `pushState`/`replaceState` hooks already reset the JS-side `played`/`shownAlready` flags and remove `data-board-entered`/`data-calendar-entered` on a path change, hiding the columns/rows again via the existing CSS rules (`html.js:not([data-board-entered]) .board > .column`, etc.). But the C# `_entrancePlayed` guard in `OnAfterRenderAsync` was never reset, so after a board switch the component never called `playBoard`/`playCalendar` again — leaving the freshly-hidden content stuck until the JS's own 5s `UNBLOCK_MS` fallback timer revealed it. That matches the symptom described ("need to refresh after using the board switcher"). The fix is exactly the missing half. The new e2e assertions (`expectVisibleSoon` in `boards.spec.js`) poll `getComputedStyle(...).opacity` on `.board > .column` and `.calendar-week` with a 3s deadline, comfortably under the 5s unblock timer, so the test would genuinely fail pre-fix rather than passing on the fallback. Selectors match the CSS hiding rules and the JS's own query selectors. The CLAUDE.md addition accurately describes the two-halves reasoning. No correctness issues found. --- ⏱ 0m 54s · 9 turns · tokens: 66.4k in / 4.3k out (+525.9k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/pr-86/run-226.md) <!-- claude-verdict:approve --> <!-- claude-reviewed-head:c4b1f4f8e28f85e8f51999bfbb4f6e2ad24cd663 -->
Grandiras deleted branch claude/issue-84 2026-08-14 16:05:21 +00:00
Grandiras referenced this pull request from a commit 2026-08-14 16:05:23 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Grandiras/Ponente!86
No description provided.