From 86215b300a469276e4398fd1ade233632ef93c86 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 14:33:04 +0300 Subject: [PATCH] =?UTF-8?q?pcp-tgu-ops-ui:=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20SUPERSEDED/EXPIRED=20=D0=B8=20=D1=87=D0=B5=D0=BA?= =?UTF-8?q?=D0=B1=D0=BE=D0=BA=D1=81=20=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA?= =?UTF-8?q?=D0=B5=20=C2=AB=D0=9F=D0=BB=D0=B0=D0=BD=D1=8B=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Статусы SUPERSEDED/EXPIRED удалены из модели tgu-service, поэтому чистим их и во фронте, чтобы не описывать несуществующие состояния. - tguTypes: убраны EXPIRED/SUPERSEDED из union TguPlanStatus. - tguStatus: удалены их стили; заодно снят осиротевший фильтр isActivePlanStatus/ACTIVE_PLAN_STATUSES (после удаления чекбокса не нужен). - tguTimelineMapper: EXPIRED убран из PROBLEM_STATUSES. - tgu-planning.css: удалены классы .status-superseded/.status-expired и осиротевший блок .tgu-timeline-controls. - TguPlanningPage: убран тумблер «Показать историю версий» вместе со стейтом showHistory и фильтром timelinePlans — таймлайн рендерит все планы из API напрямую (перестали скрываться AWAITING_LAYIN/REJECTED/LAYIN_FAILED/NOT_ACCEPTED). EXPIRED в requestTypes (статус заявок) — отдельный домен, не тронут. --- .../features/tgu-planning/TguPlanningPage.tsx | 23 ++------------- .../src/features/tgu-planning/tguStatus.ts | 15 ---------- .../tgu-planning/tguTimelineMapper.ts | 2 +- services/pcp-tgu-ops-ui/src/model/tguTypes.ts | 2 -- .../src/styles/tgu-planning.css | 29 ------------------- 5 files changed, 3 insertions(+), 68 deletions(-) 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 6712f23..cd446e0 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 @@ -10,7 +10,6 @@ import { TguPlanningLayout } from "./TguPlanningLayout"; import { TguSidebar } from "./TguSidebar"; import { TguTimeline } from "./TguTimeline"; import { TguToolbar } from "./TguToolbar"; -import { isActivePlanStatus } from "./tguStatus"; import { buildPlatformsForInterval, buildTimelineRows, mapPlans } from "./tguTimelineMapper"; const DAY_MS = 24 * 60 * 60 * 1000; @@ -29,9 +28,6 @@ export function TguPlanningPage() { const [selectedSpacecraftId, setSelectedSpacecraftId] = useState(); const [selectedPlanId, setSelectedPlanId] = useState(); const [activeTab, setActiveTab] = useState("timeline"); - // По умолчанию на таймлайне видна только актуальная цепочка; история версий - // (SUPERSEDED/EXPIRED/REJECTED и т.п.) скрыта, чтобы не было визуальной каши. - const [showHistory, setShowHistory] = useState(false); // Вкладки рендерятся в режиме keep-alive: каждую монтируем при первом открытии // и дальше держим смонтированной (скрытой через display:none), чтобы её // внутреннее состояние — загруженные заявки, выбор, слои, скролл — не сбрасывалось @@ -102,14 +98,9 @@ export function TguPlanningPage() { () => buildPlatformsForInterval(rawPlatforms, plans, appliedRange), [rawPlatforms, plans, appliedRange] ); - // Планы, показываемые на таймлайне: по умолчанию только актуальная цепочка. - const timelinePlans = useMemo( - () => (showHistory ? plans : plans.filter((plan) => isActivePlanStatus(plan.status))), - [plans, showHistory] - ); const rows = useMemo( - () => buildTimelineRows(timelinePlans, platforms, appliedRange, selectedSpacecraftId), - [timelinePlans, platforms, appliedRange, selectedSpacecraftId] + () => buildTimelineRows(plans, platforms, appliedRange, selectedSpacecraftId), + [plans, platforms, appliedRange, selectedSpacecraftId] ); const selectedPlan = useMemo(() => { const plan = plans.find((item) => item.planId === selectedPlanId); @@ -190,16 +181,6 @@ export function TguPlanningPage() { }} />
-
- -
[style.status, style])); -/** Статусы актуальной цепочки: их показываем на таймлайне по умолчанию. */ -const ACTIVE_PLAN_STATUSES = new Set([ - "PLANNED", - "ISSUING", - "WAITING_DECISION", - "ACCEPTED" -]); - -/** Проверяет, относится ли план к актуальной цепочке (а не к истории версий). */ -export function isActivePlanStatus(status: TguPlanStatus): boolean { - return ACTIVE_PLAN_STATUSES.has(status); -} - export function statusStyle(status: TguPlanStatus): TimelineStatusStyle { return ( STATUS_BY_NAME.get(status) ?? { diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-planning/tguTimelineMapper.ts b/services/pcp-tgu-ops-ui/src/features/tgu-planning/tguTimelineMapper.ts index f5d5b1c..180b613 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-planning/tguTimelineMapper.ts +++ b/services/pcp-tgu-ops-ui/src/features/tgu-planning/tguTimelineMapper.ts @@ -1,7 +1,7 @@ import type { TguPlan, TguPlatform } from "../../model/tguTypes"; import type { TguPlanUi, TguPlatformUi, TimelineRange, TimelineRow } from "../../model/timelineTypes"; -const PROBLEM_STATUSES = new Set(["REJECTED", "EXPIRED", "START_AMBIGUOUS"]); +const PROBLEM_STATUSES = new Set(["REJECTED", "START_AMBIGUOUS"]); export function mapPlans(plans: TguPlan[], platforms: TguPlatform[]): TguPlanUi[] { const platformByNorad = buildPlatformByNorad(platforms); diff --git a/services/pcp-tgu-ops-ui/src/model/tguTypes.ts b/services/pcp-tgu-ops-ui/src/model/tguTypes.ts index e62484d..bea1f4f 100644 --- a/services/pcp-tgu-ops-ui/src/model/tguTypes.ts +++ b/services/pcp-tgu-ops-ui/src/model/tguTypes.ts @@ -4,8 +4,6 @@ export type TguPlanStatus = | "WAITING_DECISION" | "PLANNED" | "ISSUING" - | "EXPIRED" - | "SUPERSEDED" | "START_AMBIGUOUS" | string; diff --git a/services/pcp-tgu-ops-ui/src/styles/tgu-planning.css b/services/pcp-tgu-ops-ui/src/styles/tgu-planning.css index 37e6639..6cb5cd7 100644 --- a/services/pcp-tgu-ops-ui/src/styles/tgu-planning.css +++ b/services/pcp-tgu-ops-ui/src/styles/tgu-planning.css @@ -183,14 +183,6 @@ background-color: #2f80ed; } -.status-expired { - background-color: #495057; -} - -.status-superseded { - background-color: #c7ced6; -} - .status-ambiguous { background-color: #b42318; outline: 1px dashed #ffd1d1; @@ -346,27 +338,6 @@ background: #121516; } -.tgu-timeline-controls { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.6rem 0.85rem 0; -} - -.tgu-timeline-controls__toggle { - display: inline-flex; - align-items: center; - gap: 0.4rem; - font-size: 0.8rem; - color: var(--muted, #9aa4ad); - cursor: pointer; - user-select: none; -} - -.tgu-timeline-controls__toggle input { - cursor: pointer; -} - .tgu-timeline { min-width: 48rem; min-height: 100%;