diff --git a/packages/mui-material/src/ButtonGroup/ButtonGroup.js b/packages/mui-material/src/ButtonGroup/ButtonGroup.js index bc5ed9a02a1d98..ba322b6549843c 100644 --- a/packages/mui-material/src/ButtonGroup/ButtonGroup.js +++ b/packages/mui-material/src/ButtonGroup/ButtonGroup.js @@ -337,7 +337,7 @@ const ButtonGroup = React.forwardRef(function ButtonGroup(inProps, ref) { {validChildren.map((child, index) => { return ( {child} diff --git a/packages/mui-material/src/ButtonGroup/ButtonGroup.test.js b/packages/mui-material/src/ButtonGroup/ButtonGroup.test.js index 6f426cac527469..94dd5d303585c9 100644 --- a/packages/mui-material/src/ButtonGroup/ButtonGroup.test.js +++ b/packages/mui-material/src/ButtonGroup/ButtonGroup.test.js @@ -1,5 +1,11 @@ import { describe, it, expect } from 'vitest'; -import { createRenderer, screen, simulateKeyboardDevice, isJsdom } from '@mui/internal-test-utils'; +import { + act, + createRenderer, + screen, + simulateKeyboardDevice, + isJsdom, +} from '@mui/internal-test-utils'; import ButtonGroup, { buttonGroupClasses as classes } from '@mui/material/ButtonGroup'; import { ThemeProvider, createTheme } from '@mui/material/styles'; import Button, { buttonClasses } from '@mui/material/Button'; @@ -364,5 +370,27 @@ describe('', () => { expect(button).not.to.have.class(classes.middleButton); expect(button).not.to.have.class(classes.lastButton); }); + + it('should keep a button mounted when the button before it is removed', async () => { + function Toolbar({ showUndo }) { + return ( + + {showUndo && } + + + + ); + } + const { setProps } = render(); + const saveButton = screen.getByRole('button', { name: 'Save' }); + await act(async () => { + saveButton.focus(); + }); + + setProps({ showUndo: false }); + + expect(screen.getByRole('button', { name: 'Save' })).to.equal(saveButton); + expect(saveButton).toHaveFocus(); + }); }); }); diff --git a/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.js b/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.js index 0811ad55d0caec..d580a6069a2d51 100644 --- a/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.js +++ b/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.js @@ -262,7 +262,7 @@ const ToggleButtonGroup = React.forwardRef(function ToggleButtonGroup(inProps, r return ( {child} diff --git a/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.test.js b/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.test.js index cbcf2f76b4865d..71b735025b1f2d 100644 --- a/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.test.js +++ b/packages/mui-material/src/ToggleButtonGroup/ToggleButtonGroup.test.js @@ -2,7 +2,7 @@ import { describe, it, expect } from 'vitest'; import * as React from 'react'; import { createTheme, ThemeProvider } from '@mui/material/styles'; import { spy } from 'sinon'; -import { createRenderer, screen } from '@mui/internal-test-utils'; +import { act, createRenderer, screen } from '@mui/internal-test-utils'; import ToggleButtonGroup, { toggleButtonGroupClasses as classes, } from '@mui/material/ToggleButtonGroup'; @@ -448,6 +448,28 @@ describe('', () => { expect(button).not.to.have.class(classes.middleButton); expect(button).not.to.have.class(classes.lastButton); }); + + it('should keep a button mounted when the button before it is removed', async () => { + function Toolbar({ showLeft }) { + return ( + + {showLeft && Left} + Center + Right + + ); + } + const { setProps } = render(); + const centerButton = screen.getByRole('button', { name: 'Center' }); + await act(async () => { + centerButton.focus(); + }); + + setProps({ showLeft: false }); + + expect(screen.getByRole('button', { name: 'Center' })).to.equal(centerButton); + expect(centerButton).toHaveFocus(); + }); }); describe('WCAG 2.2 conformance', () => {