Skip to content

Commit 8e12e45

Browse files
Added minDateTime and maxDateTime options, however must still supply minDate/maxDate for datepicker
1 parent 2f96131 commit 8e12e45

File tree

1 file changed

+77
-2
lines changed

1 file changed

+77
-2
lines changed

jquery-ui-timepicker-addon.js

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ function Timepicker() {
5858
hourMax: 23,
5959
minuteMax: 59,
6060
secondMax: 59,
61+
62+
minDateTime: null,
63+
maxDateTime: null,
64+
6165
hourGrid: 0,
6266
minuteGrid: 0,
6367
secondGrid: 0,
@@ -77,6 +81,12 @@ $.extend(Timepicker.prototype, {
7781
hour: 0,
7882
minute: 0,
7983
second: 0,
84+
hourMinOriginal: null,
85+
minuteMinOriginal: null,
86+
secondMinOriginal: null,
87+
hourMaxOriginal: null,
88+
minuteMaxOriginal: null,
89+
secondMaxOriginal: null,
8090
ampm: '',
8191
formattedDate: '',
8292
formattedTime: '',
@@ -145,12 +155,13 @@ $.extend(Timepicker.prototype, {
145155
//########################################################################
146156
// add our sliders to the calendar
147157
//########################################################################
148-
_addTimePicker: function() {
158+
_addTimePicker: function(dp_inst) {
149159
var currDT = (this.$altInput) ?
150160
this.$input.val() + ' ' + this.$altInput.val() :
151161
this.$input.val();
152162

153163
this.timeDefined = this._parseTime(currDT);
164+
this._limitMinMaxDateTime(dp_inst, false);
154165
this._injectTimePicker();
155166
},
156167

@@ -438,6 +449,67 @@ $.extend(Timepicker.prototype, {
438449
}
439450
},
440451

452+
//########################################################################
453+
// This function tries to limit the ability to go outside the
454+
// min/max date range
455+
//########################################################################
456+
_limitMinMaxDateTime: function(dp_inst, adjustSliders){
457+
var o = this._defaults,
458+
dp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay),
459+
tp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay, this.hour, this.minute, this.second, 0);
460+
461+
if(this._defaults.minDateTime !== null && dp_date){
462+
var minDateTime = this._defaults.minDateTime,
463+
minDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);
464+
465+
if(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null){
466+
this.hourMinOriginal = o.hourMin;
467+
this.minuteMinOriginal = o.minuteMin;
468+
this.secondMinOriginal = o.secondMin;
469+
}
470+
471+
if(minDateTimeDate.getTime() == dp_date.getTime()){
472+
this._defaults.hourMin = minDateTime.getHours();
473+
this._defaults.minuteMin = minDateTime.getMinutes();
474+
this._defaults.secondMin = minDateTime.getSeconds();
475+
}else{
476+
this._defaults.hourMin = this.hourMinOriginal;
477+
this._defaults.minuteMin = this.minuteMinOriginal;
478+
this._defaults.secondMin = this.secondMinOriginal;
479+
}
480+
}
481+
482+
if(this._defaults.maxDateTime !== null && dp_date){
483+
var maxDateTime = this._defaults.maxDateTime,
484+
maxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);
485+
486+
if(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){
487+
this.hourMaxOriginal = o.hourMax;
488+
this.minuteMaxOriginal = o.minuteMax;
489+
this.secondMaxOriginal = o.secondMax;
490+
}
491+
492+
if(maxDateTimeDate.getTime() == dp_date.getTime()){
493+
this._defaults.hourMax = maxDateTime.getHours();
494+
this._defaults.minuteMax = maxDateTime.getMinutes();
495+
this._defaults.secondMax = maxDateTime.getSeconds();
496+
}else{
497+
this._defaults.hourMax = this.hourMaxOriginal;
498+
this._defaults.minuteMax = this.minuteMaxOriginal;
499+
this._defaults.secondMax = this.secondMaxOriginal;
500+
}
501+
}
502+
503+
if(adjustSliders !== undefined && adjustSliders === true){
504+
this.hour_slider.slider("option", { min: this._defaults.hourMin, max: this._defaults.hourMax });
505+
this.minute_slider.slider("option", { min: this._defaults.minuteMin, max: this._defaults.minuteMax });
506+
this.second_slider.slider("option", { min: this._defaults.secondMin, max: this._defaults.secondMax });
507+
}
508+
509+
$.datepicker._setTime(dp_inst, tp_date);
510+
511+
},
512+
441513
//########################################################################
442514
// when a slider moves, set the internal time...
443515
// on time change is also called when the time is updated in the text field
@@ -581,6 +653,7 @@ $.datepicker._selectDate = function (id, dateStr) {
581653
tp_inst = this._get(inst, 'timepicker');
582654

583655
if (tp_inst) {
656+
tp_inst._limitMinMaxDateTime(inst, true);
584657
inst.inline = inst.stay_open = true;
585658
this._base_selectDate(id, dateStr);
586659
inst.inline = inst.stay_open = false;
@@ -597,10 +670,12 @@ $.datepicker._selectDate = function (id, dateStr) {
597670
$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;
598671
$.datepicker._updateDatepicker = function(inst) {
599672
if (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {
673+
600674
this._base_updateDatepicker(inst);
675+
601676
// Reload the time control when changing something in the input text field.
602677
var tp_inst = this._get(inst, 'timepicker');
603-
if(tp_inst) tp_inst._addTimePicker();
678+
if(tp_inst) tp_inst._addTimePicker(inst);
604679
}
605680
};
606681

0 commit comments

Comments
 (0)