diff --git a/semcore/input-number/__tests__/index.test.tsx b/semcore/input-number/__tests__/index.test.tsx index c3aa8dea10..708ece85b9 100644 --- a/semcore/input-number/__tests__/index.test.tsx +++ b/semcore/input-number/__tests__/index.test.tsx @@ -553,4 +553,30 @@ describe('InputNumber', () => { expect(spy).lastCalledWith('', expect.anything()); expect(spy).toBeCalledTimes(4); }); + + test('Verify displaying the same negative value after backspace', async () => { + const spy = vi.fn(); + const { getByTestId } = render( + + + , + ); + + await userEvent.keyboard('[Tab]'); + + await userEvent.keyboard('-'); + expect(spy).not.toBeCalled(); + expect(getByTestId('input-number-value').getAttribute('value')).toBe('-'); + + await userEvent.keyboard('1'); + expect(spy).lastCalledWith('-1', expect.anything()); + + await userEvent.keyboard('[Backspace]'); + expect(spy).toBeCalledTimes(1); + expect(getByTestId('input-number-value').getAttribute('value')).toBe('-'); + + await userEvent.keyboard('1'); + expect(spy).toBeCalledTimes(1); + expect(getByTestId('input-number-value').getAttribute('value')).toBe('-1'); + }); }); diff --git a/semcore/input-number/src/InputNumber.tsx b/semcore/input-number/src/InputNumber.tsx index 9a1cc7e7f5..dc3c73e58e 100644 --- a/semcore/input-number/src/InputNumber.tsx +++ b/semcore/input-number/src/InputNumber.tsx @@ -316,7 +316,16 @@ class Value extends Component< const digits = /^[0-9.-]+$/.test(value); if (digits || value === '') { - this.handlers.value(this.limitDecimals(value), event); + const newValue = this.limitDecimals(value); + this.handlers.value(newValue, event); + if (newValue === prevValue) { + const { displayValue } = this.valueParser( + newValue ?? '', + prevValue, + this.state.displayValue, + ); + this.setState({ displayValue }); + } } }; @@ -357,7 +366,6 @@ class Value extends Component< ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(event.key)) ) { const afterSelection = value.slice(element.selectionEnd ?? undefined); - requestAnimationFrame(() => { const newValue = this.state.displayValue; const index = newValue.lastIndexOf(afterSelection);