import { type DragEvent, type RefObject } from 'react'; import { type IconButtonProps } from '@mui/material/IconButton'; import { type MRT_Column, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { reorderColumn } from '../../utils/column.utils'; import { parseFromValuesOrFunc } from '../../utils/utils'; import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton'; export interface MRT_TableHeadCellGrabHandleProps extends IconButtonProps { column: MRT_Column; table: MRT_TableInstance; tableHeadCellRef: RefObject; } export const MRT_TableHeadCellGrabHandle = ({ column, table, tableHeadCellRef, ...rest }: MRT_TableHeadCellGrabHandleProps) => { const { getState, options: { enableColumnOrdering, muiColumnDragHandleProps }, setColumnOrder, setColumnPinning, setDraggingColumn, setHoveredColumn, } = table; const { columnDef } = column; const { columnOrder, draggingColumn, hoveredColumn } = getState(); const iconButtonProps = { ...parseFromValuesOrFunc(muiColumnDragHandleProps, { column, table }), ...parseFromValuesOrFunc(columnDef.muiColumnDragHandleProps, { column, table, }), ...rest, }; const handleDragStart = (event: DragEvent) => { iconButtonProps?.onDragStart?.(event); setDraggingColumn(column); try { event.dataTransfer.setDragImage( tableHeadCellRef.current as HTMLElement, 0, 0, ); } catch (e) { console.error(e); } }; const handleDragEnd = (event: DragEvent) => { iconButtonProps?.onDragEnd?.(event); if (hoveredColumn?.id === 'drop-zone') { column.toggleGrouping(); } else if ( enableColumnOrdering && hoveredColumn && hoveredColumn?.id !== draggingColumn?.id ) { const reorderedColumns = reorderColumn(column, hoveredColumn as MRT_Column, columnOrder); setColumnOrder(reorderedColumns); setColumnPinning(({ left = [], right = [] }) => ({ left: reorderedColumns.filter(header => left.includes(header)), right: reorderedColumns.filter(header => right.includes(header)), })); } setDraggingColumn(null); setHoveredColumn(null); }; return ( ); };