feat(M01-쉬운단가): Cards 잠금 카드에 표 보고 고르기 단추 - openEasyTable 답으로 식 바꿈 · on.trial 받음
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D2nUMUMTsqm93PbQtipo6c
This commit is contained in:
@@ -23,6 +23,7 @@ import {
|
|||||||
type PickResult,
|
type PickResult,
|
||||||
} from "./M01_EasyCalc_Model";
|
} from "./M01_EasyCalc_Model";
|
||||||
import { openEasyPick } from "./M01_EasyCalc_Pick";
|
import { openEasyPick } from "./M01_EasyCalc_Pick";
|
||||||
|
import { openEasyTable, readFinds } from "./M01_EasyCalc_Table";
|
||||||
import "./M01_EasyCalc_Cards.css";
|
import "./M01_EasyCalc_Cards.css";
|
||||||
|
|
||||||
const TEXT = {
|
const TEXT = {
|
||||||
@@ -60,6 +61,7 @@ const TEXT = {
|
|||||||
Auto: ["자동", "auto"],
|
Auto: ["자동", "auto"],
|
||||||
Locked: ["잠김", "Locked"],
|
Locked: ["잠김", "Locked"],
|
||||||
ToNumber: ["숫자로 바꾸기", "Make it a number"],
|
ToNumber: ["숫자로 바꾸기", "Make it a number"],
|
||||||
|
ByTable: ["표 보고 고르기", "Choose from table"],
|
||||||
ToNumber_Wait: ["계산이 끝난 뒤 가능", "Available after calculation"],
|
ToNumber_Wait: ["계산이 끝난 뒤 가능", "Available after calculation"],
|
||||||
ToNumber_Ask: [
|
ToNumber_Ask: [
|
||||||
"자동 값을 그대로 숫자로 바꿈 · 이후 자동으로 달라지지 않음",
|
"자동 값을 그대로 숫자로 바꿈 · 이후 자동으로 달라지지 않음",
|
||||||
@@ -92,7 +94,7 @@ interface Ctx {
|
|||||||
doc: EasyDoc;
|
doc: EasyDoc;
|
||||||
lines: Map<string, CalcLine>;
|
lines: Map<string, CalcLine>;
|
||||||
readOnly: boolean;
|
readOnly: boolean;
|
||||||
on: { change(doc: EasyDoc): void };
|
on: { change(doc: EasyDoc): void; trial?(): Record<string, unknown> };
|
||||||
/** 숫자 아님으로 친 글 — 다시 그려도 칸에 남김 */
|
/** 숫자 아님으로 친 글 — 다시 그려도 칸에 남김 */
|
||||||
badText: Map<string, string>;
|
badText: Map<string, string>;
|
||||||
}
|
}
|
||||||
@@ -205,6 +207,17 @@ async function lockToNumber(ctx: Ctx, card: EasyCard, value: number): Promise<vo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function pickFromTable(ctx: Ctx, card: EasyCard): Promise<void> {
|
||||||
|
if (picking) return;
|
||||||
|
picking = true;
|
||||||
|
try {
|
||||||
|
const formula = await openEasyTable(card, ctx.doc, ctx.on.trial?.());
|
||||||
|
if (formula !== null) patchCard(ctx, card, { qtyFormula: formula });
|
||||||
|
} finally {
|
||||||
|
picking = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------ 칸 만들기 ------------------------------ */
|
/* ------------------------------ 칸 만들기 ------------------------------ */
|
||||||
|
|
||||||
const text = (cls: string, value: string): HTMLSpanElement =>
|
const text = (cls: string, value: string): HTMLSpanElement =>
|
||||||
@@ -414,6 +427,17 @@ function lockedNote(ctx: Ctx, card: EasyCard): HTMLElement {
|
|||||||
});
|
});
|
||||||
if (!line) button.title = tc("ToNumber_Wait");
|
if (!line) button.title = tc("ToNumber_Wait");
|
||||||
note.push(button);
|
note.push(button);
|
||||||
|
// 표 찾기가 있는 식만 — 조건 꼴 [조건 보고 고치기] 자리는 비워 둠(sub7)
|
||||||
|
if (card.qtyFormula !== null && readFinds(card.qtyFormula)?.length) {
|
||||||
|
note.push(
|
||||||
|
createButton({
|
||||||
|
label: tc("ByTable"),
|
||||||
|
variant: "ghost",
|
||||||
|
size: "sm",
|
||||||
|
onClick: () => void pickFromTable(ctx, card),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return el("div", { className: "m01-easycards-locknote", children: note });
|
return el("div", { className: "m01-easycards-locknote", children: note });
|
||||||
}
|
}
|
||||||
@@ -485,7 +509,7 @@ export function renderCards(
|
|||||||
host: HTMLElement,
|
host: HTMLElement,
|
||||||
doc: EasyDoc,
|
doc: EasyDoc,
|
||||||
ans: CalcAnswer | null,
|
ans: CalcAnswer | null,
|
||||||
on: { change(doc: EasyDoc): void },
|
on: { change(doc: EasyDoc): void; trial?(): Record<string, unknown> },
|
||||||
): void {
|
): void {
|
||||||
const badText = badTexts.get(host) ?? new Map<string, string>();
|
const badText = badTexts.get(host) ?? new Map<string, string>();
|
||||||
badTexts.set(host, badText);
|
badTexts.set(host, badText);
|
||||||
|
|||||||
Reference in New Issue
Block a user