bootstrap-timepicker-rails-addon 0.2.4.1 → 0.2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ module Bootstrap
2
2
  module Timepicker
3
3
  module Rails
4
4
  module Addon
5
- VERSION = "0.2.4.1"
5
+ VERSION = "0.2.5.1"
6
6
  end
7
7
  end
8
8
  end
@@ -17,6 +17,7 @@
17
17
  this.$element = $(element);
18
18
  this.defaultTime = options.defaultTime;
19
19
  this.disableFocus = options.disableFocus;
20
+ this.disableMousewheel = options.disableMousewheel;
20
21
  this.isOpen = options.isOpen;
21
22
  this.minuteStep = options.minuteStep;
22
23
  this.modalBackdrop = options.modalBackdrop;
@@ -33,7 +34,6 @@
33
34
  Timepicker.prototype = {
34
35
 
35
36
  constructor: Timepicker,
36
-
37
37
  _init: function() {
38
38
  var self = this;
39
39
 
@@ -45,21 +45,24 @@
45
45
  'focus.timepicker': $.proxy(this.highlightUnit, this),
46
46
  'click.timepicker': $.proxy(this.highlightUnit, this),
47
47
  'keydown.timepicker': $.proxy(this.elementKeydown, this),
48
- 'blur.timepicker': $.proxy(this.blurElement, this)
48
+ 'blur.timepicker': $.proxy(this.blurElement, this),
49
+ 'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
49
50
  });
50
51
  } else {
51
52
  if (this.template) {
52
53
  this.$element.on({
53
54
  'focus.timepicker': $.proxy(this.showWidget, this),
54
55
  'click.timepicker': $.proxy(this.showWidget, this),
55
- 'blur.timepicker': $.proxy(this.blurElement, this)
56
+ 'blur.timepicker': $.proxy(this.blurElement, this),
57
+ 'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
56
58
  });
57
59
  } else {
58
60
  this.$element.on({
59
61
  'focus.timepicker': $.proxy(this.highlightUnit, this),
60
62
  'click.timepicker': $.proxy(this.highlightUnit, this),
61
63
  'keydown.timepicker': $.proxy(this.elementKeydown, this),
62
- 'blur.timepicker': $.proxy(this.blurElement, this)
64
+ 'blur.timepicker': $.proxy(this.blurElement, this),
65
+ 'mousewheel.timepicker DOMMouseScroll.timepicker': $.proxy(this.mousewheel, this)
63
66
  });
64
67
  }
65
68
  }
@@ -74,7 +77,8 @@
74
77
  this.$widget.find('input').each(function() {
75
78
  $(this).on({
76
79
  'click.timepicker': function() { $(this).select(); },
77
- 'keydown.timepicker': $.proxy(self.widgetKeydown, self)
80
+ 'keydown.timepicker': $.proxy(self.widgetKeydown, self),
81
+ 'keyup.timepicker': $.proxy(self.widgetKeyup, self)
78
82
  });
79
83
  });
80
84
  }
@@ -83,10 +87,19 @@
83
87
  },
84
88
 
85
89
  blurElement: function() {
86
- this.highlightedUnit = undefined;
90
+ this.highlightedUnit = null;
87
91
  this.updateFromElementVal();
88
92
  },
89
93
 
94
+ clear: function() {
95
+ this.hour = '';
96
+ this.minute = '';
97
+ this.second = '';
98
+ this.meridian = '';
99
+
100
+ this.$element.val('');
101
+ },
102
+
90
103
  decrementHour: function() {
91
104
  if (this.showMeridian) {
92
105
  if (this.hour === 1) {
@@ -103,13 +116,12 @@
103
116
  this.hour--;
104
117
  }
105
118
  } else {
106
- if (this.hour === 0) {
119
+ if (this.hour <= 0) {
107
120
  this.hour = 23;
108
121
  } else {
109
122
  this.hour--;
110
123
  }
111
124
  }
112
- this.update();
113
125
  },
114
126
 
115
127
  decrementMinute: function(step) {
@@ -127,7 +139,6 @@
127
139
  } else {
128
140
  this.minute = newVal;
129
141
  }
130
- this.update();
131
142
  },
132
143
 
133
144
  decrementSecond: function() {
@@ -139,40 +150,17 @@
139
150
  } else {
140
151
  this.second = newVal;
141
152
  }
142
- this.update();
143
153
  },
144
154
 
145
155
  elementKeydown: function(e) {
146
156
  switch (e.keyCode) {
147
157
  case 9: //tab
148
- this.updateFromElementVal();
149
-
150
- switch (this.highlightedUnit) {
151
- case 'hour':
152
- e.preventDefault();
153
- this.highlightNextUnit();
154
- break;
155
- case 'minute':
156
- if (this.showMeridian || this.showSeconds) {
157
- e.preventDefault();
158
- this.highlightNextUnit();
159
- }
160
- break;
161
- case 'second':
162
- if (this.showMeridian) {
163
- e.preventDefault();
164
- this.highlightNextUnit();
165
- }
166
- break;
167
- }
168
- break;
169
158
  case 27: // escape
170
159
  this.updateFromElementVal();
171
160
  break;
172
161
  case 37: // left arrow
173
162
  e.preventDefault();
174
163
  this.highlightPrevUnit();
175
- this.updateFromElementVal();
176
164
  break;
177
165
  case 38: // up arrow
178
166
  e.preventDefault();
@@ -194,10 +182,10 @@
194
182
  this.highlightMeridian();
195
183
  break;
196
184
  }
185
+ this.update();
197
186
  break;
198
187
  case 39: // right arrow
199
188
  e.preventDefault();
200
- this.updateFromElementVal();
201
189
  this.highlightNextUnit();
202
190
  break;
203
191
  case 40: // down arrow
@@ -220,18 +208,12 @@
220
208
  this.highlightMeridian();
221
209
  break;
222
210
  }
211
+
212
+ this.update();
223
213
  break;
224
214
  }
225
215
  },
226
216
 
227
- formatTime: function(hour, minute, second, meridian) {
228
- hour = hour < 10 ? '0' + hour : hour;
229
- minute = minute < 10 ? '0' + minute : minute;
230
- second = second < 10 ? '0' + second : second;
231
-
232
- return hour + ':' + minute + (this.showSeconds ? ':' + second : '') + (this.showMeridian ? ' ' + meridian : '');
233
- },
234
-
235
217
  getCursorPosition: function() {
236
218
  var input = this.$element.get(0);
237
219
 
@@ -258,10 +240,10 @@
258
240
  templateContent;
259
241
 
260
242
  if (this.showInputs) {
261
- hourTemplate = '<input type="text" name="hour" class="bootstrap-timepicker-hour" maxlength="2"/>';
262
- minuteTemplate = '<input type="text" name="minute" class="bootstrap-timepicker-minute" maxlength="2"/>';
263
- secondTemplate = '<input type="text" name="second" class="bootstrap-timepicker-second" maxlength="2"/>';
264
- meridianTemplate = '<input type="text" name="meridian" class="bootstrap-timepicker-meridian" maxlength="2"/>';
243
+ hourTemplate = '<input type="text" class="bootstrap-timepicker-hour" maxlength="2"/>';
244
+ minuteTemplate = '<input type="text" class="bootstrap-timepicker-minute" maxlength="2"/>';
245
+ secondTemplate = '<input type="text" class="bootstrap-timepicker-second" maxlength="2"/>';
246
+ meridianTemplate = '<input type="text" class="bootstrap-timepicker-meridian" maxlength="2"/>';
265
247
  } else {
266
248
  hourTemplate = '<span class="bootstrap-timepicker-hour"></span>';
267
249
  minuteTemplate = '<span class="bootstrap-timepicker-minute"></span>';
@@ -335,7 +317,11 @@
335
317
  },
336
318
 
337
319
  getTime: function() {
338
- return this.formatTime(this.hour, this.minute, this.second, this.meridian);
320
+ if (!this.hour && !this.minute && !this.second) {
321
+ return '';
322
+ }
323
+
324
+ return this.hour + ':' + (this.minute.toString().length === 1 ? '0' + this.minute : this.minute) + (this.showSeconds ? ':' + (this.second.toString().length === 1 ? '0' + this.second : this.second) : '') + (this.showMeridian ? ' ' + this.meridian : '');
339
325
  },
340
326
 
341
327
  hideWidget: function() {
@@ -343,10 +329,6 @@
343
329
  return;
344
330
  }
345
331
 
346
- if (this.showInputs) {
347
- this.updateFromWidgetInputs();
348
- }
349
-
350
332
  this.$element.trigger({
351
333
  'type': 'hide.timepicker',
352
334
  'time': {
@@ -364,7 +346,7 @@
364
346
  this.$widget.removeClass('open');
365
347
  }
366
348
 
367
- $(document).off('mousedown.timepicker');
349
+ $(document).off('mousedown.timepicker, touchend.timepicker');
368
350
 
369
351
  this.isOpen = false;
370
352
  },
@@ -416,7 +398,13 @@
416
398
  highlightPrevUnit: function() {
417
399
  switch (this.highlightedUnit) {
418
400
  case 'hour':
419
- this.highlightMeridian();
401
+ if(this.showMeridian){
402
+ this.highlightMeridian();
403
+ } else if (this.showSeconds) {
404
+ this.highlightSecond();
405
+ } else {
406
+ this.highlightMinute();
407
+ }
420
408
  break;
421
409
  case 'minute':
422
410
  this.highlightHour();
@@ -435,54 +423,78 @@
435
423
  },
436
424
 
437
425
  highlightHour: function() {
438
- var $element = this.$element.get(0);
426
+ var $element = this.$element.get(0),
427
+ self = this;
439
428
 
440
429
  this.highlightedUnit = 'hour';
441
430
 
442
431
  if ($element.setSelectionRange) {
443
432
  setTimeout(function() {
444
- $element.setSelectionRange(0,2);
433
+ if (self.hour < 10) {
434
+ $element.setSelectionRange(0,1);
435
+ } else {
436
+ $element.setSelectionRange(0,2);
437
+ }
445
438
  }, 0);
446
439
  }
447
440
  },
448
441
 
449
442
  highlightMinute: function() {
450
- var $element = this.$element.get(0);
443
+ var $element = this.$element.get(0),
444
+ self = this;
451
445
 
452
446
  this.highlightedUnit = 'minute';
453
447
 
454
448
  if ($element.setSelectionRange) {
455
449
  setTimeout(function() {
456
- $element.setSelectionRange(3,5);
450
+ if (self.hour < 10) {
451
+ $element.setSelectionRange(2,4);
452
+ } else {
453
+ $element.setSelectionRange(3,5);
454
+ }
457
455
  }, 0);
458
456
  }
459
457
  },
460
458
 
461
459
  highlightSecond: function() {
462
- var $element = this.$element.get(0);
460
+ var $element = this.$element.get(0),
461
+ self = this;
463
462
 
464
463
  this.highlightedUnit = 'second';
465
464
 
466
465
  if ($element.setSelectionRange) {
467
466
  setTimeout(function() {
468
- $element.setSelectionRange(6,8);
467
+ if (self.hour < 10) {
468
+ $element.setSelectionRange(5,7);
469
+ } else {
470
+ $element.setSelectionRange(6,8);
471
+ }
469
472
  }, 0);
470
473
  }
471
474
  },
472
475
 
473
476
  highlightMeridian: function() {
474
- var $element = this.$element.get(0);
477
+ var $element = this.$element.get(0),
478
+ self = this;
475
479
 
476
480
  this.highlightedUnit = 'meridian';
477
481
 
478
482
  if ($element.setSelectionRange) {
479
483
  if (this.showSeconds) {
480
484
  setTimeout(function() {
481
- $element.setSelectionRange(9,11);
485
+ if (self.hour < 10) {
486
+ $element.setSelectionRange(8,10);
487
+ } else {
488
+ $element.setSelectionRange(9,11);
489
+ }
482
490
  }, 0);
483
491
  } else {
484
492
  setTimeout(function() {
485
- $element.setSelectionRange(6,8);
493
+ if (self.hour < 10) {
494
+ $element.setSelectionRange(5,7);
495
+ } else {
496
+ $element.setSelectionRange(6,8);
497
+ }
486
498
  }, 0);
487
499
  }
488
500
  }
@@ -503,7 +515,6 @@
503
515
  return;
504
516
  }
505
517
  this.hour++;
506
- this.update();
507
518
  },
508
519
 
509
520
  incrementMinute: function(step) {
@@ -520,7 +531,6 @@
520
531
  this.minute = newVal - 60;
521
532
  } else {
522
533
  this.minute = newVal;
523
- this.update();
524
534
  }
525
535
  },
526
536
 
@@ -533,7 +543,63 @@
533
543
  } else {
534
544
  this.second = newVal;
535
545
  }
536
- this.update();
546
+ },
547
+
548
+ mousewheel: function(e) {
549
+ if (this.disableMousewheel) {
550
+ return;
551
+ }
552
+
553
+ e.preventDefault();
554
+ e.stopPropagation();
555
+
556
+ var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail,
557
+ scrollTo = null;
558
+
559
+ if (e.type === 'mousewheel') {
560
+ scrollTo = (e.originalEvent.wheelDelta * -1);
561
+ }
562
+ else if (e.type === 'DOMMouseScroll') {
563
+ scrollTo = 40 * e.originalEvent.detail;
564
+ }
565
+
566
+ if (scrollTo) {
567
+ e.preventDefault();
568
+ $(this).scrollTop(scrollTo + $(this).scrollTop());
569
+ }
570
+
571
+ switch (this.highlightedUnit) {
572
+ case 'minute':
573
+ if (delta > 0) {
574
+ this.incrementMinute();
575
+ } else {
576
+ this.decrementMinute();
577
+ }
578
+ this.highlightMinute();
579
+ break;
580
+ case 'second':
581
+ if (delta > 0) {
582
+ this.incrementSecond();
583
+ } else {
584
+ this.decrementSecond();
585
+ }
586
+ this.highlightSecond();
587
+ break;
588
+ case 'meridian':
589
+ this.toggleMeridian();
590
+ this.highlightMeridian();
591
+ break;
592
+ default:
593
+ if (delta > 0) {
594
+ this.incrementHour();
595
+ } else {
596
+ this.decrementHour();
597
+ }
598
+ this.highlightHour();
599
+ break;
600
+ }
601
+
602
+ return false;
537
603
  },
538
604
 
539
605
  remove: function() {
@@ -544,15 +610,31 @@
544
610
  delete this.$element.data().timepicker;
545
611
  },
546
612
 
547
- setDefaultTime: function(defaultTime){
613
+ setDefaultTime: function(defaultTime) {
548
614
  if (!this.$element.val()) {
549
615
  if (defaultTime === 'current') {
550
616
  var dTime = new Date(),
551
617
  hours = dTime.getHours(),
552
- minutes = Math.floor(dTime.getMinutes() / this.minuteStep) * this.minuteStep,
553
- seconds = Math.floor(dTime.getSeconds() / this.secondStep) * this.secondStep,
618
+ minutes = dTime.getMinutes(),
619
+ seconds = dTime.getSeconds(),
554
620
  meridian = 'AM';
555
621
 
622
+ if (seconds !== 0) {
623
+ seconds = Math.ceil(dTime.getSeconds() / this.secondStep) * this.secondStep;
624
+ if (seconds === 60) {
625
+ minutes += 1;
626
+ seconds = 0;
627
+ }
628
+ }
629
+
630
+ if (minutes !== 0) {
631
+ minutes = Math.ceil(dTime.getMinutes() / this.minuteStep) * this.minuteStep;
632
+ if (minutes === 60) {
633
+ hours += 1;
634
+ minutes = 0;
635
+ }
636
+ }
637
+
556
638
  if (this.showMeridian) {
557
639
  if (hours === 0) {
558
640
  hours = 12;
@@ -586,70 +668,120 @@
586
668
  }
587
669
  },
588
670
 
589
- setTime: function(time) {
590
- var arr,
591
- timeArray;
671
+ setTime: function(time, ignoreWidget) {
672
+ if (!time) {
673
+ this.clear();
674
+ return;
675
+ }
592
676
 
593
- if (this.showMeridian) {
594
- arr = time.split(' ');
595
- timeArray = arr[0].split(':');
596
- this.meridian = arr[1];
677
+ var timeArray,
678
+ hour,
679
+ minute,
680
+ second,
681
+ meridian;
682
+
683
+ if (typeof time === 'object' && time.getMonth){
684
+ // this is a date object
685
+ hour = time.getHours();
686
+ minute = time.getMinutes();
687
+ second = time.getSeconds();
688
+
689
+ if (this.showMeridian){
690
+ meridian = 'AM';
691
+ if (hour > 12){
692
+ meridian = 'PM';
693
+ hour = hour % 12;
694
+ }
695
+
696
+ if (hour === 12){
697
+ meridian = 'PM';
698
+ }
699
+ }
597
700
  } else {
598
- timeArray = time.split(':');
599
- }
701
+ if (time.match(/p/i) !== null) {
702
+ meridian = 'PM';
703
+ } else {
704
+ meridian = 'AM';
705
+ }
600
706
 
601
- this.hour = parseInt(timeArray[0], 10);
602
- this.minute = parseInt(timeArray[1], 10);
603
- this.second = parseInt(timeArray[2], 10);
707
+ time = time.replace(/[^0-9\:]/g, '');
604
708
 
605
- if (isNaN(this.hour)) {
606
- this.hour = 0;
607
- }
608
- if (isNaN(this.minute)) {
609
- this.minute = 0;
610
- }
709
+ timeArray = time.split(':');
611
710
 
612
- if (this.showMeridian) {
613
- if (this.hour > 12) {
614
- this.hour = 12;
615
- } else if (this.hour < 1) {
616
- this.hour = 12;
617
- }
711
+ hour = timeArray[0] ? timeArray[0].toString() : timeArray.toString();
712
+ minute = timeArray[1] ? timeArray[1].toString() : '';
713
+ second = timeArray[2] ? timeArray[2].toString() : '';
618
714
 
619
- if (this.meridian === 'am' || this.meridian === 'a') {
620
- this.meridian = 'AM';
621
- } else if (this.meridian === 'pm' || this.meridian === 'p') {
622
- this.meridian = 'PM';
715
+ // idiot proofing
716
+ if (hour.length > 4) {
717
+ second = hour.substr(4, 2);
718
+ }
719
+ if (hour.length > 2) {
720
+ minute = hour.substr(2, 2);
721
+ hour = hour.substr(0, 2);
722
+ }
723
+ if (minute.length > 2) {
724
+ second = minute.substr(2, 2);
725
+ minute = minute.substr(0, 2);
726
+ }
727
+ if (second.length > 2) {
728
+ second = second.substr(2, 2);
623
729
  }
624
730
 
625
- if (this.meridian !== 'AM' && this.meridian !== 'PM') {
626
- this.meridian = 'AM';
731
+ hour = parseInt(hour, 10);
732
+ minute = parseInt(minute, 10);
733
+ second = parseInt(second, 10);
734
+
735
+ if (isNaN(hour)) {
736
+ hour = 0;
627
737
  }
628
- } else {
629
- if (this.hour >= 24) {
630
- this.hour = 23;
631
- } else if (this.hour < 0) {
632
- this.hour = 0;
738
+ if (isNaN(minute)) {
739
+ minute = 0;
740
+ }
741
+ if (isNaN(second)) {
742
+ second = 0;
633
743
  }
634
- }
635
744
 
636
- if (this.minute < 0) {
637
- this.minute = 0;
638
- } else if (this.minute >= 60) {
639
- this.minute = 59;
640
- }
745
+ if (this.showMeridian) {
746
+ if (hour < 1) {
747
+ hour = 1;
748
+ } else if (hour > 12) {
749
+ hour = 12;
750
+ }
751
+ } else {
752
+ if (hour >= 24) {
753
+ hour = 23;
754
+ } else if (hour < 0) {
755
+ hour = 0;
756
+ }
757
+ if (hour < 13 && meridian === 'PM') {
758
+ hour = hour + 12;
759
+ }
760
+ }
641
761
 
642
- if (this.showSeconds) {
643
- if (isNaN(this.second)) {
644
- this.second = 0;
645
- } else if (this.second < 0) {
646
- this.second = 0;
647
- } else if (this.second >= 60) {
648
- this.second = 59;
762
+ if (minute < 0) {
763
+ minute = 0;
764
+ } else if (minute >= 60) {
765
+ minute = 59;
766
+ }
767
+
768
+ if (this.showSeconds) {
769
+ if (isNaN(second)) {
770
+ second = 0;
771
+ } else if (second < 0) {
772
+ second = 0;
773
+ } else if (second >= 60) {
774
+ second = 59;
775
+ }
649
776
  }
650
777
  }
651
778
 
652
- this.update();
779
+ this.hour = hour;
780
+ this.minute = minute;
781
+ this.second = second;
782
+ this.meridian = meridian;
783
+
784
+ this.update(ignoreWidget);
653
785
  },
654
786
 
655
787
  showWidget: function() {
@@ -662,9 +794,9 @@
662
794
  }
663
795
 
664
796
  var self = this;
665
- $(document).on('mousedown.timepicker', function (e) {
797
+ $(document).on('mousedown.timepicker, touchend.timepicker', function (e) {
666
798
  // Clicked outside the timepicker, hide it
667
- if ($(e.target).closest('.bootstrap-timepicker-widget') !== this.$widget) {
799
+ if ($(e.target).closest('.bootstrap-timepicker-widget').length === 0) {
668
800
  self.hideWidget();
669
801
  }
670
802
  });
@@ -684,7 +816,14 @@
684
816
  this.$element.blur();
685
817
  }
686
818
 
687
- this.updateFromElementVal();
819
+ // widget shouldn't be empty on open
820
+ if (!this.hour) {
821
+ if (this.defaultTime) {
822
+ this.setDefaultTime(this.defaultTime);
823
+ } else {
824
+ this.setTime('0:0:0');
825
+ }
826
+ }
688
827
 
689
828
  if (this.template === 'modal' && this.$widget.modal) {
690
829
  this.$widget.modal('show').on('hidden', $.proxy(this.hideWidget, this));
@@ -699,10 +838,9 @@
699
838
 
700
839
  toggleMeridian: function() {
701
840
  this.meridian = this.meridian === 'AM' ? 'PM' : 'AM';
702
- this.update();
703
841
  },
704
842
 
705
- update: function() {
843
+ update: function(ignoreWidget) {
706
844
  this.$element.trigger({
707
845
  'type': 'changeTime.timepicker',
708
846
  'time': {
@@ -715,7 +853,9 @@
715
853
  });
716
854
 
717
855
  this.updateElement();
718
- this.updateWidget();
856
+ if (!ignoreWidget) {
857
+ this.updateWidget();
858
+ }
719
859
  },
720
860
 
721
861
  updateElement: function() {
@@ -723,11 +863,7 @@
723
863
  },
724
864
 
725
865
  updateFromElementVal: function() {
726
- var val = this.$element.val();
727
-
728
- if (val) {
729
- this.setTime(val);
730
- }
866
+ this.setTime(this.$element.val());
731
867
  },
732
868
 
733
869
  updateWidget: function() {
@@ -735,9 +871,9 @@
735
871
  return;
736
872
  }
737
873
 
738
- var hour = this.hour < 10 ? '0' + this.hour : this.hour,
739
- minute = this.minute < 10 ? '0' + this.minute : this.minute,
740
- second = this.second < 10 ? '0' + this.second : this.second;
874
+ var hour = this.hour,
875
+ minute = this.minute.toString().length === 1 ? '0' + this.minute : this.minute,
876
+ second = this.second.toString().length === 1 ? '0' + this.second : this.second;
741
877
 
742
878
  if (this.showInputs) {
743
879
  this.$widget.find('input.bootstrap-timepicker-hour').val(hour);
@@ -766,47 +902,42 @@
766
902
  if (this.$widget === false) {
767
903
  return;
768
904
  }
769
- var time = $('input.bootstrap-timepicker-hour', this.$widget).val() + ':' +
770
- $('input.bootstrap-timepicker-minute', this.$widget).val() +
771
- (this.showSeconds ? ':' + $('input.bootstrap-timepicker-second', this.$widget).val() : '') +
772
- (this.showMeridian ? ' ' + $('input.bootstrap-timepicker-meridian', this.$widget).val() : '');
773
905
 
774
- this.setTime(time);
906
+ var t = this.$widget.find('input.bootstrap-timepicker-hour').val() + ':' +
907
+ this.$widget.find('input.bootstrap-timepicker-minute').val() +
908
+ (this.showSeconds ? ':' + this.$widget.find('input.bootstrap-timepicker-second').val() : '') +
909
+ (this.showMeridian ? this.$widget.find('input.bootstrap-timepicker-meridian').val() : '')
910
+ ;
911
+
912
+ this.setTime(t, true);
775
913
  },
776
914
 
777
915
  widgetClick: function(e) {
778
916
  e.stopPropagation();
779
917
  e.preventDefault();
780
918
 
781
- var action = $(e.target).closest('a').data('action');
919
+ var $input = $(e.target),
920
+ action = $input.closest('a').data('action');
921
+
782
922
  if (action) {
783
923
  this[action]();
784
924
  }
925
+ this.update();
926
+
927
+ if ($input.is('input')) {
928
+ $input.get(0).setSelectionRange(0,2);
929
+ }
785
930
  },
786
931
 
787
932
  widgetKeydown: function(e) {
788
- var $input = $(e.target).closest('input'),
789
- name = $input.attr('name');
933
+ var $input = $(e.target),
934
+ name = $input.attr('class').replace('bootstrap-timepicker-', '');
790
935
 
791
936
  switch (e.keyCode) {
792
937
  case 9: //tab
793
- if (this.showMeridian) {
794
- if (name === 'meridian') {
795
- return this.hideWidget();
796
- }
797
- } else {
798
- if (this.showSeconds) {
799
- if (name === 'second') {
800
- return this.hideWidget();
801
- }
802
- } else {
803
- if (name === 'minute') {
804
- return this.hideWidget();
805
- }
806
- }
938
+ if ((this.showMeridian && name === 'meridian') || (this.showSeconds && name === 'second') || (!this.showMeridian && !this.showSeconds && name === 'minute')) {
939
+ return this.hideWidget();
807
940
  }
808
-
809
- this.updateFromWidgetInputs();
810
941
  break;
811
942
  case 27: // escape
812
943
  this.hideWidget();
@@ -827,6 +958,8 @@
827
958
  this.toggleMeridian();
828
959
  break;
829
960
  }
961
+ this.setTime(this.getTime());
962
+ $input.get(0).setSelectionRange(0,2);
830
963
  break;
831
964
  case 40: // down arrow
832
965
  e.preventDefault();
@@ -844,12 +977,19 @@
844
977
  this.toggleMeridian();
845
978
  break;
846
979
  }
980
+ this.setTime(this.getTime());
981
+ $input.get(0).setSelectionRange(0,2);
847
982
  break;
848
983
  }
984
+ },
985
+
986
+ widgetKeyup: function(e) {
987
+ if ((e.keyCode === 65) || (e.keyCode === 77) || (e.keyCode === 80) || (e.keyCode === 46) || (e.keyCode === 8) || (e.keyCode >= 46 && e.keyCode <= 57)) {
988
+ this.updateFromWidgetInputs();
989
+ }
849
990
  }
850
991
  };
851
992
 
852
-
853
993
  //TIMEPICKER PLUGIN DEFINITION
854
994
  $.fn.timepicker = function(option) {
855
995
  var args = Array.apply(null, arguments);
@@ -872,6 +1012,7 @@
872
1012
  $.fn.timepicker.defaults = {
873
1013
  defaultTime: 'current',
874
1014
  disableFocus: false,
1015
+ disableMousewheel: false,
875
1016
  isOpen: false,
876
1017
  minuteStep: 15,
877
1018
  modalBackdrop: false,
@@ -96,6 +96,7 @@
96
96
  }
97
97
  .bootstrap-timepicker-widget table td a i {
98
98
  margin-top: 2px;
99
+ font-size: 18px;
99
100
  }
100
101
  .bootstrap-timepicker-widget table td input {
101
102
  width: 25px;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bootstrap-timepicker-rails-addon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4.1
4
+ version: 0.2.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: