Skip to content

Commit e75f492

Browse files
committed
Restrict keyboard navigation when startDate/endDate are set
1 parent 24697e3 commit e75f492

File tree

1 file changed

+38
-21
lines changed

1 file changed

+38
-21
lines changed

js/bootstrap-datepicker.js

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -515,14 +515,19 @@
515515
return this.moveMonth(date, dir*12);
516516
},
517517

518+
dateWithinRange: function(date){
519+
return date >= this.startDate && date <= this.endDate;
520+
},
521+
518522
keydown: function(e){
519523
if (this.picker.is(':not(:visible)')){
520524
if (e.keyCode == 27) // allow escape to hide and re-show picker
521525
this.show();
522526
return;
523527
}
524528
var dateChanged = false,
525-
dir, day, month;
529+
dir, day, month,
530+
newDate, newViewDate;
526531
switch(e.keyCode){
527532
case 27: // escape
528533
this.hide();
@@ -532,37 +537,49 @@
532537
case 39: // right
533538
dir = e.keyCode == 37 ? -1 : 1;
534539
if (e.ctrlKey){
535-
this.date = this.moveYear(this.date, dir);
536-
this.viewDate = this.moveYear(this.viewDate, dir);
540+
newDate = this.moveYear(this.date, dir);
541+
newViewDate = this.moveYear(this.viewDate, dir);
537542
} else if (e.shiftKey){
538-
this.date = this.moveMonth(this.date, dir);
539-
this.viewDate = this.moveMonth(this.viewDate, dir);
543+
newDate = this.moveMonth(this.date, dir);
544+
newViewDate = this.moveMonth(this.viewDate, dir);
540545
} else {
541-
this.date.setDate(this.date.getDate() + dir);
542-
this.viewDate.setDate(this.viewDate.getDate() + dir);
546+
newDate = new Date(this.date);
547+
newDate.setDate(this.date.getDate() + dir);
548+
newViewDate = new Date(this.viewDate);
549+
newViewDate.setDate(this.viewDate.getDate() + dir);
550+
}
551+
if (this.dateWithinRange(newDate)){
552+
this.date = newDate;
553+
this.viewDate = newViewDate;
554+
this.setValue();
555+
this.update();
556+
e.preventDefault();
557+
dateChanged = true;
543558
}
544-
this.setValue();
545-
this.update();
546-
e.preventDefault();
547-
dateChanged = true;
548559
break;
549560
case 38: // up
550561
case 40: // down
551562
dir = e.keyCode == 38 ? -1 : 1;
552563
if (e.ctrlKey){
553-
this.date = this.moveYear(this.date, dir);
554-
this.viewDate = this.moveYear(this.viewDate, dir);
564+
newDate = this.moveYear(this.date, dir);
565+
newViewDate = this.moveYear(this.viewDate, dir);
555566
} else if (e.shiftKey){
556-
this.date = this.moveMonth(this.date, dir);
557-
this.viewDate = this.moveMonth(this.viewDate, dir);
567+
newDate = this.moveMonth(this.date, dir);
568+
newViewDate = this.moveMonth(this.viewDate, dir);
558569
} else {
559-
this.date.setDate(this.date.getDate() + dir * 7);
560-
this.viewDate.setDate(this.viewDate.getDate() + dir * 7);
570+
newDate = new Date(this.date);
571+
newDate.setDate(this.date.getDate() + dir * 7);
572+
newViewDate = new Date(this.viewDate);
573+
newViewDate.setDate(this.viewDate.getDate() + dir * 7);
574+
}
575+
if (this.dateWithinRange(newDate)){
576+
this.date = newDate;
577+
this.viewDate = newViewDate;
578+
this.setValue();
579+
this.update();
580+
e.preventDefault();
581+
dateChanged = true;
561582
}
562-
this.setValue();
563-
this.update();
564-
e.preventDefault();
565-
dateChanged = true;
566583
break;
567584
case 13: // enter
568585
this.hide();

0 commit comments

Comments
 (0)