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