44 lines
1.0 KiB
TypeScript
44 lines
1.0 KiB
TypeScript
import { type Column } from '@tanstack/react-table'
|
|
import {
|
|
ChevronDownIcon,
|
|
ChevronsUpDownIcon,
|
|
ChevronUpIcon
|
|
} from 'lucide-react'
|
|
|
|
import { Button } from '@repo/ui/components/ui/button'
|
|
import { cn } from '@repo/ui/lib/utils'
|
|
|
|
interface DataTableColumnHeaderProps<TData, TValue>
|
|
extends React.HTMLAttributes<HTMLDivElement> {
|
|
column: Column<TData, TValue>
|
|
title: string
|
|
}
|
|
|
|
export function DataTableColumnHeader<TData, TValue>({
|
|
column,
|
|
title,
|
|
className
|
|
}: DataTableColumnHeaderProps<TData, TValue>) {
|
|
if (!column.getCanSort()) {
|
|
return <div className={cn(className)}>{title}</div>
|
|
}
|
|
|
|
return (
|
|
<Button
|
|
variant="ghost"
|
|
size="sm"
|
|
className={cn('-ml-3 cursor-pointer', className)}
|
|
onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
|
|
>
|
|
<span>{title}</span>
|
|
{column.getIsSorted() === 'desc' ? (
|
|
<ChevronDownIcon />
|
|
) : column.getIsSorted() === 'asc' ? (
|
|
<ChevronUpIcon />
|
|
) : (
|
|
<ChevronsUpDownIcon />
|
|
)}
|
|
</Button>
|
|
)
|
|
}
|