import React, { useMemo, useState } from 'react'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import Menu from '@mui/material/Menu'; import { MRT_ShowHideColumnsMenuItems } from './MRT_ShowHideColumnsMenuItems'; import { getDefaultColumnOrderIds } from '../column.utils'; import type { MRT_Column, MRT_TableInstance } from '..'; interface Props = {}> { anchorEl: HTMLElement | null; isSubMenu?: boolean; setAnchorEl: (anchorEl: HTMLElement | null) => void; table: MRT_TableInstance; } export const MRT_ShowHideColumnsMenu = < TData extends Record = {}, >({ anchorEl, isSubMenu, setAnchorEl, table, }: Props) => { const { getAllColumns, getAllLeafColumns, getCenterLeafColumns, getIsAllColumnsVisible, getIsSomeColumnsPinned, getIsSomeColumnsVisible, getLeftLeafColumns, getRightLeafColumns, getState, toggleAllColumnsVisible, options: { enableColumnOrdering, enableHiding, enablePinning, localization, }, } = table; const { density, columnOrder, columnPinning } = getState(); const hideAllColumns = () => { getAllLeafColumns() .filter((col) => col.columnDef.enableHiding !== false) .forEach((col) => col.toggleVisibility(false)); }; 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 [hoveredColumn, setHoveredColumn] = useState | null>( null, ); return ( setAnchorEl(null)} MenuListProps={{ dense: density === 'compact', }} > {!isSubMenu && enableHiding && ( )} {!isSubMenu && enableColumnOrdering && ( )} {!isSubMenu && enablePinning && ( )} {enableHiding && ( )} {allColumns.map((column, index) => ( ))} ); };