- SPipe_server_2026-10-30.zip 내용을 풀어서 등록 (압축 파일은 올리지 않음) - README에 데모 v2 서버 업데이트 순서 추가, 저장소에 없는 문서 목차 정리 - 패치내역을 docs/로 이동, _worklog.md 추가 - 임시 파일(backend/temp.*)과 API 키가 든 파일은 제외
108 lines
3.5 KiB
TypeScript
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>
|
|
);
|
|
};
|