Files
dc-observatio/services/pcp-tgu-ui-service
Дмитрий Соловьев 6689351ef0 feat(tgu-ui): вкладка «Слоты» — расчёт покрытия и бронирование слотов заявки
- новая вкладка: заявки интервала на карте, выбор заявки кликом/инспектором,
  расчёт слотов покрытия, бронирование и снятие брони
- выбор заявки без выпадающего списка (не масштабируется на ~10к): все заявки
  на карте, панель справа с кнопкой «Выбрать», имя выбранной заявки в тулбаре,
  кнопка «Сброс», фильтр заявок по интервалу
- бронь отмечаем по ответу POST booking/request (by-request отдаёт слот в чужом
  cycle-фрейме — ключ не совпадал, бейдж «бронь» не появлялся)
- подсветка и автоскролл активной строки по клику на слот (ручной scrollBy)
- меню выбора при плотном наложении слотов (SlotPickMenu); контур заявки
  pickable:false, чтобы не «съедать» меню; панель не закрывается при выборе
- фильтр отображения по суткам (SlotDaySelector)
- gateway: маршрут slots (/api/pcp-slots/**)
- карточка полосы обзора (swath): КА и виток в инспекторе
2026-06-11 12:20:28 +03:00
..

pcp-tgu-ui-service

Фронтенд «ТГУ — Операции». Сервис собран с нуля на чистой базе исходного pcp-tgu-ops-ui (React + Vite, своя тёмная тема), в которую добавлены только две вещи с платформы NStart:

  1. Авторизация — headless-ядро @nstart/auth (New Start ID / Keycloak): токен, login, logout, refresh. Без @nstart/ui — UI-компоненты библиотеки (ProfilePage/UserPanel) намеренно не подключены, экраны ТГУ остаются на своём UI.
  2. Сборка и деплой — платформенный контракт: hardened Dockerfile (non-root, healthcheck), runtime-config (config.js из APP_*), docker-bake.hcl, .gitlab-ci.yml (build → trivy/semgrep → push в registry), nginx.conf.

В отличие от pcp-tgu-ops-ui-template, здесь нет демо-страниц шаблона, @nstart/ui, Tailwind, i18n и борьбы тем — только рабочий ТГУ + auth + контур сборки/деплоя.

Авторизация (headless)

  • Режим выбирается переменной authMode (anonymous | new-start-id).
  • anonymous (дефолт): приложение открывается сразу, токена нет, заголовок Authorization не добавляется — поведение как у исходного сервиса.
  • new-start-id: вход редиректом на New Start ID; токен подставляется в каждый запрос src/api/* через мост apiFetch + AuthTokenBridge. В шапке появляется кнопка «Выйти».
  • Конфиг входа берётся из src/config/env.ts (runtime APP_* имеют приоритет над build VITE_*).

Конфигурация окружения

Назначение DEV (npm run dev) PROD (Docker)
источник .env (VITE_*) APP_* контейнера → config.js
api VITE_API_URL APP_API_URL
режим auth VITE_AUTH_MODE APP_AUTH_MODE
New Start ID VITE_NEW_START_ID_* APP_NEW_START_ID_*

Доступ к приватному реестру @nstart/*: scope @nstart:registry=... должен быть в ~/.npmrc (или в конфиге CI-раннера). Проектный .npmrc задаёт только min-release-age=7.

Запуск

cp .env.example .env     # режим anonymous, открывается сразу
npm install              # нужен доступ к repo.nstart.cloud (scope @nstart)
npm run dev              # http://localhost:5174
npm run build            # tsc -b + vite build
npm run test             # vitest

Прод-прокси (осталось настроить)

В nginx.conf активный /api/ — заглушка (127.0.0.1:8000), а блоки pcp-* закомментированы (зеркало server.proxy из vite.config.ts). Подставьте реальные UPSTREAM_* кластера и раскомментируйте, либо вынесите маршрутизацию на gateway/ingress.