import React, { useState } from 'react'; import { Modal, Form, Select, Button, Typography, Alert } from 'antd'; import { ExportOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { designTokens } from '../config/theme'; const { Option } = Select; const { Text } = Typography; const modalHeaderStyle = { display: 'flex', alignItems: 'center', gap: '8px', fontSize: '18px', fontWeight: 600, }; const PortExportModal = ({ visible, filters, totalCount, currentPageCount, selectedCount, onExport, onCancel, }) => { const [exportScope, setExportScope] = useState('filtered'); const [exportFormat, setExportFormat] = useState('xlsx'); const [exportLoading, setExportLoading] = useState(false); const handleExport = async () => { setExportLoading(true); try { await onExport({ scope: exportScope, format: exportFormat, }); onCancel(); } finally { setExportLoading(false); } }; const getScopeLabel = () => { switch (exportScope) { case 'selected': return `已选端口 (${selectedCount} 个)`; case 'currentPage': return `当前页 (${currentPageCount} 个)`; case 'filtered': return `筛选结果 (${totalCount} 个)`; default: return ''; } }; const getActiveFilterInfo = () => { const activeFilters = []; if (filters.deviceId) activeFilters.push(`设备ID: ${filters.deviceId}`); if (filters.status && filters.status !== 'all') activeFilters.push(`状态: ${filters.status}`); if (filters.portType && filters.portType !== 'all') activeFilters.push(`类型: ${filters.portType}`); if (filters.portSpeed && filters.portSpeed !== 'all') activeFilters.push(`速率: ${filters.portSpeed}`); if (filters.searchText) activeFilters.push(`搜索: ${filters.searchText}`); return activeFilters; }; const activeFilters = getActiveFilterInfo(); return ( 导出端口数据 } open={visible} onCancel={onCancel} footer={[ , , ]} destroyOnHidden styles={{ header: { borderBottom: '1px solid #f0f0f0', padding: '16px 24px', position: 'relative', }, body: { padding: '24px' }, }} width={500} >
{activeFilters.length > 0 && (
当前筛选条件:
{activeFilters.map((filter, index) => ( {filter} ))}
)} } message={
导出将包含以下字段:端口ID、设备ID、设备名称、设备类型、机房、机架、网卡名称、端口名称、端口类型、端口速率、状态、VLAN ID、描述、创建时间
} style={{ marginTop: '12px' }} /> {totalCount > 50000 && ( 当前数据量较大({totalCount} 条),导出可能需要较长时间。系统最大支持导出 50000 条数据。 } style={{ marginTop: '12px' }} /> )}
); }; export default React.memo(PortExportModal);