diff --git a/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx b/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx index ff94890b83976..3c952d5c36ee6 100644 --- a/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx +++ b/packages/x-data-grid-premium/src/components/GridColumnMenuAggregationItem.tsx @@ -4,6 +4,7 @@ import { GridColumnMenuItemProps, useGridSelector } from '@mui/x-data-grid-pro'; import FormControl from '@mui/material/FormControl'; import InputLabel from '@mui/material/InputLabel'; import { unstable_useId as useId } from '@mui/utils'; +import { SelectChangeEvent } from '@mui/material/Select'; import { useGridApiContext } from '../hooks/utils/useGridApiContext'; import { useGridRootProps } from '../hooks/utils/useGridRootProps'; import { @@ -17,10 +18,10 @@ import { GridAggregationModel } from '../hooks/features/aggregation/gridAggregat function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { const { colDef } = props; const apiRef = useGridApiContext(); + const inputRef = React.useRef(); const rootProps = useGridRootProps(); const id = useId(); const aggregationModel = useGridSelector(apiRef, gridAggregationModelSelector); - const availableAggregationFunctions = React.useMemo( () => getAvailableAggregationFunctions({ @@ -29,12 +30,15 @@ function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { }), [colDef, rootProps.aggregationFunctions], ); + const { native: isBaseSelectNative = false, ...baseSelectProps } = + rootProps.slotProps?.baseSelect || {}; + + const baseSelectOptionProps = rootProps.slotProps?.baseSelectOption || {}; const selectedAggregationRule = React.useMemo(() => { if (!colDef || !aggregationModel[colDef.field]) { return ''; } - const aggregationFunctionName = aggregationModel[colDef.field]; if ( canColumnHaveAggregationFunction({ @@ -49,7 +53,7 @@ function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { return ''; }, [rootProps.aggregationFunctions, aggregationModel, colDef]); - const handleAggregationItemChange = (event: Event) => { + const handleAggregationItemChange = (event: SelectChangeEvent) => { const newAggregationItem = (event.target as HTMLSelectElement | null)?.value || undefined; const currentModel = gridAggregationModelSelector(apiRef); const { [colDef.field]: columnItem, ...otherColumnItems } = currentModel; @@ -64,26 +68,60 @@ function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { const label = apiRef.current.getLocaleText('aggregationMenuItemHeader'); + const handleMenuItemKeyDown = React.useCallback((event: React.KeyboardEvent) => { + if (event.key === 'Enter' || event.key === ' ') { + inputRef.current.focus(); + } + }, []); + + const handleSelectKeyDown = React.useCallback((event: React.KeyboardEvent) => { + if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === ' ') { + event.stopPropagation(); + } + }, []); + return ( } + onKeyDown={handleMenuItemKeyDown} > - {label} + + {label} + event.stopPropagation()} + native={isBaseSelectNative} fullWidth + {...baseSelectProps} > - ... + + ... + {availableAggregationFunctions.map((aggFunc) => ( - + {getAggregationFunctionLabel({ apiRef, aggregationRule: { @@ -91,7 +129,7 @@ function GridColumnMenuAggregationItem(props: GridColumnMenuItemProps) { aggregationFunction: rootProps.aggregationFunctions[aggFunc], }, })} - + ))}