import { ReactNode, useMemo, type MouseEvent } from 'react'; import Menu, { type MenuProps } from '@mui/material/Menu'; import { MRT_ActionMenuItem } from './MRT_ActionMenuItem'; import { type MRT_Row, type MRT_RowData, type MRT_TableInstance, } from '../../types'; import { parseFromValuesOrFunc } from '../../utils/utils'; export interface MRT_RowActionMenuProps extends Partial { anchorEl: HTMLElement | null; handleEdit: (event: MouseEvent) => void; row: MRT_Row; setAnchorEl: (anchorEl: HTMLElement | null) => void; staticRowIndex?: number; table: MRT_TableInstance; } export const MRT_RowActionMenu = ({ anchorEl, handleEdit, row, setAnchorEl, staticRowIndex, table, ...rest }: MRT_RowActionMenuProps) => { const { getState, options: { editDisplayMode, enableEditing, icons: { EditIcon }, localization, mrtTheme: { menuBackgroundColor }, renderRowActionMenuItems, }, } = table; const { density } = getState(); const menuItems = useMemo(() => { const items: ReactNode[] = []; const editItem = parseFromValuesOrFunc(enableEditing, row) && ['modal', 'row'].includes(editDisplayMode!) && ( } label={localization.edit} onClick={handleEdit} table={table} /> ); if (editItem) items.push(editItem); const rowActionMenuItems = renderRowActionMenuItems?.({ closeMenu: () => setAnchorEl(null), row, staticRowIndex, table, }); if (rowActionMenuItems?.length) items.push(...rowActionMenuItems); return items; }, [renderRowActionMenuItems, row, staticRowIndex, table]); if (!menuItems.length) return null; return ( event.stopPropagation()} onClose={() => setAnchorEl(null)} open={!!anchorEl} {...rest} > {menuItems} ); };