Skip to content

Commit bf82818

Browse files
committed
Merge branch 'master' of https://github.com/gowento/react-datetime into gowento-master
2 parents f75987a + ef29293 commit bf82818

File tree

6 files changed

+77
-18
lines changed

6 files changed

+77
-18
lines changed

DateTime.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var Datetime = React.createClass({
3131
// dateFormat: TYPES.string | TYPES.bool,
3232
// timeFormat: TYPES.string | TYPES.bool,
3333
inputProps: TYPES.object,
34+
timeConstraints: TYPES.object,
3435
viewMode: TYPES.oneOf(['years', 'months', 'days', 'time']),
3536
isValidDate: TYPES.func,
3637
open: TYPES.bool,
@@ -50,6 +51,7 @@ var Datetime = React.createClass({
5051
onBlur: nof,
5152
onChange: nof,
5253
timeFormat: true,
54+
timeConstraints: {},
5355
dateFormat: true,
5456
strictParsing: true,
5557
closeOnSelect: false,
@@ -184,7 +186,7 @@ var Datetime = React.createClass({
184186
},
185187

186188
onInputKey: function( e ){
187-
if( e.which === 9 && this.props.closeOnTab ){
189+
if ( e.which === 9 && this.props.closeOnTab ){
188190
this.closeCalendar();
189191
}
190192
},
@@ -334,7 +336,7 @@ var Datetime = React.createClass({
334336
},
335337

336338
componentProps: {
337-
fromProps: ['value', 'isValidDate', 'renderDay', 'renderMonth', 'renderYear'],
339+
fromProps: ['value', 'isValidDate', 'renderDay', 'renderMonth', 'renderYear', 'timeConstraints'],
338340
fromState: ['viewDate', 'selectedDate', 'updateOn'],
339341
fromThis: ['setDate', 'setTime', 'showView', 'addTime', 'subtractTime', 'updateSelectedDate', 'localMoment']
340342
},

dist/react-datetime.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/react-datetime.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,10 @@
3939
"gulp-webpack": "^1.5.0",
4040
"jsdom": "^7.0.2",
4141
"mocha": "^2.2.5",
42+
"moment": "2.14.1",
4243
"react": ">=0.13",
4344
"react-addons-test-utils": ">=0.13",
45+
"react-dom": "15.2.1",
4446
"react-tools": "^0.13.2",
4547
"webpack": "^1.5.1",
4648
"webpack-dev-server": "^1.7.0"

src/TimeView.js

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

3-
var React = require('react');
3+
var React = require('react'),
4+
assign = require('object-assign');
45

56
var DOM = React.DOM;
67
var DateTimePickerTime = React.createClass({
@@ -89,6 +90,12 @@ var DateTimePickerTime = React.createClass({
8990
])
9091
);
9192
},
93+
componentWillMount: function() {
94+
var me = this;
95+
['hours', 'minutes', 'seconds', 'milliseconds'].forEach(function(type) {
96+
assign(me.timeConstraints[type], me.props.timeConstraints[type]);
97+
});
98+
},
9299
componentWillReceiveProps: function( nextProps ){
93100
this.setState( this.calculateState( nextProps ) );
94101
},
@@ -133,12 +140,27 @@ var DateTimePickerTime = React.createClass({
133140
document.body.addEventListener('mouseup', me.mouseUpListener);
134141
};
135142
},
136-
137-
maxValues: {
138-
hours: 23,
139-
minutes: 59,
140-
seconds: 59,
141-
milliseconds: 999
143+
timeConstraints: {
144+
hours: {
145+
min: 0,
146+
max: 23,
147+
step: 1
148+
},
149+
minutes: {
150+
min: 0,
151+
max: 59,
152+
step: 1
153+
},
154+
seconds: {
155+
min: 0,
156+
max: 59,
157+
step: 1,
158+
},
159+
milliseconds: {
160+
min: 0,
161+
max: 999,
162+
step: 1
163+
}
142164
},
143165
padValues: {
144166
hours: 1,
@@ -147,15 +169,15 @@ var DateTimePickerTime = React.createClass({
147169
milliseconds: 3
148170
},
149171
increase: function( type ){
150-
var value = parseInt(this.state[ type ], 10) + 1;
151-
if ( value > this.maxValues[ type ] )
152-
value = 0;
172+
var value = parseInt(this.state[ type ], 10) + this.timeConstraints[ type ].step;
173+
if ( value > this.timeConstraints[ type ].max )
174+
value = this.timeConstraints[ type ].min + ( value - ( this.timeConstraints[ type ].max + 1) );
153175
return this.pad( type, value );
154176
},
155177
decrease: function( type ){
156-
var value = parseInt(this.state[ type ], 10) - 1;
157-
if ( value < 0 )
158-
value = this.maxValues[ type ];
178+
var value = parseInt(this.state[ type ], 10) - this.timeConstraints[ type ].step;
179+
if ( value < this.timeConstraints[ type ].min )
180+
value = this.timeConstraints[ type ].max + 1 - ( this.timeConstraints[ type ].min - value );
159181
return this.pad( type, value );
160182
},
161183
pad: function( type, value ){

tests/datetime-spec.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,39 @@ describe( 'Datetime', function(){
571571
}, 920 );
572572
});
573573

574+
it( 'increase time with timeConstraints', function( done ){
575+
var i = 0;
576+
createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
577+
i++;
578+
if( i > 2 ){
579+
assert.equal( selected.minute(), 17 );
580+
assert.equal( selected.second(), 3 );
581+
done();
582+
}
583+
}, timeConstraints: { hours: { max: 6, step: 8 }, minutes: { step: 15 }}});
584+
585+
trigger( 'mousedown', dt.timeUp( 0 ) );
586+
trigger('mouseup', document.body );
587+
assert.equal( dt.hour().innerHTML, 3 );
588+
trigger( 'mousedown', dt.timeUp( 1 ) );
589+
trigger( 'mouseup', dt.timeUp( 1 ) );
590+
assert.equal( dt.minute().innerHTML, 17 );
591+
trigger( 'mousedown', dt.timeUp( 2 ) );
592+
trigger( 'mouseup', dt.timeUp( 2 ) );
593+
assert.equal( dt.second().innerHTML, 3 );
594+
});
595+
596+
it( 'decrease time with timeConstraints', function( done ){
597+
createDatetime({ timeFormat: "HH:mm:ss:SSS", viewMode: 'time', defaultValue: date, onChange: function( selected ){
598+
assert.equal( selected.minute(), 47 );
599+
done();
600+
}, timeConstraints: { minutes: { step: 15 }}});
601+
602+
trigger( 'mousedown', dt.timeDown( 1 ) );
603+
trigger( 'mouseup', dt.timeDown( 1 ) );
604+
assert.equal( dt.minute().innerHTML, 47 );
605+
});
606+
574607
it( 'invalid input value', function( done ){
575608
createDatetime({ defaultValue: 'luis', onChange: function( updated ){
576609
assert.equal( mDate.format('L LT'), updated.format('L LT') );

0 commit comments

Comments
 (0)