'use client' import { useMemo } from 'react' import { cn } from '../../../utils/cn' import { Button } from '../button' import { Download02Icon } from '../../icons-v2-generated/interface/download-02-icon' import { useHorizontalScrollbar } from '../../../hooks/ui/use-horizontal-scrollbar' import { TableEmptyState } from '../table/table-empty-state' import { QueryReportTableHeader } from './query-report-table-header' import { QueryReportTableRow } from './query-report-table-row' import { QueryReportTableSkeleton } from './query-report-table-skeleton' import { deriveColumns, exportToCSV } from './utils' import type { QueryReportTableProps } from './types' export function QueryReportTable({ title, data, loading = false, skeletonRows = 8, skeletonColumns = 6, emptyMessage, columnWidth = 160, columnOrder, showExport = true, exportFilename = 'query-results', onExport, headerActions, variant = 'default', className, tableClassName }: QueryReportTableProps) { const isCompact = variant === 'compact' const columns = useMemo( () => deriveColumns(data, columnOrder), [data, columnOrder] ) const handleExport = () => { exportToCSV(data, columns, exportFilename) onExport?.() } const tableMinWidth = columns.length * (columnWidth + 16) // columnWidth + gap const { scrollRef, trackRef, thumbRef, thumbRatio, canScrollLeft, canScrollRight, onScroll, onTrackClick, onTrackWheel, onThumbPointerDown, onThumbPointerMove, onThumbPointerUp, } = useHorizontalScrollbar() return (
{/* Title bar — hidden in compact mode and when empty */} {!isCompact && (title || headerActions || (showExport && data.length > 0)) && (

{title}

{headerActions} {showExport && data.length > 0 && ( )}
)} {/* Loading state */} {loading && ( )} {/* Empty state */} {!loading && data.length === 0 && ( )} {/* Table content */} {!loading && data.length > 0 && (
{/* Custom scrollbar track — hidden in compact mode */} {!isCompact && thumbRatio > 0 && (
)} {/* Scrollable table container */}
{data.map((row, index) => ( ))}
{/* Edge fades — hidden in compact mode */} {!isCompact && canScrollLeft && (
)} {!isCompact && canScrollRight && (
)}
)}
) }