- 서버: 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
62 lines
2.6 KiB
JavaScript
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),
|
|
}),
|
|
);
|