import React from 'react'; import { useNavigate } from 'react-router-dom'; import { ShieldCheck, Clock, ExternalLink } from 'lucide-react'; import { formatTimelineDate } from '../../utils/dateUtils'; const categoryDotColors = { 'Hardware': '#f97316', 'Network': '#3b82f6', 'Access': '#8b5cf6', 'Software': '#16a34a', 'Human Resources': '#ec4899', 'Other': '#6b7280' }; const TicketTable = ({ tickets = [], isLoading = false, limit = null }) => { const navigate = useNavigate(); const teamMap = { 'Network': 'Network Services', 'Hardware': 'IT Inventory', 'Software': 'Cloud Apps Team', 'Access': 'Security Ops', 'Human Resources': 'HR Systems', 'Other': 'IT Service Desk' }; const getPriorityStyle = (priority) => { const p = priority?.toLowerCase(); if (p === 'critical') return { background: '#FEF2F2', color: '#DC2626', border: '1px solid #FECACA' }; if (p === 'high') return { background: '#FFF7ED', color: '#EA580C', border: '1px solid #FED7AA' }; if (p === 'medium') return { background: '#FEFCE8', color: '#CA8A04', border: '1px solid #FDE68A' }; return { background: '#F0FDF4', color: '#16A34A', border: '1px solid #BBF7D0' }; }; const getStatusStyle = (status) => { const s = status?.toLowerCase() || ''; if (s.includes('resolv')) return { bg: '#f1f5f9', text: '#64748b', border: '#e2e8f0' }; if (s.includes('progress')) return { bg: '#eff6ff', text: '#2563eb', border: '#bfdbfe' }; return { bg: '#fffbeb', text: '#d97706', border: '#fde68a' }; }; const displayTickets = limit ? tickets.slice(0, limit) : tickets; if (isLoading) return (

Synchronizing System Data...

); if (displayTickets.length === 0) return (

No Active Tickets

All systems green. No tickets require review.

); return (
{['Ticket ID', 'Ticket Info', 'Category', 'Priority', 'Assigned Team', 'Status'].map((h, i) => ( ))} {displayTickets.map((ticket) => { const effectiveCategory = ticket.correction?.corrected_category || ticket.category; const effectiveSubcategory = ticket.correction?.corrected_subcategory || ticket.subcategory; const effectivePriority = ticket.correction?.corrected_priority || ticket.priority; const effectiveTeam = ticket.reassigned_at ? ticket.assigned_team : (teamMap[effectiveCategory] || ticket.assigned_team || 'L1 Helpdesk'); const statusSt = getStatusStyle(ticket.status); // Truncated subject const subject = ticket.subject || ticket.summary || 'Untitled ticket'; const truncSubject = subject.length > 28 ? subject.slice(0, 28) + '...' : subject; // Ticket ID truncated const tid = ticket.ticket_id || ticket.id || ''; const truncId = tid.length > 8 ? tid.slice(0, 8) + '...' : tid; // User initial const userProfile = ticket.creator || ticket.profiles; const userName = userProfile?.full_name || ticket.user_name || 'User'; const initial = userName.charAt(0).toUpperCase(); const profilePic = userProfile?.profile_picture; return ( navigate(`/admin/ticket/${ticket.ticket_id || ticket.id}`)} className="cursor-pointer group transition-colors hover:bg-[#f0fdf4]" style={{ borderBottom: '1px solid #f9fafb' }} > {/* Request Identity */} {/* Incident Context - FIXED */} {/* Category with colored dot */} {/* Risk Factor */} {/* Assigned Ops */} {/* Status */} ); })}
{h}
#{truncId}
{formatTimelineDate(ticket.created_at || ticket.createdAt || ticket.timestamp)}
{profilePic ? ( {userName} ) : (
{initial}
)}
{truncSubject} {effectiveCategory || 'General'}
{effectiveCategory} {effectiveSubcategory && {effectiveSubcategory}}
{effectivePriority || 'NORMAL'}
{effectiveTeam?.charAt(0)}
{effectiveTeam}
{ticket.status?.replace('by Human Support', '').trim()}
); }; export default TicketTable;