"use client" import { ColumnDef } from "@tanstack/react-table" import { Eye } from "lucide-react" import { Checkbox } from "@/components/ui/checkbox" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { TruncatedUrlCell, TruncatedCell } from "@/components/ui/truncated-cell" import type { Vulnerability, VulnerabilitySeverity } from "@/types/vulnerability.types" // 统一的漏洞严重程度颜色配置(与图表一致) const severityConfig: Record = { critical: { label: "严重", className: "bg-red-600 text-white hover:bg-red-600" }, high: { label: "高危", className: "bg-orange-500 text-white hover:bg-orange-500" }, medium: { label: "中危", className: "bg-yellow-500 text-white hover:bg-yellow-500" }, low: { label: "低危", className: "bg-blue-500 text-white hover:bg-blue-500" }, info: { label: "信息", className: "bg-gray-500 text-white hover:bg-gray-500" }, } interface ColumnActions { formatDate: (date: string) => string handleViewDetail: (vulnerability: Vulnerability) => void } export function createVulnerabilityColumns({ formatDate, handleViewDetail, }: ColumnActions): ColumnDef[] { return [ { id: "select", size: 40, minSize: 40, maxSize: 40, enableResizing: false, header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="全选" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="选择行" /> ), enableSorting: false, enableHiding: false, }, { accessorKey: "severity", header: "Status", size: 80, minSize: 60, maxSize: 120, cell: ({ row }) => { const severity = row.getValue("severity") as VulnerabilitySeverity const config = severityConfig[severity] return ( {config.label} ) }, }, { accessorKey: "source", header: "Source", size: 100, minSize: 80, maxSize: 150, cell: ({ row }) => { const source = row.getValue("source") as string return ( {source} ) }, }, { accessorKey: "vulnType", header: "Vuln Type", size: 150, minSize: 100, maxSize: 250, cell: ({ row }) => { const vulnType = row.getValue("vulnType") as string const vulnerability = row.original return ( handleViewDetail(vulnerability)} > {vulnType} 漏洞详情 ) }, }, { accessorKey: "url", header: "URL", size: 500, minSize: 300, maxSize: 700, cell: ({ row }) => { const url = row.original.url return }, }, { accessorKey: "discoveredAt", header: "Discovered At", size: 150, minSize: 120, maxSize: 200, cell: ({ row }) => { const discoveredAt = row.getValue("discoveredAt") as string return ( {formatDate(discoveredAt)} ) }, }, { id: "actions", header: "", size: 80, minSize: 80, maxSize: 80, enableResizing: false, cell: ({ row }) => { const vulnerability = row.original return (
) }, }, ] }