Files
SPipe/src/ExportMenu.tsx
T
bjkim1 21ebb16fb7 SPipe 데모 v2 (2026-10-30) 서버 배포본
- SPipe_server_2026-10-30.zip 내용을 풀어서 등록 (압축 파일은 올리지 않음)
- README에 데모 v2 서버 업데이트 순서 추가, 저장소에 없는 문서 목차 정리
- 패치내역을 docs/로 이동, _worklog.md 추가
- 임시 파일(backend/temp.*)과 API 키가 든 파일은 제외
2026-10-30 11:00:46 +09:00

108 lines
3.5 KiB
TypeScript

import React from 'react';
import { Camera, ChevronDown, Download, FileText, Layers, Table } from 'lucide-react';
interface ExportMenuProps {
open: boolean;
onToggle: () => void;
onClose: () => void;
disabled: boolean;
hasResult: boolean;
onExportInp: () => void;
onExportNet: () => void;
onExportXlsx: () => void;
onExportDxf: () => void;
onExportCsv: () => void;
onCaptureMap: () => void;
onExportShapefile: () => void;
onShowInpText: () => void;
onOpenAttributeTable: () => void;
}
/** Header "내보내기" dropdown. Result-based exports are disabled until a run exists. */
export const ExportMenu: React.FC<ExportMenuProps> = ({
open,
onToggle,
onClose,
disabled,
hasResult,
onExportInp,
onExportNet,
onExportXlsx,
onExportDxf,
onExportCsv,
onCaptureMap,
onExportShapefile,
onShowInpText,
onOpenAttributeTable,
}) => {
const act = (fn: () => void) => () => {
fn();
onClose();
};
return (
<div className="dropdown-container">
<button
onClick={(e) => {
e.stopPropagation();
onToggle();
}}
disabled={disabled}
className="btn btn-secondary"
title="INP, DXF, XLSX, CSV 등 내보내기"
>
<Download size={14} />
<span>내보내기</span>
<ChevronDown size={12} style={{ opacity: 0.6 }} />
</button>
{open && (
<div className="dropdown-menu align-right" style={{ width: '220px' }}>
<div className="dropdown-header">EPANET 모델 파일</div>
<button className="dropdown-item" onClick={act(onExportInp)}>
<FileText size={14} />
<span>.inp 모델 파일 다운로드</span>
</button>
<button className="dropdown-item" onClick={act(onExportNet)}>
<FileText size={14} />
<span>.net 네트워크 바이너리</span>
</button>
<div className="dropdown-divider" />
<div className="dropdown-header">엔지니어링 산출물</div>
<button className="dropdown-item" disabled={!hasResult} onClick={act(onExportXlsx)}>
<Table size={14} />
<span>검토용 수리계산서 (.xlsx)</span>
</button>
<button className="dropdown-item" onClick={act(onExportDxf)}>
<Layers size={14} />
<span>AutoCAD 표준 도면 (.dxf)</span>
</button>
<button className="dropdown-item" disabled={!hasResult} onClick={act(onExportCsv)}>
<FileText size={14} />
<span>24h 시계열 수치 (.csv)</span>
</button>
<div className="dropdown-divider" />
<button className="dropdown-item" onClick={act(onCaptureMap)}>
<Camera size={14} />
<span>지도 화면 캡처 (.png)</span>
</button>
<button className="dropdown-item" onClick={act(onExportShapefile)}>
<Layers size={14} />
<span>GIS Shapefile (.zip)</span>
</button>
<button className="dropdown-item" onClick={act(onShowInpText)}>
<FileText size={14} />
<span>INP 텍스트 전문 보기</span>
</button>
<button className="dropdown-item" onClick={act(onOpenAttributeTable)}>
<Table size={14} />
<span>속성 테이블 열기</span>
</button>
</div>
)}
</div>
);
};