From bd9fc2fe8a8e4ee06b37a2bde8fa6a7eba95108b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Thu, 1 Oct 2026 09:53:41 +0900 Subject: [PATCH] =?UTF-8?q?feat(M01-=EC=89=AC=EC=9A=B4=EB=8B=A8=EA=B0=80):?= =?UTF-8?q?=20Cards=20=EC=9E=A0=EA=B8=88=20=EC=B9=B4=EB=93=9C=EC=97=90=20?= =?UTF-8?q?=ED=91=9C=20=EB=B3=B4=EA=B3=A0=20=EA=B3=A0=EB=A5=B4=EA=B8=B0=20?= =?UTF-8?q?=EB=8B=A8=EC=B6=94=20-=20openEasyTable=20=EB=8B=B5=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=8B=9D=20=EB=B0=94=EA=BF=88=20=C2=B7=20on.trial?= =?UTF-8?q?=20=EB=B0=9B=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01D2nUMUMTsqm93PbQtipo6c --- M01_MasterData/EasyCalc/M01_EasyCalc_Cards.ts | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/M01_MasterData/EasyCalc/M01_EasyCalc_Cards.ts b/M01_MasterData/EasyCalc/M01_EasyCalc_Cards.ts index 3eb4f7ca8..f2eef8ac5 100644 --- a/M01_MasterData/EasyCalc/M01_EasyCalc_Cards.ts +++ b/M01_MasterData/EasyCalc/M01_EasyCalc_Cards.ts @@ -23,6 +23,7 @@ import { type PickResult, } from "./M01_EasyCalc_Model"; import { openEasyPick } from "./M01_EasyCalc_Pick"; +import { openEasyTable, readFinds } from "./M01_EasyCalc_Table"; import "./M01_EasyCalc_Cards.css"; const TEXT = { @@ -60,6 +61,7 @@ const TEXT = { Auto: ["자동", "auto"], Locked: ["잠김", "Locked"], ToNumber: ["숫자로 바꾸기", "Make it a number"], + ByTable: ["표 보고 고르기", "Choose from table"], ToNumber_Wait: ["계산이 끝난 뒤 가능", "Available after calculation"], ToNumber_Ask: [ "자동 값을 그대로 숫자로 바꿈 · 이후 자동으로 달라지지 않음", @@ -92,7 +94,7 @@ interface Ctx { doc: EasyDoc; lines: Map; readOnly: boolean; - on: { change(doc: EasyDoc): void }; + on: { change(doc: EasyDoc): void; trial?(): Record }; /** 숫자 아님으로 친 글 — 다시 그려도 칸에 남김 */ badText: Map; } @@ -205,6 +207,17 @@ async function lockToNumber(ctx: Ctx, card: EasyCard, value: number): Promise { + 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 => @@ -414,6 +427,17 @@ function lockedNote(ctx: Ctx, card: EasyCard): HTMLElement { }); if (!line) button.title = tc("ToNumber_Wait"); 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 }); } @@ -485,7 +509,7 @@ export function renderCards( host: HTMLElement, doc: EasyDoc, ans: CalcAnswer | null, - on: { change(doc: EasyDoc): void }, + on: { change(doc: EasyDoc): void; trial?(): Record }, ): void { const badText = badTexts.get(host) ?? new Map(); badTexts.set(host, badText);