Uecko_ERP/packages/rdx-ui/src/components/datatable/data-table-column-header.tsx

71 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-10-16 11:18:55 +00:00
import {
2025-11-16 21:11:46 +00:00
Button,
DropdownMenu,
2025-10-16 11:18:55 +00:00
DropdownMenuContent,
DropdownMenuItem,
2026-03-17 17:49:54 +00:00
DropdownMenuSeparator,
2025-11-16 21:11:46 +00:00
DropdownMenuTrigger,
} from "@repo/shadcn-ui/components";
import { cn } from "@repo/shadcn-ui/lib/utils";
import type { Column } from "@tanstack/react-table";
2026-03-17 17:49:54 +00:00
import { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon, EyeOffIcon } from "lucide-react";
2025-11-16 21:11:46 +00:00
import { useTranslation } from "../../locales/i18n.ts";
2025-10-16 11:18:55 +00:00
2025-11-16 21:11:46 +00:00
interface DataTableColumnHeaderProps<TData, TValue> extends React.HTMLAttributes<HTMLDivElement> {
column: Column<TData, TValue>;
title: string;
2025-10-16 11:18:55 +00:00
}
export function DataTableColumnHeader<TData, TValue>({
column,
title,
className,
}: DataTableColumnHeaderProps<TData, TValue>) {
const { t } = useTranslation();
if (!column.getCanSort()) {
2026-03-30 18:59:27 +00:00
return <div className={cn("text-foreground text-[0.8rem]", className)}>{title}</div>;
2025-10-16 11:18:55 +00:00
}
return (
2026-03-17 17:49:54 +00:00
<div className={cn("flex items-center gap-2 ", className)}>
2025-10-16 11:18:55 +00:00
<DropdownMenu>
<DropdownMenuTrigger>
2025-10-16 11:18:55 +00:00
<Button
2026-03-17 17:49:54 +00:00
//className="data-[state=open]:bg-accent -ml-4 h-8 text-xs text-muted-foreground font-semibold text-nowrap cursor-pointer"
className="-ml-3 h-8 data-[state=open]:bg-accent cursor-pointer text-foreground"
size="sm"
2025-10-16 17:59:13 +00:00
type="button"
2025-10-16 11:18:55 +00:00
variant="ghost"
>
<span>{title}</span>
{column.getIsSorted() === "desc" ? (
2026-03-17 17:49:54 +00:00
<ArrowDownIcon />
2025-10-16 11:18:55 +00:00
) : column.getIsSorted() === "asc" ? (
2026-03-17 17:49:54 +00:00
<ArrowUpIcon />
2025-10-16 11:18:55 +00:00
) : (
2026-03-17 17:49:54 +00:00
<ChevronsUpDownIcon />
2025-10-16 11:18:55 +00:00
)}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuItem onClick={() => column.toggleSorting(false)}>
2026-03-17 17:49:54 +00:00
<ArrowUpIcon />
2025-11-16 21:11:46 +00:00
{t("components.datatable.asc")}
2025-10-16 11:18:55 +00:00
</DropdownMenuItem>
<DropdownMenuItem onClick={() => column.toggleSorting(true)}>
2026-03-17 17:49:54 +00:00
<ArrowDownIcon />
2025-11-16 21:11:46 +00:00
{t("components.datatable.desc")}
2025-10-16 11:18:55 +00:00
</DropdownMenuItem>
2026-03-17 17:49:54 +00:00
<DropdownMenuSeparator />
<DropdownMenuItem onClick={() => column.toggleVisibility(false)}>
<EyeOffIcon />
{t("components.datatable.hide")}
</DropdownMenuItem>
2025-10-16 11:18:55 +00:00
</DropdownMenuContent>
</DropdownMenu>
</div>
2025-11-16 21:11:46 +00:00
);
2025-10-16 11:18:55 +00:00
}