| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- import {
- ArrowDownIcon,
- ArrowUpIcon,
- CaretSortIcon,
- EyeNoneIcon,
- } from '@radix-ui/react-icons'
- import { type Column } from '@tanstack/react-table'
- import { cn } from '@/lib/utils'
- import { Button } from '@/components/ui/button'
- import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuSeparator,
- DropdownMenuTrigger,
- } from '@/components/ui/dropdown-menu'
- interface DataTableColumnHeaderProps<TData, TValue>
- extends React.HTMLAttributes<HTMLDivElement> {
- column: Column<TData, TValue>
- title: string
- }
- export function DataTableColumnHeader<TData, TValue>({
- column,
- title,
- className,
- }: DataTableColumnHeaderProps<TData, TValue>) {
- if (!column.getCanSort()) {
- return <div className={cn(className)}>{title}</div>
- }
- return (
- <div className={cn('flex items-center space-x-2', className)}>
- <DropdownMenu>
- <DropdownMenuTrigger asChild>
- <Button
- variant='ghost'
- size='sm'
- className='data-[state=open]:bg-accent -ms-3 h-8'
- >
- <span>{title}</span>
- {column.getIsSorted() === 'desc' ? (
- <ArrowDownIcon className='ms-2 h-4 w-4' />
- ) : column.getIsSorted() === 'asc' ? (
- <ArrowUpIcon className='ms-2 h-4 w-4' />
- ) : (
- <CaretSortIcon className='ms-2 h-4 w-4' />
- )}
- </Button>
- </DropdownMenuTrigger>
- <DropdownMenuContent align='start'>
- <DropdownMenuItem onClick={() => column.toggleSorting(false)}>
- <ArrowUpIcon className='text-muted-foreground/70 me-2 h-3.5 w-3.5' />
- Asc
- </DropdownMenuItem>
- <DropdownMenuItem onClick={() => column.toggleSorting(true)}>
- <ArrowDownIcon className='text-muted-foreground/70 me-2 h-3.5 w-3.5' />
- Desc
- </DropdownMenuItem>
- {column.getCanHide() && (
- <>
- <DropdownMenuSeparator />
- <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
- <EyeNoneIcon className='text-muted-foreground/70 me-2 h-3.5 w-3.5' />
- Hide
- </DropdownMenuItem>
- </>
- )}
- </DropdownMenuContent>
- </DropdownMenu>
- </div>
- )
- }
|