Claude: changes for issue #167 #169

Merged
Grandiras merged 1 commit from claude/issue-167 into main 2026-08-26 22:32:48 +00:00
Collaborator

Closes #167.

Closes #167.
Stop the search box and the admin rename fields swallowing letters
All checks were successful
CI / build (pull_request) Successful in 38s
620896b250
Typing `bla` into the search box searched for `ba`: the field rendered
`value="@_query"` beside an `@oninput` handler, and only `@bind` emits
`RenderTreeBuilder.SetUpdatesAttributeName("value")` — the call that tells the
framework the element already holds what the keystroke it is handling said it
held. Without it every keystroke renders a `value` the diff has never seen and
sends it back down as a DOM patch, so the patch for `b` lands after `l` has been
typed, resets the field to `b`, and the next letter makes `ba`.

It is invisible on localhost, where the round trip is a millisecond and the echo
always lands between two keystrokes with nothing to overwrite. Reproduced, and
now pinned, by a browser context whose circuit delivers the server's messages
120 ms late.

The same pattern was in the rename field of all three admin lists (boards,
columns, tags) — fixed with `@bind:get`/`@bind:set`, since those bind through a
dictionary. `docs/live-updates.md` gains the section, `docs/search.md` the note
on the box, and CLAUDE.md the one-line rule.

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/395); the reply will link the full session transcript. <!-- claude-run:pr_review --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/pr-169/run-395.md) — updating every ~5 minutes while the task runs.
claude-reviewer left a comment

✅ Verdict: approve — no blocking issues found.

Solid, well-scoped fix. The four inputs (search box, board/column/tag rename, tag color) all move from value="@field" + @oninput to real two-way binding (@bind for the plain field, @bind:get/@bind:set for the dictionary-indexed ones), which is exactly the right fix for the echo-drops-a-keystroke bug: only @bind* emits SetUpdatesAttributeName, so the server-driven re-render stops clobbering in-flight keystrokes.

I checked the full bodies of SearchBox.razor, Boards.razor, and Tags.razor (not just the diff hunks) to confirm the surrounding logic (OnQueryChanged, Clear(), RenameAsync, dictionary population) still lines up with the new binding shape — it does; behavior is preserved, only the plumbing that assigns into the field changed.

The new Playwright test is a genuinely good regression guard: it lags WebSocket message delivery (both addEventListener and the onmessage setter, since SignalR uses the latter) rather than route-level delay, which is the only way to reproduce the down-link timing this bug depends on, and it types slower than the injected lag so the echo-for-b-arrives-after-l race is actually exercised. It also correctly waits for the panel before typing to avoid a false failure from a lagged connect.

Docs (live-updates.md, search.md, CLAUDE.md convention line) and both changelog locales are updated consistently with the fix. No correctness, security, or omission issues found.


⏱ 0m 54s · 12 turns · tokens: 31.6k in / 3.1k out (+573.0k cache-read)
📜 Full session transcript

✅ **Verdict: approve** — no blocking issues found. Solid, well-scoped fix. The four inputs (search box, board/column/tag rename, tag color) all move from `value="@field"` + `@oninput` to real two-way binding (`@bind` for the plain field, `@bind:get`/`@bind:set` for the dictionary-indexed ones), which is exactly the right fix for the echo-drops-a-keystroke bug: only `@bind*` emits `SetUpdatesAttributeName`, so the server-driven re-render stops clobbering in-flight keystrokes. I checked the full bodies of `SearchBox.razor`, `Boards.razor`, and `Tags.razor` (not just the diff hunks) to confirm the surrounding logic (`OnQueryChanged`, `Clear()`, `RenameAsync`, dictionary population) still lines up with the new binding shape — it does; behavior is preserved, only the plumbing that assigns into the field changed. The new Playwright test is a genuinely good regression guard: it lags WebSocket `message` delivery (both `addEventListener` and the `onmessage` setter, since SignalR uses the latter) rather than route-level delay, which is the only way to reproduce the down-link timing this bug depends on, and it types slower than the injected lag so the echo-for-`b`-arrives-after-`l` race is actually exercised. It also correctly waits for the panel before typing to avoid a false failure from a lagged connect. Docs (`live-updates.md`, `search.md`, `CLAUDE.md` convention line) and both changelog locales are updated consistently with the fix. No correctness, security, or omission issues found. --- ⏱ 0m 54s · 12 turns · tokens: 31.6k in / 3.1k out (+573.0k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/pr-169/run-395.md) <!-- claude-verdict:approve --> <!-- claude-reviewed-head:620896b250b3aef4199d132b981a3e3db2022ba6 -->
Grandiras deleted branch claude/issue-167 2026-08-26 22:32:48 +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!169
No description provided.