Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Hopyo_ToItem.ts
T
eomsangdonandClaude Opus 5.5 e91fd4398e feat(786-2): 불러오기 [수정] → 모달 「확인 — 제N호표」 옛 꼴 되살림 · 새 기능 「새」 배지
- 새 Hopyo_Check(모달 껍데기 · 머리 = 호표 · 엑셀 단가 · 제안 n / 줄 m · 확인 n · 만든 일위대가 ·
  [호표 제안 모두 확인](새) · [일위대가 생성] = 옮기기 길 이 호표만 · [구조물 조합으로] · [엑셀 보기])
- 새 Hopyo_CheckRows(로직 표 + 자재 표 = 구조물 조합 상세 꼴 · Labor_Rows moneyCell · PRICE_SLOTS ·
  Labor_MatMarks 빌려 씀 · 칸마다 엑셀 / 우리 단가 · 품 비교 · [고르기] · [원문 보기] · [옵션] · 추가 / 로직없음)
- 새 Hopyo_ToItem(구조물 조합 나무 add-item → 그 일위대가 문서에 SC 참조 한 줄 · 옮겨진 뒤만 켬)
- Hopyo_Rows: 시트 아래 줄 판 몸 걷음 → 줄 칸 부품 createRowKit(판정 · 고름 칩 · 블록 풀이 · 단위 환산 · [확인]) ·
  옮기기 한 번 runMove(오른쪽 [옮기기] · 모달 [일위대가 생성] 한 벌)
- Router: POST /hopyo/{키}/price 우리 금액 미리 셈(저장 없음 · Make.Move.pick · Lines.picks → Labor_Doc.calc 재사용)
- Sheet: [수정] = openHopyoCheck · 시트 아래 자리는 단가산출 블록 판(SheetSk) 몫으로 남김
- 안 살림: 맞음·별칭 일괄 체크 · 품셈으로 바꾸기 · 모두 고정으로(지운 서버 길 몫) · 사용안함(새 옮기기 길에 뺌 없음)
- 시험: 새 test_786_2_check_modal(우리 금액 예시 1 = 94,227 · 예시 3 입력 필요 → 0 · 쓰기 0 · 모달 · 새 배지 ·
  공용 import 만 · 날 button/input 0) · test_642_6 단언 = 줄 판 createJudgeRows → 모달 openHopyoCheck(까닭: 줄 판 몸 걷음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 07:26:37 +09:00

78 lines
3.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =============================================================================
* 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 { editTree, fetchTree, readTemplate, saveTemplate } from "./M02_MasterTemplete_Api_Fetch";
import type { HopyoScope } from "./M02_MasterTemplete_Hopyo_Api";
/** 만든 항목이 놓이는 폴더 */
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<string> {
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"));
const now = await readTemplate(layer, "labor", col, null, owner);
const doc = (now.문서 ?? {}) as Record<string, unknown>;
const line = {
참조: { 층: layer, 주인: owner, 키: o.sc },
별칭: null,
메모: null,
수량: { 손: 1 },
};
await saveTemplate(layer, "labor", col, null, now.판 ?? "", { ...doc, 담은로직: [line], 단위: o.unit || doc.단위 || null }, owner); // prettier-ignore
return col;
}
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);
},
});
}