"use client" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog" import { Search, MoreHorizontal, Edit, Trash2, Mail, Phone, CreditCard } from "lucide-react" import type { Client } from "@/types/business" interface ClientsTableProps { clients: Client[] onEdit: (client: Client) => void onDelete: (clientId: string) => void onAddPayment: (clientId: string) => void } export function ClientsTable({ clients, onEdit, onDelete, onAddPayment }: ClientsTableProps) { const [searchTerm, setSearchTerm] = useState("") const [deleteClient, setDeleteClient] = useState(null) const filteredClients = clients.filter( (client) => client.name.toLowerCase().includes(searchTerm.toLowerCase()) || client.email.toLowerCase().includes(searchTerm.toLowerCase()) || client.contactPerson.toLowerCase().includes(searchTerm.toLowerCase()) || client.businessType.toLowerCase().includes(searchTerm.toLowerCase()), ) const getCreditStatus = (outstandingAmount: number, creditLimit: number) => { if (outstandingAmount === 0) return { label: "Good Standing", variant: "default" as const, color: "text-green-600" } if (outstandingAmount >= creditLimit * 0.9) return { label: "Near Limit", variant: "secondary" as const, color: "text-yellow-600" } if (outstandingAmount > creditLimit) return { label: "Over Limit", variant: "destructive" as const, color: "text-red-600" } return { label: "Active Credit", variant: "secondary" as const, color: "text-blue-600" } } const handleDelete = (client: Client) => { onDelete(client.id) setDeleteClient(null) } return (
{/* Search */}
setSearchTerm(e.target.value)} className="pl-10" />
{/* Clients Table */}
Client Contact Business Type Payment Terms Credit Status Outstanding {filteredClients.length === 0 ? ( {searchTerm ? "No clients found matching your search." : "No clients added yet."} ) : ( filteredClients.map((client) => { const creditStatus = getCreditStatus(client.outstandingAmount, client.creditLimit) const creditUtilization = client.creditLimit > 0 ? ((client.outstandingAmount / client.creditLimit) * 100).toFixed(1) : "0" return (

{client.name}

{client.contactPerson && (

{client.contactPerson}

)}
{client.email && (
{client.email}
)} {client.phone && (
{client.phone}
)}
{client.businessType || "N/A"} {client.paymentTerms}
{creditStatus.label} {client.creditLimit > 0 && (

{creditUtilization}% utilized

)}

0 ? creditStatus.color : ""}`}> ${client.outstandingAmount.toFixed(2)}

/ ${client.creditLimit.toFixed(2)} limit

onEdit(client)}> Edit onAddPayment(client.id)}> Add Payment setDeleteClient(client)} className="text-red-600"> Delete
) }) )}
{/* Delete Confirmation Dialog */} setDeleteClient(null)}> Delete Client Are you sure you want to delete "{deleteClient?.name}"? This action cannot be undone and will remove all associated transaction history. Cancel deleteClient && handleDelete(deleteClient)} className="bg-red-600 hover:bg-red-700" > Delete
) }