fix(793-3b): 우리 기초로 바꾸기 — 옵션 = 블록 풀이 후보 바인딩 · 단위 성격 다르면 환산 계수 입력 필요 · 가져온 식 시트 M01 바뀜 표지 걷음

- to-base 몸 환산? · 환산 없이 단위 성격 다름 = 후 None · 필요 ["환산"](막지 않음 · 화면 붉은 칸)
- 화면 bind = 블록 풀이 그 기초 후보 바인딩(엑셀 값 · 기본) + 블록 검산 입력 필요 · 줄 검산(빈 입력값)은 옵션을 못 읽었음
- 가져온 식 SK = M01 짝 없음 — 시트 M01바뀜 · 짝잃음 안 띄움(저장 M01판이 바탕 줄과 달라 늘 떴음)
- 시험 test_793_3b 8

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 18:26:07 +09:00
co-authored by Claude Opus 5.5
parent ca72718e26
commit 5a6cccd997
9 changed files with 110 additions and 32 deletions
@@ -24,6 +24,7 @@ import { newBadge } from "./M02_MasterTemplete_Hopyo_CheckRows";
import {
gapText,
isImported,
needValues,
stillNeed,
tiers,
TIERS,
@@ -61,6 +62,7 @@ const TEXT = {
PickBase: ["기초 고르기", "Pick basis"],
Gap: ["바꾸기 전 {a} → 후 {b} ({d})", "Before {a} → after {b} ({d})"],
Need: ["입력 필요", "Input needed"],
Swap: ["환산 계수(기초 1 단위 = 이 단가산출 몇 단위)", "Unit factor (1 basis unit = n of this)"],
NeedHint: ["채워야 이 줄을 확인 · 옮김", "Fill to confirm and move this line"],
Close: ["닫기", "Close"],
} as const satisfies Record<string, readonly [string, string]>;
@@ -222,10 +224,12 @@ export function importedPanel(s: PanelState, a: PanelActs): HTMLElement {
const g = tx("Gap").replace("{a}", won(gone.전)).replace("{b}", won(gone.후));
kids.push(createBanner({ tone: "info", text: g.replace("{d}", gapText(gone.전, gone.후) || "0") })); // prettier-ignore
}
const left = stillNeed(s.need, s.doc.입력값);
const values = needValues(s.doc);
const left = stillNeed(s.need, values);
if (s.need.length) {
const fields = s.need.map((k) => {
const f = createInputField({ label: k, size: 28, value: String(s.doc.입력값?.[k] ?? "") });
const label = k === "환산" ? tx("Swap") : k;
const f = createInputField({ label, size: 28, value: String(values[k] ?? "") });
f.input.dataset.importedNeed = k;
f.input.disabled = s.readOnly || s.busy;
if (left.includes(k)) f.setError(tx("Need"));