Files
Aislo/M02_MasterTemplete/M02_MasterTemplete_Sangeun_View.ts
T
eomsangdonandClaude Opus 5.5 a64e3ca398 feat(717-2a): M02 왼쪽 맨 위 「단가산출」 칸 — 층 단추 따로(기본 개인) · 폴더 나무 · 목록표 · 상세 자리 · 대시보드 줄
- 새 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>
2026-11-01 16:00:03 +09:00

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() };
}