diff --git a/superset-frontend/src/explore/components/controls/NumberControl/NumberControl.test.tsx b/superset-frontend/src/explore/components/controls/NumberControl/NumberControl.test.tsx index 422b8394333..7ece02addb2 100644 --- a/superset-frontend/src/explore/components/controls/NumberControl/NumberControl.test.tsx +++ b/superset-frontend/src/explore/components/controls/NumberControl/NumberControl.test.tsx @@ -82,6 +82,21 @@ test('can clear field completely', async () => { expect(props.onChange).toHaveBeenLastCalledWith(undefined); }); +test('stepper arrows trigger onChange immediately', async () => { + const props = { + ...mockedProps, + value: 5, + onChange: jest.fn(), + }; + render(); + const upButton = document.querySelector( + '.ant-input-number-handler-up', + ) as HTMLElement; + expect(upButton).toBeInTheDocument(); + await userEvent.click(upButton); + expect(props.onChange).toHaveBeenCalledWith(6); +}); + test('updates local value when prop changes', () => { const props = { ...mockedProps, diff --git a/superset-frontend/src/explore/components/controls/NumberControl/index.tsx b/superset-frontend/src/explore/components/controls/NumberControl/index.tsx index ec2eb7c9c6e..db7d85b97a0 100644 --- a/superset-frontend/src/explore/components/controls/NumberControl/index.tsx +++ b/superset-frontend/src/explore/components/controls/NumberControl/index.tsx @@ -71,6 +71,11 @@ export default function NumberControl({ onChange?.(pendingValueRef.current); }; + const handleStep = (val: number) => { + pendingValueRef.current = val; + onChange?.(val); + }; + return ( @@ -82,6 +87,7 @@ export default function NumberControl({ value={value} onChange={handleChange} onBlur={handleBlur} + onStep={handleStep} disabled={disabled} aria-label={rest.label} />