From f1f4d5f336e9b2542a0ff95e23a3c716aa54d77a Mon Sep 17 00:00:00 2001 From: claude-bot Date: Wed, 20 May 2026 09:54:32 +0300 Subject: [PATCH] =?UTF-8?q?docs(ET-002):=20BRD,=20=D0=A2=D0=97,=20AC,=20Te?= =?UTF-8?q?st=20Plan=20=E2=80=94=20=D1=87=D0=B5=D0=BA=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=20POI=20=D0=B2=20=D0=BF=D0=BE=D0=BF=D0=B0=D0=BF=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B5=D0=BB=D1=8C=D0=B5=D1=84=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/work-items/ET-002/00-business-request.md | 20 +++ docs/work-items/ET-002/01-brd.md | 61 +++++++++ docs/work-items/ET-002/02-trz.md | 98 +++++++++++++++ .../ET-002/03-acceptance-criteria.md | 85 +++++++++++++ docs/work-items/ET-002/04-test-plan.yaml | 116 ++++++++++++++++++ 5 files changed, 380 insertions(+) create mode 100644 docs/work-items/ET-002/00-business-request.md create mode 100644 docs/work-items/ET-002/01-brd.md create mode 100644 docs/work-items/ET-002/02-trz.md create mode 100644 docs/work-items/ET-002/03-acceptance-criteria.md create mode 100644 docs/work-items/ET-002/04-test-plan.yaml diff --git a/docs/work-items/ET-002/00-business-request.md b/docs/work-items/ET-002/00-business-request.md new file mode 100644 index 0000000..afeb911 --- /dev/null +++ b/docs/work-items/ET-002/00-business-request.md @@ -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 +- Приоритет: не указан (обычный) diff --git a/docs/work-items/ET-002/01-brd.md b/docs/work-items/ET-002/01-brd.md new file mode 100644 index 0000000..d154e4b --- /dev/null +++ b/docs/work-items/ET-002/01-brd.md @@ -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) diff --git a/docs/work-items/ET-002/02-trz.md b/docs/work-items/ET-002/02-trz.md new file mode 100644 index 0000000..a6316a7 --- /dev/null +++ b/docs/work-items/ET-002/02-trz.md @@ -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`), отделённый горизонтальной линией (`
`). + +### 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-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()`, логику восстановления состояния при загрузке | diff --git a/docs/work-items/ET-002/03-acceptance-criteria.md b/docs/work-items/ET-002/03-acceptance-criteria.md new file mode 100644 index 0000000..37d38ca --- /dev/null +++ b/docs/work-items/ET-002/03-acceptance-criteria.md @@ -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 +``` diff --git a/docs/work-items/ET-002/04-test-plan.yaml b/docs/work-items/ET-002/04-test-plan.yaml new file mode 100644 index 0000000..f3b79bf --- /dev/null +++ b/docs/work-items/ET-002/04-test-plan.yaml @@ -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)"