Restore school tabs and filters after refresh.

The URL keeps the open school and current view; sessionStorage keeps list filters and searches so F5 and re-entry do not dump the player on an empty map.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-20 12:03:04 +03:00
co-authored by Cursor
parent d8a2c2903c
commit 36ec5e9f8e
16 changed files with 1104 additions and 62 deletions
+32
View File
@@ -143,3 +143,35 @@
Ручной `CHANGELOG.md`. Запись на пользователе в `users.json`. Вызов git из бегущего процесса.
Бамп версии сокета. Окно внутри открытой школы.
## Состояние экрана
### Зачем
Менеджер — списки с фильтрами. Сейчас они живут только в RAM: F5 всегда меню, повторный вход
сбрасывает вкладки и запросы. Игрок сравнивает людей и соискателей; потерять «ученики 5А» на
обновлении — дырка в уже живых экранах, не новая фича.
### Было / Стало / Почему
**Было.** SPA без адреса. `GameScreen.show` и `PeoplePanel.show` обнуляют вкладки, фильтры и
выбор. Язык уже в `localStorage`; игровые часы — на сервере.
**Стало.** Query URL держит *где я*: школа, обзор/управление, карта/люди, выбранные комната и
человек. `sessionStorage` по `schoolId` держит фильтры, поиски, сорт, страницу, вкладку карточки
и класс сетки — и последний маршрут, чтобы вход с меню поднял то же место. F5 с `?school=`
шлёт тот же `OpenSchool`, что карточка. Вход/выход — `pushState`; смена вкладки и фильтра —
`replaceState`, чтобы «назад» не листал каждый клик.
**Почему.** Сервер не знает про вкладки; класть их в сейв — лишний HTTP. `localStorage` как у
языка держал бы «5А» через месяц. URL без фильтров остаётся коротким и копируемым.
### Что видит игрок
F5 внутри школы — та же школа, те же вкладки и фильтры. Назад — меню. Снова открыть ту же
школу — не сброс на карту. Гость не входит в управление по ссылке. Скорость часов, пауза,
открытый пул соискателей и мастер создания не вспоминаются.
### Что не входит
Поиск по имени в списках, где его нет. Роутер-библиотека. Состояние на сервере. Бамп протокола.