import React, { useState } from 'react'; import Box from '@mui/material/Box'; import IconButton from '@mui/material/IconButton'; import ListItemIcon from '@mui/material/ListItemIcon'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; import { MRT_FilterOptionMenu } from './MRT_FilterOptionMenu'; import { MRT_ShowHideColumnsMenu } from './MRT_ShowHideColumnsMenu'; import type { MRT_Header, MRT_TableInstance } from '..'; export const commonMenuItemStyles = { py: '6px', my: 0, justifyContent: 'space-between', alignItems: 'center', }; export const commonListItemStyles = { display: 'flex', alignItems: 'center', }; interface Props { anchorEl: HTMLElement | null; header: MRT_Header; setAnchorEl: (anchorEl: HTMLElement | null) => void; table: MRT_TableInstance; } export const MRT_ColumnActionMenu = ({ anchorEl, header, setAnchorEl, table, }: Props) => { const { getState, toggleAllColumnsVisible, setColumnOrder, options: { columnFilterModeOptions, enableColumnFilterModes, enableColumnFilters, enableColumnResizing, enableGrouping, enableHiding, enablePinning, enableSorting, icons: { ArrowRightIcon, ClearAllIcon, ViewColumnIcon, DynamicFeedIcon, FilterListIcon, FilterListOffIcon, PushPinIcon, SortIcon, RestartAltIcon, VisibilityOffIcon, }, localization, renderColumnActionsMenuItems, }, refs: { filterInputRefs }, setColumnSizingInfo, setShowFilters, } = table; const { column } = header; const { columnDef } = column; const { columnSizing, columnVisibility, density } = getState(); const [filterMenuAnchorEl, setFilterMenuAnchorEl] = useState(null); const [showHideColumnsMenuAnchorEl, setShowHideColumnsMenuAnchorEl] = useState(null); const handleClearSort = () => { column.clearSorting(); setAnchorEl(null); }; const handleSortAsc = () => { column.toggleSorting(false); setAnchorEl(null); }; const handleSortDesc = () => { column.toggleSorting(true); setAnchorEl(null); }; const handleResetColumnSize = () => { setColumnSizingInfo((old) => ({ ...old, isResizingColumn: false })); column.resetSize(); setAnchorEl(null); }; const handleHideColumn = () => { column.toggleVisibility(false); setAnchorEl(null); }; const handlePinColumn = (pinDirection: 'left' | 'right' | false) => { column.pin(pinDirection); setAnchorEl(null); }; const handleGroupByColumn = () => { column.toggleGrouping(); setColumnOrder((old: any) => ['mrt-row-expand', ...old]); setAnchorEl(null); }; const handleClearFilter = () => { column.setFilterValue(''); setAnchorEl(null); }; const handleFilterByColumn = () => { setShowFilters(true); queueMicrotask(() => filterInputRefs.current[`${column.id}-0`]?.focus()); setAnchorEl(null); }; const handleShowAllColumns = () => { toggleAllColumnsVisible(true); setAnchorEl(null); }; const handleOpenFilterModeMenu = (event: React.MouseEvent) => { event.stopPropagation(); setFilterMenuAnchorEl(event.currentTarget); }; const handleOpenShowHideColumnsMenu = ( event: React.MouseEvent, ) => { event.stopPropagation(); setShowHideColumnsMenuAnchorEl(event.currentTarget); }; const isSelectFilter = !!columnDef.filterSelectOptions; const allowedColumnFilterOptions = columnDef?.columnFilterModeOptions ?? columnFilterModeOptions; const showFilterModeSubMenu = enableColumnFilterModes && columnDef.enableColumnFilterModes !== false && !isSelectFilter && (allowedColumnFilterOptions === undefined || !!allowedColumnFilterOptions?.length); return ( setAnchorEl(null)} MenuListProps={{ dense: density === 'compact', }} > {columnDef.renderColumnActionsMenuItems?.({ closeMenu: () => setAnchorEl(null), column, table, }) ?? renderColumnActionsMenuItems?.({ closeMenu: () => setAnchorEl(null), column, table, }) ?? (enableSorting && column.getCanSort() && [ {localization.clearSort} , {localization.sortByColumnAsc?.replace( '{column}', String(columnDef.header), )} , {localization.sortByColumnDesc?.replace( '{column}', String(columnDef.header), )} , ])} {enableColumnFilters && column.getCanFilter() && [ {localization.clearFilter} , {localization.filterByColumn?.replace( '{column}', String(columnDef.header), )} {showFilterModeSubMenu && ( )} , showFilterModeSubMenu && ( ), ].filter(Boolean)} {enableGrouping && column.getCanGroup() && [ {localization[ column.getIsGrouped() ? 'ungroupByColumn' : 'groupByColumn' ]?.replace('{column}', String(columnDef.header))} , ]} {enablePinning && column.getCanPin() && [ handlePinColumn('left')} sx={commonMenuItemStyles} > {localization.pinToLeft} , handlePinColumn('right')} sx={commonMenuItemStyles} > {localization.pinToRight} , handlePinColumn(false)} sx={commonMenuItemStyles} > {localization.unpin} , ]} {enableColumnResizing && column.getCanResize() && [ {localization.resetColumnSize} , ]} {enableHiding && [ {localization.hideColumn?.replace( '{column}', String(columnDef.header), )} , !visible) .length } key={1} onClick={handleShowAllColumns} sx={commonMenuItemStyles} > {localization.showAllColumns?.replace( '{column}', String(columnDef.header), )} , , ]} ); };