/* ============================================================================= * M02_MasterTemplete_Hopyo_ToItem.ts * [구조물 조합으로](PLAN 786-2 · 옛 704-4 꼴 되살림) — [수정] 모달에서 이 호표가 옮겨진 일위대가(SC)를 담은 * 구조물 조합 항목을 만듦. 창 = 항목 이름(기본 = 호표 이름 · 규격) · [만들기]. * 길 = 구조물 조합 나무 항목 더하기(`editTree` add-item · 「실무자료」 폴더) → 그 항목 일위대가 문서에 SC 참조 한 줄 * (`readTemplate` · `saveTemplate` — 서버가 정리 · 셈) · 구조물 조합 공용 파일 · 길은 부르기만. * ========================================================================== */ import { createButton, showToast } from "@ui/ui_template_elements"; import { createInputField } from "@ui/ui_template_input"; import { t as L } from "@ui/ui_template_locale"; import { openModal } from "@ui/ui_template_modal"; import { createText } from "@ui/ui_template_text"; import { fetchSessionUser } from "../A06_Login/A06_Login_Api_Fetch"; import { editTree, fetchTree, readTemplate, saveTemplate } from "./M02_MasterTemplete_Api_Fetch"; import type { HopyoScope } from "./M02_MasterTemplete_Hopyo_Api"; import { ownOwner } from "./M02_MasterTemplete_Layer"; /** 만든 항목이 놓이는 폴더 */ export const ITEM_PATH = ["실무자료"]; export interface ToItemOptions { /** 만들 층(일위대가 SC 가 있는 층) */ target: HopyoScope; /** 이 호표가 옮겨진 일위대가 키(SC-…) */ sc: string; name: string; unit: string; } /** 항목 더하기 → 일위대가 문서에 SC 참조 한 줄 → 새 열 id */ export async function makeItem(o: ToItemOptions, label: string): Promise { const { layer, owner } = o.target; const tree = await fetchTree(layer, owner); const made = await editTree(layer, { op: "add-item", 경로: ITEM_PATH, 이름: label, 단위: o.unit }, tree.판, owner); // prettier-ignore const col = [made.알림?.열].flat()[0]; if (!col) throw new Error(L("M02_CheckToItemFail")); try { await fillLabor(o, col); } catch (e) { // 일위대가 못 담음 = 빈 항목 남기지 않음(방금 더한 항목만 지움) await editTree(layer, { op: "delete", 키: col }, made.판, owner).catch(() => null); throw e; } return col; } /** 새 항목 일위대가 문서 = SC 참조 한 줄 */ async function fillLabor(o: ToItemOptions, col: string): Promise { const { layer, owner } = o.target; const now = await readTemplate(layer, "labor", col, null, owner); const doc = (now.문서 ?? {}) as Record; // 참조 주인 = 실제 주인 id(개인 「회사/사용자」 · 자기 층이면 세션에서 · `Find_Pick.upper` 와 같은 길) const who = layer === "system" || layer === "project" ? null : (owner ?? ownOwner(layer, await fetchSessionUser())); const line = { 참조: { 층: layer, 주인: who, 키: o.sc }, 별칭: null, 메모: null, 수량: { 손: 1 }, }; await saveTemplate(layer, "labor", col, null, now.판 ?? "", { ...doc, 담은로직: [line], 단위: o.unit || doc.단위 || null }, owner); // prettier-ignore } export function toItem(o: ToItemOptions): void { const name = createInputField({ label: L("M02_CheckItemName"), value: o.name }); openModal({ title: `${L("M02_CheckToItem")} — ${o.sc}`, closeLabel: L("Common_Btn_Cancel"), width: "40rem", mount: (body, close, actions) => { const go = createButton({ label: L("M02_CheckItemMake"), onClick: async () => { const label = name.input.value.trim(); if (!label) return name.setError(L("M02_CheckItemEmpty")); go.disabled = true; try { await makeItem(o, label); close(); showToast(L("M02_CheckItemMade").replace("{name}", label).replace("{path}", ITEM_PATH.join(" › ")), "success", 6000); // prettier-ignore } catch (e) { showToast(`${L("M02_CheckToItemFail")} — ${e instanceof Error ? e.message : String(e)}`, "error"); // prettier-ignore } finally { go.disabled = false; } }, }); go.dataset.hopyoItemMake = ""; actions.append(go); body.append(createText(L("M02_CheckItemHint"), "muted"), name.root); }, }); }