Spaces:
Paused
Paused
import { | |
ArrowDownIcon, | |
ArrowUpIcon, | |
CaretSortIcon, | |
EyeNoneIcon, | |
} from "@radix-ui/react-icons" | |
import { 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="-ml-3 h-8 data-[state=open]:bg-accent" | |
> | |
<span>{title}</span> | |
{column.getIsSorted() === "desc" ? ( | |
<ArrowDownIcon className="ml-2 h-4 w-4" /> | |
) : column.getIsSorted() === "asc" ? ( | |
<ArrowUpIcon className="ml-2 h-4 w-4" /> | |
) : ( | |
<CaretSortIcon className="ml-2 h-4 w-4" /> | |
)} | |
</Button> | |
</DropdownMenuTrigger> | |
<DropdownMenuContent align="start"> | |
<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> | |
) | |
} |