feat(B07): CAD 명령 TOAREA 면적산출로 보내기 · 부모 요청 export-table 메시지(83-2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015KYZ2HWWdUwZWYnn3tQz7X
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
* CAD → 부모 화면 표 보내기(M02 83장 · 도면 → 면적산출 한 번 옮기기 · 연동 아님). 짝 = `M02_MasterTemplete_AreaDrawing.ts`.
|
||||
* export-table-request 부모 [면적산출로 보내기] 단추 → 고른 범위를 표 자료로
|
||||
* export-table{table} 표 자료(`helpers/table-from-drawing.ts` 꼴) → 부모가 새 시트로
|
||||
* CAD 명령 TOAREA(「면적산출로 보내기」)도 같은 길. 보기 전용 도면에서도 됨(도면을 안 바꿈).
|
||||
* 고른 것이 없거나 옮길 글이 없으면 부모에 안 보내고 안내만.
|
||||
*/
|
||||
import { toast } from 'react-toastify';
|
||||
import type { DrawingEntityJson } from '../helpers/table-from-drawing.ts';
|
||||
import { type DrawingTable, tableFromDrawing } from '../helpers/table-from-drawing.ts';
|
||||
import { getSelectedEntities } from '../state.ts';
|
||||
|
||||
export const AISLO_EXPORT_TABLE_REQUEST_MESSAGE = 'aislo:b08:export-table-request';
|
||||
export const AISLO_EXPORT_TABLE_MESSAGE = 'aislo:b08:export-table';
|
||||
|
||||
const TEXT = {
|
||||
empty: '면적산출로 보낼 범위를 먼저 고르세요(누름 · 끌기).',
|
||||
noText: '고른 범위에 글이 없어 표로 옮길 것이 없습니다.',
|
||||
standalone: '면적산출 화면에서 연 도면에서만 보낼 수 있습니다.',
|
||||
};
|
||||
|
||||
type Notify = (type: string, payload: Record<string, unknown>) => void;
|
||||
|
||||
function notifyParent(type: string, payload: Record<string, unknown>): void {
|
||||
if (window.parent === window) return;
|
||||
window.parent.postMessage({ type, ...payload }, window.location.origin);
|
||||
}
|
||||
|
||||
/** 고른 범위 → 표 자료 · 고른 것이 없으면 'empty' · 글이 없으면 'no-text' */
|
||||
export async function selectionTable(): Promise<DrawingTable | 'empty' | 'no-text'> {
|
||||
const selected = getSelectedEntities();
|
||||
if (!selected.length) return 'empty';
|
||||
const json = (await Promise.all(selected.map((entity) => entity.toJson()))).filter(
|
||||
(entity): entity is NonNullable<typeof entity> => Boolean(entity)
|
||||
);
|
||||
return tableFromDrawing(json as DrawingEntityJson[]) ?? 'no-text';
|
||||
}
|
||||
|
||||
/** 고른 범위를 표로 만들어 부모에 보냄 — 보냈으면 true */
|
||||
export async function sendSelectionTable(notify: Notify = notifyParent): Promise<boolean> {
|
||||
const result = await selectionTable();
|
||||
if (result === 'empty') toast.info(TEXT.empty);
|
||||
else if (result === 'no-text') toast.info(TEXT.noText);
|
||||
else {
|
||||
notify(AISLO_EXPORT_TABLE_MESSAGE, { table: result });
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/** CAD 명령 TOAREA — 부모 없이 띄운 CAD(단독)면 안내만 */
|
||||
export function runSendSelectionTable(): string {
|
||||
if (window.parent === window) {
|
||||
toast.info(TEXT.standalone);
|
||||
return '부모 화면 없음';
|
||||
}
|
||||
void sendSelectionTable();
|
||||
return '면적산출로 보내기';
|
||||
}
|
||||
|
||||
/** 부모 요청 메시지면 처리하고 true */
|
||||
export async function handleTableExportMessage(
|
||||
data: unknown,
|
||||
notify: Notify = notifyParent
|
||||
): Promise<boolean> {
|
||||
const message = data as { type?: string } | null;
|
||||
if (
|
||||
!message ||
|
||||
typeof message !== 'object' ||
|
||||
message.type !== AISLO_EXPORT_TABLE_REQUEST_MESSAGE
|
||||
)
|
||||
return false;
|
||||
await sendSelectionTable(notify);
|
||||
return true;
|
||||
}
|
||||
|
||||
/** 부모 [면적산출로 보내기] 요청을 받음 — 같은 출처 · 부모 창만 */
|
||||
export function registerAisloTableExport(): void {
|
||||
window.addEventListener('message', (event: MessageEvent<unknown>) => {
|
||||
if (event.origin !== window.location.origin || event.source !== window.parent) return;
|
||||
void handleTableExportMessage(event.data);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user