From fae57e957eb2c05b81f638644157fb82b9fee5f3 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: Thu, 4 Jun 2026 16:32:49 +0300 Subject: [PATCH] =?UTF-8?q?pcp-tgu-ops-ui:=20=C2=AB=D0=A1=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BB=D0=B0=D0=BD=C2=BB=20?= =?UTF-8?q?=D0=B1=D0=B5=D1=80=D1=91=D1=82=20=D0=BF=D0=BB=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=B2=20=D1=84=D0=BE=D0=BA=D1=83=D1=81=D0=B5=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BA=20=D0=B1=D0=B0=D0=B7=D1=83-=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D1=8B=D1=81=D1=82=D0=BE=D1=80=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Диалог получает initialBasePlanId — выбранный (в фокусе) план; селект «Базовое состояние» предзаполняется им, если он годится в базу (тот же КА, не PLANNED/DRAFT), иначе остаётся «без истории». Оператор может сменить базу вручную. --- docs/задачи для pcp-tgu-ops-ui.txt | 3 +++ .../tgu-planning/CreateChainPlanDialog.tsx | 26 +++++++++++++++++-- .../features/tgu-planning/TguPlanningPage.tsx | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/docs/задачи для pcp-tgu-ops-ui.txt b/docs/задачи для pcp-tgu-ops-ui.txt index a87be64..f26a955 100644 --- a/docs/задачи для pcp-tgu-ops-ui.txt +++ b/docs/задачи для pcp-tgu-ops-ui.txt @@ -16,3 +16,6 @@ TODO: - Деактивировать отмененный план, чтобы он не портил статистику - Если план заложен, то все отмененные планы до него (время начала которых меньше времени начала этого) не должны влиять на цветовую индикацию плана на вкладке Планы + + + diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-planning/CreateChainPlanDialog.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-planning/CreateChainPlanDialog.tsx index 8a1e17e..19f88fc 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-planning/CreateChainPlanDialog.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-planning/CreateChainPlanDialog.tsx @@ -13,6 +13,8 @@ type CreateChainPlanDialogProps = { spacecraftId: string; /** Планы для выбора базы-предыстории (берём persisted этого КА, кроме черновиков/проекции). */ plans: TguPlanUi[]; + /** Выбранный (в фокусе) план — предзаполняет базу-предысторию, если он годится в базу. */ + initialBasePlanId?: string; onClose: () => void; /** Вызвать после создания черновика — чтобы он сразу появился на таймлайне (режим «Черновики»). */ onCreated?: () => void; @@ -25,12 +27,32 @@ type CreateChainPlanDialogProps = { * цепочку без истории), набирает окно из двух реальных ЗРВ и создаёт черновик плана. После * создания сразу предлагается перейти к его редактированию. */ -export function CreateChainPlanDialog({ spacecraftId, plans, onClose, onCreated, onEdit }: CreateChainPlanDialogProps) { +export function CreateChainPlanDialog({ + spacecraftId, + plans, + initialBasePlanId, + onClose, + onCreated, + onEdit +}: CreateChainPlanDialogProps) { const [zrvOptions, setZrvOptions] = useState([]); const [zrvLoading, setZrvLoading] = useState(true); const [zrvError, setZrvError] = useState(); - const [basePlanId, setBasePlanId] = useState(""); // "" — без истории + // "" — без истории; при открытии берём план в фокусе, если он годится в базу (этот КА, не + // проекция/черновик), иначе остаёмся без истории. + const [basePlanId, setBasePlanId] = useState(() => + initialBasePlanId && + plans.some( + (plan) => + plan.planId === initialBasePlanId && + plan.spacecraftId === spacecraftId && + plan.status !== "PLANNED" && + plan.status !== "DRAFT" + ) + ? initialBasePlanId + : "" + ); const [startId, setStartId] = useState(""); const [endId, setEndId] = useState(""); diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanningPage.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanningPage.tsx index 915a622..aa69261 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanningPage.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-planning/TguPlanningPage.tsx @@ -497,6 +497,7 @@ export function TguPlanningPage() { setCreateChainOpen(false)} onCreated={() => { setShowDrafts(true);