import classes from './MRT_ShowHideColumnsMenuItems.module.css'; import { type Dispatch, type DragEvent, type SetStateAction, useRef, useState, } from 'react'; import { Box, Menu, Switch, Text, Tooltip, useMantineTheme, } 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 { dataVariable, getPrimaryColor } from '../../utils/style.utils'; import { MRT_ColumnPinningButtons } from '../buttons/MRT_ColumnPinningButtons'; import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton'; interface Props { allColumns: MRT_Column[]; column: MRT_Column; hoveredColumn: MRT_Column | null; setHoveredColumn: Dispatch | null>>; table: MRT_TableInstance; } export const MRT_ShowHideColumnsMenuItems = ({ allColumns, column, hoveredColumn, setHoveredColumn, table, }: Props) => { 'use no memo'; const theme = useMantineTheme(); const { getState, options: { enableColumnOrdering, enableColumnPinning, enableHiding, localization, }, setColumnOrder, } = table; const { columnOrder } = getState(); const { columnDef } = column; const { columnDefType } = columnDef; const switchChecked = (columnDefType !== 'group' && column.getIsVisible()) || (columnDefType === 'group' && column.getLeafColumns().some((col) => col.getIsVisible())); const handleToggleColumnHidden = (column: MRT_Column) => { if (columnDefType === 'group') { column?.columns?.forEach?.((childColumn: MRT_Column) => { childColumn.toggleVisibility(!switchChecked); }); } else { column.toggleVisibility(); } }; const menuItemRef = useRef(null); const [isDragging, setIsDragging] = useState(false); const handleDragStart = (e: DragEvent) => { setIsDragging(true); e.dataTransfer.setDragImage(menuItemRef.current as HTMLElement, 0, 0); }; const handleDragEnd = (_e: DragEvent) => { setIsDragging(false); setHoveredColumn(null); if (hoveredColumn) { setColumnOrder(reorderColumn(column, hoveredColumn, columnOrder)); } }; const handleDragEnter = (_e: DragEvent) => { if (!isDragging && columnDef.enableColumnOrdering !== false) { setHoveredColumn(column); } }; if (!columnDef.header || columnDef.visibleInShowHideMenu === false) { return null; } return ( <> {columnDefType !== 'group' && enableColumnOrdering && !allColumns.some( (col) => col.columnDef.columnDefType === 'group', ) && (columnDef.enableColumnOrdering !== false ? ( ) : ( ))} {enableColumnPinning && (column.getCanPin() ? ( ) : ( ))} {enableHiding ? ( handleToggleColumnHidden(column)} /> ) : ( {columnDef.header} )} {column.columns?.map((c: MRT_Column, i) => ( ))} ); };