import {type DragEvent, type ReactNode, useMemo} from 'react'; import {Box, Flex, type MantineTheme, useMantineTheme} from '@mantine/core'; import {MRT_ColumnActionMenu} from '../menus/MRT_ColumnActionMenu'; import {MRT_TableHeadCellFilterContainer} from './MRT_TableHeadCellFilterContainer'; import {MRT_TableHeadCellFilterLabel} from './MRT_TableHeadCellFilterLabel'; import {MRT_TableHeadCellGrabHandle} from './MRT_TableHeadCellGrabHandle'; import {MRT_TableHeadCellResizeHandle} from './MRT_TableHeadCellResizeHandle'; import {MRT_TableHeadCellSortLabel} from './MRT_TableHeadCellSortLabel'; import {getCommonCellStyles, getPrimaryColor} from '../column.utils'; import {type MRT_Header, type MRT_TableInstance} from '../types'; interface Props = {}> { header: MRT_Header; table: MRT_TableInstance; } export const MRT_TableHeadCell = = {}>({header, table,}: Props) => { const theme = useMantineTheme(); const { getState, options: { enableColumnActions, enableColumnDragging, enableColumnOrdering, enableGrouping, enableMultiSort, layoutMode, mantineTableHeadCellProps, }, refs: {tableHeadCellRefs}, setHoveredColumn, } = table; const {/*density, */draggingColumn, grouping, hoveredColumn, showColumnFilters} = getState(); const {column} = header; const {columnDef} = column; const {columnDefType} = columnDef; const mTableHeadCellProps = mantineTableHeadCellProps instanceof Function ? mantineTableHeadCellProps({column, table}) : mantineTableHeadCellProps; const mcTableHeadCellProps = columnDef.mantineTableHeadCellProps instanceof Function ? columnDef.mantineTableHeadCellProps({column, table}) : columnDef.mantineTableHeadCellProps; const tableCellProps = { ...mTableHeadCellProps, ...mcTableHeadCellProps, }; const showColumnActions = (enableColumnActions || columnDef.enableColumnActions) && columnDef.enableColumnActions !== false; const showDragHandle = enableColumnDragging !== false && columnDef.enableColumnDragging && (enableColumnDragging || (enableColumnOrdering && columnDef.enableColumnOrdering) || (enableGrouping && columnDef.enableGrouping && !grouping.includes(column.id))); const headerPL = useMemo(() => { let pl = 0; if (column.getCanSort()) pl++; if (showColumnActions) pl += 1.75; if (showDragHandle) pl += 1.25; return pl; }, [showColumnActions, showDragHandle]); const draggingBorder = useMemo( () => draggingColumn?.id === column.id ? `1px dashed ${theme.colors.gray[7]} !important` : hoveredColumn?.id === column.id ? `2px dashed ${getPrimaryColor(theme)} !important` : undefined, [draggingColumn, hoveredColumn], ); const draggingBorders = draggingBorder ? { borderLeft: draggingBorder, borderRight: draggingBorder, borderTop: draggingBorder, } : undefined; const handleDragEnter = (_e: DragEvent) => { if (enableGrouping && hoveredColumn?.id === 'drop-zone') { setHoveredColumn(null); } if (enableColumnOrdering && draggingColumn && columnDefType !== 'group') { setHoveredColumn( columnDef.enableColumnOrdering ? column : null, ); } }; const headerElement = columnDef?.Header instanceof Function ? columnDef?.Header?.({ column, header, table, }) : columnDef?.Header ?? (columnDef.header as ReactNode); return ( { if (node) { tableHeadCellRefs.current[column.id] = node; } }} {...tableCellProps} sx={(theme: MantineTheme) => ({ flexDirection: layoutMode === 'grid' ? 'column' : undefined, fontWeight: 'bold', overflow: 'visible', userSelect: enableMultiSort && column.getCanSort() ? 'none' : undefined, verticalAlign: 'top', zIndex: column.getIsResizing() || draggingColumn?.id === column.id ? 3 : column.getIsPinned() && columnDefType !== 'group' ? 2 : 1, '&:hover .mantine-ActionIcon-root': { opacity: 1, }, ...getCommonCellStyles({ column, header, table, tableCellProps, theme, }), ...draggingBorders, padding: "0 !important", })} > {header.isPlaceholder ? null : ( {headerElement} {column.getCanSort() && ( )} {column.getCanFilter() && ( )} {columnDefType !== 'group' && ( {showDragHandle && ( )} {showColumnActions && ( )} )} {column.getCanResize() && ( )} )} {( )} ); };