- 세션 칸 pagesettings(설계속도 · 지형 · 기준값 · 최소고 강제 · 시작 측점) · 열 때 최신 응답 위에 얹음 - 저장 차례 settings = 노선 뒤 · 관 앞(기본 창구 · 노선 바꾼 [저장]에도 돎) - PUT /route/page-settings — stage 2 params 에 사용자 값만 병합(상태 · STALE 그대로) · 종단 정책 · criteria 갱신 뒤 위반 · 요약 다시 셈(기하 그대로) - 시 · 종점 계획고 조정 = 첫 · 끝 측점 계획고 편집(끝점 ▲▼ 와 같은 길) · 샘플 간격 두 칸 읽기 전용 - E1 재설계 요청이 설계속도 · 최소고 강제 · 시작 측점 옮김 · E2 B06 재생성 지형 기본 특수 · E3 초기값 스냅샷 stage 2 params 뜸 · 되돌림 - 노선 추천 · 평면 R 설정 읽기가 params.options 를 봄(옛 맨 위 칸 폴백) - 시험 test_442_2_page_settings · test_442_2_grade_limit_mirror · design_store_save 차례 갱신 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
3.1 KiB
TypeScript
68 lines
3.1 KiB
TypeScript
/* =============================================================================
|
|
* B05_Profile_Api_PageSettings.ts
|
|
* B05 「페이지 설정」 초안(448) — 세션 칸 `pagesettings` · [저장]의 `settings` 차례(노선 뒤 · 계획고 앞).
|
|
*
|
|
* 설계속도 · 지형 · 기준값 · 최소고 강제 · 시작 측점을 조작 즉시 세션에 쌓고 [저장] · [확정]에서만
|
|
* 서버로(자동저장 없음). 서버가 stage 2 params 에 얹고 종단 경고 기준을 갈아 끼운다(기하 그대로).
|
|
* 시작 측점은 B05 표시 전용 — 측점 열쇠 · 다른 페이지 라벨에 안 씀.
|
|
* 시 · 종점 계획고 조정은 여기 없음 — 첫 · 끝 측점 계획고 편집(`alignment` 차례)이 정본.
|
|
* ========================================================================== */
|
|
|
|
import { clearState, readState, writeState } from "../A00_Common/b_page_state";
|
|
import {
|
|
readRouteLatestCache,
|
|
savePageSettings,
|
|
writeRouteLatestCache,
|
|
type PageSettingsBody,
|
|
} from "./B05_Profile_Api_Fetch";
|
|
import type { RoutePanelValues } from "./B05_Profile_UI_Panel_Fields";
|
|
|
|
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 =>
|
|
readState<PageSettingsDraft>("pagesettings", projectId);
|
|
|
|
export const writePageSettings = (projectId: string, value: PageSettingsDraft): void =>
|
|
writeState("pagesettings", value, projectId);
|
|
|
|
/** [저장] `settings` 차례 — 초안이 없으면 안 보냄 · 성공하면 최신 응답 캐시에 얹고 초안을 비움
|
|
* (실패 = 던짐 · 초안 그대로 다음 [저장]에서 다시). */
|
|
export async function flushPageSettings(projectId: string): Promise<void> {
|
|
const draft = readPageSettings(projectId);
|
|
if (!draft) return;
|
|
await savePageSettings(projectId, draft);
|
|
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);
|
|
}
|
|
clearState("pagesettings", projectId);
|
|
}
|