/* ============================================================================= * formula_doc_options.ts * 수식 문서 옵션 가로(PLAN 802-3 · 802-4b-2 · 요구 655 「옵션 선택은 상단에 수평」) — 선택 · 입력 기호마다 칸 하나 * 값 = 화면 값(`given`) › 문서 값 · 고침은 부른 쪽 `set`(M01 = 화면 값만 · M02 사본 = 문서 값) · `lock` = 읽기만 * ========================================================================== */ import { createInputField, createSelectField } from "@ui/ui_template_input"; import { varId, type DocVar, type FormulaDoc } from "../common_util/common_util_formula_doc"; export function buildOptions( doc: FormulaDoc | null, given: Record, lock: boolean, set: (key: string, v: DocVar, value: unknown) => void, ): HTMLElement[] { const out: HTMLElement[] = []; for (const v of doc?.변수 ?? []) { const kind = v.연결?.갈래; const k = v.열쇠; if (!k || (kind !== "선택" && kind !== "입력")) continue; const label = v.이름 || varId(v); const now = k in given ? given[k] : v.연결?.값; if (kind === "선택") { const list = (v.연결?.목록 ?? []).map(String); const f = createSelectField({ label, options: list.map((x) => ({ value: x, text: x })), value: String(now ?? ""), compact: true, size: 28, disabled: lock, onChange: (x) => set(k, v, x), }); f.root.dataset.option = k; out.push(f.root); } else { const f = createInputField({ label, value: now === undefined || now === null ? "" : String(now), compact: true, size: 28, unit: v.단위 || undefined, }); f.input.disabled = lock; f.input.addEventListener("change", () => { const t = f.input.value.trim(); const n = Number(t.replace(/,/g, "")); set(k, v, t !== "" && Number.isFinite(n) ? n : t); }); f.root.dataset.option = k; out.push(f.root); } } return out; }