diff --git a/jest.config.js b/jest.config.js index 61bd0ba..c5ab56d 100644 --- a/jest.config.js +++ b/jest.config.js @@ -3,5 +3,6 @@ module.exports = { collectCoverageFrom: ['src/**/*.{js,jsx}'], testMatch: ['/test/*.test.js'], bail: true, - verbose: false + verbose: false, + testURL: 'http://localhost/' }; diff --git a/src/TimeInput.js b/src/TimeInput.js index 21e62c5..ba8d8c4 100644 --- a/src/TimeInput.js +++ b/src/TimeInput.js @@ -87,16 +87,36 @@ var TimeInput = CreateReactClass({ if (this.props.value.charAt(index) === ' ') index++; if (this.mounted) this.setState({ caretIndex: index }); }, - handleArrows(event) { - event.preventDefault(); - var start = caret.start(this.input); - var value = this.props.value; - var amount = event.which === 38 ? 1 : -1; + getStep() { + var step = this.props.step; + if (typeof step === 'number') { + return step; + } else { + return 1; + } + }, + getAmount(event, groupId) { + var amount = 1; + if (groupId === 1) { + amount = this.getStep(); + } if (event.shiftKey) { amount *= 2; if (event.metaKey) amount *= 2; } - value = adder(value, getGroupId(start), amount); + if (event.which === 38) { + return amount; + } else { + return -amount; + } + }, + handleArrows(event) { + event.preventDefault(); + var start = caret.start(this.input); + var value = this.props.value; + var groupId = getGroupId(start); + var amount = this.getAmount(event, groupId); + value = adder(value, groupId, amount); this.onChange(value, start); }, silhouette() { diff --git a/test/arrow-keys.test.js b/test/arrow-keys.test.js index 9ea647a..3ffb90c 100644 --- a/test/arrow-keys.test.js +++ b/test/arrow-keys.test.js @@ -65,6 +65,18 @@ describe('up', function() { '01:00:00:000 AM' ); }); + it('should increment minutes with given step amount', function() { + expect(arrow('01:00 AM', 3, true, false, false, 15).input.value).toEqual('01:15 AM'); + expect(arrow('01:00:00:000 PM', 3, true, false, false, 15).input.value).toEqual( + '01:15:00:000 PM' + ); + }); + it('should increment hours with given step for minutes amount', function() { + expect(arrow('01:45 AM', 3, true, false, false, 15).input.value).toEqual('02:00 AM'); + expect(arrow('01:45:00:000 PM', 3, true, false, false, 15).input.value).toEqual( + '02:00:00:000 PM' + ); + }); }); describe('down', function() { @@ -129,11 +141,23 @@ describe('down', function() { '01:00:00:000 AM' ); }); + it('should decrement minutes with given step amount', function() { + expect(arrow('01:30 AM', 3, false, false, false, 15).input.value).toEqual('01:15 AM'); + expect(arrow('01:30:00:000 PM', 3, false, false, false, 15).input.value).toEqual( + '01:15:00:000 PM' + ); + }); + it('should decrement hours with given step for minutes amount', function() { + expect(arrow('01:00 AM', 3, false, false, false, 15).input.value).toEqual('12:45 AM'); + expect(arrow('01:00:00:000 PM', 3, false, false, false, 15).input.value).toEqual( + '12:45:00:000 PM' + ); + }); }); -function arrow(value, caretIndex, up, shiftKey, metaKey) { +function arrow(value, caretIndex, up, shiftKey, metaKey, step) { document.body.innerHTML = '
'; - var timeInput = render(value); + var timeInput = render(value, null, false, step); caret.set(timeInput.input, caretIndex); ReactTestUtils.Simulate.keyDown(timeInput.input, { keyCode: up ? 38 : 40, diff --git a/test/lib/renderTimeInput.js b/test/lib/renderTimeInput.js index 89c83d9..46d9578 100644 --- a/test/lib/renderTimeInput.js +++ b/test/lib/renderTimeInput.js @@ -2,13 +2,14 @@ import React from 'react'; import ReactDOM from 'react-dom'; import TimeInput from '../../src/TimeInput'; -export default (value, el, omitOnChange) => { - var timeInput = render(value); +export default (value, el, omitOnChange, step) => { + var timeInput = render(value, step); timeInput.input.focus(); return timeInput; - function render(value) { + function render(value, step) { return ReactDOM.render(