feat(M01): 입력 없는 로직 열 때 한 번 계산 · 비목 몫으로 갈린 줄에 몫 표시 (PLAN 4장)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016WRFJmmhPi4exAzHgPZHMT
This commit is contained in:
@@ -87,6 +87,8 @@ interface Entry {
|
|||||||
qty: string;
|
qty: string;
|
||||||
qtyTag: string;
|
qtyTag: string;
|
||||||
qtyFrag: Fragment[];
|
qtyFrag: Fragment[];
|
||||||
|
/** 한 줄이 비목 몫으로 갈렸을 때 이 묶음의 몫 이름(예 「노무비」) */
|
||||||
|
share?: string;
|
||||||
price: string;
|
price: string;
|
||||||
amount: number | null;
|
amount: number | null;
|
||||||
/** 덧줄이면 true */
|
/** 덧줄이면 true */
|
||||||
@@ -188,7 +190,12 @@ function infoBox(ctx: DetailContext): HTMLElement {
|
|||||||
const spread = (e: Entry, line?: CalcLine): Entry[] => {
|
const spread = (e: Entry, line?: CalcLine): Entry[] => {
|
||||||
const parts = Object.entries(line?.비목 ?? {}).filter(([, v]) => v !== 0);
|
const parts = Object.entries(line?.비목 ?? {}).filter(([, v]) => v !== 0);
|
||||||
if (!parts.length) return [e];
|
if (!parts.length) return [e];
|
||||||
return parts.map(([k, v]) => ({ ...e, group: OF_COST[k] ?? "other", amount: v }));
|
return parts.map(([k, v]) => ({
|
||||||
|
...e,
|
||||||
|
group: OF_COST[k] ?? "other",
|
||||||
|
amount: v,
|
||||||
|
...(parts.length > 1 ? { share: k } : {}),
|
||||||
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
function entries(ctx: DetailContext): Entry[] {
|
function entries(ctx: DetailContext): Entry[] {
|
||||||
@@ -275,6 +282,9 @@ function lineRow(e: Entry): HTMLElement {
|
|||||||
el("td", {
|
el("td", {
|
||||||
children: [
|
children: [
|
||||||
el("div", { text: e.name }),
|
el("div", { text: e.name }),
|
||||||
|
...(e.share
|
||||||
|
? [el("div", { className: "m01-logic__tag", text: `${e.share} ${tl("Share")}` })]
|
||||||
|
: []),
|
||||||
...(e.spec ? [el("div", { className: "m01-logic__muted", text: e.spec })] : []),
|
...(e.spec ? [el("div", { className: "m01-logic__muted", text: e.spec })] : []),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ const TEXT = {
|
|||||||
G_other: ["그 밖 (인력·자재·경비 어디에도 안 맞는 줄)", "Other (fits none of the three)"],
|
G_other: ["그 밖 (인력·자재·경비 어디에도 안 맞는 줄)", "Other (fits none of the three)"],
|
||||||
Tag_Table: ["표", "Table"],
|
Tag_Table: ["표", "Table"],
|
||||||
Subtotal: ["소계", "Subtotal"],
|
Subtotal: ["소계", "Subtotal"],
|
||||||
|
Share: ["몫", "Share"],
|
||||||
Total: ["계", "Total"],
|
Total: ["계", "Total"],
|
||||||
Extra: ["덧줄", "Extra"],
|
Extra: ["덧줄", "Extra"],
|
||||||
Col_Name: ["이름", "Name"],
|
Col_Name: ["이름", "Name"],
|
||||||
|
|||||||
@@ -139,7 +139,12 @@ export function buildCalc(host: HTMLElement, ctx: CalcContext): void {
|
|||||||
ctx.onText?.(answer);
|
ctx.onText?.(answer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (ctx.savedKey !== null && !autoAsked.has(ctx.values)) {
|
if (!fields.length && !autoAsked.has(ctx.values)) {
|
||||||
|
autoAsked.add(ctx.values); // 입력이 없으면 채울 것이 없음 — 열 때 한 번 바로 계산
|
||||||
|
queueMicrotask(() => {
|
||||||
|
if (previewSeq === mySeqAtOpen) host.querySelector("button")?.click();
|
||||||
|
});
|
||||||
|
} else if (ctx.savedKey !== null && !autoAsked.has(ctx.values)) {
|
||||||
autoAsked.add(ctx.values);
|
autoAsked.add(ctx.values);
|
||||||
void fetchAuto(ctx.savedKey).then((auto) => {
|
void fetchAuto(ctx.savedKey).then((auto) => {
|
||||||
const names = (ctx.row.입력 ?? [])
|
const names = (ctx.row.입력 ?? [])
|
||||||
|
|||||||
Reference in New Issue
Block a user