Files
dc-observatio/services/pcp-tgu-ops-ui/src/features/tgu-editor/EditorRail.tsx
T
Дмитрий Соловьев ac2220d063 pcp-tgu-ops-ui: вкладка Редактор — план, включения, нижняя панель
- Слева выводим даты начала/конца плана и корректные счётчики
  съёмки/сброса (из plan modes, а не из заглушки-черновика).
- На таймлайне показываем реальные включения плана (read-only): убран
  фейковый «сброс на весь интервал»; вместо линии «сейчас» — маркеры
  начала и конца плана; клик по включению открывает его инфо справа.
- Включения съёмки и сброса разнесены на два ряда (верх/низ) и различаются
  цветом, слева — подписи рядов.
- Нижняя панель: активная дорожка резиновая — примыкает к низу и не
  пустует, при подъёме панели ряды расширяются; высота бара ограничена
  потолком и центрируется в ряду, чтобы узкие включения не вытягивались.
- Время в редакторе парсится/форматируется через utils/utcTime.
2026-06-02 16:54:01 +03:00

90 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TguPlanUi, TguPlatformUi } from "../../model/timelineTypes";
import { formatDateTime } from "./editorPresentation";
type EditorRailProps = {
selectedSpacecraftId?: string;
selectedPlan?: TguPlanUi;
platforms: TguPlatformUi[];
surveyCount: number;
downlinkCount: number;
conflictCount: number;
contextSpacecraftIds: Set<string>;
onToggleContext: (spacecraftId: string) => void;
};
export function EditorRail({
selectedSpacecraftId,
selectedPlan,
platforms,
surveyCount,
downlinkCount,
conflictCount,
contextSpacecraftIds,
onToggleContext
}: EditorRailProps) {
const currentPlatform = platforms.find((platform) => platform.spacecraftId === selectedSpacecraftId);
const contextPlatforms = platforms.filter((platform) => platform.spacecraftId !== selectedSpacecraftId).slice(0, 40);
return (
<aside className="tgu-editor-rail">
<section className="tgu-editor-rail__section">
<div className="tgu-editor-eyebrow">Редактируется</div>
<div className="tgu-editor-rail__title">{currentPlatform?.name ?? selectedSpacecraftId ?? "КА не выбран"}</div>
<div className="tgu-editor-rail__meta">
{selectedPlan ? `${selectedPlan.planId} · КПП ${selectedPlan.kppId}` : "План не выбран"}
</div>
{selectedPlan && (
<dl className="tgu-editor-rail__plan-dates">
<dt>Начало</dt>
<dd className="mono">{formatDateTime(selectedPlan.startMs)}</dd>
<dt>Окончание</dt>
<dd className="mono">{formatDateTime(selectedPlan.endMs)}</dd>
</dl>
)}
<div className="tgu-editor-stats">
<RailStat label="Включений" value={surveyCount + downlinkCount} />
<RailStat label="Съёмка" value={surveyCount} color="var(--t-optical)" />
<RailStat label="Сброс" value={downlinkCount} color="var(--accent)" />
<RailStat label="Конфл." value={conflictCount} color={conflictCount > 0 ? "var(--now)" : undefined} />
</div>
</section>
<section className="tgu-editor-rail__section">
<div className="tgu-editor-eyebrow">Контекст других КА</div>
<div className="tgu-editor-context-list">
{contextPlatforms.length === 0 ? (
<div className="tgu-empty tgu-empty--compact">Нет других КА в выбранном интервале.</div>
) : (
contextPlatforms.map((platform) => {
const enabled = contextSpacecraftIds.has(platform.spacecraftId);
return (
<button
className={`tgu-editor-context-item ${enabled ? "is-enabled" : ""}`}
key={platform.spacecraftId}
type="button"
onClick={() => onToggleContext(platform.spacecraftId)}
>
<span className="tgu-editor-context-item__check">{enabled ? "✓" : ""}</span>
<span>{platform.name ?? platform.noradId ?? platform.spacecraftId}</span>
<small>{platform.planCount}</small>
</button>
);
})
)}
</div>
</section>
</aside>
);
}
function RailStat({ label, value, color }: { label: string; value: number; color?: string }) {
return (
<div className="tgu-editor-stat">
<span style={{ color }}>{value}</span>
<small>{label}</small>
</div>
);
}