diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapLayers.ts b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapLayers.ts index 2dfd7d4..c58f5de 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapLayers.ts +++ b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapLayers.ts @@ -7,8 +7,8 @@ export type Tgu2DMapLayerAvailability = Partial; }; const UNAVAILABLE = "Данные слоя недоступны в текущем API."; diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapSidebar.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapSidebar.tsx index 7390cd2..cbe28de 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapSidebar.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapSidebar.tsx @@ -5,36 +5,41 @@ import type { Tgu2DMapLayerAvailability } from "./Tgu2DMapLayers"; type Tgu2DMapSidebarProps = { platforms: TguPlatformUi[]; - selectedSpacecraftId?: string; selectedPlanId?: string; + hiddenIds: ReadonlySet; layers: Tgu2DMapLayersState; search: string; layerAvailability: Tgu2DMapLayerAvailability; onSearchChange: (value: string) => void; - onSelectSpacecraft: (spacecraftId?: string) => void; + onToggleSpacecraft: (id: string) => void; + onShowAll: () => void; onToggleLayer: (key: Tgu2DMapLayerKey) => void; }; export function Tgu2DMapSidebar({ platforms, - selectedSpacecraftId, selectedPlanId, + hiddenIds, layers, search, layerAvailability, onSearchChange, - onSelectSpacecraft, + onToggleSpacecraft, + onShowAll, onToggleLayer }: Tgu2DMapSidebarProps) { const filteredPlatforms = filterPlatforms(platforms, search); + const hiddenCount = hiddenIds.size; return ( ); } - diff --git a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapTab.tsx b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapTab.tsx index 48f9e4a..6e0b97c 100644 --- a/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapTab.tsx +++ b/services/pcp-tgu-ops-ui/src/features/tgu-map-2d/Tgu2DMapTab.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from "react"; +import { useCallback, useMemo, useState } from "react"; import type { TguPlanUi, TguPlatformUi, TimelineRange } from "../../model/timelineTypes"; import { platformLabel } from "../tgu-planning/tguTimelineMapper"; import { DEFAULT_TGU_2D_MAP_LAYERS, type Tgu2DMapLayerKey, type Tgu2DMapLayersState } from "./model/mapLayerTypes"; @@ -13,45 +13,59 @@ import { getTgu2DMapIntervalState, TGU_2D_MAP_INTERVAL_WARNING } from "./tgu2DMa type Tgu2DMapTabProps = { range: TimelineRange; invalidRange: boolean; - selectedSpacecraftId?: string; selectedPlan?: TguPlanUi; platforms: TguPlatformUi[]; - onSelectSpacecraft: (spacecraftId?: string) => void; }; export function Tgu2DMapTab({ range, invalidRange, - selectedSpacecraftId, selectedPlan, - platforms, - onSelectSpacecraft + platforms }: Tgu2DMapTabProps) { const [layers, setLayers] = useState(DEFAULT_TGU_2D_MAP_LAYERS); const [search, setSearch] = useState(""); const [redrawToken, setRedrawToken] = useState(0); const [selectedObject, setSelectedObject] = useState(); - const satelliteId = selectedPlan?.spacecraftId ?? selectedSpacecraftId; + const [hiddenIds, setHiddenIds] = useState>(new Set()); + const mapInterval = getTgu2DMapIntervalState(range, selectedPlan); const mapInvalidRange = invalidRange || mapInterval.tooLarge; - const platform = useMemo( - () => platforms.find((item) => item.spacecraftId === satelliteId), - [platforms, satelliteId] + + const toggleSpacecraft = useCallback((id: string) => { + setHiddenIds((prev) => { + const next = new Set(prev); + if (next.has(id)) next.delete(id); + else next.add(id); + return next; + }); + }, []); + + const showAll = useCallback(() => setHiddenIds(new Set()), []); + + const planPlatform = useMemo( + () => selectedPlan ? platforms.find((p) => p.spacecraftId === selectedPlan.spacecraftId) : undefined, + [platforms, selectedPlan] ); - const satelliteLabel = satelliteId ? platformLabel(platform, satelliteId) : "КА не выбран"; + const satelliteLabel = selectedPlan + ? platformLabel(planPlatform, selectedPlan.spacecraftId) + : hiddenIds.size > 0 + ? `Скрыто: ${hiddenIds.size} КА` + : "Все КА"; + const intervalLabel = `${formatDate(mapInterval.range.fromMs)} - ${formatDate(mapInterval.range.toMs)}`; + const scene = useMemo( - () => buildTgu2DMapScene({ range: mapInterval.range, selectedPlan, selectedSpacecraftId: satelliteId, platforms }), - [mapInterval.range, platforms, satelliteId, selectedPlan] + () => buildTgu2DMapScene({ range: mapInterval.range, selectedPlan, platforms, hiddenSpacecraftIds: hiddenIds }), + [mapInterval.range, platforms, selectedPlan, hiddenIds] ); const layerAvailability = useMemo(() => getLayerAvailability(layers, scene), [layers, scene]); - const overlayMessage = !satelliteId - ? "Выберите КА в sidebar или план на timeline." - : invalidRange - ? "Некорректный интервал: from должен быть меньше to." - : mapInterval.tooLarge - ? TGU_2D_MAP_INTERVAL_WARNING - : undefined; + + const overlayMessage = invalidRange + ? "Некорректный интервал: from должен быть меньше to." + : mapInterval.tooLarge + ? TGU_2D_MAP_INTERVAL_WARNING + : undefined; const toggleLayer = (key: Tgu2DMapLayerKey) => { setLayers((current) => ({ ...current, [key]: !current[key] })); @@ -70,13 +84,14 @@ export function Tgu2DMapTab({
@@ -128,4 +143,3 @@ function layerLabel(layer: Tgu2DMapLayerKey): string { return "Маркеры КА"; } } - 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 fff4c19..4d0edf8 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 @@ -202,14 +202,8 @@ export function TguPlanningPage() { { - setSelectedSpacecraftId(spacecraftId); - setSelectedPlanId(undefined); - setDecisionNotice(undefined); - }} /> ) : ( onTabChange("timeline")} > - Timeline + Планы