import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdownMenu"; import { cn } from "@/lib/utils"; import { Header, flexRender } from "@tanstack/react-table"; import { ArrowLeftToLine, ArrowRightToLine, Ellipsis, EyeOff, PinOff } from "lucide-react"; import { CSSProperties, useState } from "react"; export const TH_CLASS = "text-foreground h-10 px-4 text-left align-middle font-medium whitespace-nowrap"; export function DraggableColumnHeader({ header, isConfigurable, pinStyle, pinnedHeaderClassName, className: extraClassName, onHide, onPin, onDrop, cellRef, }: { header: Header; isConfigurable: boolean; pinStyle: CSSProperties; pinnedHeaderClassName?: string; className?: string; onHide: (id: string) => void; onPin: (id: string, position: "left" | "right") => void; onDrop: (draggedId: string, targetId: string) => void; cellRef: (el: HTMLTableCellElement | null) => void; }) { const [isDragging, setIsDragging] = useState(false); const [isDropTarget, setIsDropTarget] = useState(false); const pinned = header.column.getIsPinned(); const size = header.getSize(); return ( { setIsDragging(true); e.dataTransfer.setData("text/plain", header.column.id); e.dataTransfer.effectAllowed = "move"; }} onDragEnd={() => setIsDragging(false)} onDragOver={(e) => { if (!isConfigurable) return; e.preventDefault(); e.dataTransfer.dropEffect = "move"; setIsDropTarget(true); }} onDragLeave={() => setIsDropTarget(false)} onDrop={(e) => { e.preventDefault(); setIsDropTarget(false); const draggedId = e.dataTransfer.getData("text/plain"); if (draggedId && draggedId !== header.column.id) { onDrop(draggedId, header.column.id); } }} > {header.isPlaceholder ? null : (
{flexRender(header.column.columnDef.header, header.getContext())}
{isConfigurable && ( onHide(header.column.id)}> Hide column {pinned === "left" ? ( onPin(header.column.id, "left")}> Unpin ) : ( onPin(header.column.id, "left")}> Pin to left )} {pinned === "right" ? ( onPin(header.column.id, "right")}> Unpin ) : ( onPin(header.column.id, "right")}> Pin to right )} )}
)} ); }