import { type DragEvent, type RefObject } from 'react'; import { type ActionIconProps } from '@mantine/core'; import { type MRT_CellValue, 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'; interface Props extends ActionIconProps { column: MRT_Column; table: MRT_TableInstance; tableHeadCellRef: RefObject; } export const MRT_TableHeadCellGrabHandle = ({ column, table, tableHeadCellRef, ...rest }: Props) => { 'use no memo'; const { getState, options: { enableColumnOrdering, mantineColumnDragHandleProps }, setColumnOrder, setDraggingColumn, setHoveredColumn, } = table; const { columnDef } = column; const { columnOrder, draggingColumn, hoveredColumn } = getState(); const arg = { column, table }; const actionIconProps = { ...parseFromValuesOrFunc(mantineColumnDragHandleProps, arg), ...parseFromValuesOrFunc(columnDef.mantineColumnDragHandleProps, arg), ...rest, }; const handleDragStart = (event: DragEvent) => { actionIconProps?.onDragStart?.(event); setDraggingColumn(column); event.dataTransfer.setDragImage( tableHeadCellRef.current as HTMLElement, 0, 0, ); }; const handleDragEnd = (event: DragEvent) => { actionIconProps?.onDragEnd?.(event); if (hoveredColumn?.id === 'drop-zone') { column.toggleGrouping(); } else if ( enableColumnOrdering && hoveredColumn && hoveredColumn?.id !== draggingColumn?.id ) { setColumnOrder( reorderColumn(column, hoveredColumn as MRT_Column, columnOrder), ); } setDraggingColumn(null); setHoveredColumn(null); }; return ( ); };