Files
Aislo/B05_Profile/B05_Profile_Api_PageSettings.ts
T
eomsangdonandClaude Opus 5.5 990832d629 refactor(472-5 5-C 값 주인 하나): 종단 편집 · 페이지 설정 = 설계 가게 칸 — ↶ ↷ 뒤 두 보기 · 폼 · 기울기 한도 같은 값(N6 · N7)
- 종단 편집: 모듈 사본 EditState 걷음 — 지금 값 = 가게 alignmentDraft(세션) ?? 새 칸 alignmentSaved(노선별 서버 저장분 · 메모리)
  · ↶ ↷ = 다시 읽기만(resync · 같은 값이면 다시 셈 없음) · [저장] 뒤 ↶ 가 저장 전 서버 값으로 안 돌아감 · 노선 없는 창구는 그 안 메모리
- 페이지 설정: 가게 칸 pageSettings(세션 pagesettings) · ↶ ↷ 훅이 가게로 다시 알림 → 폼(B05) · 기울기 한도 · 시작 측점(종단도 한 벌)이 들음(N6)
- 최소고 강제: 결과 통 사본 칸 profile-enforce-min-cover 지움 — 편집 가드가 페이지 설정(초안 ?? 저장 노선)을 바로 읽음(N7)
- 시험: test_472_5_value_owner(옛 코드 빨강 3) · 헬퍼 271 · 442_2 가게 창구 따라감 · 최소고 가드 글 검사 줄
- 위키 design_page 값 · 조작 · 세션 열쇠 · 규칙 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:35:58 +09:00

86 lines
4.1 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,
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 =>
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));
},
});
/** [저장] `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);
}
writePageSettings(projectId, null);
}