Skip to content

Commit 026c27c

Browse files
committed
fix: isolate clear button keyboard events
1 parent 39c2585 commit 026c27c

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

src/InputNumber.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ const InputNumber = React.forwardRef<InputNumberRef, InputNumberProps>((props, r
734734
)}
735735
style={styles?.clear}
736736
onMouseDown={(event) => event.preventDefault()}
737+
onKeyDown={(event) => event.stopPropagation()}
737738
onClick={() => {
738739
triggerValueUpdate(getMiniDecimal(null), false);
739740
onClear?.();

tests/allowClear.test.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,38 @@ describe('InputNumber.AllowClear', () => {
9393
fireEvent.click(clearButton);
9494
expect(onChange).toHaveBeenCalledWith(null);
9595
});
96+
97+
it('isolates clear button keyboard events from input handlers', () => {
98+
const onChange = jest.fn();
99+
const onPressEnter = jest.fn();
100+
const onStep = jest.fn();
101+
const { getByRole } = render(
102+
<InputNumber
103+
allowClear
104+
value={1}
105+
onChange={onChange}
106+
onPressEnter={onPressEnter}
107+
onStep={onStep}
108+
/>,
109+
);
110+
const input = getByRole('spinbutton');
111+
const clearButton = getByRole('button', { name: 'Clear Value' });
112+
113+
fireEvent.change(input, { target: { value: '2' } });
114+
onChange.mockClear();
115+
act(() => clearButton.focus());
116+
117+
['Enter', 'ArrowUp', 'ArrowDown'].forEach((key) => {
118+
fireEvent.keyDown(clearButton, { key });
119+
});
120+
121+
expect(onPressEnter).not.toHaveBeenCalled();
122+
expect(onStep).not.toHaveBeenCalled();
123+
expect(onChange).not.toHaveBeenCalled();
124+
expect(input).toHaveValue('2');
125+
126+
fireEvent.click(clearButton);
127+
expect(onChange).toHaveBeenCalledTimes(1);
128+
expect(onChange).toHaveBeenCalledWith(null);
129+
});
96130
});

0 commit comments

Comments
 (0)