[SF-v2 #958] 958-B5: Починить вход — выбор участка на карте + понятный ввод участка #1001

Closed
opened 2026-06-02 20:05:22 +00:00 by lekss361 · 1 comment
Owner

Часть EPIC #958 (Site Finder v2 / GG-форсайт). 🔴 Демо-блокер — точка входа всего продукта.

Симптом (стратегсессия ГГ, 2026-06-01)

На демо ГГ участок не удалось нормально завести: «Дайте кадастровый номер… или давайте на карту выберем» → выбор точки на карте не сработал, интерфейс «ещё не совершенен» (Антон), при анализе сайт упал (00:07:41 «Она упала. Анализируем участок. Ненавижу»). Без рабочего входа продемонстрировать «Железнодорожники» невозможно.

Текущее состояние (код)

Вход уже собран: frontend/src/app/site-finder/page.tsx

  • components/site-finder/entry/EntryMap.tsx (Leaflet, dynamic ssr:false) — клик по участку → onParcelSelectParcelDrawer
  • components/site-finder/CadInput.tsx — ввод кадастрового номера → router.push(/site-finder/analysis/<cad>)
  • entry/ParcelDrawer.tsx, entry/RecentParcels.tsx, entry/MapFilterBar.tsx
    Но в рабочем виде на демо это не сработало: либо выбор участка на карте не кликается/не выделяется, либо bbox-загрузка участков пустая, либо переход в анализ падает.

Scope

  1. Починить выбор участка на карте — клик по полигону/точке участка в EntryMap должен надёжно выделять участок и открывать ParcelDrawer с «Анализировать». Проверить useParcelsBboxQuery/onBboxChange (участки реально грузятся в видимом bbox), z-index/pointer-events слоёв, что клик ловится.
  2. Сделать очевидным ввод участкаCadInput должен быть заметен (label/placeholder «Кадастровый номер, напр. 66:41:…», кнопка «Анализировать»), + поиск по адресу (§12.1), + явная подсказка «введите кадастр / выберите на карте». Сейчас sidebar 300px справа теряется.
  3. Не падать при переходе в анализ — добиться, чтобы выбор участка → /analysis/<cad> не ронял страницу (см. backend-устойчивость /analyze).

DoD

  • На проде на «Железнодорожниках»: ввёл кадастр ИЛИ кликнул участок на карте → открылся анализ без падения.
  • Клик по участку на карте выделяет его и показывает drawer с CTA «Анализировать».
  • Пустой/ошибочный ввод кадастра даёт понятную ошибку, не белый экран.
  • Smoke: mcp__playwright__* golden-path (ввод кадастра → анализ; клик на карте → анализ).

Файлы

frontend/src/app/site-finder/page.tsx, components/site-finder/entry/EntryMap.tsx, components/site-finder/CadInput.tsx, entry/ParcelDrawer.tsx, lib/site-finder-api.ts (useParcelsBboxQuery)

Зависит от: — (можно делать сразу; параллельно с #995)
Effort: M

**Часть EPIC #958 (Site Finder v2 / GG-форсайт).** 🔴 Демо-блокер — точка входа всего продукта. ## Симптом (стратегсессия ГГ, 2026-06-01) На демо ГГ участок не удалось нормально завести: «Дайте кадастровый номер… или давайте на карту выберем» → **выбор точки на карте не сработал**, интерфейс «ещё не совершенен» (Антон), при анализе **сайт упал** (00:07:41 «Она упала. Анализируем участок. Ненавижу»). Без рабочего входа продемонстрировать «Железнодорожники» невозможно. ## Текущее состояние (код) Вход уже собран: `frontend/src/app/site-finder/page.tsx` → - `components/site-finder/entry/EntryMap.tsx` (Leaflet, dynamic ssr:false) — клик по участку → `onParcelSelect` → `ParcelDrawer` - `components/site-finder/CadInput.tsx` — ввод кадастрового номера → `router.push(/site-finder/analysis/<cad>)` - `entry/ParcelDrawer.tsx`, `entry/RecentParcels.tsx`, `entry/MapFilterBar.tsx` Но в рабочем виде на демо это не сработало: либо выбор участка на карте не кликается/не выделяется, либо bbox-загрузка участков пустая, либо переход в анализ падает. ## Scope 1. **Починить выбор участка на карте** — клик по полигону/точке участка в `EntryMap` должен надёжно выделять участок и открывать `ParcelDrawer` с «Анализировать». Проверить `useParcelsBboxQuery`/`onBboxChange` (участки реально грузятся в видимом bbox), z-index/pointer-events слоёв, что клик ловится. 2. **Сделать очевидным ввод участка** — `CadInput` должен быть заметен (label/placeholder «Кадастровый номер, напр. 66:41:…», кнопка «Анализировать»), + поиск по адресу (§12.1), + явная подсказка «введите кадастр / выберите на карте». Сейчас sidebar 300px справа теряется. 3. **Не падать при переходе в анализ** — добиться, чтобы выбор участка → `/analysis/<cad>` не ронял страницу (см. backend-устойчивость `/analyze`). ## DoD - На проде на «Железнодорожниках»: ввёл кадастр ИЛИ кликнул участок на карте → открылся анализ без падения. - Клик по участку на карте выделяет его и показывает drawer с CTA «Анализировать». - Пустой/ошибочный ввод кадастра даёт понятную ошибку, не белый экран. - Smoke: `mcp__playwright__*` golden-path (ввод кадастра → анализ; клик на карте → анализ). ## Файлы `frontend/src/app/site-finder/page.tsx`, `components/site-finder/entry/EntryMap.tsx`, `components/site-finder/CadInput.tsx`, `entry/ParcelDrawer.tsx`, `lib/site-finder-api.ts` (`useParcelsBboxQuery`) **Зависит от:** — (можно делать сразу; параллельно с #995) **Effort:** M
lekss361 added this to the Site Finder v2 — Foresight (GG-форсайт) milestone 2026-06-02 20:05:36 +00:00
lekss361 added the
GG-форсайт
scope/frontend
site-finder
status/ready
labels 2026-06-02 20:05:37 +00:00
Author
Owner

🔎 Уточнение симптома (наблюдение 2026-06-02)

«Нельзя выбрать точки, такое ощущение что слои разъехались

Это указывает не на логику выбора, а на рассинхрон Leaflet-panes: кликабельный слой участков (GeoJSON/markers) визуально смещён относительно tile-слоя, поэтому клик не попадает в полигон. Классические причины (проверять в этом порядке):

  1. map.invalidateSize() не вызван после изменения размера контейнера. EntryMap в page.tsx живёт в flex-контейнере (flex:1, position:relative) с drawer/sidebar — карта инициализируется до того, как контейнер получил финальный размер → Leaflet кэширует неверный _size → tile-pane и overlay-pane «разъезжаются». Фикс: useEffect/ResizeObservermap.invalidateSize() после mount и на resize контейнера. Наиболее вероятная причина.
  2. CSS-transform на родителе карты (анимация/will-change) ломает абсолютное позиционирование Leaflet-panes — убрать transform с предков .leaflet-container.
  3. Отсутствует/битый импорт leaflet/dist/leaflet.css или конфликт высоты → панель тайлов и overlay считают разный origin.
  4. Overlay-div поверх карты с pointer-events (ParcelDrawer/filter bar) перехватывает клики в зоне карты — проверить, что ParcelDrawer при закрытом состоянии не растягивается на всю map-area.
  5. Маркер/полигон в неверной проекции (lng/lat перепутаны) — точки физически не там, где видны.

Быстрая проверка: в DevTools сравнить transform у .leaflet-tile-pane vs .leaflet-overlay-pane / .leaflet-marker-pane — если разные → подтверждён pane-desync (причина 1/2).

DoD дополняется: клик попадает в участок в любой точке видимой карты (не только в центре), после ресайза окна/открытия drawer выбор остаётся точным.

## 🔎 Уточнение симптома (наблюдение 2026-06-02) > «Нельзя выбрать точки, такое ощущение что **слои разъехались**.» Это указывает не на логику выбора, а на **рассинхрон Leaflet-panes**: кликабельный слой участков (GeoJSON/markers) визуально смещён относительно tile-слоя, поэтому клик не попадает в полигон. Классические причины (проверять в этом порядке): 1. **`map.invalidateSize()` не вызван после изменения размера контейнера.** `EntryMap` в `page.tsx` живёт в flex-контейнере (`flex:1`, `position:relative`) с drawer/sidebar — карта инициализируется до того, как контейнер получил финальный размер → Leaflet кэширует неверный `_size` → tile-pane и overlay-pane «разъезжаются». Фикс: `useEffect`/`ResizeObserver` → `map.invalidateSize()` после mount и на resize контейнера. **Наиболее вероятная причина.** 2. **CSS-`transform` на родителе карты** (анимация/`will-change`) ломает абсолютное позиционирование Leaflet-panes — убрать transform с предков `.leaflet-container`. 3. **Отсутствует/битый импорт `leaflet/dist/leaflet.css`** или конфликт высоты → панель тайлов и overlay считают разный origin. 4. **Overlay-div поверх карты с `pointer-events`** (ParcelDrawer/filter bar) перехватывает клики в зоне карты — проверить, что `ParcelDrawer` при закрытом состоянии не растягивается на всю map-area. 5. Маркер/полигон в неверной проекции (lng/lat перепутаны) — точки физически не там, где видны. **Быстрая проверка:** в DevTools сравнить `transform` у `.leaflet-tile-pane` vs `.leaflet-overlay-pane` / `.leaflet-marker-pane` — если разные → подтверждён pane-desync (причина 1/2). DoD дополняется: клик попадает в участок **в любой точке видимой карты** (не только в центре), после ресайза окна/открытия drawer выбор остаётся точным.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1001
No description provided.