// frontend/src/components/TablaTitulares.tsx import { Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Chip, IconButton, Typography, Link } from '@mui/material'; import DeleteIcon from '@mui/icons-material/Delete'; import DragHandleIcon from '@mui/icons-material/DragHandle'; import EditIcon from '@mui/icons-material/Edit'; import { DndContext, closestCenter, PointerSensor, useSensor, useSensors, type DragEndEvent } from '@dnd-kit/core'; import { arrayMove, SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; import type { Titular } from '../types'; interface SortableRowProps { titular: Titular; onDelete: (id: number) => void; onEdit: (titular: Titular) => void; } const SortableRow = ({ titular, onDelete, onEdit }: SortableRowProps) => { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: titular.id }); const style = { transform: CSS.Transform.toString(transform), transition, }; const getChipColor = (tipo: Titular['tipo']): "success" | "warning" | "info" => { if (tipo === 'Edited') return 'warning'; if (tipo === 'Manual') return 'info'; return 'success'; }; const formatFuente = (fuente: string | null) => { if (!fuente) return 'N/A'; try { const url = new URL(fuente); return url.hostname.replace('www.', ''); } catch { return fuente; } } return ( {titular.texto} {titular.urlFuente ? ( {formatFuente(titular.fuente)} ) : ( formatFuente(titular.fuente) )} { e.stopPropagation(); onEdit(titular); }}> { e.stopPropagation(); onDelete(titular.id); }} sx={{ color: '#ef4444' }}> ); }; interface TablaTitularesProps { titulares: Titular[]; onReorder: (titulares: Titular[]) => void; onDelete: (id: number) => void; onEdit: (titular: Titular) => void; } const TablaTitulares = ({ titulares, onReorder, onDelete, onEdit }: TablaTitularesProps) => { const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 8 } })); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (over && active.id !== over.id) { const oldIndex = titulares.findIndex((item) => item.id === active.id); const newIndex = titulares.findIndex((item) => item.id === over.id); onReorder(arrayMove(titulares, oldIndex, newIndex)); } }; if (titulares.length === 0) { return ( No hay titulares para mostrar. ); } return ( t.id)} strategy={verticalListSortingStrategy}> Texto del Titular Tipo Fuente Acciones {titulares.map((titular) => ( ))}
); }; export default TablaTitulares;