gitscope
← marzneshin / v0.6.5 / dashboard/src/libs/entity-table/components/column-header.tsx
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/libs/entity-table/components/column-header.tsx · TypeScript
Blame Raw
 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}