|
515 | 515 | return this.moveMonth(date, dir*12);
|
516 | 516 | },
|
517 | 517 |
|
| 518 | + dateWithinRange: function(date){ |
| 519 | + return date >= this.startDate && date <= this.endDate; |
| 520 | + }, |
| 521 | + |
518 | 522 | keydown: function(e){
|
519 | 523 | if (this.picker.is(':not(:visible)')){
|
520 | 524 | if (e.keyCode == 27) // allow escape to hide and re-show picker
|
521 | 525 | this.show();
|
522 | 526 | return;
|
523 | 527 | }
|
524 | 528 | var dateChanged = false,
|
525 |
| - dir, day, month; |
| 529 | + dir, day, month, |
| 530 | + newDate, newViewDate; |
526 | 531 | switch(e.keyCode){
|
527 | 532 | case 27: // escape
|
528 | 533 | this.hide();
|
|
532 | 537 | case 39: // right
|
533 | 538 | dir = e.keyCode == 37 ? -1 : 1;
|
534 | 539 | 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); |
537 | 542 | } 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); |
540 | 545 | } 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; |
543 | 558 | }
|
544 |
| - this.setValue(); |
545 |
| - this.update(); |
546 |
| - e.preventDefault(); |
547 |
| - dateChanged = true; |
548 | 559 | break;
|
549 | 560 | case 38: // up
|
550 | 561 | case 40: // down
|
551 | 562 | dir = e.keyCode == 38 ? -1 : 1;
|
552 | 563 | 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); |
555 | 566 | } 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); |
558 | 569 | } 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; |
561 | 582 | }
|
562 |
| - this.setValue(); |
563 |
| - this.update(); |
564 |
| - e.preventDefault(); |
565 |
| - dateChanged = true; |
566 | 583 | break;
|
567 | 584 | case 13: // enter
|
568 | 585 | this.hide();
|
|
0 commit comments