import { useMemo, useState } from 'react'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import Menu, { type MenuProps } from '@mui/material/Menu'; import { MRT_ShowHideColumnsMenuItems } from './MRT_ShowHideColumnsMenuItems'; import { type MRT_Column, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { getDefaultColumnOrderIds } from '../../utils/displayColumn.utils'; export interface MRT_ShowHideColumnsMenuProps extends Partial { anchorEl: HTMLElement | null; isSubMenu?: boolean; setAnchorEl: (anchorEl: HTMLElement | null) => void; table: MRT_TableInstance; } export const MRT_ShowHideColumnsMenu = ({ anchorEl, setAnchorEl, table, ...rest }: MRT_ShowHideColumnsMenuProps) => { const { getAllColumns, getAllLeafColumns, getCenterLeafColumns, getIsAllColumnsVisible, getIsSomeColumnsPinned, getIsSomeColumnsVisible, getLeftLeafColumns, getRightLeafColumns, getState, initialState, options: { enableColumnOrdering, enableColumnPinning, enableHiding, localization, mrtTheme: { menuBackgroundColor }, }, } = table; const { columnOrder, columnPinning, density } = getState(); const handleToggleAllColumns = (value?: boolean) => { getAllLeafColumns() .filter((col) => col.columnDef.enableHiding !== false) .forEach((col) => col.toggleVisibility(value)); }; const allColumns = useMemo(() => { const columns = getAllColumns(); if ( columnOrder.length > 0 && !columns.some((col) => col.columnDef.columnDefType === 'group') ) { return [ ...getLeftLeafColumns(), ...Array.from(new Set(columnOrder)).map((colId) => getCenterLeafColumns().find((col) => col?.id === colId), ), ...getRightLeafColumns(), ].filter(Boolean); } return columns; }, [ columnOrder, columnPinning, getAllColumns(), getCenterLeafColumns(), getLeftLeafColumns(), getRightLeafColumns(), ]) as MRT_Column[]; const isNestedColumns = allColumns.some( (col) => col.columnDef.columnDefType === 'group', ); const hasColumnOrderChanged = useMemo( () => columnOrder.length !== initialState.columnOrder.length || !columnOrder.every( (column, index) => column === initialState.columnOrder[index], ), [columnOrder, initialState.columnOrder], ); const [hoveredColumn, setHoveredColumn] = useState | null>( null, ); return ( setAnchorEl(null)} open={!!anchorEl} {...rest} > {enableHiding && ( )} {enableColumnOrdering && ( )} {enableColumnPinning && ( )} {enableHiding && ( )} {allColumns.map((column, index) => ( ))} ); };