/* ============================================================================= * M02_MasterTemplete_Labor_LibMeta.ts * 서고 모드(일위대가 · 사전조합) 정보 칸 구분 · 상세구분 고르기(51-12 · 134-5 · `Labor_Detail` 에서 뗌 · 717-3) * 고침 = 문서 `구분` · `상세구분` 바로(화면 캐시) · 바꾼 뒤 `changed()`. * ========================================================================== */ import { createSelectField } from "@ui/ui_template_elements"; import { fetchStructureDef } from "./StructOptions/M02_SO_Api"; import { precomboClasses } from "./M02_MasterTemplete_UI_Side_Precombo"; import { tc } from "./M02_MasterTemplete_Labor_Text"; /** 서고 구분 · 상세구분(51-12 · 134-5) — 구조물군 › 종류 + 공통(`precomboClasses`)에서 고름 · * 구분 바꾸면 상세구분 = 그 첫 줄(공통) · 빈 값 = 미분류 */ export function libMeta(doc: unknown, edit: boolean, changed: () => void): HTMLElement[] { const meta = doc as { 구분?: string | null; 상세구분?: string | null }; const sub = createSelectField({ options: [], label: tc("Sub"), disabled: !edit }); const detail = createSelectField({ options: [], label: tc("Detail"), disabled: !edit }); sub.root.dataset.laborField = "구분"; detail.root.dataset.laborField = "상세구분"; let subs: { name: string; details: string[] }[] = []; // 목록에 없는 지금 값(빈 것 = 「—」 · 옛 문서)도 선택지로 둠 const opts = (names: string[], now: string | null | undefined) => [...new Set([now ?? "", ...names])] .filter((v, i) => v || i === 0) .map((v) => ({ value: v, text: v || "—" })); const fill = (): void => { sub.setOptions( opts( subs.map((s) => s.name), meta.구분, ), meta.구분 ?? "", ); const details = subs.find((s) => s.name === meta.구분)?.details ?? []; detail.setOptions(opts(details, meta.상세구분), meta.상세구분 ?? ""); }; sub.select.addEventListener("change", () => { meta.구분 = sub.select.value; meta.상세구분 = subs.find((s) => s.name === meta.구분)?.details[0] ?? null; fill(); changed(); }); detail.select.addEventListener("change", () => { meta.상세구분 = detail.select.value; changed(); }); fill(); void fetchStructureDef().then( (def) => { subs = precomboClasses(def); fill(); }, () => undefined, ); return [sub.root, detail.root]; }