import classes from './MRT_ColumnActionMenu.module.css'; import { ActionIcon, Menu, type MenuProps, Tooltip } from '@mantine/core'; import { type MRT_Header, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { parseFromValuesOrFunc } from '../../utils/utils'; interface Props extends MenuProps { header: MRT_Header; table: MRT_TableInstance; } export const MRT_ColumnActionMenu = ({ header, table, ...rest }: Props) => { 'use no memo'; const { getState, options: { columnFilterDisplayMode, enableColumnFilters, enableColumnPinning, enableColumnResizing, enableGrouping, enableHiding, enableSorting, enableSortingRemoval, icons: { IconArrowAutofitContent, IconBoxMultiple, IconClearAll, IconColumns, IconDotsVertical, IconEyeOff, IconFilter, IconFilterOff, IconPinned, IconPinnedOff, IconSortAscending, IconSortDescending, }, localization, mantineColumnActionsButtonProps, renderColumnActionsMenuItems, }, refs: { filterInputRefs }, setColumnOrder, setColumnSizingInfo, setShowColumnFilters, toggleAllColumnsVisible, } = table; const { column } = header; const { columnDef } = column; const { columnSizing, columnVisibility } = getState(); const arg = { column, table }; const actionIconProps = { ...parseFromValuesOrFunc(mantineColumnActionsButtonProps, arg), ...parseFromValuesOrFunc(columnDef.mantineColumnActionsButtonProps, arg), }; const handleClearSort = () => { column.clearSorting(); }; const handleSortAsc = () => { column.toggleSorting(false); }; const handleSortDesc = () => { column.toggleSorting(true); }; const handleResetColumnSize = () => { setColumnSizingInfo((old) => ({ ...old, isResizingColumn: false })); column.resetSize(); }; const handleHideColumn = () => { column.toggleVisibility(false); }; const handlePinColumn = (pinDirection: 'left' | 'right' | false) => { column.pin(pinDirection); }; const handleGroupByColumn = () => { column.toggleGrouping(); setColumnOrder((old: any) => ['mrt-row-expand', ...old]); }; const handleClearFilter = () => { column.setFilterValue(''); }; const handleFilterByColumn = () => { setShowColumnFilters(true); setTimeout(() => filterInputRefs.current[`${column.id}-0`]?.focus(), 100); }; const handleShowAllColumns = () => { toggleAllColumnsVisible(true); }; const internalColumnMenuItems = ( <> {enableSorting && column.getCanSort() && ( <> {enableSortingRemoval !== false && ( } onClick={handleClearSort} > {localization.clearSort} )} } onClick={handleSortAsc} > {localization.sortByColumnAsc?.replace( '{column}', String(columnDef.header), )} } onClick={handleSortDesc} > {localization.sortByColumnDesc?.replace( '{column}', String(columnDef.header), )} {(enableColumnFilters || enableGrouping || enableHiding) && ( )} )} {enableColumnFilters && columnFilterDisplayMode !== 'popover' && column.getCanFilter() && ( <> } onClick={handleClearFilter} > {localization.clearFilter} } onClick={handleFilterByColumn} > {localization.filterByColumn?.replace( '{column}', String(columnDef.header), )} {(enableGrouping || enableHiding) && } )} {enableGrouping && column.getCanGroup() && ( <> } onClick={handleGroupByColumn} > {localization[ column.getIsGrouped() ? 'ungroupByColumn' : 'groupByColumn' ]?.replace('{column}', String(columnDef.header))} {enableColumnPinning && } )} {enableColumnPinning && column.getCanPin() && ( <> } onClick={() => handlePinColumn('left')} > {localization.pinToLeft} } onClick={() => handlePinColumn('right')} > {localization.pinToRight} } onClick={() => handlePinColumn(false)} > {localization.unpin} {enableHiding && } )} {enableColumnResizing && column.getCanResize() && ( } onClick={handleResetColumnSize} > {localization.resetColumnSize} )} {enableHiding && ( <> } onClick={handleHideColumn} > {localization.hideColumn?.replace( '{column}', String(columnDef.header), )} !visible) .length } key={1} leftSection={} onClick={handleShowAllColumns} > {localization.showAllColumns?.replace( '{column}', String(columnDef.header), )} )} ); return ( {columnDef.renderColumnActionsMenuItems?.({ column, internalColumnMenuItems, table, }) ?? renderColumnActionsMenuItems?.({ column, internalColumnMenuItems, table, }) ?? internalColumnMenuItems} ); };