import { useState, useCallback } from 'react' /** Columna genérica del kanban */ interface ColumnaDef { id: string titulo: string color: string } interface KanbanViewProps { items: T[] columnas: ColumnaDef[] obtenerColumna: (item: T) => string onCambiarEstado: (itemId: string, nuevoEstado: string, fuente?: string) => void renderCard?: (item: T) => React.ReactNode /** Click en la tarjeta: abre la bitácora/detalle del registro */ onVerItem?: (item: T) => void } export default function KanbanView({ items, columnas, obtenerColumna, onCambiarEstado, renderCard, onVerItem, }: KanbanViewProps) { const [arrastrando, setArrastrando] = useState(null) const onDragStart = useCallback((e: React.DragEvent, itemId: string) => { e.dataTransfer.setData('text/plain', itemId) e.dataTransfer.effectAllowed = 'move' setArrastrando(itemId) }, []) const onDragOver = useCallback((e: React.DragEvent) => { e.preventDefault() e.dataTransfer.dropEffect = 'move' }, []) const onDrop = useCallback((e: React.DragEvent, columnaId: string) => { e.preventDefault() const itemId = e.dataTransfer.getData('text/plain') setArrastrando(null) if (itemId === '') return const item = items.find((i) => i.id === itemId) if (!item || obtenerColumna(item) === columnaId) return onCambiarEstado(itemId, columnaId) }, [items, obtenerColumna, onCambiarEstado]) return (
{columnas.map((col) => { const itemsCol = items.filter((item) => obtenerColumna(item) === col.id) return (
void onDrop(e, col.id)} >

{col.titulo}

{itemsCol.length}
{itemsCol.map((item) => (
void onDragStart(e, item.id)} onClick={onVerItem ? () => onVerItem(item) : undefined} role={onVerItem ? 'button' : undefined} tabIndex={onVerItem ? 0 : undefined} onKeyDown={onVerItem ? (e) => { if (e.key === 'Enter') onVerItem(item) } : undefined} className={`rounded-lg border border-[#E5E7EB] bg-white p-2.5 shadow-sm transition-opacity dark:border-[#334155] dark:bg-[#1E293B] ${arrastrando === item.id ? 'opacity-50' : ''} ${onVerItem ? 'cursor-pointer hover:border-accent' : ''}`} > {renderCard ? renderCard(item) : ( <>

{item.nombre}

{item.telefono &&

{item.telefono}

} {item.unidadCodigo &&

{item.unidadCodigo}

} )}
))} {itemsCol.length === 0 && (

Sin items

)}
) })}
) }