Skip to content

Commit 355dfe4

Browse files
committed
Add support for changing the slider value using up and down also
Call event.preventDefault() to prevent unwanted scrolling.
1 parent 19e4bd7 commit 355dfe4

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

src/InputRange/InputRange.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ const internals = new WeakMap();
2222
* @const {Object.<string, number>}
2323
*/
2424
const KeyCode = {
25+
DOWN_ARROW: 40,
2526
LEFT_ARROW: 37,
2627
RIGHT_ARROW: 39,
28+
UP_ARROW: 38,
2729
};
2830

2931
/**
@@ -393,10 +395,14 @@ export default class InputRange extends React.Component {
393395

394396
switch (event.keyCode) {
395397
case KeyCode.LEFT_ARROW:
398+
case KeyCode.DOWN_ARROW:
399+
event.preventDefault();
396400
this.decrementValue(key);
397401
break;
398402

399403
case KeyCode.RIGHT_ARROW:
404+
case KeyCode.UP_ARROW:
405+
event.preventDefault();
400406
this.incrementValue(key);
401407
break;
402408

test/InputRange.spec.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ describe('InputRange', () => {
219219
slider = inputRange.refs.sliderMax;
220220
event = {
221221
keyCode: 37,
222+
preventDefault: jasmine.createSpy('preventDefault'),
222223
};
223224
});
224225

@@ -228,6 +229,44 @@ describe('InputRange', () => {
228229
expect(inputRange.decrementValue).toHaveBeenCalledWith('max');
229230
});
230231

232+
it('should call event.preventDefault()', () => {
233+
inputRange.handleSliderKeyDown(event, slider);
234+
235+
expect(event.preventDefault).toHaveBeenCalledWith();
236+
});
237+
238+
it('should not decrement value if disabled', () => {
239+
inputRange = renderComponent(<InputRange disabled={true} defaultValue={10} onChange={onChange}/>);
240+
spyOn(inputRange, 'decrementValue');
241+
inputRange.handleSliderKeyDown(event, slider);
242+
243+
expect(inputRange.decrementValue).not.toHaveBeenCalled();
244+
});
245+
});
246+
247+
describe('when pressing down arrow key', () => {
248+
beforeEach(() => {
249+
spyOn(inputRange, 'decrementValue');
250+
251+
slider = inputRange.refs.sliderMax;
252+
event = {
253+
keyCode: 40,
254+
preventDefault: jasmine.createSpy('preventDefault'),
255+
};
256+
});
257+
258+
it('should decrement value', () => {
259+
inputRange.handleSliderKeyDown(event, slider);
260+
261+
expect(inputRange.decrementValue).toHaveBeenCalledWith('max');
262+
});
263+
264+
it('should call event.preventDefault()', () => {
265+
inputRange.handleSliderKeyDown(event, slider);
266+
267+
expect(event.preventDefault).toHaveBeenCalledWith();
268+
});
269+
231270
it('should not decrement value if disabled', () => {
232271
inputRange = renderComponent(<InputRange disabled={true} defaultValue={10} onChange={onChange}/>);
233272
spyOn(inputRange, 'decrementValue');
@@ -244,6 +283,7 @@ describe('InputRange', () => {
244283
slider = inputRange.refs.sliderMax;
245284
event = {
246285
keyCode: 39,
286+
preventDefault: jasmine.createSpy('preventDefault'),
247287
};
248288
});
249289

@@ -253,6 +293,44 @@ describe('InputRange', () => {
253293
expect(inputRange.incrementValue).toHaveBeenCalledWith('max');
254294
});
255295

296+
it('should call event.preventDefault()', () => {
297+
inputRange.handleSliderKeyDown(event, slider);
298+
299+
expect(event.preventDefault).toHaveBeenCalledWith();
300+
});
301+
302+
it('should not increment value if disabled', () => {
303+
inputRange = renderComponent(<InputRange disabled={true} defaultValue={10} onChange={onChange}/>);
304+
spyOn(inputRange, 'incrementValue');
305+
inputRange.handleSliderKeyDown(event, slider);
306+
307+
expect(inputRange.incrementValue).not.toHaveBeenCalled();
308+
});
309+
});
310+
311+
describe('when pressing up arrow key', () => {
312+
beforeEach(() => {
313+
spyOn(inputRange, 'incrementValue');
314+
315+
slider = inputRange.refs.sliderMax;
316+
event = {
317+
keyCode: 38,
318+
preventDefault: jasmine.createSpy('preventDefault'),
319+
};
320+
});
321+
322+
it('should increment value', () => {
323+
inputRange.handleSliderKeyDown(event, slider);
324+
325+
expect(inputRange.incrementValue).toHaveBeenCalledWith('max');
326+
});
327+
328+
it('should call event.preventDefault()', () => {
329+
inputRange.handleSliderKeyDown(event, slider);
330+
331+
expect(event.preventDefault).toHaveBeenCalledWith();
332+
});
333+
256334
it('should not increment value if disabled', () => {
257335
inputRange = renderComponent(<InputRange disabled={true} defaultValue={10} onChange={onChange}/>);
258336
spyOn(inputRange, 'incrementValue');

0 commit comments

Comments
 (0)