feat(tgu-ops-ui): display plan works and new shoots on editor map

На вкладке Редактор 2D-карта теперь показывает включения выбранного плана
и новые съёмки, добавленные в текущей сессии.

- editorApi: типы PlanSurveyMode/PlanDropMode/PlanMode и fetchPlanModes —
  вызывает GET /api/current-plans/missions/{planId}/modes на pcp-mission-planing-service,
  где planId TGU совпадает с missionId (выяснено по Camunda-процессу)
- TguEditorTab: загружает включения при выборе плана, строит MapPolygon[]
  из SURVEY-режимов через parseWktPolygon(contourWkt), включён слой planWorks
- Tgu2DMapView: разделены pending-маркер (оранжевый, выбор точки)
  и confirmed-маркеры (бирюзовые, подтверждённые съёмки из драфта);
  клик на маркер съёмки открывает WorkInspector

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Дмитрий Соловьев
2026-05-31 09:18:53 +03:00
parent 42708450bb
commit 637a5e8848
4 changed files with 140 additions and 11 deletions
@@ -20,6 +20,9 @@ type Tgu2DMapViewProps = {
pickMode?: boolean;
onPickPoint?: (point: { lat: number; lon: number }) => void;
targets?: Tgu2DMapTarget[];
pickTarget?: Tgu2DMapTarget;
selectedTargetId?: string;
onTargetSelect?: (id: string) => void;
};
export type Tgu2DMapTarget = {
@@ -58,7 +61,10 @@ export function Tgu2DMapView({
onObjectSelect,
pickMode = false,
onPickPoint,
targets = []
targets = [],
pickTarget,
selectedTargetId,
onTargetSelect
}: Tgu2DMapViewProps) {
const wrapperRef = useRef<HTMLDivElement | null>(null);
const canvasRef = useRef<HTMLCanvasElement | null>(null);
@@ -299,17 +305,35 @@ export function Tgu2DMapView({
className={polygon.id === selectedPolygon?.id ? "is-selected" : "is-hovered"}
/>
))}
{targets.map((target) => {
const screen = projection.project(target);
{targets.map((t) => {
const screen = projection.project(t);
const isSelected = t.id === selectedTargetId;
return (
<g className="tgu-2d-map__target" key={target.id} transform={`translate(${screen.x} ${screen.y})`}>
<g
className={`tgu-2d-map__target tgu-2d-map__target--confirmed${isSelected ? " is-selected" : ""}`}
key={t.id}
transform={`translate(${screen.x} ${screen.y})`}
onClick={(e) => { e.stopPropagation(); onTargetSelect?.(t.id); }}
style={{ cursor: "pointer" }}
>
<circle r="6" />
<line x1="-10" x2="10" y1="0" y2="0" />
<line x1="0" x2="0" y1="-10" y2="10" />
<text x="10" y="-8">{target.name}</text>
<text x="10" y="-8">{t.name}</text>
</g>
);
})}
{pickTarget && (() => {
const screen = projection.project(pickTarget);
return (
<g className="tgu-2d-map__target tgu-2d-map__target--pending" key="pick" transform={`translate(${screen.x} ${screen.y})`}>
<circle r="6" />
<line x1="-10" x2="10" y1="0" y2="0" />
<line x1="0" x2="0" y1="-10" y2="10" />
<text x="10" y="-8">{pickTarget.name}</text>
</g>
);
})()}
</svg>
{tooltip && (
<div className="tgu-2d-map__tooltip" style={{ left: tooltip.x, top: tooltip.y }}>