From e82c9f8bbd192126f15b4e6520d0ce626334a497 Mon Sep 17 00:00:00 2001 From: Ilia Denisov Date: Tue, 26 May 2026 00:18:30 +0200 Subject: [PATCH] fix(ui): no-op when re-selecting the turn already on screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clicking the current-turn row in the header turn navigator while already viewing it routed through returnToCurrent() → viewTurn(currentTurn), which re-fetches the live report and flips the view through `loading`. At turn 0 the only row is the live turn, so the dropdown always fired a pointless backend round-trip and redraw. Guard goToTurn() against re-selecting the on-screen turn (turn === viewedTurn): just close the popover and stop. Leaving history is unaffected — there the viewed turn differs from the target. Closes #45 Co-Authored-By: Claude Opus 4.7 --- ui/docs/navigation.md | 8 +++-- .../src/lib/header/turn-navigator.svelte | 12 ++++++- ui/frontend/tests/turn-navigator.test.ts | 36 +++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/ui/docs/navigation.md b/ui/docs/navigation.md index a8bd24e..141fe90 100644 --- a/ui/docs/navigation.md +++ b/ui/docs/navigation.md @@ -179,8 +179,12 @@ arrows step `viewedTurn` by ±1 (disabled at boundaries `0` and popover (desktop) or a fixed full-width drawer (mobile, ≤ 767.98 px) listing every turn from `currentTurn` down to `0`. Selecting the current-turn row routes through `gameState.returnToCurrent()`; -any other row calls `gameState.viewTurn(N)`. The popover reuses -`view-menu.svelte`'s outside-click / Escape pattern. +any other row calls `gameState.viewTurn(N)`. Selecting the row +already on screen (`viewedTurn`) is a pure no-op — it only closes +the popover — so re-picking the live turn (most visibly turn 0, +where it is the only row) never re-fetches the report to redraw the +same snapshot. The popover reuses `view-menu.svelte`'s +outside-click / Escape pattern. `lib/header/history-banner.svelte` renders directly under the header whenever `gameState.historyMode === true`. It shows diff --git a/ui/frontend/src/lib/header/turn-navigator.svelte b/ui/frontend/src/lib/header/turn-navigator.svelte index 6a85e20..64e33a0 100644 --- a/ui/frontend/src/lib/header/turn-navigator.svelte +++ b/ui/frontend/src/lib/header/turn-navigator.svelte @@ -12,7 +12,10 @@ drawer below the 768 px breakpoint, mirroring `view-menu.svelte`. Selecting a row calls `gameState.viewTurn(N)`; the row that matches `currentTurn` delegates to `gameState.returnToCurrent()` so the -"leave history" path always flows through one method. +"leave history" path always flows through one method. Selecting the +row already on screen (`viewedTurn`) is a pure no-op — most visibly +at turn 0, where the sole row is the live turn — so the navigator +never re-fetches the report just to redraw the same snapshot. -->