| import { Column } from '@tanstack/react-table'; |
| import { ArrowDownIcon, ArrowUpIcon, CaretSortIcon, EyeNoneIcon } from '@radix-ui/react-icons'; |
| import { |
| DropdownMenu, |
| DropdownMenuContent, |
| DropdownMenuItem, |
| DropdownMenuSeparator, |
| DropdownMenuTrigger, |
| } from './DropdownMenu'; |
| import { useLocalize } from '~/hooks'; |
| import { Button } from './Button'; |
| import { cn } from '~/utils'; |
|
|
| 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>) { |
| const localize = useLocalize(); |
|
|
| const getSortIcon = () => { |
| const sortDirection = column.getIsSorted(); |
| if (sortDirection === 'desc') { |
| return <ArrowDownIcon className="ml-2 h-4 w-4" />; |
| } |
| if (sortDirection === 'asc') { |
| return <ArrowUpIcon className="ml-2 h-4 w-4" />; |
| } |
| return <CaretSortIcon className="ml-2 h-4 w-4" />; |
| }; |
|
|
| 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="-ml-3 h-8 data-[state=open]:bg-accent" |
| aria-label={localize('com_ui_filter_by', { title })} |
| > |
| <span>{title}</span> |
| {getSortIcon()} |
| </Button> |
| </DropdownMenuTrigger> |
| <DropdownMenuContent align="start" className="z-[1001]"> |
| <DropdownMenuItem onClick={() => column.toggleSorting(false)}> |
| <ArrowUpIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" /> |
| Asc |
| </DropdownMenuItem> |
| <DropdownMenuItem onClick={() => column.toggleSorting(true)}> |
| <ArrowDownIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" /> |
| Desc |
| </DropdownMenuItem> |
| <DropdownMenuSeparator /> |
| <DropdownMenuItem onClick={() => column.toggleVisibility(false)}> |
| <EyeNoneIcon className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" /> |
| Hide |
| </DropdownMenuItem> |
| </DropdownMenuContent> |
| </DropdownMenu> |
| </div> |
| ); |
| } |
|
|