Skip to content

Commit 4927d44

Browse files
authored
fix(Label): reset edit state when canceling with escape (#12649)
Signed-off-by: Mohamed Fall <ps.hackmaster@gmail.com>
1 parent 103c595 commit 4927d44

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

‎packages/react-core/src/components/Label/Label.tsx‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,8 @@ export const Label: React.FunctionComponent<LabelProps> = ({
205205
if (isEditableActive && key === 'Escape') {
206206
event.preventDefault();
207207
event.stopImmediatePropagation();
208-
// Reset div text to initial children prop - pre-edit
208+
setCurrValue(children);
209209
if (editableInputRef.current.value) {
210-
editableInputRef.current.value = children as string;
211210
onEditCancel && onEditCancel(event, children as string);
212211
}
213212
setIsEditableActive(false);

‎packages/react-core/src/components/Label/__tests__/Label.test.tsx‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,46 @@ describe('Label', () => {
109109
expect(asFragment()).toMatchSnapshot();
110110
});
111111

112+
test('editable label discards the draft text when the edit is canceled with escape', async () => {
113+
const user = userEvent.setup();
114+
115+
render(<Label isEditable>Something</Label>);
116+
117+
const label = screen.getByRole('button', { name: 'Something' });
118+
await user.click(label);
119+
120+
const draftInput = screen.getByRole('textbox');
121+
await user.type(draftInput, ' else');
122+
expect(draftInput).toHaveValue('Something else');
123+
124+
await user.keyboard('{Escape}');
125+
// The button and input remount when the editor toggles, so another query is required
126+
127+
const labelAfterCancel = screen.getByRole('button', { name: 'Something' });
128+
expect(labelAfterCancel).toBeInTheDocument();
129+
await user.click(labelAfterCancel);
130+
131+
const reopenedInput = screen.getByRole('textbox');
132+
expect(reopenedInput).toHaveValue('Something');
133+
});
134+
135+
test('editable label calls onEditCancel with the previous text when the edit is canceled with escape', async () => {
136+
const user = userEvent.setup();
137+
const onEditCancel = jest.fn();
138+
139+
render(
140+
<Label onEditCancel={onEditCancel} isEditable>
141+
Something
142+
</Label>
143+
);
144+
145+
await user.click(screen.getByRole('button', { name: 'Something' }));
146+
await user.type(screen.getByRole('textbox'), ' else');
147+
await user.keyboard('{Escape}');
148+
149+
expect(onEditCancel).toHaveBeenCalledWith(expect.anything(), 'Something');
150+
});
151+
112152
test('renders with variant overflow and type is set to button ', () => {
113153
const { asFragment } = render(<Label variant="overflow">Something</Label>);
114154
expect(screen.getByRole('button')).toHaveAttribute('type', 'button');

0 commit comments

Comments
 (0)