ruvector/studio/components/ui/DataTable/DataTableViewOptions.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

96 lines
3.7 KiB
TypeScript

import { GripVertical, Settings2 } from 'lucide-react'
import { useMemo, useState } from 'react'
import {
Checkbox_Shadcn_,
Command_Shadcn_ as Command,
CommandEmpty_Shadcn_ as CommandEmpty,
CommandGroup_Shadcn_ as CommandGroup,
CommandInput_Shadcn_ as CommandInput,
CommandItem_Shadcn_ as CommandItem,
CommandList_Shadcn_ as CommandList,
Popover_Shadcn_ as Popover,
PopoverContent_Shadcn_ as PopoverContent,
PopoverTrigger_Shadcn_ as PopoverTrigger,
} from 'ui'
import { ButtonTooltip } from '../ButtonTooltip'
import { Sortable, SortableDragHandle, SortableItem } from './primitives/Sortable'
import { useDataTable } from './providers/DataTableProvider'
export function DataTableViewOptions() {
const { table, enableColumnOrdering } = useDataTable()
const [open, setOpen] = useState(false)
const [drag, setDrag] = useState(false)
const [search, setSearch] = useState('')
const columnOrder = table.getState().columnOrder
const sortedColumns = useMemo(
() =>
table.getAllColumns().sort((a, b) => {
return columnOrder.indexOf(a.id) - columnOrder.indexOf(b.id)
}),
[columnOrder]
)
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<ButtonTooltip
type="default"
size="tiny"
role="combobox"
aria-expanded={open}
className="w-[26px]"
icon={<Settings2 className="text-foreground" />}
tooltip={{ content: { side: 'bottom', text: 'Toggle column visibility' } }}
/>
</PopoverTrigger>
<PopoverContent portal side="bottom" align="end" className="w-[200px] p-0">
<Command>
<CommandInput value={search} onValueChange={setSearch} placeholder="Search columns..." />
<CommandList>
<CommandEmpty>No option found.</CommandEmpty>
<CommandGroup>
<Sortable
value={sortedColumns.map((c) => ({ id: c.id }))}
onValueChange={(items) => table.setColumnOrder(items.map((c) => c.id))}
overlay={<div className="h-8 w-full rounded-md bg-muted/60" />}
onDragStart={() => setDrag(true)}
onDragEnd={() => setDrag(false)}
onDragCancel={() => setDrag(false)}
>
{sortedColumns
.filter(
(column) => typeof column.accessorFn !== 'undefined' && column.getCanHide()
)
.map((column) => (
<SortableItem key={column.id} value={column.id} asChild>
<CommandItem
value={column.id}
onSelect={() => column.toggleVisibility(!column.getIsVisible())}
className="capitalize p-1"
disabled={drag}
>
<Checkbox_Shadcn_ checked={column.getIsVisible()} className="mr-2" />
<span>{(column.columnDef.meta as any)?.label || column.id}</span>
{enableColumnOrdering && !search ? (
<SortableDragHandle
type="text"
size="tiny"
className="ml-auto size-5 text-muted-foreground hover:text-foreground focus:bg-muted focus:text-foreground"
>
<GripVertical className="size-4" aria-hidden="true" />
</SortableDragHandle>
) : null}
</CommandItem>
</SortableItem>
))}
</Sortable>
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
)
}