'use client'; import { useState } from 'react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { ChevronDown, ChevronRight, Search } from 'lucide-react'; import { CompanyBackupDetail } from './company-backup-detail'; export interface CompanyBackupRow { organizationUid: string; companyId: number | null; companyName: string; organizationName: string; protectedWorkloadCount: number; backupServerJobCount: number; backupAgentJobCount: number; failedJobCount: number; warningJobCount: number; lastJobStatus: string; lastSuccessfulBackup: string | null; oldestRestorePoint: string | null; } interface CompanyBackupTableProps { companies: CompanyBackupRow[]; } function StatusBadge({ status }: { status: string }) { const variant = status === 'Success' ? 'default' : status === 'Warning' ? 'secondary' : 'destructive'; const colors = status === 'Success' ? 'bg-green-500/10 text-green-500 hover:bg-green-500/20' : status === 'Warning' ? 'bg-yellow-500/10 text-yellow-500 hover:bg-yellow-500/20' : 'bg-red-500/10 text-red-500 hover:bg-red-500/20'; return {status}; } function timeAgo(dateStr: string | null): string { if (!dateStr) return 'Never'; const diff = Date.now() - new Date(dateStr).getTime(); const hours = Math.floor(diff / 3600000); if (hours < 1) return 'Just now'; if (hours < 24) return `${hours}h ago`; const days = Math.floor(hours / 24); return `${days}d ago`; } export function CompanyBackupTable({ companies }: CompanyBackupTableProps) { const [expandedRow, setExpandedRow] = useState(null); const [search, setSearch] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const filtered = companies.filter((c) => { const matchesSearch = c.companyName.toLowerCase().includes(search.toLowerCase()); const matchesStatus = statusFilter === 'all' || c.lastJobStatus === statusFilter; return matchesSearch && matchesStatus; }); return ( setSearch(e.target.value)} className="pl-9" /> {['all', 'Success', 'Warning', 'Failed'].map((s) => ( setStatusFilter(s)} > {s === 'all' ? 'All' : s} ))} Company Protected Server Jobs Agent Jobs Status Last Backup {filtered.length === 0 ? ( No companies found ) : ( filtered.map((company) => ( <> setExpandedRow( expandedRow === company.organizationUid ? null : company.organizationUid ) } > {expandedRow === company.organizationUid ? ( ) : ( )} {company.companyName} {company.protectedWorkloadCount} {company.backupServerJobCount} {company.backupAgentJobCount} {timeAgo(company.lastSuccessfulBackup)} {expandedRow === company.organizationUid && ( )} > )) )} ); }