[F8-02] Навигация по ходам: no-op на ходе 0 #45
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Подзадача полировки UI (этап F8), родительский #43.
Цель: Клик по «current» в навигации по ходам при текущем ходе = 0 не должен дёргать бэкенд и перерисовывать UI.
Пункты из #43:
Заметка. Чистый no-op, когда выбранный текущий ход уже активен (ход 0).
Порядок обработки: F8-02 из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач.
@developer Кая! тут no-op не на "ходе 0", а не любом ходе, который текущий, то есть выбран в игровом UI! Это важно :)
Working log (issue-agent) — click to expand
State: done
Updated: 2026-05-26T05:14Z
Branch / PR:
feature/issue-45-turn-navigator-noop→ PR #57 MERGED intodevelopmentat1f6791549a25e014370744c44d0fcc896aeb76a0Merge gate passed (this run):
development, body containsCloses #45.e82c9f8b: ui-test push (run 346) success, ui-test pull_request (run 347) success, dev-deploy (run 348) success. Combined commit-status carried the known phantompendingon the push context — workflow run conclusions are authoritative.stale: false,commit_id == e82c9f8b…(current head).openat merge time — no cancel signal.Post-merge:
Closes #45auto-closed the issue at 2026-05-26T05:13:24Z; setclaude/done(the exclusiveclaude/*scope clearedclaude/in-review). Owner's confirmation comment (335) acknowledged before merge.Shipped: guard
if (turn === gameState.viewedTurn) return;inui/frontend/src/lib/header/turn-navigator.svelte::goToTurn— re-clicking the on-screen turn closes the popover and stops. Same fix incidentally drops the redundant re-fetch on re-clicking an already-viewed history turn. Regression tests inui/frontend/tests/turn-navigator.test.ts;ui/docs/navigation.mdupdated.FUNCTIONAL.md/ARCHITECTURE.mddid not describe this micro-behavior → untouched (mirrorFUNCTIONAL_ru.mdalso untouched).Next: nothing — F8-02 done. Umbrella #43 (F8 manual-QA loop) remains owner-driven; further subtasks come as individual issues.
@owner, готово — PR #57 ждёт твоего ревью.
Что было. Клик по строке текущего хода в навигаторе шёл через
returnToCurrent()→viewTurn(currentTurn), а тот всегда дёргал бэкенд (fetchGameReport, мимо кэша) и прогонял вид черезloading(перерисовка). На ходе 0 единственная строка списка — это и есть живой ход, поэтому открыть список и кликнуть по нему = гарантированный лишний запрос и перерисовка того же снимка.Что сделала. В
goToTurn(turn-navigator.svelte) добавила охранник:if (turn === gameState.viewedTurn) return;— повторный выбор хода, который уже на экране, просто закрывает поповер, и всё. Условие написала черезviewedTurn, а не как спец-случай «ход 0»: заодно ушёл такой же лишний повторный запрос при повторном клике по уже открытому историческому ходу. Выход из истории работает как прежде — там просматриваемый ход отличается от целевого, так чтоreturnToCurrent()/viewTurn(N)отрабатывают.Файлы.
ui/frontend/src/lib/header/turn-navigator.svelte— фикс + комментарий в шапке.ui/frontend/tests/turn-navigator.test.ts— 2 регрессионных теста (no-op на ходе 0 с закрытием поповера; no-op при повторном выборе уже открытого исторического хода).ui/docs/navigation.md— описание no-op.FUNCTIONAL.md/ARCHITECTURE.mdэтот микро-no-op не описывают, так что их (иFUNCTIONAL_ru.md) не трогала.Тесты. Локально весь Vitest зелёный (79 файлов / 776 тестов),
svelte-check— 0 ошибок / 0 предупреждений. CIui-test(push + PR) — зелёный; интеграционный набор не запускается (его пути не включаютui/frontend).Мелочь: в сводном commit-status у контекста
pushможет висеть фантомныйpending— это та самая известная причуда Gitea, оба прогона по фактуsuccess.Мерджить не буду — жду твой
APPROVED, тогда вмерджу через merge-gate.@owner, да, увидела твой комментарий — и это ровно то, что уже в PR #57, я не завязывалась на «ход 0».
Условие в
goToTurn—if (turn === gameState.viewedTurn) return;, гдеviewedTurnэто и есть ход, который сейчас выбран/показан в игровом UI (та самая подсвеченная строка списка). То есть no-op срабатывает для любого хода, который выбран, а не только для нулевого. Ход 0 — просто самый заметный случай: там выбранный ход всегда совпадает с текущим, поэтому баг и был виден всегда.Поведение по случаям:
Один нюанс на всякий случай: я трактовала «текущий» как «выбранный в UI» (
viewedTurn) — именно из твоего «то есть выбран в игровом UI». Если под «текущим» ты имел в виду строго живой ход сервера (currentTurn), а не выбранный, то отличие лишь в одном случае — повторный клик по уже открытому историческому ходу: сейчас это тоже no-op (что, по-моему, правильно — это тот же лишний запрос). Скажи, если хочешь сузить до строго живого хода, поправлю.Всё отлично, проверил. Твоё чутьё тебя не подвело. :) Постановка размытая - реализация превосходная, спасибо 👍