ruvector/studio/components/ui/DataTable/DataTableSideBarLayout.tsx
rUv 814f595995 feat(studio): Add complete RuVector Studio application
Major additions:
- Complete Next.js studio application with 1600+ components
- Docker support (Dockerfile.combined, docker-compose.yml)
- GCP deployment documentation and benchmarks
- SQL benchmark scripts for performance testing
- Sentry integration for monitoring
- Comprehensive test suite and mocks

Studio features:
- Dashboard and admin interfaces
- Data visualization components
- Authentication and user management
- API integration with RuVector backend
- Static data and public assets

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-06 23:04:48 +00:00

52 lines
1.8 KiB
TypeScript

import { CSSProperties, ReactNode, useMemo } from 'react'
import { cn } from 'ui'
import { useDataTable } from './providers/DataTableProvider'
interface DataTableSideBarLayoutProps {
children: ReactNode
className?: string
topBarHeight?: number
}
export function DataTableSideBarLayout({
children,
className,
topBarHeight = 0,
}: DataTableSideBarLayoutProps) {
const { table } = useDataTable()
/**
* https://tanstack.com/table/v8/docs/guide/column-sizing#advanced-column-resizing-performance
* Instead of calling `column.getSize()` on every render for every header
* and especially every data cell (very expensive),
* we will calculate all column sizes at once at the root table level in a useMemo
* and pass the column sizes down as CSS variables to the <table> element.
*/
const columnSizeVars = useMemo(() => {
const headers = table.getFlatHeaders()
const colSizes: { [key: string]: string } = {}
for (let i = 0; i < headers.length; i++) {
const header = headers[i]!
// REMINDER: replace "." with "-" to avoid invalid CSS variable name (e.g. "timing.dns" -> "timing-dns")
colSizes[`--header-${header.id.replace('.', '-')}-size`] = `${header.getSize()}px`
colSizes[`--col-${header.column.id.replace('.', '-')}-size`] = `${header.column.getSize()}px`
}
return colSizes
}, [
// TODO: check if we need this
table.getState().columnSizingInfo,
table.getState().columnSizing,
table.getState().columnVisibility,
])
return (
<div
className={cn('flex flex-row w-full h-full', className)}
// topBarHeight is the height of the chart and search bar, and 64px is the height of the top bar
style={{ '--top-bar-height': `${topBarHeight + 64}px`, ...columnSizeVars } as CSSProperties}
>
{children}
</div>
)
}