feat(714-3): M01 텍스트 수식 입력 단추 — 줄이 쓰는 시험 입력(표 찾기 행 열쇠 · 이름 조각)을 값 식 아래 단추로 · 누르면 그 자리 고르기/글 칸 · 바꾸면 시험 계산 입력 고침 + 다시 셈 · 정본 · 캐시 안 바뀜

- Formula.ts usedInputs(순수) · inputChip(부품 상자 단추 · 고르기 · 입력 칸)
- Detail → Formula 에 입력 · 값 · onInput 넘김 · LogicLab syncLeft(loud) = 흐름 예시값도 같은 길 · 줄 수 그대로(627)
- Logic_Api TextPiece 에 이름 조각 값 칸
- 새 지킴 시험 test_714_3_formula_inputs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-01 15:49:52 +09:00
co-authored by Claude Opus 5.5
parent f8c628552c
commit 915feb436e
7 changed files with 185 additions and 6 deletions
+3 -3
View File
@@ -99,7 +99,6 @@ const calcRow = (row: LogicRow | null): LogicRow | null => {
const cacheKey = "m01_logic_drafts_lab";
const ownHost = (): HTMLElement => el("div", { className: "m01lab__own" });
const clone = <T>(v: T): T => JSON.parse(JSON.stringify(v)) as T;
function loadDrafts(): Record<string, Draft> {
@@ -257,6 +256,7 @@ export async function mountM01LogicLab(
values: current.values,
ownHost: current.ownHost,
onChange: touch,
onInput: (name, v) => syncLeft(current, { [name]: v }, true),
calcHost: calc,
flowHost: flowOf(current.row) ? current.flowHost : undefined,
admin,
@@ -332,11 +332,11 @@ export async function mountM01LogicLab(
};
/** 흐름 예시값 → 왼쪽 시험 계산 입력(이름이 있는 칸만) · 바뀌면 왼쪽을 다시 그리고 셈 */
const syncLeft = (o: Opened, ex: Record<string, string>): void => {
const syncLeft = (o: Opened, ex: Record<string, string>, loud = false): void => {
const names = new Set((calcRow(o.row)?.입력 ?? []).map((x) => x.이름));
const changed = Object.entries(ex).filter(([k, v]) => names.has(k) && o.values[k] !== v);
if (!changed.length) return;
quiet = true;
quiet = !loud; // 텍스트 수식 고침(loud)은 흐름 예시값에도 — 시험 계산 칸 고침과 같은 길
for (const [k, v] of changed) o.values[k] = v;
quiet = false;
drawCalc();