/** * Модальное окно для экспорта данных */ 'use client'; import { useState } from 'react'; import { exportToExcel } from '@/lib/export/excel'; import { exportToCSV } from '@/lib/export/csv'; import { exportToPDF } from '@/lib/export/pdf'; import { exportToJSON } from '@/lib/export/json'; interface ExportModalProps { isOpen: boolean; onClose: () => void; data: any[]; filename?: string; title?: string; availableColumns?: string[]; columnLabels?: Record; } export default function ExportModal({ isOpen, onClose, data, filename = 'export', title = 'Экспорт данных', availableColumns, columnLabels = {}, }: ExportModalProps) { const [selectedFormat, setSelectedFormat] = useState<'excel' | 'csv' | 'pdf' | 'json'>('excel'); const [selectedColumns, setSelectedColumns] = useState( availableColumns || (data.length > 0 ? Object.keys(data[0]) : []) ); const [exportFilename, setExportFilename] = useState(filename); if (!isOpen) return null; const allColumns = availableColumns || (data.length > 0 ? Object.keys(data[0]) : []); const handleExport = () => { const headers = selectedColumns.map((col) => columnLabels[col] || col); switch (selectedFormat) { case 'excel': exportToExcel(data, { filename: exportFilename, headers, columns: selectedColumns, }); break; case 'csv': exportToCSV(data, { filename: exportFilename, headers, columns: selectedColumns, }); break; case 'pdf': exportToPDF(data, { filename: exportFilename, title, headers, columns: selectedColumns, }); break; case 'json': exportToJSON(data, { filename: exportFilename, }); break; } onClose(); }; const toggleColumn = (column: string) => { setSelectedColumns((prev) => prev.includes(column) ? prev.filter((c) => c !== column) : [...prev, column] ); }; const selectAll = () => { setSelectedColumns([...allColumns]); }; const deselectAll = () => { setSelectedColumns([]); }; return (
e.stopPropagation()} >

{title}

{/* Формат экспорта */}
{(['excel', 'csv', 'pdf', 'json'] as const).map((format) => ( ))}
{/* Имя файла */}
setExportFilename(e.target.value)} style={{ width: '100%', padding: '10px', border: '1px solid #ccc', borderRadius: '4px', fontSize: '14px', }} />
{/* Выбор колонок */} {selectedFormat !== 'json' && (
{allColumns.map((column) => ( ))}
)} {/* Информация */}
Будет экспортировано: {data.length} записей
{/* Кнопки */}
); }