/* ============================================================================= * B05_Profile_UI_Structures_Panel_AddAt.ts * 종단 우클릭 → 종류 고름 = 「[추가]까지 끝난 상태」(PLAN 116-1) — 세 길(B05 종단 · B06 종단 · * 3D)이 함께 쓰는 패널 `addAt` 의 끝맺음. 필수 빈칸이 없는 종류는 그 측점에 바로 추가하고 * 새 항목을 고른 채로 둠 · 남는 종류는 폼만. * ========================================================================== */ import type { StructureInstance, StructureType } from "./B05_Profile_Api_Structures"; import type { StructuresSection } from "./B05_Profile_UI_Structures_Panel_Types"; /** 바로 추가하지 않는 종류 — 노면공(겹침 확인창) · 세월교 · 물넘이포장(월류 높이가 유량 뒤 채워짐). */ const FORM_ONLY = new Set(["pavement_concrete", "ford_bridge", "ford_pavement"]); /** 우클릭 한 번으로 [추가]까지 끝낼 수 있는지 — [추가]가 막는 빈 필수 칸이 없어야 함. */ export function addsAtOnce( type: StructureType, optionInputs: ReadonlyArray<{ required: boolean; isEmpty: () => boolean }>, ): boolean { if (FORM_ONLY.has(type.type_id)) return false; return !optionInputs.some((entry) => entry.required && entry.isEmpty()); } /** [추가]를 대신 누르고 새 항목을 고름. [추가]가 거절하면(전길이 > 기준 등) 아무것도 안 들고 * 그 칸에 포커스가 간 폼 그대로 남음 — false. */ export async function finishAdd(ctx: { type: StructureType; anchorM: number; structures: StructureInstance[]; commit: () => Promise; /** 패널 — 바깥에서 고를 때와 같은 길(좌측 패널 폄 · 폼 · 목록 고름). */ pick: Pick; }): Promise { if (ctx.type.managed_by) { // 관 지점 정본 — 배수유역 재계산은 종전 [추가] 그대로. B06 은 목록에 바로 들어 여기서 고르고, // B05 는 재계산 뒤 배수유역 패널이 새 관 고름을 다시 알려 폼이 열림. await ctx.commit(); ctx.pick.selectPipeByChainage(ctx.anchorM); return true; } const before = new Set(ctx.structures.map((entry) => entry.structure_id)); await ctx.commit(); // 목록 알림 → 페이지가 임시 id 를 붙여 되돌려 줌(`withLocalIds`) const added = ctx.structures.find( (entry) => !!entry.structure_id && !before.has(entry.structure_id), ); if (!added?.structure_id) return false; ctx.pick.selectById(added.structure_id); return true; }