- 새 UI_Side_Sangeun.ts — 서고 칸(716-4) kind sangeun · 목록표 고름 sangeunList - 새 Sangeun_View.ts — 이름 · 단위 · 바탕 · 덮개 · 더한 줄 · 뺀 줄 · 열린 입력 요약 + 상세 자리표(717-2b 가 갈음) - UI_Main 종류 sangeun 갈래 · 목록표 조건에 sangeun · Library_List 열 표(단가산출 = 바탕 · 고친 줄 · 쓰는 곳) · sangeunBlank(단위 식 · 바탕 없음) - UI_Page 단가산출 층 상태 sk · UI_Side 맨 위 칸 · reveal 「단가산출」 · Layer open 「단가산출」 · Api Kind sangeun - m_settings_nav 대시보드 마스터 템플릿 묶음 「단가산출」 줄(?open=단가산출) · locale_m2 키 - 낡은 글 대조 시험 넷 고침(197_1 · b01_settings_cards · m02_layer_screen · m02_precombo_scope) — 대시보드 줄 하나 늘고 OPENS · reveal · 목록 열 표 · 칸 차례가 바뀜 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62 lines
2.8 KiB
TypeScript
62 lines
2.8 KiB
TypeScript
/* =============================================================================
|
|
* M02_MasterTemplete_Sangeun_View.ts
|
|
* 단가산출(SK) 상세 자리(717-2a) — 편집 칸 종류 sangeun 이 여는 곳(UI_Main 갈래 한 줄).
|
|
* 지금 = 이름 · 단위 · 바탕 · 고친 줄 요약(덮개 · 더한 줄 · 뺀 줄 · 열린 입력) + 상세 자리표.
|
|
* 717-2b(sub2) = 자리표 줄을 `mountSangeunDetail(slot, doc, opt)`(`Sangeun_Detail.ts`)로 갈음 ·
|
|
* [저장]은 그 손잡이 `getDoc` · 고침 알림은 `opt.onChanged`. 지금 [저장] = 읽은 문서 그대로.
|
|
* ========================================================================== */
|
|
|
|
import { el } from "@ui/ui_template_elements";
|
|
import { createEmpty } from "@ui/ui_template_empty";
|
|
import { createKv } from "@ui/ui_template_kv";
|
|
import { t as L } from "@ui/ui_template_locale";
|
|
import { tc } from "./M02_MasterTemplete_Labor_Text";
|
|
import type { Selection } from "./M02_MasterTemplete_UI_Main";
|
|
|
|
/** SK 문서 중 이 자리가 읽는 칸(꼴 = 서버 `M02_Sangeun_Doc`) */
|
|
export interface SangeunDoc {
|
|
키?: string;
|
|
이름?: string;
|
|
단위?: string;
|
|
바탕?: { 로직?: string; 참조?: { 키?: string } } | null;
|
|
덮개?: Record<string, unknown>;
|
|
더한줄?: unknown[];
|
|
뺀줄?: unknown[];
|
|
열린입력?: string[];
|
|
}
|
|
|
|
/** 고름(층 · 주인 · SK 키 = name) + 읽기만 · 고침 알림 */
|
|
export type SangeunViewOptions = Pick<Selection, "layer" | "owner" | "name"> & {
|
|
readOnly: boolean;
|
|
onChanged: (dirty: boolean) => void;
|
|
};
|
|
|
|
/** 바탕 한 줄 — 로직 키 · 참조 SK 키 · 없으면 「바탕 없음」 */
|
|
export const baseText = (doc: SangeunDoc): string =>
|
|
doc.바탕?.로직 ?? doc.바탕?.참조?.키 ?? L("M02_SangeunNoBase");
|
|
|
|
export function mountSangeunView(
|
|
host: HTMLElement,
|
|
doc: unknown,
|
|
_opt: SangeunViewOptions,
|
|
): { getDoc: () => unknown; destroy: () => void } {
|
|
const sk = (doc ?? {}) as SangeunDoc;
|
|
const count = (v: unknown[] | Record<string, unknown> | undefined): number =>
|
|
Array.isArray(v) ? v.length : Object.keys(v ?? {}).length;
|
|
const head = createKv([
|
|
{ label: L("M02_Name"), value: sk.이름 ?? "" },
|
|
{ label: tc("Lib_Unit"), value: sk.단위 ?? "" },
|
|
{ label: L("M02_SangeunBase"), value: baseText(sk) },
|
|
{ label: L("M02_SangeunCover"), value: count(sk.덮개) },
|
|
{ label: L("M02_SangeunAdded"), value: count(sk.더한줄) },
|
|
{ label: L("M02_SangeunRemoved"), value: count(sk.뺀줄) },
|
|
{ label: L("M02_SangeunOpened"), value: (sk.열린입력 ?? []).join(" · ") || null },
|
|
]);
|
|
const slot = el("div", {
|
|
attrs: { "data-sangeun-detail": sk.키 ?? "" },
|
|
children: [createEmpty({ text: L("M02_SangeunDetailSoon") })],
|
|
});
|
|
host.replaceChildren(el("div", { attrs: { "data-sangeun-view": "" }, children: [head, slot] }));
|
|
return { getDoc: () => doc, destroy: () => host.replaceChildren() };
|
|
}
|