/* ============================================================================= * M02_MasterTemplete_Labor_Detail.ts * 일위대가 상세 입구(PLAN 39-3 · 806-1) — 구조물 열마다 하나(`labor/<열>.json`) · 일위대가 서고(사전조합) · * 구조물 조합 카드 · 일위조합 참조 모달이 모두 부르는 자리. 화면은 **한 부품**(`Labor_Table` — 일위대가 컨테이너) — * · `mode: "precombo"` = 컨테이너(서고 · 정보 칸 · 수량 칸 손 입력) * · `mode` 없음 = 구조물 조합(면적산출 잇기 · 수량산출 모달 · 규격 열 · 다이어그램 = `Labor_Combo` 덧칸) * · `card` = 조합 카드 갈래(정보 칸 · 원문 패널 · 다이어그램 · [항목 추가] 없음) * 줄 누름 = 줄 갈래마다 모달(단가산출 SK 줄 = `Labor_SkEdit` 수식 탭) — 옛 조합 전용 표 · 단가산출 보기 모달은 걷음. * 양식 길 읽기 · [저장] · [다시 읽기]는 UI_Main. * ========================================================================== */ import type { DataColumn } from "@ui/ui_template_data_table"; import type { Layer } from "./M02_MasterTemplete_Api_Fetch"; import type { LaborCalc, LaborDoc } from "./M02_MasterTemplete_Labor_Api"; import { mountLaborTable } from "./M02_MasterTemplete_Labor_Table"; export interface LaborDetailOptions { layer: Layer; column: string; readOnly: boolean; /** 저장 안 한 고침이 생기거나 사라짐 */ onChanged: (dirty: boolean) => void; /** 구조물 조합 카드 갈래(43-4) — 단가산출 로직 표 + 자재목록만 · 위로 · 아래로 · 항목 추가 · * 정보(단위 · 본뜬) · 다이어그램 없음 · 옵션 · 삭제 · 줄 · 수량 모달은 상세와 같음 */ card?: boolean; /** 일위대가 사전조합 서고(50-3) — 사전조합 문서(`column` = 키) */ mode?: "precombo"; /** 덧칸(809-1 불러오기 [수정] 보기 · 읽기만) — 줄 표지 · 엑셀 금액 열 · 줄 누름 가로챔 */ view?: LaborView; /** 그 층 주인(134-3 · 사전조합 층 · null = 자기 층) — 없으면 페이지 층 것 */ owner?: string | null; /** 셈 · 면적 자리 주입(142-1 · 고르기 모달 = 프로젝트 복사본) — 없으면 층 길 */ calc?: (doc: LaborDoc, 수량?: Record) => Promise; readArea?: () => Promise<{ 문서: unknown; 판?: string | null }>; } /** 덧칸 — `cell(n, 열)` = 문서 줄 n 의 값 · `onRow(n)` 참 = 기본 줄 모달 안 엶 */ export interface LaborView { cols: DataColumn[]; cell: (n: number, key: string) => string | number | null; tone?: (n: number, key: string) => string | null; onRow?: (n: number) => boolean; } export interface LaborDetailHandle { getDoc: () => LaborDoc; /** [엑셀에서 고르기]로 바뀐 면적산출 문서를 저장(일위대가 [저장] 앞) · 저장했으면 참(없으면 거짓) — * 서버가 면적 저장 때 그 열 일위대가 계산값을 다시 적어 일위대가 판이 바뀜 → 부르는 쪽이 판을 다시 읽음 */ saveArea: () => Promise; destroy: () => void; } export function mountLaborDetail( host: HTMLElement, doc: unknown, opt: LaborDetailOptions, ): LaborDetailHandle { return mountLaborTable(host, doc, opt); }