docs(ET-002): BRD, ТЗ, AC, Test Plan — чекбокс POI в попапе рельефа

This commit is contained in:
2026-05-20 09:54:32 +03:00
parent 832099c3c6
commit f1f4d5f336
5 changed files with 380 additions and 0 deletions

View File

@@ -0,0 +1,20 @@
---
type: business-request
work_item_id: ET-002
title: "Чекбокс показа/скрытия POI на карте"
created_at: 2026-05-20
source: telegram
requester: Слава
---
# Исходный запрос — ET-002
## Формулировка заказчика
> На карте сейчас всегда отражаются маркеры POI. Нужен в кнопке рельефа добавить чекбокс показывать/не показывать POI.
## Контекст
- Канал: Telegram
- Дата: 2026-05-19
- Приоритет: не указан (обычный)

View File

@@ -0,0 +1,61 @@
---
type: brd
work_item_id: ET-002
title: "BRD: Чекбокс показа/скрытия POI в попапе рельефа"
version: 1
status: draft
created_at: 2026-05-20
authors:
- "agent:analyst"
---
# BRD — ET-002: Чекбокс показа/скрытия POI в попапе рельефа
## 1. Цель
Дать пользователю возможность скрывать маркеры POI на карте, чтобы они не загромождали обзор при планировании маршрута. Управление — через чекбокс в существующем попапе кнопки «Рельеф».
## 2. Контекст
- Сейчас POI (слои `poi-circles`, `poi-labels`) отображаются всегда при загрузке карты.
- Попап кнопки «Рельеф» (`terrain-popup`) уже содержит чекбоксы: Тени рельефа, Перепады, Грунтовки, Тропы.
- Механизм `toggleLayer('poi')` уже реализован в коде, но не привязан к UI в попапе.
## 3. Scope
### In scope
- Добавить чекбокс «POI» в попап кнопки «Рельеф» (после секции «Тропы»)
- POI включены по умолчанию (checked)
- Состояние чекбокса сохраняется в localStorage (ключ `poi-visible`)
- При загрузке страницы — восстанавливать состояние из localStorage
- Скрытие/показ слоёв `poi-circles` и `poi-labels` через MapLibre `setLayoutProperty`
### Out of scope
- Фильтрация POI по типу (кафе, заправки, и т.д.)
- Отдельная кнопка для POI вне попапа рельефа
- Изменение иконок или стилей POI
- Backend-изменения
## 4. Метрики успеха
| Метрика | Критерий |
|---------|----------|
| Чекбокс отображается в попапе | Визуально присутствует после «Тропы» |
| Снятие чекбокса скрывает POI | Слои `poi-circles` и `poi-labels` получают visibility: none |
| Установка чекбокса показывает POI | Слои получают visibility: visible |
| Состояние сохраняется | После перезагрузки страницы чекбокс и видимость POI соответствуют последнему выбору |
| Не ломает существующий функционал | Грунтовки, тропы, рельеф, роутинг работают как прежде |
## 5. Риски
| Риск | Вероятность | Митигация |
|------|-------------|-----------|
| Конфликт с существующим toggleLayer('poi') | Низкая | Использовать тот же механизм layerState, не дублировать логику |
| Попап становится слишком длинным на мобильных | Низкая | Один чекбокс — минимальное увеличение высоты |
## 6. Зависимости
- Нет внешних зависимостей
- Только фронтенд (vanilla JS + HTML)

View File

@@ -0,0 +1,98 @@
---
type: trz
work_item_id: ET-002
title: "ТЗ: Чекбокс показа/скрытия POI в попапе рельефа"
version: 1
status: draft
created_at: 2026-05-20
authors:
- "agent:analyst"
---
# ТЗ — ET-002: Чекбокс показа/скрытия POI в попапе рельефа
## 1. Функциональные требования
### REQ-F-01: Чекбокс POI в попапе рельефа
Система должна отображать чекбокс «POI» в попапе кнопки «Рельеф» (`terrain-popup`), расположенный после чекбокса «Тропы» (`trails-path-cb`), отделённый горизонтальной линией (`<hr>`).
### REQ-F-02: Состояние по умолчанию
При первом посещении (отсутствие ключа в localStorage) чекбокс POI должен быть включён (checked), маркеры POI видимы.
### REQ-F-03: Скрытие POI
При снятии чекбокса система должна установить `visibility: 'none'` для слоёв `poi-circles` и `poi-labels` через `map.setLayoutProperty()`.
### REQ-F-04: Показ POI
При установке чекбокса система должна установить `visibility: 'visible'` для слоёв `poi-circles` и `poi-labels`.
### REQ-F-05: Сохранение состояния
Система должна сохранять состояние чекбокса в `localStorage` под ключом `poi-visible` (значения: `'1'` — показывать, `'0'` — скрывать).
### REQ-F-06: Восстановление состояния при загрузке
При загрузке страницы система должна:
1. Прочитать значение `localStorage.getItem('poi-visible')`
2. Если значение `'0'` — снять чекбокс и скрыть слои POI
3. Если значение `'1'` или отсутствует (null) — установить чекбокс и показать слои POI
### REQ-F-07: Синхронизация с layerState
Изменение чекбокса должно обновлять `layerState.poi` (true/false), чтобы состояние было консистентно с внутренней моделью приложения.
## 2. Нефункциональные требования
### REQ-NF-01: Производительность
Переключение видимости POI должно происходить мгновенно (< 50 мс), без перезагрузки тайлов.
### REQ-NF-02: Совместимость
Решение должно работать во всех браузерах, поддерживающих MapLibre GL JS (Chrome 80+, Firefox 78+, Safari 14+, Edge 80+).
### REQ-NF-03: Мобильная адаптация
Чекбокс должен быть доступен и нажимаем на мобильных устройствах (touch target ≥ 44px).
### REQ-NF-04: Отсутствие регрессий
Существующие чекбоксы (Тени рельефа, Перепады, Грунтовки, Тропы) должны продолжать работать без изменений.
## 3. UI-спецификация
### Расположение в HTML
```html
<!-- Внутри #terrain-popup, после trails-path-cb -->
<hr style="margin:6px 0;border-color:rgba(128,128,128,0.3)">
<label class="terrain-checkbox">
<input type="checkbox" id="poi-visible-cb" onchange="onPoiCheckbox()" checked>
<span>POI</span>
</label>
```
### Стилизация
Использовать существующий класс `terrain-checkbox` — единообразие с остальными чекбоксами в попапе.
## 4. Данные
- localStorage ключ: `poi-visible`
- Значения: `'1'` (показывать) | `'0'` (скрывать)
- MapLibre слои: `poi-circles`, `poi-labels`
- Состояние в JS: `layerState.poi`
## 5. API
Нет изменений в backend API. Вся логика — клиентская.
## 6. Затрагиваемые файлы
| Файл | Изменение |
|------|-----------|
| `src/web/index.html` | Добавить чекбокс в `terrain-popup` |
| `src/web/app.js` | Добавить функцию `onPoiCheckbox()`, логику восстановления состояния при загрузке |

View File

@@ -0,0 +1,85 @@
---
type: acceptance-criteria
work_item_id: ET-002
title: "Acceptance Criteria: Чекбокс POI"
version: 1
status: draft
created_at: 2026-05-20
authors:
- "agent:analyst"
---
# Acceptance Criteria — ET-002
## AC-01: Чекбокс отображается в попапе
```gherkin
Given пользователь открыл карту
When пользователь нажимает кнопку «Рельеф»
Then в попапе отображается чекбокс «POI» после секции «Тропы»
And чекбокс отделён горизонтальной линией от секции выше
```
## AC-02: POI включены по умолчанию
```gherkin
Given пользователь открыл карту впервые (нет ключа poi-visible в localStorage)
When попап рельефа открыт
Then чекбокс «POI» установлен (checked)
And маркеры POI видны на карте
```
## AC-03: Скрытие POI
```gherkin
Given чекбокс «POI» установлен
And маркеры POI видны на карте
When пользователь снимает чекбокс «POI»
Then маркеры POI исчезают с карты
And слои poi-circles и poi-labels имеют visibility: none
```
## AC-04: Показ POI
```gherkin
Given чекбокс «POI» снят
And маркеры POI скрыты
When пользователь устанавливает чекбокс «POI»
Then маркеры POI появляются на карте
And слои poi-circles и poi-labels имеют visibility: visible
```
## AC-05: Состояние сохраняется после перезагрузки
```gherkin
Given пользователь снял чекбокс «POI»
When пользователь перезагружает страницу
Then чекбокс «POI» снят
And маркеры POI скрыты
```
## AC-06: Восстановление включённого состояния
```gherkin
Given пользователь установил чекбокс «POI»
When пользователь перезагружает страницу
Then чекбокс «POI» установлен
And маркеры POI видны
```
## AC-07: Не ломает существующие чекбоксы
```gherkin
Given попап рельефа открыт
When пользователь переключает чекбоксы «Тени рельефа», «Перепады», «Грунтовки», «Тропы»
Then каждый чекбокс работает как прежде
And чекбокс «POI» не влияет на их поведение
```
## AC-08: Синхронизация с layerState
```gherkin
Given чекбокс «POI» снят
When внешний код читает layerState.poi
Then значение равно false
```

View File

@@ -0,0 +1,116 @@
---
type: test-plan
work_item_id: ET-002
title: "Test Plan: Чекбокс POI"
version: 1
status: draft
created_at: 2026-05-20
authors:
- "agent:analyst"
---
tests:
- id: TP-01
type: unit
description: "onPoiCheckbox() устанавливает visibility слоёв"
steps:
- "Mock map.getLayer() → true"
- "Mock map.setLayoutProperty()"
- "Установить checkbox.checked = false"
- "Вызвать onPoiCheckbox()"
expected:
- "setLayoutProperty('poi-circles', 'visibility', 'none') вызван"
- "setLayoutProperty('poi-labels', 'visibility', 'none') вызван"
- "localStorage.setItem('poi-visible', '0') вызван"
- "layerState.poi === false"
- id: TP-02
type: unit
description: "onPoiCheckbox() показывает слои при checked=true"
steps:
- "Mock map.getLayer() → true"
- "Установить checkbox.checked = true"
- "Вызвать onPoiCheckbox()"
expected:
- "setLayoutProperty('poi-circles', 'visibility', 'visible') вызван"
- "setLayoutProperty('poi-labels', 'visibility', 'visible') вызван"
- "localStorage.setItem('poi-visible', '1') вызван"
- "layerState.poi === true"
- id: TP-03
type: unit
description: "Восстановление состояния при загрузке — POI скрыты"
steps:
- "localStorage.setItem('poi-visible', '0')"
- "Вызвать функцию инициализации POI"
expected:
- "checkbox.checked === false"
- "layerState.poi === false"
- "Слои скрыты"
- id: TP-04
type: unit
description: "Восстановление состояния при загрузке — POI видны (default)"
steps:
- "localStorage не содержит ключ poi-visible"
- "Вызвать функцию инициализации POI"
expected:
- "checkbox.checked === true"
- "layerState.poi === true"
- id: TP-05
type: e2e
description: "Чекбокс POI виден в попапе рельефа"
steps:
- "Открыть карту в браузере"
- "Нажать кнопку «Рельеф»"
expected:
- "В попапе виден чекбокс с текстом «POI»"
- "Чекбокс расположен после «Тропы», отделён линией"
- id: TP-06
type: e2e
description: "Переключение POI скрывает/показывает маркеры"
steps:
- "Открыть карту, дождаться загрузки POI"
- "Открыть попап рельефа"
- "Снять чекбокс POI"
- "Убедиться что маркеры исчезли"
- "Установить чекбокс POI"
- "Убедиться что маркеры появились"
expected:
- "Маркеры POI скрываются и появляются в соответствии с чекбоксом"
- id: TP-07
type: e2e
description: "Состояние POI сохраняется после перезагрузки"
steps:
- "Открыть карту"
- "Снять чекбокс POI"
- "Перезагрузить страницу"
- "Открыть попап рельефа"
expected:
- "Чекбокс POI снят"
- "Маркеры POI не отображаются"
- id: TP-08
type: integration
description: "Чекбокс POI не влияет на другие слои"
steps:
- "Включить Тени рельефа и Грунтовки"
- "Снять чекбокс POI"
expected:
- "Тени рельефа остаются видимыми"
- "Грунтовки остаются видимыми"
- "Только POI скрыты"
- id: TP-09
type: e2e
description: "Мобильная доступность чекбокса"
steps:
- "Открыть карту на мобильном viewport (375px)"
- "Открыть попап рельефа"
- "Тапнуть чекбокс POI"
expected:
- "Чекбокс нажимается без проблем"
- "Touch target достаточный (≥ 44px)"