Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
/* =============================================================================
|
|
* B09_Estimation_UI_Builders.ts
|
|
* B09 탭 표 짜기(PLAN 303-2) — 탭 → 표(`TabTable`) · 표 → 공용 표 옵션(DOM · 누름 없이).
|
|
*
|
|
* 화면(Shell) · 팝업 창(303-2) · 인쇄(302-4)가 같은 표 짜기를 씀 — 보는 값 = 찍는 값
|
|
* 초안 탭 = `DRAFT.builders`(draft 폴더가 넣음 · 없으면 빈 채로)
|
|
* ========================================================================== */
|
|
|
|
import type { DataTableOptions } from "@ui/ui_template_data_table";
|
|
import { buildDaegaBlocks, buildDaegaList } from "./B09_Estimation_UI_Tabs_Labor";
|
|
import {
|
|
DRAFT,
|
|
TABS,
|
|
type TabBuild,
|
|
type TabContext,
|
|
type TabId,
|
|
type TabTable,
|
|
} from "./B09_Estimation_UI_Tabs";
|
|
import {
|
|
buildBasis,
|
|
buildCompare,
|
|
buildExpense,
|
|
buildLabor,
|
|
buildMachine,
|
|
buildMachineBlocks,
|
|
buildMaterial,
|
|
} from "./B09_Estimation_UI_Tabs_Base";
|
|
import { buildBill } from "./B09_Estimation_UI_Tabs_Bill";
|
|
import type { BillTable } from "./B09_Estimation_UI_Tabs_Bill_Edit";
|
|
import {
|
|
buildSumExpense,
|
|
buildSumLabor,
|
|
buildSumMachine,
|
|
buildSumMaterial,
|
|
} from "./B09_Estimation_UI_Tabs_Summary";
|
|
import { buildCost, buildTotal } from "./B09_Estimation_UI_Tabs_Total";
|
|
import { buildSg, buildSgList } from "./B09_Estimation_UI_Tabs_Sangeun";
|
|
|
|
const BUILDERS: Partial<Record<TabId, TabBuild>> = {
|
|
dg_list: buildDaegaList,
|
|
dg: buildDaegaBlocks,
|
|
bill: buildBill,
|
|
basis: buildBasis,
|
|
machine: buildMachine,
|
|
machine_blocks: buildMachineBlocks,
|
|
material: buildMaterial,
|
|
labor: buildLabor,
|
|
expense: buildExpense,
|
|
compare: buildCompare,
|
|
cost: buildCost,
|
|
total: buildTotal,
|
|
sum_material: buildSumMaterial,
|
|
sum_labor: buildSumLabor,
|
|
sum_expense: buildSumExpense,
|
|
sum_machine: buildSumMachine,
|
|
sg_list: buildSgList,
|
|
sg: buildSg,
|
|
};
|
|
|
|
/** 탭 짜기 — 없는 탭 = null(「다음 단계에서 채움」) · 글 = 안내만 */
|
|
export function tabTableOf(tab: TabId, ctx: TabContext): TabTable | string | null {
|
|
const build = BUILDERS[tab] ?? DRAFT.builders[tab];
|
|
return build ? build(ctx) : null;
|
|
}
|
|
|
|
/** 표 → 공용 표 옵션(화면과 같은 값 · 꼴) — 누름 · 메뉴 · 풍선은 그리는 쪽 몫 */
|
|
export function tableOptionsOf(spec: TabTable, tab?: TabId): DataTableOptions {
|
|
return {
|
|
columns: spec.columns,
|
|
rows: spec.rows,
|
|
total: spec.total ?? null,
|
|
frozen: spec.frozen ?? 0,
|
|
empty: "",
|
|
caption: TABS.find(([id]) => id === tab)?.[1],
|
|
editable: spec.editable,
|
|
// 243-1 고칠 수 있는 칸 = 모든 표 더블클릭 · Enter · F2 (설계내역서 키 = 레벨 키 몫)
|
|
editOnDouble: spec.editOnDouble ?? true,
|
|
keyEdit: !(spec as BillTable).menu,
|
|
onEdit: spec.onEdit,
|
|
rowClass: spec.rowClass,
|
|
cellClass: spec.cellClass,
|
|
level: spec.level,
|
|
mergeSame: spec.mergeSame,
|
|
};
|
|
}
|