Files
Aislo/resources/tester/helper_m02_inputs.cjs
T
eomsangdonandClaude Opus 5.5 43a59a6893 refactor(M02): 일위대가 입력 목록 · 넣을 값 칸 부품 옮김(39-3 C2) — 선택 입력에서 M02_Labor_Inputs.py · M02_Labor_Values(_Model).ts 로 · 옛 자리는 다시 내보냄 · 입력 목록 길 logic-lib/inputs
- 서버: inputs · combo_logics · _num 몸을 M02_Labor_Inputs.py 로(logic_inputs = 로직 키들 입력 + 자동값) · M02_MasterTemplete_Inputs.py 는 그것을 부름
- 길: GET /api/m02/logic-lib/inputs?keys= (로그인 · 일위대가 입력 모달용)
- 화면: 값 카드(createInputsValueCard) · 값 함수 → M02_Labor_Values.ts · M02_Labor_Values_Model.ts · 값 칸 하나(createValueControl)를 떼어 값 카드와 입력 모달이 같이 씀 · CSS 도 옮김
- 옛 자리(M02_MasterTemplete_Inputs.ts · _Inputs_Model.ts)는 새 파일을 다시 내보냄 — B05 고르기 모달 그대로
- 시험: 새 test_m02_labor_values.py · 옮긴 자리 따라 test_item_picker_detail · test_m02_card_shell · helper_m02_inputs 고침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MgChuAcyBqUkhHMTXomQC7
2026-10-04 17:27:30 +09:00

62 lines
2.6 KiB
JavaScript

/* M02 「선택 입력」 카드 셈(`M02_MasterTemplete_Inputs_Model.ts`) 단위검증 헬퍼 —
* 그 자리에서 트랜스파일해 Node 로 돌리고 값을 JSON 으로 낸다. */
const fs = require("fs");
const path = require("path");
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
// 상대 경로 TS(값 함수 = `M02_Labor_Values_Model.ts` 다시 내보냄)는 이어 트랜스파일
function loadTs(file) {
const js = ts.transpileModule(fs.readFileSync(file, "utf8"), {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
}).outputText;
const box = { exports: {} };
const local = (request) =>
request.startsWith(".") ? loadTs(`${path.resolve(path.dirname(file), request)}.ts`) : require(request);
new Function("exports", "module", "require", js)(box.exports, box, local);
return box.exports;
}
const m = loadTs(path.join(__dirname, "..", "..", "M02_MasterTemplete", "M02_MasterTemplete_Inputs_Model.ts"));
// 같은 이름(높이)의 입력이 두 로직에 있음
const list = {
일위대가: "UA000001",
로직: [
{
로직: "GC1",
이름: "돌쌓기",
입력: [
{ 이름: "높이", 단위: "m", 범위: [0.5, 5], 자동값: 1.2 },
{ 이름: "종류", 고르기: ["막돌", "견치돌"] },
],
},
{ 로직: "GC2", 이름: "타설", 입력: [{ 이름: "높이", 범위: { 최소: 0, 최대: 3 } }, { 이름: "배합" }] },
],
빠진로직: [],
};
const seats = m.seatsOf({
판: "v1",
줄: [
{ 로직: "GC1", 입력: "높이", 자리: "면적", 알약: "입력|GC1|높이" },
{ 로직: "GC2", 입력: "높이", 자리: "면적" },
{ 로직: "GC2", 입력: "배합", 자리: "재료" },
{ 로직: "GC1", 입력: "종류", 자리: null },
{ 로직: "GC9", 입력: "없는것", 자리: "선택" },
],
});
const links = { 판: "v1", 줄: [...[...seats].map(([k, 자리]) => ({ 로직: k.split("|")[0], 입력: k.split("|")[1], 자리 }))] };
const pick = new Map(seats);
pick.set(m.inputKey("GC1", "종류"), "선택");
process.stdout.write(
JSON.stringify({
keys: [m.inputKey("GC1", "높이"), m.pillKey("GC2", "높이")],
seatKeys: [...seats.keys()],
count: m.countOf(list),
area: m.pillsOf(list, links, "면적").map((p) => [p.키, p.이름, p.단위 ?? null, p.고정]),
material: m.pillsOf(list, links, "재료").map((p) => [p.키, p.이름]),
lines: m.linesOf(list, pick),
none: m.linesOf(list, new Map()),
hints: list.로직.flatMap((l) => l.입력).map((i) => [m.valueHint(i), m.autoText(i)]),
seatOptions: m.SEAT_OPTIONS.map((o) => o.label),
}),
);