/* ============================================================================= * 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 => ({ 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); }