feat(tgu-ops-ui): display request polygons on 2D map

Добавлен слой заявок (КНС) на 2D карту ТГУ:
- requestApi.ts — загрузка заявок постранично через GET /v1/requests/map
  с прогресс-коллбэком; автоматически собирает все страницы
- wktParser.ts — парсинг WKT POLYGON/MULTIPOLYGON в массив координат
- drawRequests.ts — Canvas-рендеринг полигонов заявок
- Tgu2DMapLayers.ts — buildTgu2DMapScene строит MapPolygon[] из RequestMapItem[]
- Tgu2DMapTab.tsx — состояние requestsState, кнопка «Загрузить», фильтры по дате
- Tgu2DMapSidebar.tsx — панель слоя заявок: счётчик, ошибки, truncated-предупреждение
- requestTypes.ts — RequestMapItem, RequestMapPage модели
- Поддержка выбора заявки на карте (mapSelectionTypes, mapTypes)
- nginx.conf, vite.config.ts — проксирование /v1 на pcp-request-service в dev

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Дмитрий Соловьев
2026-05-30 23:28:58 +03:00
parent bb84844674
commit 42708450bb
16 changed files with 647 additions and 22 deletions
@@ -978,3 +978,84 @@
grid-template-columns: 1fr 1fr;
}
}
/* ── Requests filter panel ─────────────────────────────── */
.tgu-button--sm {
min-height: 1.75rem;
padding: 0.28rem 0.55rem;
font-size: 0.78rem;
}
.tgu-alert--compact {
padding: 0.42rem 0.58rem;
font-size: 0.76rem;
}
.tgu-map-requests-filter {
display: grid;
gap: 0.55rem;
}
.tgu-map-requests-filter .tgu-field {
grid-template-columns: 2rem minmax(0, 1fr);
align-items: center;
}
.tgu-map-requests-filter .tgu-field input {
width: 100%;
}
.tgu-map-requests-filter__actions {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.tgu-map-requests-filter__status {
color: var(--text-dim);
font-size: 0.75rem;
line-height: 1.4;
}
.tgu-map-requests-filter__truncated {
color: #ffe0a3;
}
.tgu-map-requests-legend {
display: flex;
flex-wrap: wrap;
gap: 0.45rem 0.8rem;
padding-top: 0.2rem;
color: var(--text-dim);
font-size: 0.74rem;
}
.tgu-map-requests-legend span {
display: inline-flex;
align-items: center;
gap: 0.38rem;
}
.tgu-map-requests-legend i {
display: inline-block;
width: 1.1rem;
height: 0.42rem;
border-radius: 3px;
border: 1.5px dashed;
}
.req-optics {
background: rgba(255, 160, 64, 0.25);
border-color: rgba(255, 160, 64, 0.85);
}
.req-rsa {
background: rgba(64, 175, 255, 0.25);
border-color: rgba(64, 175, 255, 0.85);
}
.req-combined {
background: rgba(192, 128, 255, 0.25);
border-color: rgba(192, 128, 255, 0.85);
}