Files
Aislo/resources/tester/helper_778_5_sk_pick.cjs
eomsangdonandClaude Opus 5.5 cf4e2a0339 refactor(785-7): 옛 맞춤 화면 TS 지움 · 옛 [저장] · [모두 고정] 단추 걷음 · 390 줄 판 높이
- 지움(git rm) 15 파일 3,318 줄: Hopyo_Check · CheckRows · Choose · WizardSk · SkApi · SkLines · logic/SkPick · logic/Draft ·
  Left · Lost · Pick · SheetMake · Kids · ToItem · Compare(모두 옛 확인 창 · 마법사 단가산출 · 안 이은 줄 길 몫 · 부르는 곳 0)
- 단추 판단: 엑셀 보기 [저장](체크 호표) · [모두 고정으로 들여오기] 화면 단추 걷음 → 만들기 = [옮기기] 하나 ·
  모두 고정 서버 길(Builder · build_all)은 B09 · 붙여넣기가 써서 남김 · 목록 체크 칸 · 모달 껍데기(openHopyoSheet · raise · lower) 걷음
- Import: 「안 이은 줄」 띠 · [안 이은 줄 고르기] · 남은 줄 셈 걷음 · [끝내기] = 물음(확인하고 안 옮긴 수 = 판정 고름 캐시 moveBody)
- Api: 옛 맞춤 타입 · 길(readHopyoOne · guessHopyo · buildHopyo · buildHopyoAll · leftHopyo · listHopyoPicks · hopyoSiblings ·
  buildHopyoItem …) 걷음 · POLL_MS · HOPYO_BUILT 옮겨 옴 · 목록 꼴 = 1차 판정 줄상태(Judge.view)
- Labor_Pick: withHopyo(실무 호표 덧줄) → withSangeun(찾아 넣기 창 표시만) · Detail · Table 부름 바꿈
- Ledger: unitField 옮겨 옴 · SheetNav: 옛 확인 캐시 칠 걷음 · UI_Page: [구조물 조합으로] 듣기 걷음
- CSS: 옛 확인 창 · 고르기 창 규칙 34 걷음(481 → 287 줄) · 390 폭 = 줄 판 열리면 위 칸 넓힘 · 줄 판 높이 바닥 16rem

시험 정리(까닭 = 지운 화면 파일만 읽음):
- 지움: test_729_3_hopyo_left_screen · test_746_2_hopyo_compare_screen · test_778_5_sk_pick_screen · helper_729_3 · helper_m02_hopyo_check · pick · seam
- test_m02_hopyo_screen = 좌측 판 · 끝내기 둘만 · 627 · helper_778_5 = SheetSk 판 바꿈만 · 785_4 · 721 · 717_4 · 720 · 739_1 = 지금 꼴로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 01:32:17 +09:00

169 lines
5.1 KiB
JavaScript

/* 780-2 · 785-6 엑셀 보기 오른쪽 판 바꾸기 헬퍼 — stdin `{sheetSk: {...}}` = `Hopyo_SheetSk` 를 트랜스파일해 Node 로 돌림 ·
* 단가산출 칸 · 시트 막대 · 판은 가짜 · stdout = JSON. 옛 마법사 줄 고름(`SkPick` · `SkApi`)은 785-7 에서 지움. */
const fs = require("fs");
const path = require("path");
const { makeLoader } = require("./helper_ts_stub_loader.cjs");
const ROOT = path.join(__dirname, "..", "..");
const fakeEl = () => ({
hidden: false,
attrs: {},
kids: [],
setAttribute(k, v) {
this.attrs[k] = v;
},
append(x) {
this.kids.push(x);
},
});
const list = []; // 그린 목록 줄 벌
const reads = []; // 목록 읽음
const BRIEFS = [
{
번: 8,
이름: "거푸집",
단위: "㎡",
부름: [1],
표지: null,
만든: null,
판정: "고를 것",
고를수: 2,
},
{
번: 9,
이름: "잡석",
단위: "㎥",
부름: [],
표지: "준용",
만든: null,
판정: "줄 조합",
고를수: 0,
},
{
번: 10,
이름: "운반",
단위: "㎡",
부름: [2],
표지: null,
만든: "SK-000001",
판정: "기초로 풂",
고를수: 0,
},
];
const STUBS = {
"@ui/ui_template_locale": { t: (k) => (k === "M02_JudgeBlock" ? "단산{n}" : k) },
"@ui/ui_template_badge": { createBadge: (text, tone) => `${tone}:${text}` },
"@ui/ui_template_text": { createText: (text) => text },
"@ui/ui_template_list_row": { createListRow: (opts) => ({ opts, dataset: {} }) },
"./M02_MasterTemplete_Hopyo_JudgeApi": {
readJudge: async (scope, key, to) => {
reads.push({ key, to });
return { 키: key, 파일: "a.xls", 호표: [], 블록: BRIEFS };
},
},
"./M02_MasterTemplete_Hopyo_Block": { createJudgeBlock: (o) => ({ ...o, destroy() {} }) },
"./M02_MasterTemplete_Hopyo_Api": { POLL_MS: 3000 },
"./M02_MasterTemplete_Hopyo_Rows": { createJudgeMove: () => ({ root: fakeEl(), destroy() {} }) },
"@config/config_frontend": { API_BASE_URL: "/api", ROUTES: {} },
"@ui/ui_template_elements": {
el: (tag, o = {}) => ({
...fakeEl(),
tag,
className: o.className,
replaceChildren(...kids) {
this.kids = kids;
if (kids.length && kids[0]?.opts) list.push(kids);
},
}),
},
};
const stub = new Proxy({}, { get: () => () => {} });
const { loadTs } = makeLoader({
root: ROOT,
requireFor: (full) => (request) => {
if (STUBS[request]) return STUBS[request];
if (request.startsWith(".") && !request.endsWith(".css"))
return loadTs(`${path.resolve(path.dirname(full), request)}.ts`);
return stub;
},
});
global.sessionStorage = { getItem: () => null, setItem: () => {}, removeItem: () => {} };
(async () => {
const input = JSON.parse(fs.readFileSync(0, "utf8"));
process.stdout.write(JSON.stringify(await sheetSk(input.sheetSk)));
})().catch((error) => {
process.stderr.write(String(error?.stack ?? error));
process.exit(1);
});
/** 780-2 · 785-6 판 바꾸기 — 탭(역할) 차례로 고름 · 판 숨김 · 목록 읽음 한 번 · 강조 · 줄 누름 = 뛰기 + 블록 판 */
async function sheetSk({ same, canWrite, picks }) {
const M02 = path.join(ROOT, "M02_MasterTemplete");
const { createSheetSk } = loadTs(path.join(M02, "M02_MasterTemplete_Hopyo_SheetSk.ts"));
const roles = { s1: "일위대가표", s2: "단가산출표", s3: "단가산출상세" };
const jumps = [];
const nav = {
role: (sheet) => roles[sheet],
blockAt: (sheet, row) =>
sheet === "s2" ? row - 4 : sheet === "s3" ? Math.floor(row / 10) : null,
spotOf: (no, role) => ({ 시트: role === "단가산출표" ? "s2" : "s3", 행: [no, no + 1] }),
jumpTo: (sheet, rows) => jumps.push([sheet, rows]),
};
const toggled = [];
const side = {
hidden: false,
after: () => {},
parentElement: { classList: { toggle: (c, on) => toggled.push([c, on]) } },
};
const scope = { layer: "personal", owner: null };
const target = same ? scope : { layer: "company", owner: null };
const state = {
get: () => ({ 호표: {}, 블록: { 8: { 고른: [], 확인: true } } }),
on: () => () => {},
};
const opened = [];
const p = createSheetSk({
scope,
key: "HP-000001",
target,
canWrite,
nav,
side,
state,
openLines: (make) => opened.push(make("host")),
closeLines: () => {},
});
const seen = [];
const rows = () => list.at(-1) ?? [];
for (const [sheet, cell] of picks) {
p.at({ 시트: sheet, 칸: cell });
await new Promise((r) => setTimeout(r, 0));
const active = rows().find((r) => r.opts.active)?.opts.label ?? null;
seen.push({
호표판숨김: side.hidden,
단가판숨김: p.root.hidden,
읽음: reads.length,
강조: active,
});
if (sheet !== "s1")
rows()
.find((r) => r.opts.label.startsWith("단산8 "))
?.opts.onClick();
}
return {
seen,
toggled,
jumps,
reads,
blocks: opened.map((o) => ({ no: o.no, readOnly: o.readOnly, onSheet: !!o.onSheet })),
rows: rows().map((r) => ({
label: r.opts.label,
sub: r.opts.sub,
stripe: r.opts.stripe,
tail: r.opts.trailing,
})),
count: p.count(),
};
}