Files
Aislo/M01_MasterData/M01_MasterData_UI_Test.ts
T
eomsangdon 63832239d4 Merge remote-tracking branch 'origin/dev' into sub_laptop_3
# Conflicts:
#	resources/master_data/_화면_계약.md
2026-09-21 09:36:36 +09:00

107 lines
4.1 KiB
TypeScript

/* =============================================================================
* M01_MasterData_UI_Test.ts
* 로직 테스트 컨테이너 틀 — 공종(로직) 10 개 고르기 + 방식 탭 A·B·C
* 읽기와 시험 계산만 — 저장 없음 · 정본 로직은 안 고침 · 계산은 로직 화면과 같은 `/calc`
* 접속 계약 — 방식 파일마다 `render(host, logicKey)` 하나
* ========================================================================== */
import { createButton, createSelectField, el, showToast } from "@ui/ui_template_elements";
import { fetchLogics } from "./M01_MasterData_UI_Logic_Api";
import { openLogicWizard } from "./M01_MasterData_UI_Logic_Wizard";
import { render as renderA } from "./M01_MasterData_UI_Test_A";
import { render as renderB } from "./M01_MasterData_UI_Test_B";
import { render as renderC } from "./M01_MasterData_UI_Logic_Flow";
import { tt } from "./M01_MasterData_UI_Test_Text";
import "./M01_MasterData_UI_Test_Style.css";
/** 시험 대상 산림품셈 로직 10 개 — 복잡도(입력·표 찾기·로직 부르기·덧줄·재료)로 잰 순서.
* 재는 법 `resources/master_data/scripts/로직_복잡도_재기.py` · 메쌓기·노체·트럭 운반은 끝까지 눌러 보는 세 개. */
export const TEST_KEYS: readonly string[] = [
"GF000181", // 12-16 맨홀
"GF000177", // 12-12 날개벽
"GF000173", // 12-11-1 VR관(소켓식) 부설
"GF000174", // 12-11-2-1 흄관 부설
"GF000160", // 12-4 합판거푸집
"GF000182", // 12-17-1 펌프카 타설
"GF000069", // 7-11 동력상하차기 집재
"GF000219", // 13-4-1 돌쌓기 메쌓기(인력)
"GF000119", // 9-16-1 노체포설
"GF000137", // 10-4 중기운반 트레일러
];
type Render = (host: HTMLElement, logicKey: string) => void;
/** 방식 파일이 오면 여기 한 줄씩 잇는다 — null 은 준비 중 */
const METHODS: { id: string; label: () => string; render: Render | null }[] = [
{ id: "A", label: () => tt("Tab_A"), render: renderA },
{ id: "B", label: () => tt("Tab_B"), render: renderB },
{ id: "C", label: () => tt("Tab_C"), render: renderC },
];
export function mountM01Test(host: HTMLElement): void {
let logicKey = TEST_KEYS[0];
let method = METHODS[0].id;
const body = el("div", { className: "m01-test__body" });
const tabs = el("div", { className: "m01-test__tabs" });
const select = createSelectField({
label: tt("Pick_Logic"),
options: TEST_KEYS.map((k) => ({ value: k, text: k })),
value: logicKey,
onChange: (v) => {
logicKey = v;
draw();
},
});
const draw = (): void => {
tabs.replaceChildren(
...METHODS.map((m) =>
el("button", {
className: `m01-test__tab${m.id === method ? " is-active" : ""}`,
text: m.label(),
attrs: { type: "button", "data-method": m.id },
}),
),
);
tabs.querySelectorAll("button").forEach((b) =>
b.addEventListener("click", () => {
method = b.dataset.method ?? "A";
draw();
}),
);
const one = METHODS.find((m) => m.id === method);
if (one?.render) one.render(body, logicKey);
else body.replaceChildren(el("p", { className: "m01-test__muted", text: tt("Soon") }));
};
host.replaceChildren(
el("div", {
className: "m01-test",
children: [
el("div", {
className: "m01-test__bar",
children: [
el("h2", { text: tt("Title") }),
select.root,
tabs,
createButton({ label: tt("New_Logic"), onClick: () => openLogicWizard() }),
],
}),
el("p", { className: "m01-test__muted", text: tt("Read_Only") }),
body,
],
}),
);
// 목록에서 이름을 받아 「번호 이름」 으로 바꿈 — 못 받아도 키로 쓸 수 있음
fetchLogics()
.then((all) => {
const label = new Map(all.map((r) => [r., `${r.원문번호} ${r.이름}`]));
select.setOptions(
TEST_KEYS.map((k) => ({ value: k, text: label.get(k) ?? k })),
logicKey,
);
})
.catch((error) => showToast(error instanceof Error ? error.message : tt("Failed"), "error"));
draw();
}