- POST /design/save 에 route(노선 초안) · carry(옛 노선 세션 칸) 칸 · 서버 = 노선 저장 → Node facility.rebase(rebasePipeDraft · rebaseStructureDraft) → 6-A 차례(새 노선) → Node stations.carry(routeCarryPatches) → 횡단 저장 - 되돌림 범위 = 노선 행 · 자식 표 · 단계 · 배수 폴더 · 노선 파일 · 지표면 확정(설계 지형 바꿈) - 손 상단측은 안 넘김(요구 274) · 노선 바뀐 [확정] = [저장](새 노선 본 뒤 다시) - 브라우저 = 노선 초안 + 사용자 칸만 한 본문 · 옛 차례 길(saveRouteDraft 뒤 flush · carryAfterRouteSave · keepDraftsOnNewRoute) · 부름 0 된 flush 창구 여섯 · saveCachedCrossPatches 걷음 - 등록부 R9 stations.carry · F10 facility.rebase · 옛 차례 단언 시험 한 본문 꼴로 · test_472_6_route_save(옛 길 = 새 길 · 실패 되돌림) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
88 lines
4.2 KiB
TypeScript
88 lines
4.2 KiB
TypeScript
/* =============================================================================
|
|
* B05_Profile_Api_PageSettings.ts
|
|
* B05 「페이지 설정」 초안(448) — 세션 칸 `pagesettings` · [저장]의 `settings` 차례(노선 뒤 · 계획고 앞).
|
|
*
|
|
* 설계속도 · 지형 · 기준값 · 최소고 강제 · 시작 측점을 조작 즉시 세션에 쌓고 [저장] · [확정]에서만
|
|
* 서버로(자동저장 없음). 서버가 stage 2 params 에 얹고 종단 경고 기준을 갈아 끼운다(기하 그대로).
|
|
* 시작 측점은 B05 표시 전용 — 측점 열쇠 · 다른 페이지 라벨에 안 씀.
|
|
* 시 · 종점 계획고 조정은 여기 없음 — 첫 · 끝 측점 계획고 편집(`alignment` 차례)이 정본.
|
|
* 값 주인 = 설계 가게 `pageSettings` 칸(472-5) — 폼 · 기울기 한도 · 최소고 강제가 가게를 듣고 읽음 ·
|
|
* ↶ ↷ 가 세션을 되쓰면 가게가 듣는 쪽을 다시 부름(N6) · 최소고 강제 사본 칸 없음(N7).
|
|
* ========================================================================== */
|
|
|
|
import { draftProjectId, useDesignStore } from "../A00_Common/design/design_store";
|
|
import { onPageHistory } from "./B05_Profile_UI_Profile_History";
|
|
import {
|
|
readRouteLatestCache,
|
|
writeRouteLatestCache,
|
|
type PageSettingsBody,
|
|
} from "./B05_Profile_Api_Fetch";
|
|
import type { RoutePanelValues } from "./B05_Profile_UI_Panel_Fields";
|
|
import type { SavePart } from "../A00_Common/design/design_save_api";
|
|
|
|
export type PageSettingsDraft = PageSettingsBody;
|
|
|
|
/** 좌측 폼 값 → 초안(사용자가 넣은 값 그대로 · 빈 칸 = null). */
|
|
export const pageSettingsOf = (values: RoutePanelValues): PageSettingsDraft => ({
|
|
design_speed_kph: values.designSpeed,
|
|
terrain_type: values.terrainType,
|
|
max_grade_pct: values.maxGradePct,
|
|
min_vertical_radius_m: values.minVerticalRadius,
|
|
min_tangent_length_m: values.minTangentLength,
|
|
enforce_pipe_clearance: values.enforcePipeClearance,
|
|
station_display: values.stationDisplay,
|
|
});
|
|
|
|
/** 초안 → 좌측 폼 되살리기 값(최신 응답 위에 얹음). */
|
|
export const panelValuesOfDraft = (draft: PageSettingsDraft): Partial<RoutePanelValues> => ({
|
|
designSpeed: draft.design_speed_kph,
|
|
terrainType: draft.terrain_type,
|
|
maxGradePct: draft.max_grade_pct,
|
|
minVerticalRadius: draft.min_vertical_radius_m,
|
|
minTangentLength: draft.min_tangent_length_m,
|
|
enforcePipeClearance: draft.enforce_pipe_clearance,
|
|
stationDisplay: draft.station_display,
|
|
});
|
|
|
|
export const readPageSettings = (projectId: string): PageSettingsDraft | null =>
|
|
useDesignStore(projectId, null).get("pageSettings");
|
|
|
|
export const writePageSettings = (projectId: string, value: PageSettingsDraft | null): void =>
|
|
useDesignStore(projectId, null).set("pageSettings", value);
|
|
|
|
/** 횡단배수 최소고를 편집에서 강제할지 — 초안이 있으면 초안 · 없으면 저장 노선 설정(기본 해제). */
|
|
export function enforceMinCoverOf(projectId: string): boolean {
|
|
const draft = readPageSettings(projectId);
|
|
if (draft) return draft.enforce_pipe_clearance === true;
|
|
return readRouteLatestCache(projectId)?.route_params?.enforce_pipe_clearance === true;
|
|
}
|
|
|
|
// 되돌리기 · 다시하기는 세션을 바로 되씀 — 가게로 다시 알려 폼 · 기울기 한도 · 시작 측점이 따라옴(N6)
|
|
onPageHistory({
|
|
restore: () => {
|
|
const projectId = draftProjectId();
|
|
writePageSettings(projectId, readPageSettings(projectId));
|
|
},
|
|
});
|
|
|
|
/** 한 본문 [저장] 조각(472-6) — 초안이 없으면 null · 저장 뒤 최신 응답 캐시에 얹고 초안 비움. */
|
|
export function pageSettingsPart(projectId: string): SavePart | null {
|
|
const draft = readPageSettings(projectId);
|
|
if (!draft) return null;
|
|
return { body: draft, after: () => adoptPageSettings(projectId, draft) };
|
|
}
|
|
|
|
function adoptPageSettings(projectId: string, draft: PageSettingsDraft): void {
|
|
const latest = readRouteLatestCache(projectId);
|
|
if (latest?.route_params) {
|
|
const { design_speed_kph, terrain_type, ...top } = draft;
|
|
latest.route_params = {
|
|
...latest.route_params,
|
|
...top,
|
|
options: { ...latest.route_params.options, design_speed_kph, terrain_type },
|
|
};
|
|
writeRouteLatestCache(projectId, latest);
|
|
}
|
|
writePageSettings(projectId, null);
|
|
}
|