Update TGU 2D map spacecraft visibility controls

Switch the 2D map sidebar from single-spacecraft selection to per-spacecraft visibility toggles, add a show-all action, and update map tab labels and styles for the all-spacecraft view.
This commit is contained in:
Дмитрий Соловьев
2026-05-30 21:13:50 +03:00
parent 39f108e496
commit 3d508b6be9
6 changed files with 72 additions and 54 deletions
@@ -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<Tgu2DMapLayersState>(DEFAULT_TGU_2D_MAP_LAYERS);
const [search, setSearch] = useState("");
const [redrawToken, setRedrawToken] = useState(0);
const [selectedObject, setSelectedObject] = useState<Tgu2DMapSelection>();
const satelliteId = selectedPlan?.spacecraftId ?? selectedSpacecraftId;
const [hiddenIds, setHiddenIds] = useState<ReadonlySet<string>>(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({
<div className="tgu-map-content">
<Tgu2DMapSidebar
platforms={platforms}
selectedSpacecraftId={satelliteId}
selectedPlanId={selectedPlan?.planId}
hiddenIds={hiddenIds}
layers={layers}
search={search}
layerAvailability={layerAvailability}
onSearchChange={setSearch}
onSelectSpacecraft={onSelectSpacecraft}
onToggleSpacecraft={toggleSpacecraft}
onShowAll={showAll}
onToggleLayer={toggleLayer}
/>
<section className="tgu-map-stage">
@@ -128,4 +143,3 @@ function layerLabel(layer: Tgu2DMapLayerKey): string {
return "Маркеры КА";
}
}