From 8fe3290b3101607cba3086768c48768260fa3aff Mon Sep 17 00:00:00 2001 From: Mohamed Fall Date: Sat, 12 Sep 2026 17:40:41 +0000 Subject: [PATCH] fix(Label): reset edit state when canceling with escape Signed-off-by: Mohamed Fall --- .../react-core/src/components/Label/Label.tsx | 3 +- .../components/Label/__tests__/Label.test.tsx | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/react-core/src/components/Label/Label.tsx b/packages/react-core/src/components/Label/Label.tsx index 1590844fe02..295f8794fd0 100644 --- a/packages/react-core/src/components/Label/Label.tsx +++ b/packages/react-core/src/components/Label/Label.tsx @@ -205,9 +205,8 @@ export const Label: React.FunctionComponent = ({ if (isEditableActive && key === 'Escape') { event.preventDefault(); event.stopImmediatePropagation(); - // Reset div text to initial children prop - pre-edit + setCurrValue(children); if (editableInputRef.current.value) { - editableInputRef.current.value = children as string; onEditCancel && onEditCancel(event, children as string); } setIsEditableActive(false); diff --git a/packages/react-core/src/components/Label/__tests__/Label.test.tsx b/packages/react-core/src/components/Label/__tests__/Label.test.tsx index dd7655eb3ba..848a45db8a3 100644 --- a/packages/react-core/src/components/Label/__tests__/Label.test.tsx +++ b/packages/react-core/src/components/Label/__tests__/Label.test.tsx @@ -109,6 +109,44 @@ describe('Label', () => { expect(asFragment()).toMatchSnapshot(); }); + test('editable label discards the draft text when the edit is canceled with escape', async () => { + const user = userEvent.setup(); + + render( + + ); + + await user.click(screen.getByRole('button', { name: 'Something' })); + await user.type(screen.getByRole('textbox'), ' else'); + expect(screen.getByRole('textbox')).toHaveValue('Something else'); + + await user.keyboard('{Escape}'); + expect(screen.getByRole('button', { name: 'Something' })).toBeInTheDocument(); + + // Reopening the editor must show the original text, not the discarded draft + await user.click(screen.getByRole('button', { name: 'Something' })); + expect(screen.getByRole('textbox')).toHaveValue('Something'); + }); + + test('editable label calls onEditCancel with the previous text when the edit is canceled with escape', async () => { + const user = userEvent.setup(); + const onEditCancel = jest.fn(); + + render( + + ); + + await user.click(screen.getByRole('button', { name: 'Something' })); + await user.type(screen.getByRole('textbox'), ' else'); + await user.keyboard('{Escape}'); + + expect(onEditCancel).toHaveBeenCalledWith(expect.anything(), 'Something'); + }); + test('renders with variant overflow and type is set to button ', () => { const { asFragment } = render(); expect(screen.getByRole('button')).toHaveAttribute('type', 'button');