# Settlements UI

GIS-интерфейс для выбора объектов, редактирования полигонов, проверки геометрии и экспорта. Публичное демо работает на полностью синтетической карте.

Статус: passed

Версия: `74ff9dfa024489475f7ef868ef1338a6c447cabf`. История репозитория: с февраля 2025. Публичная синтетическая версия: 7 сентября 2026.

## Задача

Изменение границ должно оставаться связано с карточкой объекта, проходить проверку и давать воспроизводимый результат экспорта.

## Аудитория

Специалисты, работающие с территориальными объектами и геометрией.

## Личный вклад

- Прикладной интерфейс карточек, слоёв и редактирования геометрии.

- Работа с React/MobX, MapLibre, Mapbox Draw, GeoJSON и EWKB.

- Подготовка отдельного demo adapter без корпоративного API, registry-зависимостей и рабочих данных.

## Решения

- Сохранены исходные application store, модели, контроллеры карты и проверки геометрии.

- Транспорт OData заменён локальным адаптером; карта не запрашивает внешние тайлы.

- Импорт разрешён только для встроенного GeoJSON-примера, повтор не создаёт дубликат.

## Границы и ограничения

- Четыре объекта и географическая подложка вымышлены; это не кадастровая или административная карта.

- Исходный репозиторий остаётся приватным. Серверный OData и исходный массовый импорт не развёрнуты.

- Production Vite-сборка и браузерные сценарии проверены; полный legacy TypeScript/lint набор не заявляется пройденным.

## Что попробовать

- Найдите объект, откройте карточку и включите режим редактирования.

- Переместите вершину полигона, проверьте геометрию и сохраните.

- Импортируйте встроенный пример, затем повторите импорт: останется пять объектов.

- Экспортируйте GeoJSON, сравните изменённую вершину и сбросьте карту.

## Проверки

- Polygon vertex moved, saved and verified through exported GeoJSON

- Import, export and duplicate prevention

- Independent browser session retains seed

- Reset restores exact seed

- Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.

## Результаты

- Сохранено 12 содержательных кадров фактического интерфейса.

- Дата, сценарий и версия указаны у каждого кадра.

- Отдельного backend-процесса на VPS нет: Nginx раздаёт статику. Ресурсы общего Nginx нельзя честно приписать одному сайту.

- Измерено 6 повторений сценария; медиана 71.5 мс, максимум 819 мс. Время включает браузер и HTTPS; методика и ограничения приложены.

## Запуск и эксплуатация

- Исходная архитектура связывала интерфейс с OData и корпоративными службами. Демонстрационная архитектура отдельно заменяет этот транспорт локальным adapter; рабочие заголовки и endpoints не включены в сборку.

- Сборка выполняется из src_front: docker build -f Dockerfile.portfolio --output type=local,dest=dist-demo . Готовые файлы передаются Nginx; Node.js на VPS не запускается.

- Проверять выбор объекта, движение вершины, сохранение/отмену, экспорт и повтор импорта. Изменение формы полигона подтверждено сравнением GeoJSON до и после настоящего drag в опубликованной версии.

- Общие правила эксплуатации: готовые файлы и закреплённые образы собираются вне VPS; секреты не входят в артефакты. Общесерверный docker prune не применяется. Логи backend ограничены ротацией, изменения log options требуют пересоздания контейнера.

- Перед изменением пройти code-map от функции к экрану/API, модулю и данным. После изменения обновить карту и схемы, выполнить связанные сценарии, включая ошибку, повтор и сброс. Источник истины — конкретная версия кода, а не старая диаграмма.

- Откат проверен 2026-09-07T00:59:40.214472+00:00: 20260907-verified → 20260907c → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.

## Стек и роль

- **React / MobX**: Карточки, application store и согласованное состояние выбора.
- **MapLibre / Mapbox Draw**: Рендер карты, слои и интерактивное изменение вершин.
- **GeoJSON / EWKB**: Обмен геометрией, преобразования и валидация.
- **Vite**: Изолированная production-сборка без корпоративного registry.

## Code-map

|Функция|Экран / API|Модуль|Данные / проверка|
|---|---|---|---|
|Поиск и карточка|Sidebar / Settlement|application.store, settlements-code.repository|municipals|
|Редактирование|MapEditor / SettlementPolygon|PageController, MapEditorController, Mapbox Draw|settlements_geometry|
|Валидация|Сохранение / кнопка проверки|validation.util, wkb.util|GeoJSON / EWKB|
|Импорт и экспорт|DemoControls|demo/data, demo/api|встроенный GeoJSON, память вкладки|
|Слои|MapEditorLayersSwitcher|LayerManager, demo/config|GeoJSON sources|

## Схемы

- Компоненты опубликованного демо — `diagrams/components.mmd`
- Основной сценарий — `diagrams/scenario.mmd`
- Размещение опубликованной версии — `diagrams/deployment.mmd`
- Состав данных и границы хранения — `diagrams/data.mmd`
- Исходный интеграционный контур — не развёрнут в демо — `diagrams/original.mmd`

## Индекс изображений

- 01-map: Четыре синтетических поселения и учебный округ; 2026-09-06T22:58:31.274Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 02-search: Поиск поселения; 2026-09-06T22:58:32.152Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 03-empty: Поиск без совпадений; 2026-09-06T22:58:32.869Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 04-card: Карточка поселения и полигон; 2026-09-06T22:58:35.175Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 05-edit: Редактирование вершин Mapbox Draw; 2026-09-06T22:58:38.025Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 06-vertex: Перемещение вершины; 2026-09-06T22:58:40.139Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 07-saved: Сохранённая изменённая геометрия; 2026-09-06T22:58:41.576Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 08-import: Встроенный GeoJSON добавил пятый полигон; 2026-09-06T22:58:43.178Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 09-validation: Проверка геометрии текущей сессии; 2026-09-06T22:58:44.054Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 10-layers: Переключение слоёв; 2026-09-06T22:58:44.789Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 11-hidden-layer: Скрытый слой поселений; 2026-09-06T22:58:45.978Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf
- 12-mobile: Мобильный вид карты и списка; 2026-09-06T22:58:50.027Z; SHA 74ff9dfa024489475f7ef868ef1338a6c447cabf

## Подробности runtime из репозитория

# Публичное демо Settlements UI

Исходная версия: `cbc16e864a9c6021196eaa0d42865e10324a1ce8`. Подготовка демо: 07.09.2026. Репозиторий остаётся приватным.

Сохранены React/MobX application store, модели поселений, MapLibre, Mapbox Draw, WKB-конвертация, проверки геометрии, выбор/редактирование/сохранение полигонов. Публичный транспорт OData заменён `src_front/src/demo/api.ts`: данные находятся только в памяти вкладки и исчезают при перезагрузке. Корпоративный API, UI Kit и OTLP не подключаются. Синтетическая карта не загружает внешние тайлы. Импорт принимает только встроенный GeoJSON-пример; произвольных загрузок нет.

## Сборка

Из `src_front`: `docker build -f Dockerfile.portfolio --output type=local,dest=dist-demo .`. Закреплённый Node используется только для локальной сборки; Nginx на VPS отдаёт готовые файлы. `npm run build:demo` выполняет Vite production build. Это не утверждение о прохождении полного legacy TypeScript/lint набора.

## Что проверить

1. Четыре поселения, поиск и пустой результат.
2. Карточка поселения → редактирование полигона → перемещение вершины → сохранение.
3. Импорт встроенного GeoJSON → пятый полигон → проверка → экспорт.
4. Повторный импорт не создаёт дубликат. Сброс возвращает четыре полигона.
5. Отдельная вкладка получает независимый набор данных.
6. Переключение слоёв, масштабирование, мобильный вид.

## Code-map

| Сценарий | Экран | Модуль | Данные |
|---|---|---|---|
| Поиск и карточка | Sidebar / Settlement | application.store, settlements-code.repository | municipals |
| Редактирование | MapEditor / SettlementPolygon | PageController, MapEditorController, Mapbox Draw | settlements_geometry |
| Валидация | Сохранение / кнопка проверки | validation.util, wkb.util | GeoJSON / EWKB |
| Импорт и экспорт | DemoControls | demo/data, demo/api | встроенный GeoJSON, память вкладки |
| Слои | MapEditorLayersSwitcher | LayerManager, demo/config | GeoJSON sources |

Перед изменением проследить строку карты от экрана до модели и транспорта. После изменения обновить карту и проверить выбор, сохранение, отмену и экспорт. Демонстрационный адаптер не является реализацией серверного OData или исходного модуля массового импорта.
