import React, { Dispatch, DragEvent, SetStateAction, useRef, useState, } from 'react'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import MenuItem from '@mui/material/MenuItem'; import Switch from '@mui/material/Switch'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import { MRT_ColumnPinningButtons } from '../buttons/MRT_ColumnPinningButtons'; import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton'; import { reorderColumn } from '../column.utils'; import type { MRT_Column, MRT_TableInstance } from '..'; interface Props = {}> { allColumns: MRT_Column[]; column: MRT_Column; hoveredColumn: MRT_Column | null; isSubMenu?: boolean; setHoveredColumn: Dispatch | null>>; table: MRT_TableInstance; } export const MRT_ShowHideColumnsMenuItems = < TData extends Record = {}, >({ allColumns, hoveredColumn, setHoveredColumn, column, isSubMenu, table, }: Props) => { const { getState, options: { enableColumnOrdering, enableHiding, enablePinning, 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); } }; return ( <> ({ alignItems: 'center', justifyContent: 'flex-start', my: 0, opacity: isDragging ? 0.5 : 1, outlineOffset: '-2px', outline: isDragging ? `2px dashed ${theme.palette.divider}` : hoveredColumn?.id === column.id ? `2px dashed ${theme.palette.primary.main}` : 'none', pl: `${(column.depth + 0.5) * 2}rem`, py: '6px', })} > {!isSubMenu && columnDefType !== 'group' && enableColumnOrdering && !allColumns.some( (col) => col.columnDef.columnDefType === 'group', ) && (columnDef.enableColumnOrdering !== false ? ( ) : ( ))} {!isSubMenu && enablePinning && (column.getCanPin() ? ( ) : ( ))} {enableHiding ? ( } disabled={(isSubMenu && switchChecked) || !column.getCanHide()} label={columnDef.header} onChange={() => handleToggleColumnHidden(column)} /> ) : ( {columnDef.header} )} {column.columns?.map((c: MRT_Column, i) => ( ))} ); };