this repo has no description hallaine.com
at main 69 lines 2.0 kB view raw
1import type { Column } from "@tanstack/react-table"; 2import { ArrowDown, ArrowUp, ChevronsUpDown, EyeOff } from "lucide-react"; 3 4import { Button } from "@/components/ui/button"; 5import { 6 DropdownMenu, 7 DropdownMenuContent, 8 DropdownMenuItem, 9 DropdownMenuSeparator, 10 DropdownMenuTrigger, 11} from "@/components/ui/dropdown-menu"; 12import { cn } from "@/lib/utils"; 13 14interface DataTableColumnHeaderProps<TData, TValue> 15 extends React.HTMLAttributes<HTMLDivElement> { 16 column: Column<TData, TValue>; 17 title: string; 18} 19 20export function DataTableColumnHeader<TData, TValue>({ 21 column, 22 title, 23 className, 24}: DataTableColumnHeaderProps<TData, TValue>) { 25 if (!column.getCanSort()) { 26 return <div className={cn(className)}>{title}</div>; 27 } 28 29 return ( 30 <div className={cn("flex items-center gap-2", className)}> 31 <DropdownMenu> 32 <DropdownMenuTrigger 33 id="data-table-column-header-dropdown" 34 render={ 35 <Button 36 variant="ghost" 37 size="sm" 38 className="data-[state=open]:bg-accent -ml-3 h-8" 39 /> 40 } 41 > 42 <span>{title}</span> 43 {column.getIsSorted() === "desc" ? ( 44 <ArrowDown /> 45 ) : column.getIsSorted() === "asc" ? ( 46 <ArrowUp /> 47 ) : ( 48 <ChevronsUpDown /> 49 )} 50 </DropdownMenuTrigger> 51 <DropdownMenuContent align="start"> 52 <DropdownMenuItem onClick={() => column.toggleSorting(false)}> 53 <ArrowUp /> 54 Asc 55 </DropdownMenuItem> 56 <DropdownMenuItem onClick={() => column.toggleSorting(true)}> 57 <ArrowDown /> 58 Desc 59 </DropdownMenuItem> 60 <DropdownMenuSeparator /> 61 <DropdownMenuItem onClick={() => column.toggleVisibility(false)}> 62 <EyeOff /> 63 Hide 64 </DropdownMenuItem> 65 </DropdownMenuContent> 66 </DropdownMenu> 67 </div> 68 ); 69}