import React, { useState, useMemo } from 'react'; import { X, Download, ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'; import html2canvas from 'html2canvas'; const DataTableModal = ({ isOpen, onClose, data }) => { const [sortConfig, setSortConfig] = useState({ key: null, direction: 'ascending' }); if (!isOpen || !data) return null; const sortedRows = useMemo(() => { let sortableItems = [...(data.rows || [])]; if (sortConfig.key !== null) { sortableItems.sort((a, b) => { let aValue = a.values[sortConfig.key] || ''; let bValue = b.values[sortConfig.key] || ''; // Try numeric sort const aNum = parseFloat(aValue.replace(/[^0-9.-]+/g, "")); const bNum = parseFloat(bValue.replace(/[^0-9.-]+/g, "")); if (!isNaN(aNum) && !isNaN(bNum)) { if (aNum < bNum) return sortConfig.direction === 'ascending' ? -1 : 1; if (aNum > bNum) return sortConfig.direction === 'ascending' ? 1 : -1; return 0; } if (aValue < bValue) { return sortConfig.direction === 'ascending' ? -1 : 1; } if (aValue > bValue) { return sortConfig.direction === 'ascending' ? 1 : -1; } return 0; }); } return sortableItems; }, [data.rows, sortConfig]); const requestSort = (key) => { let direction = 'ascending'; if (sortConfig.key === key && sortConfig.direction === 'ascending') { direction = 'descending'; } setSortConfig({ key, direction }); }; const handleDownloadImage = async () => { const element = document.getElementById('data-table-export'); if (!element) return; try { const canvas = await html2canvas(element, { backgroundColor: '#1f1f1f' }); // Dark bg match const dataUrl = canvas.toDataURL('image/png'); const link = document.createElement('a'); link.download = `${data.title || 'data-table'}.png`; link.href = dataUrl; link.click(); } catch (err) { console.error("Export failed:", err); } }; return (
{/* Header */}

{data.title || "Data Table"}

AI-extracted comparative analysis

{/* Content - Scrollable */}
{data.columns?.map(col => ( ))} {sortedRows.length > 0 ? ( sortedRows.map((row, idx) => ( {data.columns?.map(col => ( ))} )) ) : ( )}
Entity requestSort(col.key)} className="p-4 text-sm font-semibold text-gray-300 border-r border-white/10 cursor-pointer hover:bg-white/5 min-w-[150px] group select-none" >
{col.label} {sortConfig.key === col.key ? ( sortConfig.direction === 'ascending' ? : ) : }
{row.entity} {row.values[col.key] || '-'}
No data available.
Generated by Vertical.ai • Research Assistant
); }; export default DataTableModal;