/* ============================================================================= * M02_MasterTemplete_Labor_Sheet.ts * 계산서 보기(704-2) — 기준 목록 줄을 누르면 담기 전에 한 장: 맨 위 「출처 · 판」 · 비목마다 * 「이름 | 노임 × 품 | 금액」 줄 · 소계 · 계(서버 M01 엔진 값 · `/logic-lib/sheet`) · 곁에 원문 띠 · * [담기] = 부르는 쪽 담기 동작 그대로(`put`). * ========================================================================== */ import { createButton, el, showToast } from "@ui/ui_template_elements"; import { createCalcFormula, createCalcFormulaRow } from "@ui/ui_template_calc_row"; import { openModal } from "@ui/ui_template_modal"; import { createText } from "@ui/ui_template_text"; import { createSourceView } from "../M01_MasterData/M01_MasterData_UI_LogicLab_Source"; import { fetchStandardSheet, type StandardRow } from "./M02_MasterTemplete_Labor_Api"; import { tc } from "./M02_MasterTemplete_Labor_Text"; const won = (v: number | null, digits = 0): string => v === null ? "-" : v.toLocaleString("ko-KR", { maximumFractionDigits: digits }); const out = (v: number | null, key = false, digits = 0): HTMLElement => el("span", { className: `ui-calc-row__out${key ? " is-key" : ""}`, text: won(v, digits) }); export function openStandardSheet(row: StandardRow, put: () => void): void { const sheet = el("div", { className: "m02-std-sheet__body", attrs: { "data-std-sheet": "" } }); sheet.append(createText(tc("Loading"))); const source = createSourceView({ path: "/m02/logic-lib/source", pdf: "/m02/logic-lib/source-pdf", }); let close = (): void => {}; const add = createButton({ label: tc("Std_Put"), variant: "filled", onClick: () => { close(); put(); }, }); ({ close } = openModal({ title: `${tc("Std_Sheet")} — ${row.이름}`, closeLabel: tc("Pick_Close"), width: "1100px", wide: true, actions: [add], mount: (body) => body.append(el("div", { className: "m02-std-sheet", children: [sheet, source.root] })), })); void fetchStandardSheet(row).then( (got) => { const head = [got.이름, got.규격, got.단위].filter(Boolean).join(" · "); const lines: HTMLElement[] = [ createText(head, "muted", 14), createText([got.출처, got.판].filter(Boolean).join(" · "), "hint"), ]; for (const g of got.묶음) { for (const line of g.줄) { const text = line.글.replace(/ = [^=]*$/, "").replaceAll(" * ", " × "); lines.push( createCalcFormulaRow(line.이름, createCalcFormula(text), out(line.금액, false, 1)), ); } lines.push( createCalcFormulaRow(`${g.비목}${g.끝수 ? ` (${g.끝수})` : ""}`, null, out(g.소계, true)), ); } lines.push( createCalcFormulaRow(`${tc("Std_Sum")} (원/${got.단위 || "식"})`, null, out(got.계, true)), ); sheet.replaceChildren(...lines); source.show(got.출처); }, (error) => { sheet.replaceChildren(createText(tc("Load_Failed"), "error")); showToast(error instanceof Error ? error.message : tc("Load_Failed"), "error"); }, ); }