pcp-tgu-ops-ui: «Создать план» берёт план в фокусе как базу-предысторию

Диалог получает initialBasePlanId — выбранный (в фокусе) план; селект
«Базовое состояние» предзаполняется им, если он годится в базу (тот же КА,
не PLANNED/DRAFT), иначе остаётся «без истории». Оператор может сменить
базу вручную.
This commit is contained in:
Дмитрий Соловьев
2026-06-04 16:32:49 +03:00
parent faadc63028
commit fae57e957e
3 changed files with 28 additions and 2 deletions
@@ -16,3 +16,6 @@ TODO:
- Деактивировать отмененный план, чтобы он не портил статистику - Деактивировать отмененный план, чтобы он не портил статистику
- Если план заложен, то все отмененные планы до него (время начала которых меньше времени начала этого) не должны влиять на цветовую индикацию плана на вкладке Планы - Если план заложен, то все отмененные планы до него (время начала которых меньше времени начала этого) не должны влиять на цветовую индикацию плана на вкладке Планы
@@ -13,6 +13,8 @@ type CreateChainPlanDialogProps = {
spacecraftId: string; spacecraftId: string;
/** Планы для выбора базы-предыстории (берём persisted этого КА, кроме черновиков/проекции). */ /** Планы для выбора базы-предыстории (берём persisted этого КА, кроме черновиков/проекции). */
plans: TguPlanUi[]; plans: TguPlanUi[];
/** Выбранный (в фокусе) план — предзаполняет базу-предысторию, если он годится в базу. */
initialBasePlanId?: string;
onClose: () => void; onClose: () => void;
/** Вызвать после создания черновика — чтобы он сразу появился на таймлайне (режим «Черновики»). */ /** Вызвать после создания черновика — чтобы он сразу появился на таймлайне (режим «Черновики»). */
onCreated?: () => void; onCreated?: () => void;
@@ -25,12 +27,32 @@ type CreateChainPlanDialogProps = {
* цепочку без истории), набирает окно из двух реальных ЗРВ и создаёт черновик плана. После * цепочку без истории), набирает окно из двух реальных ЗРВ и создаёт черновик плана. После
* создания сразу предлагается перейти к его редактированию. * создания сразу предлагается перейти к его редактированию.
*/ */
export function CreateChainPlanDialog({ spacecraftId, plans, onClose, onCreated, onEdit }: CreateChainPlanDialogProps) { export function CreateChainPlanDialog({
spacecraftId,
plans,
initialBasePlanId,
onClose,
onCreated,
onEdit
}: CreateChainPlanDialogProps) {
const [zrvOptions, setZrvOptions] = useState<ZrvOption[]>([]); const [zrvOptions, setZrvOptions] = useState<ZrvOption[]>([]);
const [zrvLoading, setZrvLoading] = useState(true); const [zrvLoading, setZrvLoading] = useState(true);
const [zrvError, setZrvError] = useState<string>(); const [zrvError, setZrvError] = useState<string>();
const [basePlanId, setBasePlanId] = useState<string>(""); // "" — без истории // "" — без истории; при открытии берём план в фокусе, если он годится в базу (этот КА, не
// проекция/черновик), иначе остаёмся без истории.
const [basePlanId, setBasePlanId] = useState<string>(() =>
initialBasePlanId &&
plans.some(
(plan) =>
plan.planId === initialBasePlanId &&
plan.spacecraftId === spacecraftId &&
plan.status !== "PLANNED" &&
plan.status !== "DRAFT"
)
? initialBasePlanId
: ""
);
const [startId, setStartId] = useState<string>(""); const [startId, setStartId] = useState<string>("");
const [endId, setEndId] = useState<string>(""); const [endId, setEndId] = useState<string>("");
@@ -497,6 +497,7 @@ export function TguPlanningPage() {
<CreateChainPlanDialog <CreateChainPlanDialog
spacecraftId={selectedSpacecraftId} spacecraftId={selectedSpacecraftId}
plans={plans} plans={plans}
initialBasePlanId={selectedPlanId}
onClose={() => setCreateChainOpen(false)} onClose={() => setCreateChainOpen(false)}
onCreated={() => { onCreated={() => {
setShowDrafts(true); setShowDrafts(true);