pcp-tgu: слоты по факту закладки, запрет ранней закладки, шире рейл редактора

- слоты (acceptedPlanSlotsUpdate) занимаются на LAID_IN, а не на ACCEPT —
  до закладки план ещё может быть вытеснен коррекцией
- «Подтвердить закладку» недоступно, пока начало плана в будущем
- левая панель редактора 15.5rem → 17rem (цифры статистики у границы)
This commit is contained in:
Дмитрий Соловьев
2026-06-04 21:15:13 +03:00
parent bd2bc9d583
commit 69dfd8025d
4 changed files with 28 additions and 10 deletions
@@ -1032,7 +1032,7 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
{applyError && <div className="tgu-alert tgu-alert--danger tgu-editor-notice">{applyError}</div>}
</div>
<div className="tgu-editor-layout" style={{ gridTemplateColumns: rightMode === "none" ? "15.5rem minmax(0, 1fr) 0" : "15.5rem minmax(0, 1fr) 21rem" }}>
<div className="tgu-editor-layout" style={{ gridTemplateColumns: rightMode === "none" ? "17rem minmax(0, 1fr) 0" : "17rem minmax(0, 1fr) 21rem" }}>
<EditorRail
selectedSpacecraftId={selectedSpacecraftId}
selectedPlan={selectedPlan}
@@ -82,6 +82,9 @@ export function TguPlanDetails({
const duration = formatDuration(plan.endMs - plan.startMs);
// Окно решения закрылось, если с момента старта плана прошло больше grace-периода.
const decisionWindowClosed = Date.now() > plan.startMs + DECISION_GRACE_MINUTES * 60_000;
// Закладку нельзя подтверждать, пока начало плана ещё в будущем: план закладывается на КА
// по факту наступления своего старта, а не заранее.
const layinStartInFuture = plan.startMs > Date.now();
// «Создать черновик на основе плана» (replace, окно 1:1, все включения) доступно для
// персистентных правимых баз. DRAFT уже имеет свои действия; PLANNED — виртуальная проекция,
// не база; LAID_IN — replace 1:1 запрещён (слот зафиксирован, только fork-forward).
@@ -232,17 +235,24 @@ export function TguPlanDetails({
<button
className="tgu-button tgu-button--accept"
type="button"
disabled={decisionInFlight || layinConflict}
disabled={decisionInFlight || layinConflict || layinStartInFuture}
title={
layinConflict
? "По КА уже заложен план со стартом в пределах ±10 минут — закладка недоступна"
: "Сымитировать событие «план заложен» (AWAITING_LAYIN → LAID_IN)"
layinStartInFuture
? "Начало плана ещё не наступило — подтвердить закладку можно только после его старта"
: layinConflict
? "По КА уже заложен план со стартом в пределах ±10 минут — закладка недоступна"
: "Сымитировать событие «план заложен» (AWAITING_LAYIN → LAID_IN)"
}
onClick={confirmLayin}
>
Подтвердить закладку
</button>
{layinConflict && (
{layinStartInFuture && (
<div className="tgu-details__test-hint">
Начало плана ещё в будущем подтвердить закладку можно только после наступления его старта.
</div>
)}
{!layinStartInFuture && layinConflict && (
<div className="tgu-details__test-hint">
По КА уже есть заложенный план со стартом в пределах ±10 минут подтвердить нельзя.
</div>