/* ============================================================================= * M02_MasterTemplete_Hopyo_Lost.ts * 단가산출 줄 찾기 단추 · 옛 못옮김 창(PLAN 729-4 · 778-5 D-5). * · `lineFind` = 줄 묶음대로 찾아 넣기 창(`Find_Pick` 탭 하나 · 노임 = 인력 · 기계 = 기계 · 자재 = 재료) → * 고름 `{노임|기계|자재: 키}` — 마법사 단가산출 줄 표(`Hopyo_SkLines`)가 씀 * · `openLost` = 옛 SK(기초 + 엑셀 차이)의 남은 못옮김 보기만 — 잇기는 마법사 단가산출 칸에서 그 블록 줄 고름 → * [확인] → [확인한 것 옮기기](서버 778-5 D-3 · 옛 `바탕` 몸 걷음) * ========================================================================== */ import { createButton, showToast } from "@ui/ui_template_elements"; import { t as L } from "@ui/ui_template_locale"; import { openModal } from "@ui/ui_template_modal"; import { createTable } from "@ui/ui_template_table"; import { createText } from "@ui/ui_template_text"; import { openFindPicker } from "./M02_MasterTemplete_Find_Pick"; import type { HopyoScope, SangeunBuilt, SangeunLost } from "./M02_MasterTemplete_Hopyo_Api"; import type { SkPick } from "./logic/M02_MasterTemplete_Hopyo_SkPick"; const KIND = { 노임: "labor", 기계: "machine", 자재: "material" } as const; /** 줄 찾기 단추 — 묶음 갈래 탭 하나 · 고르면 `done({갈래: 키})` */ export function lineFind(opt: { scope: HopyoScope; 갈래: "노임" | "기계" | "자재"; 이름: string; 규격?: string; done: (p: SkPick) => void; }): HTMLButtonElement { const go = createButton({ label: opt.갈래 === "기계" ? L("M02_LeftMachine") : L("M02_LeftFind"), size: 24, variant: "ghost", onClick: () => openFindPicker({ layer: opt.scope.layer, owner: opt.scope.owner, title: `${opt.이름} ${opt.규격 ?? ""}`.trim(), kinds: [KIND[opt.갈래]], query: opt.이름.split(/[\s(]/)[0] ?? "", logic: () => showToast(L("M02_GridLinkNoLogic"), "info"), element: (e) => opt.done({ [opt.갈래]: e.코드 } as SkPick), machine: (e) => opt.done({ 기계: e.코드 }), }), }); go.dataset.skFind = opt.갈래; return go; } export interface LostOptions { scope: HopyoScope; key: string; /** 블록 번(단산N) */ 번: number; /** 그 블록 SK 키 */ sk: string; 이름?: string; lost: SangeunLost[]; /** 옛 꼴 그대로(부르는 쪽) — 보기만이라 안 부름 */ done?: (got: SangeunBuilt) => void; } /** 옛 못옮김 창 — 보기만 · 잇기 = 마법사 단가산출 칸 */ export function openLost(opt: LostOptions): void { openModal({ title: `${L("M02_LostTitle")} — 단산${opt.번} ${opt.이름 ?? ""}`.trim(), closeLabel: L("M02_Close"), width: "960px", dialogClass: "m02-modal", mount: (body) => { const rows = opt.lost.map((x) => [ x.갈래, x.이름, x.규격 ?? "", `${x.수량 ?? ""} ${x.단위 ?? ""}`.trim(), x.글 ?? "", ]); body.append( createText(L("M02_LostHint").replace("{n}", String(opt.번)), "hint", 14), createTable( [ { label: L("M02_LeftKind"), width: "56px" }, { label: L("M02_SangeunColName") }, { label: L("M02_LeftSpec") }, { label: L("M02_SangeunColQty"), width: "90px" }, { label: L("M02_LeftWhy") }, ], rows, { density: "data", empty: L("M02_LostZero") }, ), ); }, }); }