tgu: DELETE /plans/{draftPlanId} — отказ от черновика (бэкенд + кнопка «Отмена» и авто-отмена в редакторе)
This commit is contained in:
@@ -13,7 +13,7 @@ import {
|
||||
validateMission,
|
||||
type SurveyRoute
|
||||
} from "../../api/missionPlanningApi";
|
||||
import { createDraft, promoteDraft } from "../../api/tguPlanApi";
|
||||
import { abandonDraft, createDraft, promoteDraft } from "../../api/tguPlanApi";
|
||||
import { parseUtc } from "../../utils/utcTime";
|
||||
import { Tgu2DMapView } from "../tgu-map-2d/Tgu2DMapView";
|
||||
import { parseWktPolygon } from "../tgu-map-2d/geometry/wktParser";
|
||||
@@ -111,6 +111,7 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
|
||||
const [serviceConflicts, setServiceConflicts] = useState<EditorConflictMap>({});
|
||||
const [checking, setChecking] = useState(false);
|
||||
const [applying, setApplying] = useState(false);
|
||||
const [canceling, setCanceling] = useState(false);
|
||||
const [notice, setNotice] = useState<string>();
|
||||
const [applyError, setApplyError] = useState<string>();
|
||||
const [contextSpacecraftIds, setContextSpacecraftIds] = useState<Set<string>>(new Set());
|
||||
@@ -416,6 +417,18 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
|
||||
setServiceConflicts({});
|
||||
}, [selectedPlan]);
|
||||
|
||||
// Зеркало draftPlanId в ref — чтобы при уходе/смене плана отменить незавершённый черновик,
|
||||
// не оставляя осиротевший DRAFT (он бы заблокировал createDraft по той же базе на 409).
|
||||
const draftPlanIdRef = useRef<string | undefined>(undefined);
|
||||
useEffect(() => { draftPlanIdRef.current = draftPlanId; }, [draftPlanId]);
|
||||
useEffect(() => () => {
|
||||
const stale = draftPlanIdRef.current;
|
||||
if (stale) {
|
||||
// best-effort: применённый/уже отменённый черновик сюда не попадёт (ref обнулён).
|
||||
void abandonDraft(stale).catch(() => {});
|
||||
}
|
||||
}, [selectedPlan]);
|
||||
|
||||
// Источник истины для включений — DRAFT, если он уже создан, иначе живой план (read-only превью).
|
||||
useEffect(() => {
|
||||
const missionId = draftPlanId ?? selectedPlan?.planId;
|
||||
@@ -655,6 +668,28 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
|
||||
}
|
||||
};
|
||||
|
||||
// «Отмена» = отказ от черновика (Ф6): удаляет DRAFT и клон-миссию на сервере, возвращает
|
||||
// редактор к живому плану (read-only) и сбрасывает локальные правки.
|
||||
const cancelDraft = async () => {
|
||||
if (!draftPlanId) return;
|
||||
setCanceling(true);
|
||||
setApplyError(undefined);
|
||||
setNotice(undefined);
|
||||
try {
|
||||
await abandonDraft(draftPlanId);
|
||||
setDraftPlanId(undefined);
|
||||
setServiceConflicts({});
|
||||
setHistory({ draft: seedDraft(selectedPlan, selectedSpacecraftId), past: [], future: [] });
|
||||
setSelectedWorkId(undefined);
|
||||
setRightMode("none");
|
||||
setNotice("Черновик отменён — правки отброшены.");
|
||||
} catch (error) {
|
||||
setApplyError(error instanceof Error ? error.message : "Не удалось отменить черновик.");
|
||||
} finally {
|
||||
setCanceling(false);
|
||||
}
|
||||
};
|
||||
|
||||
// Удаление включения: персистнутые режимы (с planModeId) удаляются в БД черновика (Ф3,
|
||||
// с каскадами drop↔survey), затем убираются из локального представления. Несохранённые
|
||||
// (planModeId нет) — только локально.
|
||||
@@ -745,6 +780,7 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
|
||||
addedCount={addedCount}
|
||||
dirty={dirty}
|
||||
applying={applying}
|
||||
canceling={canceling}
|
||||
windowLabel={formatDuration(window.toMs - window.fromMs)}
|
||||
rightMode={rightMode}
|
||||
onSetRightMode={(mode) => {
|
||||
@@ -757,6 +793,7 @@ export function TguEditorTab({ selectedSpacecraftId, selectedPlan, appliedRange,
|
||||
onRedo={() => setHistory((current) => redo(current))}
|
||||
onCheck={runCheck}
|
||||
onApply={applyDraft}
|
||||
onCancel={cancelDraft}
|
||||
onZoom={zoom}
|
||||
onPan={pan}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user