--- type: trz work_item_id: ET-001 title: "ТЗ: Чекбокс показа/скрытия POI в кнопке рельефа" version: 3 status: proposed created_at: 2026-06-14 updated_at: 2026-06-14 author: "agent:analyst" relates_to: ET-002 --- # Техническое задание — ET-001: Видимость POI > Поведение, описанное ниже, **уже реализовано в рамках ET-002**. ТЗ > служит спецификацией для **верификации** существующей реализации плюс > единственной новой правки — подписи чекбокса (REQ-F-01). Описание > текущей реализации приведено как **контекст для тестирования**, а не > как предлагаемая архитектура. ## 1. Функциональные требования ### REQ-F-01 — Подпись чекбокса «Показывать POI» (НОВАЯ ПРАВКА) - В попапе рельефа (`#terrain-popup`) чекбокс `#poi-visible-cb` должен иметь текстовую подпись **«Показывать POI»**. - Текущее состояние: подпись — «POI» (`src/web/index.html:88`, узел `POI` рядом с `#poi-visible-cb`). - **Жёсткая связь с существующим тестом (важно для исполнителя):** правка ломает регресс ET-002 `tests/unit/test_poi_toggle.py:54` — `assert "POI" in html`. Эту проверку нужно обновить на `Показывать POI` **в том же коммите**, иначе `make test` упадёт. (JS-тест `tests/unit/poi_toggle.test.js` текст подписи **не** проверяет — он извлекает поведенческий блок по маркерам и подписи не касается.) - Приёмка: видимый текст подписи равен «Показывать POI»; layout попапа не ломается (одна строка, без обрезки) на desktop и mobile. ### REQ-F-02 — Чекбокс присутствует в попапе рельефа - Чекбокс находится внутри `#terrain-popup`, открываемого кнопкой `#terrain-toggle` (`toggleTerrainPopup()`). ### REQ-F-03 — Включён по умолчанию - При первом заходе (ключ `localStorage['poi-visible']` отсутствует) чекбокс отмечен, POI видны. ### REQ-F-04 — Снятие чекбокса скрывает POI - Снятие `#poi-visible-cb` скрывает все маркеры POI: слои `poi-circles` и `poi-labels` получают `visibility: none`. ### REQ-F-05 — Установка чекбокса возвращает POI - Обратная установка возвращает `visibility: visible` тем же слоям. ### REQ-F-06 — Персистентность между сессиями - Выбор сохраняется в браузере и применяется при следующей загрузке страницы (наблюдаемо: после перезагрузки состояние совпадает). ### REQ-F-07 — Устойчивость к смене темы - Смена темы (`#btn-theme`, пересоздание стиля карты) не сбрасывает выбранную видимость POI; чекбокс и слои остаются в согласованном состоянии. ## 2. Нефункциональные требования ### REQ-NF-01 — Без новых зависимостей - Реализация остаётся клиентской, без новых npm/python пакетов (ограничение инфраструктуры, ET-002 `07-infra-requirements.md`). ### REQ-NF-02 — Без изменения серверного контракта - Эндпоинты `/api/tiles/{z}/{x}/{y}.mvt` и слой `poi` в MVT не меняются. Управление видимостью — только переключение `visibility` слоёв MapLibre на клиенте. ### REQ-NF-03 — Согласованность состояния - Единый источник истины в рантайме — `layerState.poi`; чекбокс, `localStorage` и фактическая видимость слоёв не расходятся. ## 3. Текущая реализация (контекст для верификации) > Информативно. Изменять требуется только подпись (REQ-F-01). - `src/web/index.html` - стр. ~86–89: `` и `POI` внутри `#terrain-popup`. - `src/web/app.js` - `layerState.poi` (стр. ~406) и `layerGroups.poi = ['poi-circles', 'poi-labels']` (стр. ~410). - `applyPoiVisibility(visible)` — переключает `visibility` слоёв POI и синхронизирует `layerState.poi`. - `onPoiCheckbox()` — пишет `localStorage['poi-visible']` ('1'/'0') и вызывает `applyPoiVisibility()`. - `restorePoiState()` — восстановление при загрузке и после смены темы; дефолт (ключ отсутствует или '1') — POI видимы. - Блок-маркеры `>>> ET-002 POI visibility block <<<`. - ADR: `docs/work-items/ET-002/06-adr/adr-0001-poi-visibility-client-side.md`. ## 4. Объём изменений для ET-001 1. `src/web/index.html:88`: заменить текст подписи `POI` → `Показывать POI` у `#poi-visible-cb`. 2. **Синхронно** обновить ожидание текста в существующем регресс-тесте ET-002 `tests/unit/test_poi_toggle.py:54` (`assert "POI" in html` → `assert "Показывать POI" in html`). Без этого `make test` упадёт. *(Уточнение: текст подписи проверяет именно python-тест; JS-тест `poi_toggle.test.js` его не трогает.)* 3. Прогнать регрессию по REQ-F-02…REQ-F-07 (поведение ET-002 не должно измениться). ## 5. Зависимости и ограничения - Не править артефакты ET-002 и заархивированной барьерной задачи. - Не закрывать ET-001 самостоятельно — закрытие за Owner/CI. - Если Owner решит, что переименование не нужно — ТЗ аннулируется, ET-001 закрывается как дубликат ET-002 (см. `09-analyst-decision-required.md`).