- 지움(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>
169 lines
5.1 KiB
JavaScript
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(),
|
|
};
|
|
}
|