"use client"; import { useState, useEffect } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Download, ExternalLink, Search, Loader2 } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { updateOrderStatus } from "@/lib/actions/orders"; interface OrdersTableProps { initialOrders: any[]; } const statusLabel: Record = { pending: 'Eingegangen', active: 'In Bearbeitung', completed: 'Abgeschlossen', cancelled: 'Storniert', }; const statusClass: Record = { pending: 'bg-amber-500/20 text-amber-400 border border-amber-500/30', active: 'bg-blue-500/20 text-blue-400 border border-blue-500/30', completed: 'bg-green-500/20 text-green-400 border border-green-500/30', cancelled: 'bg-red-500/20 text-red-400 border border-red-500/30', }; export function OrdersTable({ initialOrders }: OrdersTableProps) { const [orders, setOrders] = useState(initialOrders); const [search, setSearch] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [updatingId, setUpdatingId] = useState(null); useEffect(() => { setOrders(initialOrders); }, [initialOrders]); const handleStatusChange = async (orderId: string, newStatus: 'pending' | 'active' | 'completed' | 'cancelled') => { setUpdatingId(orderId); try { await updateOrderStatus(orderId, newStatus); setOrders(prev => prev.map(o => o.id === orderId ? { ...o, status: newStatus } : o)); } catch (error) { console.error(error); alert("Fehler beim Ändern des Status."); } finally { setUpdatingId(null); } }; const filteredOrders = orders.filter((order) => { const orderNum = (order.order_number || "").toLowerCase(); const company = (order.customer_data?.company_name || "").toLowerCase(); const contact = `${order.customer_data?.first_name || ""} ${order.customer_data?.last_name || ""}`.toLowerCase(); const matchesSearch = orderNum.includes(search.toLowerCase()) || company.includes(search.toLowerCase()) || contact.includes(search.toLowerCase()); const matchesStatus = statusFilter === "all" || order.status === statusFilter; return matchesSearch && matchesStatus; }); return (
{/* Filterleiste */}
setSearch(e.target.value)} className="pl-10 bg-slate-950/40 border-white/10 text-white placeholder:text-slate-500" />
{/* Tabelle */}
Bestellnr. Datum Kunde Auswahl Betrag Status Aktionen {filteredOrders.length === 0 ? ( Keine Bestellungen gefunden. ) : ( filteredOrders.map((order) => { const items = order.order_data?.items || []; return ( #{order.order_number || order.id.slice(0, 8)} {new Date(order.created_at).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' })}
{order.customer_data?.company_name || 'Privatkunde'}
{order.customer_data?.first_name} {order.customer_data?.last_name}
{items.map((item: any) => ( {item.product_name} {item.selected_modules?.length > 0 && ( +{item.selected_modules.length} )} ))}
{new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(order.total_price)} {Object.entries(statusLabel).map(([key, label]) => ( handleStatusChange(order.id, key as any)} className={`text-xs cursor-pointer hover:bg-white/10 transition-colors focus:bg-white/10 focus:text-white ${order.status === key ? 'font-bold text-primary' : ''}`} > {label} ))}
{order.pdf_url ? ( <> ) : ( Keine Bestätigung )}
); }) )}
); }