/* ============================================================================= * M02_MasterTemplete_Hopyo_ToItem.ts * [구조물 조합으로](PLAN 704-4 뒷부분) — 실무자료 확인 창 몸 그대로 구조물 조합 항목(SU)을 바로 만듦(사전조합 안 거침). * 창 = 항목 이름(기본 = 호표 이름 · 규격) · 규격 묶음 제안(같은 이름 · 줄 구성 · 규격만 다른 호표 → 한 항목의 규격 열 · * 기본 켬 · 끄면 이 호표 하나) · [만들기] → 서버 `/hopyo-item`(이 층 쓰기 · 「실무자료」 폴더) → 나무 다시 * 숫자는 서버가 파일에서 — 화면은 체크 · 고름만 * ========================================================================== */ import { createButton, el, hideLoadingOverlay, showLoadingOverlay, showToast, } from "@ui/ui_template_elements"; import { createCheckbox } from "@ui/ui_template_checkbox"; import { createInputField } from "@ui/ui_template_input"; import { openModal } from "@ui/ui_template_modal"; import { createText } from "@ui/ui_template_text"; import { t as L } from "@ui/ui_template_locale"; import { buildHopyoItem, hopyoSiblings, type BuildLine, type BuildTarget, type HopyoOne, type HopyoScope, } from "./M02_MasterTemplete_Hopyo_Api"; /** 항목을 만들었음(document 알림) — 구조물 조합 나무 · 옆 목록 다시 */ export const ITEM_BUILT = "m02-hopyo-item-built"; export interface ToItemOptions { scope: HopyoScope; target: HopyoScope; key: string; no: number; hopyo: HopyoOne["호표"]; lines: BuildLine[]; whole: { 대상: BuildTarget[] } | null; } export async function toItem(o: ToItemOptions): Promise { let sib: Awaited>; try { sib = await hopyoSiblings(o.scope, o.key, o.no); } catch (error) { showToast( `묶음 제안 실패 — ${error instanceof Error ? error.message : String(error)}`, "error", ); return; } const h = o.hopyo; const one = [h.이름, h.규격].filter(Boolean).join(" "); const bundle = sib.묶음.length > 1; const name = createInputField({ label: "구조물 조합 이름", value: bundle ? h.이름 : one }); const pack = bundle ? createCheckbox( `규격 열로 묶음 — ${sib.이름}: ${sib.묶음.map((r) => `${r.열}(제${r.번}호표)`).join(" · ")}`, { checked: true, onChange: (on) => (name.input.value = on ? h.이름 : one), }, ) : null; openModal({ title: `구조물 조합으로 — 제${o.no}호표`, closeLabel: "취소", width: "40rem", mount: (body, close, actions) => { const go = createButton({ label: "만들기", onClick: async () => { const label = name.input.value.trim(); if (!label) return name.setError("이름이 빔"); const from = { 층: o.scope.layer, 주인: o.scope.owner, 키: o.key, 번: o.no }; const with_ = pack?.input.checked ? sib.묶음.map((r) => r.번).filter((n) => n !== o.no) : []; showLoadingOverlay(); try { const got = await buildHopyoItem(o.target, from, o.lines, o.whole, with_, label); close(); document.dispatchEvent(new Event(ITEM_BUILT)); showToast( `구조물 조합 「${label}」 만듦 — 「실무자료」 폴더 · 줄 ${got.줄수}` + (got.열수 > 1 ? ` · 규격 열 ${got.열수}` : ""), "success", 6000, ); } catch (error) { showToast( `못 만듦 — ${error instanceof Error ? error.message : String(error)}`, "error", ); } finally { hideLoadingOverlay(); } }, }); actions.append(go); body.append( createText( `체크한 줄 = 품셈 줄 · 나머지 = 고정 줄(엑셀 숫자 그대로) — ${L("M02_PrecomboTitle")}을 거치지 않고 구조물 조합 항목을 바로 만듦`, "muted", ), name.root, ...(pack ? [el("div", { children: [pack.root] })] : []), ); }, }); }