docs(ET-002): BRD, ТЗ, AC, Test Plan — чекбокс POI в попапе рельефа
This commit is contained in:
20
docs/work-items/ET-002/00-business-request.md
Normal file
20
docs/work-items/ET-002/00-business-request.md
Normal 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
|
||||
- Приоритет: не указан (обычный)
|
||||
61
docs/work-items/ET-002/01-brd.md
Normal file
61
docs/work-items/ET-002/01-brd.md
Normal 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)
|
||||
98
docs/work-items/ET-002/02-trz.md
Normal file
98
docs/work-items/ET-002/02-trz.md
Normal 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()`, логику восстановления состояния при загрузке |
|
||||
85
docs/work-items/ET-002/03-acceptance-criteria.md
Normal file
85
docs/work-items/ET-002/03-acceptance-criteria.md
Normal 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
|
||||
```
|
||||
116
docs/work-items/ET-002/04-test-plan.yaml
Normal file
116
docs/work-items/ET-002/04-test-plan.yaml
Normal 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)"
|
||||
Reference in New Issue
Block a user