'use client'; import { useState, useEffect } from 'react'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; import { Ticket as TicketIcon, Building2, User, Calendar, Clock, AlertCircle, CheckCircle, ExternalLink, Loader2 } from 'lucide-react'; interface TicketDetailModalProps { ticketNumber: string; open: boolean; onOpenChange: (open: boolean) => void; } export function TicketDetailModal({ ticketNumber, open, onOpenChange }: TicketDetailModalProps) { const [ticket, setTicket] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchTicketDetails = async () => { setLoading(true); setError(null); setTicket(null); try { const response = await fetch('/api/tickets'); if (response.ok) { const data = await response.json(); const matchingTicket = data.tickets?.find((t: any) => t.ticketNumber === ticketNumber); if (matchingTicket) { const detailResponse = await fetch(`/api/tickets/${matchingTicket.id}`); if (detailResponse.ok) { const detailData = await detailResponse.json(); setTicket(detailData.ticket); } else { setError('Failed to fetch ticket details'); } } else { setError(`Ticket ${ticketNumber} not found`); } } else { setError('Failed to fetch tickets list'); } } catch (err) { setError('Failed to fetch ticket'); console.error('Error fetching ticket:', err); } finally { setLoading(false); } }; // Fetch ticket when modal opens useEffect(() => { if (open && ticketNumber) { fetchTicketDetails(); } }, [open, ticketNumber]); const handleOpenChange = (newOpen: boolean) => { onOpenChange(newOpen); }; const getStatusBadge = (status: number) => { const statusMap: Record = { 1: { label: "New", variant: "default" }, 5: { label: "Complete", variant: "secondary" }, 8: { label: "In Progress", variant: "default" }, }; const config = statusMap[status] || { label: `Status ${status}`, variant: "outline" }; return {config.label}; }; const getPriorityBadge = (priority: number) => { const priorityMap: Record = { 1: { label: "Critical", variant: "destructive" }, 2: { label: "High", variant: "destructive" }, 3: { label: "Medium", variant: "default" }, 4: { label: "Low", variant: "secondary" }, }; const config = priorityMap[priority] || { label: `Priority ${priority}`, variant: "outline" as any }; return {config.label}; }; const formatDate = (dateString?: string) => { if (!dateString) return 'N/A'; return new Date(dateString).toLocaleString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; return ( Ticket Details Viewing ticket information from Autotask PSA {loading && (
)} {error && (
{error}
)} {ticket && !loading && (
{/* Header Info */}

Ticket Number

{ticket.ticketNumber}

Status

{getStatusBadge(ticket.status)}
{/* Title */}

{ticket.title}

{/* Key Details */}

Assigned To

{ticket.assignedResourceName || 'Unassigned'}

Priority

{getPriorityBadge(ticket.priority)}

Created Date

{formatDate(ticket.createDate)}

Due Date

{formatDate(ticket.dueDateTime)}

{ticket.resolvedDateTime && (

Resolved Date

{formatDate(ticket.resolvedDateTime)}

)} {ticket.purchaseOrderNumber && (

PO Number

{ticket.purchaseOrderNumber}

)}
{/* Description */} {ticket.description && (

Description

{ticket.description}
)} {/* Resolution */} {ticket.resolution && (

Resolution

{ticket.resolution}
)} {/* Quote Number */} {ticket.userDefinedFields && ( <> {ticket.userDefinedFields.find((f: any) => f.name === 'Quote Number' && f.value) && (

Quote Number

{ticket.userDefinedFields.find((f: any) => f.name === 'Quote Number')?.value}

)} )} {/* Actions */}
)}
); }