Files
Aislo/B05_Profile/B05_Profile_UI_Structures_Summary.ts
T
eomsangdonandClaude Opus 5.5 fc54a385df feat(B05): 48-3 · 48-4 구조물 배치 칸 = 구조물 정의대로 그림
- 정의 덧칸 얹기 — GET /m02/structure-definition 의 구조물군 이름 · 기준측점 · 동작 · 배치 · 규칙 · 그룹 형상을 종류에 얹음(못 받으면 옛 화면 그대로)
- 레지스트리 칸 — 배치(줄 · 칸 · 너비) 격자 · 차례 · 안 씀(enabled:false) · 규칙(선택지 · 보이기 · 기본값) 즉시 적용 · 규칙이 가린 칸은 저장 안 건드림
- 손코딩 시설 폼(동작 계곡통과시설) — 안 씀 · 선택지 · 규칙을 칸 표식으로 붙임 · 배치 · 이름은 손코딩 그대로
- 지난 정의 값 — 지금 정의에 없는 키 값을 읽기만 상자로
- 그룹 형상 칸 — 길이 · 높이 · 전 · 후 받기 켬끔 · 값은 옵션 {그룹 id}__{칸}
- 정의에서 뺀 선택지를 고른 옛 값은 그 값만 남겨 보임
- 시험 test_b05_structures_define 8 · 헬퍼 문맥 groupBoxes 로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BVPp2o6Mh2FZJr72yW3ofZ
2026-10-05 16:15:37 +09:00

30 lines
1.9 KiB
TypeScript

/* =============================================================================
* B05_Profile_UI_Structures_Summary.ts
* 구조물 폼의 **집계 항목** 쪽 순수 규칙(PLAN 21-4) — 옵션 보이기 · [수정] 옵션 보존.
*
* ⚠ [수정]이 옵션을 통째로 덮어쓰던 흠(2026-09-29 조사: B05 폼이 안 그리는 상세(detail) 옵션이
* 저장 때 지워져 B06 상세 값이 사라졌음)을 여기서 막는다 — **폼이 그린 칸만 갈아 끼우고
* 나머지(안 보이는 칸 · 상세 칸)는 옛 값 그대로**. 관 계열(`mergeFacilityOptions`)과 같은 길.
* import 없음 — 시험이 이 파일만 옮겨 돌림.
* ========================================================================== */
/** 옵션 보이기 — 서버가 채운 `visible`(21-8)이 false 이거나 정의가 「안 씀」(`enabled:false` · 48)일 때 숨김. */
export function isOptionVisible(option: { visible?: boolean; enabled?: boolean }): boolean {
return option.visible !== false && option.enabled !== false;
}
/** 저장할 옵션 — 같은 종류를 고치는 중이면 폼이 안 그린 옛 칸을 이어 붙임.
* `rendered` = 폼이 그린 칸의 키 · `next` = 폼이 읽은 값(빈 칸은 이미 빠져 있음).
* 폼이 그린 칸을 폼이 비웠으면 그 칸은 지워짐(사용자가 한 일). 종류를 바꾸면 통째로 새 값. */
export function mergeStructureOptions(
previous: { type_id: string; options?: Record<string, string | number> } | null | undefined,
typeId: string,
rendered: Iterable<string>,
next: Record<string, string | number>,
): Record<string, string | number> {
if (!previous || previous.type_id !== typeId) return next;
const drawn = new Set(rendered);
const kept = Object.entries(previous.options ?? {}).filter(([key]) => !drawn.has(key));
return { ...Object.fromEntries(kept), ...next };
}