/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ /* eslint-disable react-refresh/only-export-components */ import { useState } from 'react' import type { ColumnDef } from '@tanstack/react-table' import { Zap } from 'lucide-react' import { formatTimestampToDate, formatTokens } from '@/lib/format' import { cn } from '@/lib/utils' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip' import { DataTableColumnHeader } from '@/components/data-table' import { StatusBadge } from '@/components/status-badge' import { formatDuration } from '../../lib/format' import { FailReasonDialog } from '../dialogs/fail-reason-dialog' /** * Cache tooltip component for token display */ export function CacheTooltip({ tokens, label, color, }: { tokens: number label: string color: string }) { if (tokens <= 0) return null return ( } >

{label}: {formatTokens(tokens)}

) } // ============================================================================ // Column Definition Factories // ============================================================================ /** * Create a timestamp column - compact mono style matching common logs */ export function createTimestampColumn(config: { accessorKey: string title: string unit?: 'seconds' | 'milliseconds' }): ColumnDef { const { accessorKey, title, unit = 'milliseconds' } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const timestamp = row.getValue(accessorKey) as number if (!timestamp) { return - } return ( {formatTimestampToDate(timestamp, unit)} ) }, meta: { label: title }, } } /** * Create a duration column - pill style matching common logs timing */ export function createDurationColumn(config: { submitTimeKey: string finishTimeKey: string unit?: 'seconds' | 'milliseconds' headerLabel: string warningThresholdSec?: number }): ColumnDef { const { submitTimeKey, finishTimeKey, unit = 'milliseconds', headerLabel, warningThresholdSec = 60, } = config return { id: 'duration', header: ({ column }) => ( ), cell: ({ row }) => { const log = row.original as Record const duration = formatDuration( log[submitTimeKey] as number | undefined, log[finishTimeKey] as number | undefined, unit ) if (!duration) { return - } const variant = duration.durationSec > warningThresholdSec ? 'danger' : 'success' const durationBgMap: Record = { success: 'border border-emerald-200/40 bg-emerald-50/35 dark:border-emerald-900/40 dark:bg-emerald-950/15', warning: 'border border-amber-200/45 bg-amber-50/35 dark:border-amber-900/40 dark:bg-amber-950/15', danger: 'border border-rose-200/50 bg-rose-50/35 dark:border-rose-900/40 dark:bg-rose-950/15', } return ( ) }, meta: { label: headerLabel }, } } /** * Create a channel column (admin only) - #id badge matching common logs */ export function createChannelColumn(config: { accessorKey?: string headerLabel: string }): ColumnDef { const { accessorKey = 'channel_id', headerLabel } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const channelId = row.getValue(accessorKey) as number if (!channelId) { return - } return ( ) }, meta: { label: headerLabel }, } } /** * Create a fail reason column - text-xs truncate, hover underline, dialog */ export function createFailReasonColumn(config: { accessorKey?: string headerLabel: string cellTitle: string }): ColumnDef { const { accessorKey = 'fail_reason', headerLabel, cellTitle } = config return { accessorKey, header: ({ column }) => ( ), cell: function FailReasonCell({ row }) { const failReason = row.getValue(accessorKey) as string const [dialogOpen, setDialogOpen] = useState(false) if (!failReason) { return - } return ( <> ) }, meta: { label: headerLabel }, } } /** * Create a progress column - compact mono pill */ export function createProgressColumn(config: { accessorKey?: string headerLabel: string }): ColumnDef { const { accessorKey = 'progress', headerLabel } = config return { accessorKey, header: ({ column }) => ( ), cell: ({ row }) => { const progress = row.getValue(accessorKey) as string if (!progress) { return - } return ( {progress} ) }, meta: { label: headerLabel }, } }