import React, { useState, useMemo } from "react"; import { EventData, EventStatus, UserRole } from "../types"; import { CheckCircle, ArrowUpDown, ArrowUp, ArrowDown } from "lucide-react"; import { STATUS_COLORS } from "../constants"; interface EventTableProps { events: EventData[]; onEventClick: (event: EventData) => void; onApprove?: (e: React.MouseEvent, eventId: string) => void; userRole: UserRole; currentProfessionalId?: string; onAssignmentResponse?: (e: React.MouseEvent, eventId: string, status: string, reason?: string) => void; } type SortField = | "fot" | "date" | "curso" | "instituicao" | "anoFormatura" | "empresa" | "type" | "status"; type SortOrder = "asc" | "desc" | null; export const EventTable: React.FC = ({ events, onEventClick, onApprove, userRole, currentProfessionalId, onAssignmentResponse, }) => { const canApprove = userRole === UserRole.BUSINESS_OWNER || userRole === UserRole.SUPERADMIN; const isPhotographer = userRole === UserRole.PHOTOGRAPHER; const [sortField, setSortField] = useState(null); const [sortOrder, setSortOrder] = useState(null); const handleSort = (field: SortField) => { if (sortField === field) { if (sortOrder === "asc") { setSortOrder("desc"); } else if (sortOrder === "desc") { setSortOrder(null); setSortField(null); } } else { setSortField(field); setSortOrder("asc"); } }; const sortedEvents = useMemo(() => { if (!sortField || !sortOrder) { return events; } const sorted = [...events].sort((a, b) => { let aValue: any; let bValue: any; switch (sortField) { case "fot": aValue = (a as any).fotId || ""; bValue = (b as any).fotId || ""; break; case "date": aValue = new Date(a.date + "T00:00:00").getTime(); bValue = new Date(b.date + "T00:00:00").getTime(); break; case "curso": aValue = ((a as any).curso || "").toLowerCase(); bValue = ((b as any).curso || "").toLowerCase(); break; case "instituicao": aValue = ((a as any).instituicao || "").toLowerCase(); bValue = ((b as any).instituicao || "").toLowerCase(); break; case "anoFormatura": aValue = (a as any).anoFormatura || 0; bValue = (b as any).anoFormatura || 0; break; case "empresa": aValue = ((a as any).empresa || "").toLowerCase(); bValue = ((b as any).empresa || "").toLowerCase(); break; case "type": aValue = a.type.toLowerCase(); bValue = b.type.toLowerCase(); break; case "status": aValue = a.status.toLowerCase(); bValue = b.status.toLowerCase(); break; default: return 0; } if (aValue < bValue) return sortOrder === "asc" ? -1 : 1; if (aValue > bValue) return sortOrder === "asc" ? 1 : -1; return 0; }); return sorted; }, [events, sortField, sortOrder]); const getSortIcon = (field: SortField) => { if (sortField !== field) { return ( ); } if (sortOrder === "asc") { return ; } return ; }; const formatDate = (date: string) => { const eventDate = new Date(date + "T00:00:00"); return eventDate.toLocaleDateString("pt-BR", { day: "2-digit", month: "2-digit", year: "numeric", }); }; const getStatusDisplay = (status: EventStatus) => { const statusLabels: Record = { [EventStatus.PENDING_APPROVAL]: "Pendente", [EventStatus.CONFIRMED]: "Confirmado", [EventStatus.PLANNING]: "Planejamento", [EventStatus.IN_PROGRESS]: "Em Andamento", [EventStatus.DELIVERED]: "Entregue", [EventStatus.ARCHIVED]: "Arquivado", }; return statusLabels[status] || status; }; return (
{(canApprove || isPhotographer) && ( )} {sortedEvents.map((event) => { // Logic to find photographer assignment status let photographerAssignment = null; if (isPhotographer && currentProfessionalId && event.assignments) { photographerAssignment = event.assignments.find(a => a.professionalId === currentProfessionalId); } return ( onEventClick(event)} className="hover:bg-gray-50 cursor-pointer transition-colors" > {(canApprove || isPhotographer) && ( )} ); })}
handleSort("fot")} >
FOT {getSortIcon("fot")}
handleSort("date")} >
Data {getSortIcon("date")}
handleSort("curso")} >
Curso {getSortIcon("curso")}
handleSort("instituicao")} >
Instituição {getSortIcon("instituicao")}
handleSort("anoFormatura")} >
Ano Formatura {getSortIcon("anoFormatura")}
handleSort("empresa")} >
Empresa {getSortIcon("empresa")}
handleSort("type")} >
Tipo Evento {getSortIcon("type")}
handleSort("status")} >
Status {getSortIcon("status")}
Ações
{event.fot || "-"} {formatDate(event.date)} {event.curso || "-"} {event.instituicao || "-"} {event.anoFormatura || "-"} {event.empresa || "-"} {event.type} {getStatusDisplay(event.status)} e.stopPropagation()} >
{canApprove && event.status === EventStatus.PENDING_APPROVAL && ( )} {isPhotographer && photographerAssignment && ( <> {photographerAssignment.status === "PENDENTE" && ( <> )} {photographerAssignment.status === "ACEITO" && ( Aceito )} {photographerAssignment.status === "REJEITADO" && ( Rejeitado )} )}
{sortedEvents.length === 0 && (

Nenhum evento encontrado.

)}
); };