From ac2220d0634079abfeb6939d6efbfda80016f747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=A1=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D1=8C=D0=B5=D0=B2?= Date: Tue, 2 Jun 2026 16:54:01 +0300 Subject: [PATCH] =?UTF-8?q?pcp-tgu-ops-ui:=20=D0=B2=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B0=20=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=20=E2=80=94=20=D0=BF=D0=BB=D0=B0=D0=BD,=20=D0=B2=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=BD=D0=B8?= =?UTF-8?q?=D0=B6=D0=BD=D1=8F=D1=8F=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Слева выводим даты начала/конца плана и корректные счётчики съёмки/сброса (из plan modes, а не из заглушки-черновика). - На таймлайне показываем реальные включения плана (read-only): убран фейковый «сброс на весь интервал»; вместо линии «сейчас» — маркеры начала и конца плана; клик по включению открывает его инфо справа. - Включения съёмки и сброса разнесены на два ряда (верх/низ) и различаются цветом, слева — подписи рядов. - Нижняя панель: активная дорожка резиновая — примыкает к низу и не пустует, при подъёме панели ряды расширяются; высота бара ограничена потолком и центрируется в ряду, чтобы узкие включения не вытягивались. - Время в редакторе парсится/форматируется через utils/utcTime. --- .../src/features/tgu-editor/EditorPanels.tsx | 89 +++++++----- .../src/features/tgu-editor/EditorRail.tsx | 27 ++-- .../features/tgu-editor/EditorTimeline.tsx | 128 +++++++----------- .../src/features/tgu-editor/TguEditorTab.tsx | 37 +++-- .../features/tgu-editor/editorDraft.test.ts | 97 ++++++++++--- .../src/features/tgu-editor/editorDraft.ts | 59 ++++++-- .../pcp-tgu-ops-ui/src/styles/tgu-editor.css | 84 ++++++++++-- 7 files changed, 340 insertions(+), 181 deletions(-) diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-editor/EditorPanels.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-editor/EditorPanels.tsx index 016ff09..6219284 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-editor/EditorPanels.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-editor/EditorPanels.tsx @@ -1,5 +1,6 @@ import { formatDate, formatDateTime, formatDuration, formatTime, kindColor, kindLabel } from "./editorPresentation"; import { statusStyle } from "../tgu-planning/tguStatus"; +import { formatUtcDateTime, parseUtc } from "../../utils/utcTime"; import type { RvaZone } from "../../api/ballisticsApi"; import type { SurveyRoute, SurveyRouteAnchor } from "../../api/missionPlanningApi"; import type { Tgu2DMapSelection } from "../tgu-map-2d/model/mapSelectionTypes"; @@ -28,6 +29,8 @@ type WorkInspectorProps = { modes: EditorMode[]; stations: EditorGroundStation[]; conflicts: string[]; + /** Включение существующего плана — показываем только информацию, без правок. */ + readOnly?: boolean; onUpdate: (workId: string, patch: EditorWorkPatch) => void; onDelete: (workId: string) => void; onDuplicate: (workId: string) => void; @@ -96,6 +99,7 @@ export function WorkInspector({ modes, stations, conflicts, + readOnly, onUpdate, onDelete, onDuplicate, @@ -118,26 +122,43 @@ export function WorkInspector({
Время
- onUpdate(work.id, { startMs: value })} /> - onUpdate(work.id, { endMs: value })} /> -
длительность: {formatDuration(work.endMs - work.startMs)}
+ {readOnly ? ( +
+
Начало
+
{formatDateTime(work.startMs)}
+
Конец
+
{formatDateTime(work.endMs)}
+
Длительность
+
{formatDuration(work.endMs - work.startMs)}
+
+ ) : ( + <> + onUpdate(work.id, { startMs: value })} /> + onUpdate(work.id, { endMs: value })} /> +
длительность: {formatDuration(work.endMs - work.startMs)}
+ + )}
{work.kind === "shoot" && (
Режим аппаратуры
-
- {modes.map((mode) => ( - - ))} -
+ {readOnly ? ( +
{modes.find((mode) => mode.id === work.modeId)?.label ?? "—"}
+ ) : ( +
+ {modes.map((mode) => ( + + ))} +
+ )} {work.targetName &&
цель: {work.targetName}
}
)} @@ -145,24 +166,30 @@ export function WorkInspector({ {work.kind === "downlink" && (
Станция приёма
- + {readOnly ? ( +
{stations.find((station) => station.id === work.stationId)?.name ?? work.stationId ?? "—"}
+ ) : ( + + )}
)} -
- - -
+ {!readOnly && ( +
+ + +
+ )}