import { useState, useEffect, useRef } from 'react'; import { useTranslation } from 'react-i18next'; import { GripVertical, Eye, EyeOff, ChevronUp, ChevronDown, RotateCcw } from 'lucide-react'; import { Card, CardContent } from './Card'; import { Button } from './Button'; export interface ColumnConfig { id: string; label: string; visible: boolean; } interface ColumnConfigModalProps { isOpen: boolean; onClose: () => void; columns: ColumnConfig[]; defaultColumns: ColumnConfig[]; onSave: (columns: ColumnConfig[]) => void; } export function ColumnConfigModal({ isOpen, onClose, columns, defaultColumns, onSave }: ColumnConfigModalProps) { const { t } = useTranslation(); const [localColumns, setLocalColumns] = useState(columns); const [draggedIndex, setDraggedIndex] = useState(null); const draggedIndexRef = useRef(null); useEffect(() => { if (isOpen) { setLocalColumns(columns.map((c) => ({ ...c }))); } }, [isOpen, columns]); useEffect(() => { if (!isOpen) return; const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [isOpen, onClose]); if (!isOpen) return null; const toggleVisibility = (index: number) => { setLocalColumns((prev) => prev.map((col, i) => (i === index ? { ...col, visible: !col.visible } : col)) ); }; const moveColumn = (fromIndex: number, toIndex: number) => { if (toIndex < 0 || toIndex >= localColumns.length) return; setLocalColumns((prev) => { const newColumns = [...prev]; const [moved] = newColumns.splice(fromIndex, 1); newColumns.splice(toIndex, 0, moved); return newColumns; }); }; const handleDragStart = (e: React.DragEvent, index: number) => { draggedIndexRef.current = index; setDraggedIndex(index); e.dataTransfer.effectAllowed = 'move'; }; const handleDragOver = (e: React.DragEvent, index: number) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; const from = draggedIndexRef.current; if (from !== null && from !== index) { moveColumn(from, index); draggedIndexRef.current = index; setDraggedIndex(index); } }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); }; const handleDragEnd = () => { draggedIndexRef.current = null; setDraggedIndex(null); }; const resetToDefaults = () => { setLocalColumns(defaultColumns.map((c) => ({ ...c }))); }; const handleSave = () => { onSave(localColumns); onClose(); }; const visibleCount = localColumns.filter((c) => c.visible).length; return (
e.stopPropagation()}> {/* Header */}

{t('inventory.configureColumns')}

{t('inventory.configureColumnsDesc')} ({visibleCount} {t('inventory.of')} {localColumns.length} {t('inventory.visible')})

{/* Column list */}
{localColumns.map((column, index) => (
handleDragStart(e, index)} onDragOver={(e) => handleDragOver(e, index)} onDrop={handleDrop} onDragEnd={handleDragEnd} > {/* Drag Handle */}
{/* Column Name */} {column.label} {/* Move Buttons */}
{/* Visibility Toggle */}
))}
{/* Footer */}
); }