this repo has no description
hallaine.com
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}