/* ============================================================================= * M02_MasterTemplete_Hopyo_Pick.ts * [로직 추가] 창의 「실무 호표」 줄(PLAN 324-4 · 338-3) — 일위대가 문서 층 · 위 층 실무자료의 호표마다 한 줄(제안 n/m) · * 고름 = 문서 층에 확인된 사전조합이 있으면 그것을 바로 참조 · 없으면 확인 창 모달(`Hopyo_Check` · 늦게 불러옴) → * [확인하고 사전조합 만들기] → `lib.pick` 참조 줄(별칭 = 호표 품명) · 확인 없이 만들지 않음 · * 파일마다 「엑셀로 보기 · 여러 호표」 줄(329 엑셀 보기 창 · 고른 호표마다 참조 줄). 프로젝트 층엔 없음. * ========================================================================== */ import { showToast } from "@ui/ui_template_elements"; import { listHopyoPicks, type HopyoPickRow } from "./M02_MasterTemplete_Hopyo_Api"; import type { LibraryPick, PickExtra } from "./M02_MasterTemplete_Labor_Pick"; import { tc } from "./M02_MasterTemplete_Labor_Text"; export const HOPYO_KIND = "hopyo"; const LAYER_TEXT: Record = { system: "마스터", company: "회사", personal: "개인" }; const ALIAS_MAX = 40; // 별칭 상한(44-6 · 서버 `ALIAS_MAX`) /** 서고 고르기에 「실무 호표」 덧줄 · 종류 고르기(단가산출 · 사전조합 · 실무 호표)를 붙임 */ export function withHopyo(lib: LibraryPick): LibraryPick { if (lib.layer === "project") return lib; const scope = { layer: lib.layer, owner: lib.owner }; return { ...lib, kindFilter: lib.kindFilter ?? [ { value: "logic", text: tc("Kind_Logic") }, { value: "precombo", text: tc("Kind_Combo") }, { value: HOPYO_KIND, text: "실무 호표" }, ], more: async () => { const rows = await listHopyoPicks(scope); const files = new Map(); for (const row of rows) { const key = `${row.층}|${row.주인 ?? ""}|${row.키}`; files.set(key, [...(files.get(key) ?? []), row]); } return [ ...rows.map((row) => hopyoExtra(row, lib)), ...[...files].map(([key, list]) => sheetExtra(key, list[0], list.length, lib)), ]; }, }; } /** 파일 하나 — 엑셀 보기 창에서 여러 호표를 골라 한 번에(만드는 층 = 문서 층) */ export function sheetExtra(key: string, row: HopyoPickRow, n: number, lib: LibraryPick): PickExtra { return { kind: HOPYO_KIND, key: `${key}|엑셀`, tag: "실무 호표", name: "엑셀로 보기 · 여러 호표", sub: `${row.파일} · ${LAYER_TEXT[row.층] ?? row.층}`, unit: `호표 ${n}`, onPick: () => void import("./M02_MasterTemplete_Hopyo_Sheet").then((m) => m.openHopyoSheet({ scope: { layer: row.층, owner: row.주인 }, key: row.키, 파일: row.파일, canWrite: true, target: { layer: lib.layer, owner: lib.owner }, onImport: (got, h) => lib.pick(got.참조, got.이름, h.이름.slice(0, ALIAS_MAX).trim() || null), }), ), }; } /** 실무 호표 한 줄 */ export function hopyoExtra(row: HopyoPickRow, lib: LibraryPick): PickExtra { return { kind: HOPYO_KIND, key: `${row.층}|${row.주인 ?? ""}|${row.키}|${row.번}`, tag: "실무 호표", name: [row.이름, row.규격].filter(Boolean).join(" "), sub: `${row.파일} · 제${row.번}호표 · ${LAYER_TEXT[row.층] ?? row.층}`, unit: `${row.단위} · ${row.확인 ? `확인 ${row.확인.키}` : `제안 ${row.맞춤[0]}/${row.맞춤[1]}`}`, onPick: () => void pickHopyo(row, lib), }; } /** 고름 — 확인된 사전조합이면 바로 참조 · 아니면 확인 창 모달 → 만든 뒤 참조 */ export async function pickHopyo(row: HopyoPickRow, lib: LibraryPick): Promise { const alias = row.이름.slice(0, ALIAS_MAX).trim() || null; if (row.확인) { showToast(`「${row.이름}」 → 확인한 사전조합 ${row.확인.키}`, "success"); return lib.pick(row.확인, row.이름, alias); } try { const check = await import("./M02_MasterTemplete_Hopyo_Check"); check.openHopyoCheck({ title: `확인 — ${row.파일} 제${row.번}호표 ${row.이름}`, scope: { layer: row.층, owner: row.주인 }, key: row.키, no: row.번, target: { layer: lib.layer, owner: lib.owner }, canWrite: true, onBuilt: (got) => lib.pick(got.참조, got.이름, alias), }); } catch (error) { showToast(error instanceof Error ? error.message : String(error), "error"); } }