https://dev.kronoz.win/r/marzneshin.git
1
2import {
3 ArrowDownIcon,
4 ArrowUpIcon,
5 CaretSortIcon,
6 EyeNoneIcon,
7} from "@radix-ui/react-icons"
8import { Column } from "@tanstack/react-table"
9
10import {
11 Button,
12 DropdownMenu,
13 DropdownMenuContent,
14 DropdownMenuItem,
15 DropdownMenuSeparator,
16 DropdownMenuTrigger,
17} from "@marzneshin/common/components"
18import { cn } from "@marzneshin/common/utils"
19
20interface DataTableColumnHeaderProps<TData, TValue>
21 extends React.HTMLAttributes<HTMLDivElement> {
22 column: Column<TData, TValue>
23 title: string
24}
25
26export function DataTableColumnHeader<TData, TValue>({
27 column,
28 title,
29 className,
30}: DataTableColumnHeaderProps<TData, TValue>) {
31 if (!column.getCanSort()) {
32 return <div className={cn(className)}>{title}</div>
33 }
34
35 return (
36 <div className={cn("flex items-center space-x-2", className)}>
37 <DropdownMenu>
38 <DropdownMenuTrigger asChild>
39 <Button
40 variant="ghost"
41 size="sm"
42 className="-ml-3 h-8 data-[state=open]:bg-accent"
43 >
44 <span>{title}</span>
45 {column.getIsSorted() === "desc" ? (
46 <ArrowDownIcon className="ml-2 w-4 h-4" />
47 ) : column.getIsSorted() === "asc" ? (
48 <ArrowUpIcon className="ml-2 w-4 h-4" />
49 ) : (
50 <CaretSortIcon className="ml-2 w-4 h-4" />
51 )}
52 </Button>
53 </DropdownMenuTrigger>
54 <DropdownMenuContent align="start">
55 <DropdownMenuItem onClick={() => column.toggleSorting(false)}>
56 <ArrowUpIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
57 Asc
58 </DropdownMenuItem>
59 <DropdownMenuItem onClick={() => column.toggleSorting(true)}>
60 <ArrowDownIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
61 Desc
62 </DropdownMenuItem>
63 <DropdownMenuSeparator />
64 <DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
65 <EyeNoneIcon className="mr-2 w-3.5 h-3.5 text-muted-foreground/70" />
66 Hide
67 </DropdownMenuItem>
68 </DropdownMenuContent>
69 </DropdownMenu>
70 </div>
71 )
72}