- 새 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>
78 lines
3.5 KiB
TypeScript
78 lines
3.5 KiB
TypeScript
/* =============================================================================
|
||
* 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);
|
||
},
|
||
});
|
||
}
|