import { type Dispatch, type DragEvent, type SetStateAction, useRef, useState, } from 'react'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import MenuItem, { type MenuItemProps } from '@mui/material/MenuItem'; import Switch from '@mui/material/Switch'; import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import { type MRT_Column, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { reorderColumn } from '../../utils/column.utils'; import { getCommonTooltipProps } from '../../utils/style.utils'; import { parseFromValuesOrFunc } from '../../utils/utils'; import { MRT_ColumnPinningButtons } from '../buttons/MRT_ColumnPinningButtons'; import { MRT_GrabHandleButton } from '../buttons/MRT_GrabHandleButton'; export interface MRT_ShowHideColumnsMenuItemsProps extends MenuItemProps { allColumns: MRT_Column[]; column: MRT_Column; hoveredColumn: MRT_Column | null; isNestedColumns: boolean; setHoveredColumn: Dispatch | null>>; table: MRT_TableInstance; } export const MRT_ShowHideColumnsMenuItems = ({ allColumns, column, hoveredColumn, isNestedColumns, setHoveredColumn, table, ...rest }: MRT_ShowHideColumnsMenuItemsProps) => { const { getState, options: { enableColumnOrdering, enableColumnPinning, enableHiding, localization, mrtTheme: { draggingBorderColor }, }, setColumnOrder, setColumnPinning, } = table; const { columnOrder } = getState(); const { columnDef } = column; const { columnDefType } = columnDef; const switchChecked = column.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); try { e.dataTransfer.setDragImage(menuItemRef.current as HTMLElement, 0, 0); } catch (e) { console.error(e); } }; const handleDragEnd = (_e: DragEvent) => { setIsDragging(false); setHoveredColumn(null); if (hoveredColumn) { const reorderedColumns = reorderColumn(column, hoveredColumn, columnOrder); setColumnOrder(reorderedColumns); setColumnPinning(({ left = [], right = [] }) => ({ left: reorderedColumns.filter(header => left.includes(header)), right: reorderedColumns.filter(header => right.includes(header)), })); } }; const handleDragEnter = (_e: DragEvent) => { if (!isDragging && columnDef.enableColumnOrdering !== false) { setHoveredColumn(column); } }; if (!columnDef.header || columnDef.visibleInShowHideMenu === false) { return null; } return ( <> ({ alignItems: 'center', justifyContent: 'flex-start', my: 0, opacity: isDragging ? 0.5 : 1, outline: isDragging ? `2px dashed ${theme.palette.grey[500]}` : hoveredColumn?.id === column.id ? `2px dashed ${draggingBorderColor}` : 'none', outlineOffset: '-2px', pl: `${(column.depth + 0.5) * 2}rem`, py: '6px', ...(parseFromValuesOrFunc(rest?.sx, theme) as any), })} > {columnDefType !== 'group' && enableColumnOrdering && !isNestedColumns && (columnDef.enableColumnOrdering !== false ? ( ) : ( ))} {enableColumnPinning && (column.getCanPin() ? ( ) : ( ))} {enableHiding ? ( } disabled={!column.getCanHide()} label={columnDef.header} onChange={() => handleToggleColumnHidden(column)} /> ) : ( {columnDef.header} )} {column.columns?.map((c: MRT_Column, i) => ( ))} ); };