- 전역변수: 표지 대입 변수를 호표 넘어 유지, 지정·해제, 목록·이동 - 새내역서 파일로저장: 당초값·신규 표시·당초 사본 지운 새 작업 따로 저장 - 수량산출서 삽입(공종명칭·규격)·선택공종 삭제 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
71 lines
3.3 KiB
JavaScript
71 lines
3.3 KiB
JavaScript
// 원본 단가산출 「전역변수 지정,해제」(mnuCostSetGlobalVar 0xf053cc)·「전역변수 목록」(mnuCostGlobalvarList → TfrmGlobalVarList).
|
|
// 지정·해제: 마지막으로 누른 산출근거 칸의 커서 아래 낱말([0-9A-Za-z_], 영문자 하나 이상)을 ⟦전역⟧ 표지로 감싸거나 푼다.
|
|
// 목록: 단가산출을 처음부터 계산해 전역변수 대입마다 변수명·값과 그 줄로 이동.
|
|
const EstGlobalVars = (() => {
|
|
const MARK = "⟦전역⟧";
|
|
let last = null;
|
|
if (typeof document !== "undefined" && document.addEventListener)
|
|
document.addEventListener("focusin", (event) => {
|
|
const t = event.target.closest?.('[data-table="CostMainDat"][data-field="LineData"]');
|
|
if (t) last = t;
|
|
});
|
|
|
|
function toggle(text, caret) {
|
|
const word = /[0-9A-Za-z_]/;
|
|
let a = caret,
|
|
b = caret;
|
|
while (a > 0 && word.test(text[a - 1])) a--;
|
|
while (b < text.length && word.test(text[b])) b++;
|
|
const name = text.slice(a, b);
|
|
if (!name || !/[A-Za-z]/.test(name))
|
|
throw Error(
|
|
'선택한 변수는 전역변수로 지정할수 없습니다.\n\n변수는 알파벳과 숫자,"_"로 이루어져야합니다.\n\n예) Q , V1 , L_1',
|
|
);
|
|
const before = text.slice(0, a),
|
|
after = text.slice(b);
|
|
if (before.endsWith(MARK) && after.startsWith(MARK))
|
|
return before.slice(0, -MARK.length) + name + after.slice(MARK.length);
|
|
return `${before}${MARK}${name}${MARK}${after}`;
|
|
}
|
|
|
|
function list(state) {
|
|
const out = EstText.calculate(state.project.tables.CostMainDat || [], state.project.options);
|
|
const { esc, number } = EstApp;
|
|
EstApp.showDialog(
|
|
"전역변수 목록",
|
|
out.globals.length
|
|
? `<table class="sheet"><thead><tr><th>변수명</th><th>값</th><th>이동</th></tr></thead><tbody>${out.globals.map((g) => `<tr><td>${esc(g.name)}</td><td>${number(g.value)}</td><td><button data-action="global-var-go" data-row="${g.index}">이동</button></td></tr>`).join("")}</tbody></table>`
|
|
: "<p>전역변수가 없습니다. 단가산출 산출근거의 변수에 커서를 두고 「전역변수 지정,해제」를 누르세요.</p>",
|
|
);
|
|
}
|
|
|
|
function handle(name, state, node) {
|
|
if (name === "global-var") {
|
|
if (!last) throw Error("단가산출 산출근거 칸의 변수에 커서를 두세요.");
|
|
const index = Number(last.dataset.row),
|
|
text = last.value,
|
|
next = toggle(text, last.selectionStart ?? 0);
|
|
EstApp.change(
|
|
(project) => (project.tables.CostMainDat[index].LineData = EstText.encode(next)),
|
|
);
|
|
} else if (name === "global-var-list") list(state);
|
|
else if (name === "global-var-go") {
|
|
EstApp.byId("dialog").close();
|
|
const index = Number(node.dataset.row);
|
|
state.view = "CostMainDat";
|
|
const rows = state.project.tables.CostMainDat;
|
|
let head = index;
|
|
while (head > 0 && !(Number(rows[head].Index) > 0)) head--;
|
|
state.group = rows[head]?.Code || state.group;
|
|
state.selection.clear();
|
|
state.selection.add(index);
|
|
EstApp.render();
|
|
document
|
|
.querySelector(`[data-table="CostMainDat"][data-row="${index}"][data-field="LineData"]`)
|
|
?.scrollIntoView({ block: "center" });
|
|
} else return false;
|
|
return true;
|
|
}
|
|
return { toggle, handle };
|
|
})();
|