"use client" import { useState, useMemo } from "react" import type { Ticket, TicketStatus } from "@/lib/types" import { StatusBadge } from "./status-badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { ArrowUpDown, ArrowDown, ArrowUp, Calendar, MapPin, FileText, Trash2 } from "lucide-react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { TicketComments } from "./ticket-comments" interface TicketTableProps { tickets: Ticket[] showStatusUpdate?: boolean onStatusUpdate?: (ticketId: number, status: TicketStatus) => void onDeleteTicket?: (ticketId: number) => void } type SortDirection = "asc" | "desc" export function TicketTable({ tickets, showStatusUpdate = false, onStatusUpdate, onDeleteTicket }: TicketTableProps) { const [sortConfig, setSortConfig] = useState<{ key: keyof Ticket | "room" | "owner"; direction: SortDirection }>({ key: "createdAt", direction: "desc" }) const [search, setSearch] = useState("") const [statusFilter, setStatusFilter] = useState("ALL") const [selectedTicket, setSelectedTicket] = useState(null) // Advanced Filtering & Sorting const processedTickets = useMemo(() => { let filtered = [...tickets] // Search if (search.trim()) { const q = search.toLowerCase() filtered = filtered.filter(t => t.title.toLowerCase().includes(q) || t.description.toLowerCase().includes(q) || t.room.name.toLowerCase().includes(q) ) } // Filter if (statusFilter !== "ALL") { filtered = filtered.filter(t => t.status === statusFilter) } // Sort return filtered.sort((a, b) => { let aValue: any = a[sortConfig.key as keyof Ticket] let bValue: any = b[sortConfig.key as keyof Ticket] // Nested keys if (sortConfig.key === "room") { aValue = a.room.name bValue = b.room.name } else if (sortConfig.key === "owner") { aValue = a.owner.name bValue = b.owner.name } if (aValue < bValue) return sortConfig.direction === "asc" ? -1 : 1 if (aValue > bValue) return sortConfig.direction === "asc" ? 1 : -1 return 0 }) }, [tickets, search, statusFilter, sortConfig]) const handleSort = (key: keyof Ticket | "room" | "owner") => { setSortConfig(current => ({ key, direction: current.key === key && current.direction === "asc" ? "desc" : "asc" })) } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString("de-DE", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" }) } return (
setSearch(e.target.value)} className="max-w-sm" />
handleSort("room")}>
Room {sortConfig.key === "room" && (sortConfig.direction === "asc" ? : )}
handleSort("title")}> Title {sortConfig.key === "title" && (sortConfig.direction === "asc" ? : )} Description handleSort("createdAt")}>
Date {sortConfig.key === "createdAt" && (sortConfig.direction === "asc" ? : )}
handleSort("status")}> Status {sortConfig.key === "status" && (sortConfig.direction === "asc" ? : )} {onDeleteTicket && }
{processedTickets.length === 0 ? ( No results found. ) : ( processedTickets.map((ticket) => ( setSelectedTicket(ticket)} > {ticket.room.name} {ticket.title}

{ticket.description}

{formatDate(ticket.createdAt)} e.stopPropagation()}> {showStatusUpdate && onStatusUpdate ? ( ) : ( )} {onDeleteTicket && ( e.stopPropagation()}> )}
)) )}
{selectedTicket && ( !open && setSelectedTicket(null)}> {selectedTicket.title} {selectedTicket.room.name} • {formatDate(selectedTicket.createdAt)} • {selectedTicket.owner.name}

Description

{selectedTicket.description}
)}
) }