bootstrap3-datetimepicker-rails 4.7.14 → 4.14.30

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b9d7d21db6bacf96ec8077966448a038acd6d67
4
- data.tar.gz: ca7423c5be979aaba72c6efac641388052295500
3
+ metadata.gz: bf1eb41e131ed226e4ef6045cd53ff75f198a04e
4
+ data.tar.gz: 7551237d8b71261ed2c40dfc2beabc64bc676b44
5
5
  SHA512:
6
- metadata.gz: 62da4f1e8be61b478151235e2bf1db718403cf4f12a760fedd21dd15fd07a5a9dae016c1cce35400a8d12f04ac429fb029bbe7c096c155ba9b6116225c900c2b
7
- data.tar.gz: 6918e1b85f676a0a0574cef9ea1361f6a7f647418d61d57e36799d3390124967989872021914dadd10ffe54e2133d6399a9d9bc76a09057c079a5a030925119d
6
+ metadata.gz: 79bd1d4b59da62b10534b371fec88cd60dceda47217ca9756378bbb50f4f5f2b62985c887ac86e0486cb148fd6727d95b908ebb6bd4cee2baa8e6b9909199da6
7
+ data.tar.gz: 3f059eaceb88571250f776f66f18a9d83a631b864ec4ab2ed5d854e574bea4de90c0c50419e1fc9d911377009668433b941725b80c61676af2ac9df28a5005e0
data/README.md CHANGED
@@ -14,7 +14,7 @@ actively maintained and works with [Bootstrap3](http://getbootstrap.com).
14
14
  Add these lines to your application's Gemfile:
15
15
  ```ruby
16
16
  gem 'momentjs-rails', '>= 2.9.0'
17
- gem 'bootstrap3-datetimepicker-rails', '~> 4.7.14'
17
+ gem 'bootstrap3-datetimepicker-rails', '~> 4.14.30'
18
18
  ```
19
19
 
20
20
  And then execute:
@@ -1,5 +1,5 @@
1
1
  module Bootstrap3Datetimepicker
2
2
  module Rails
3
- VERSION = '4.7.14'
3
+ VERSION = '4.14.30'
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- /*! version : 4.7.14
1
+ /*! version : 4.14.30
2
2
  =========================================================
3
3
  bootstrap-datetimejs
4
4
  https://github.com/Eonasdan/bootstrap-datetimepicker
@@ -84,9 +84,14 @@
84
84
  clsName: 'years',
85
85
  navFnc: 'y',
86
86
  navStep: 10
87
+ },
88
+ {
89
+ clsName: 'decades',
90
+ navFnc: 'y',
91
+ navStep: 100
87
92
  }
88
93
  ],
89
- viewModes = ['days', 'months', 'years'],
94
+ viewModes = ['days', 'months', 'years', 'decades'],
90
95
  verticalModes = ['top', 'bottom', 'auto'],
91
96
  horizontalModes = ['left', 'right', 'auto'],
92
97
  toolbarPlacements = ['default', 'top', 'bottom'],
@@ -149,7 +154,6 @@
149
154
  return false;
150
155
  }
151
156
  },
152
-
153
157
  hasTime = function () {
154
158
  return (isEnabled('h') || isEnabled('m') || isEnabled('s'));
155
159
  },
@@ -186,6 +190,11 @@
186
190
  .append(contTemplate.clone())
187
191
  ),
188
192
  $('<div>').addClass('datepicker-years')
193
+ .append($('<table>').addClass('table-condensed')
194
+ .append(headTemplate.clone())
195
+ .append(contTemplate.clone())
196
+ ),
197
+ $('<div>').addClass('datepicker-decades')
189
198
  .append($('<table>').addClass('table-condensed')
190
199
  .append(headTemplate.clone())
191
200
  .append(contTemplate.clone())
@@ -200,12 +209,12 @@
200
209
 
201
210
  if (isEnabled('h')) {
202
211
  topRow.append($('<td>')
203
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'incrementHours')
212
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Hour'}).addClass('btn').attr('data-action', 'incrementHours')
204
213
  .append($('<span>').addClass(options.icons.up))));
205
214
  middleRow.append($('<td>')
206
- .append($('<span>').addClass('timepicker-hour').attr('data-time-component', 'hours').attr('data-action', 'showHours')));
215
+ .append($('<span>').addClass('timepicker-hour').attr({'data-time-component':'hours', 'title':'Pick Hour'}).attr('data-action', 'showHours')));
207
216
  bottomRow.append($('<td>')
208
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'decrementHours')
217
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Hour'}).addClass('btn').attr('data-action', 'decrementHours')
209
218
  .append($('<span>').addClass(options.icons.down))));
210
219
  }
211
220
  if (isEnabled('m')) {
@@ -215,12 +224,12 @@
215
224
  bottomRow.append($('<td>').addClass('separator'));
216
225
  }
217
226
  topRow.append($('<td>')
218
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'incrementMinutes')
227
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Minute'}).addClass('btn').attr('data-action', 'incrementMinutes')
219
228
  .append($('<span>').addClass(options.icons.up))));
220
229
  middleRow.append($('<td>')
221
- .append($('<span>').addClass('timepicker-minute').attr('data-time-component', 'minutes').attr('data-action', 'showMinutes')));
230
+ .append($('<span>').addClass('timepicker-minute').attr({'data-time-component': 'minutes', 'title':'Pick Minute'}).attr('data-action', 'showMinutes')));
222
231
  bottomRow.append($('<td>')
223
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'decrementMinutes')
232
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Minute'}).addClass('btn').attr('data-action', 'decrementMinutes')
224
233
  .append($('<span>').addClass(options.icons.down))));
225
234
  }
226
235
  if (isEnabled('s')) {
@@ -230,19 +239,19 @@
230
239
  bottomRow.append($('<td>').addClass('separator'));
231
240
  }
232
241
  topRow.append($('<td>')
233
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'incrementSeconds')
242
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Increment Second'}).addClass('btn').attr('data-action', 'incrementSeconds')
234
243
  .append($('<span>').addClass(options.icons.up))));
235
244
  middleRow.append($('<td>')
236
- .append($('<span>').addClass('timepicker-second').attr('data-time-component', 'seconds').attr('data-action', 'showSeconds')));
245
+ .append($('<span>').addClass('timepicker-second').attr({'data-time-component': 'seconds', 'title':'Pick Second'}).attr('data-action', 'showSeconds')));
237
246
  bottomRow.append($('<td>')
238
- .append($('<a>').attr({href: '#', tabindex: '-1'}).addClass('btn').attr('data-action', 'decrementSeconds')
247
+ .append($('<a>').attr({href: '#', tabindex: '-1', 'title':'Decrement Second'}).addClass('btn').attr('data-action', 'decrementSeconds')
239
248
  .append($('<span>').addClass(options.icons.down))));
240
249
  }
241
250
 
242
251
  if (!use24Hours) {
243
252
  topRow.append($('<td>').addClass('separator'));
244
253
  middleRow.append($('<td>')
245
- .append($('<button>').addClass('btn btn-primary').attr('data-action', 'togglePeriod')));
254
+ .append($('<button>').addClass('btn btn-primary').attr({'data-action': 'togglePeriod', tabindex: '-1', 'title':'Toggle Period'})));
246
255
  bottomRow.append($('<td>').addClass('separator'));
247
256
  }
248
257
 
@@ -276,16 +285,16 @@
276
285
  getToolbar = function () {
277
286
  var row = [];
278
287
  if (options.showTodayButton) {
279
- row.push($('<td>').append($('<a>').attr('data-action', 'today').append($('<span>').addClass(options.icons.today))));
288
+ row.push($('<td>').append($('<a>').attr({'data-action':'today', 'title':'Go to today'}).append($('<span>').addClass(options.icons.today))));
280
289
  }
281
290
  if (!options.sideBySide && hasDate() && hasTime()) {
282
- row.push($('<td>').append($('<a>').attr('data-action', 'togglePicker').append($('<span>').addClass(options.icons.time))));
291
+ row.push($('<td>').append($('<a>').attr({'data-action':'togglePicker', 'title':'Select Time'}).append($('<span>').addClass(options.icons.time))));
283
292
  }
284
293
  if (options.showClear) {
285
- row.push($('<td>').append($('<a>').attr('data-action', 'clear').append($('<span>').addClass(options.icons.clear))));
294
+ row.push($('<td>').append($('<a>').attr({'data-action':'clear', 'title':'Clear selection'}).append($('<span>').addClass(options.icons.clear))));
286
295
  }
287
296
  if (options.showClose) {
288
- row.push($('<td>').append($('<a>').attr('data-action', 'close').append($('<span>').addClass(options.icons.close))));
297
+ row.push($('<td>').append($('<a>').attr({'data-action':'close', 'title':'Close the picker'}).append($('<span>').addClass(options.icons.close))));
289
298
  }
290
299
  return $('<table>').addClass('table-condensed').append($('<tbody>').append($('<tr>').append(row)));
291
300
  },
@@ -304,6 +313,9 @@
304
313
  if (use24Hours) {
305
314
  template.addClass('usetwentyfour');
306
315
  }
316
+ if (isEnabled('s') && !use24Hours) {
317
+ template.addClass('wider');
318
+ }
307
319
  if (options.sideBySide && hasDate() && hasTime()) {
308
320
  template.addClass('timepicker-sbs');
309
321
  template.append(
@@ -366,7 +378,7 @@
366
378
  if (options.widgetParent) {
367
379
  parent = options.widgetParent.append(widget);
368
380
  } else if (element.is('input')) {
369
- parent = element.parent().append(widget);
381
+ parent = element.after(widget).parent();
370
382
  } else if (options.inline) {
371
383
  parent = element.append(widget);
372
384
  return;
@@ -421,8 +433,8 @@
421
433
  widget.css({
422
434
  top: vertical === 'top' ? 'auto' : position.top + element.outerHeight(),
423
435
  bottom: vertical === 'top' ? position.top + element.outerHeight() : 'auto',
424
- left: horizontal === 'left' ? parent.css('padding-left') : 'auto',
425
- right: horizontal === 'left' ? 'auto' : parent.width() - element.outerWidth()
436
+ left: horizontal === 'left' ? (parent === element ? 0 : position.left) : 'auto',
437
+ right: horizontal === 'left' ? 'auto' : parent.outerWidth() - element.outerWidth() - (parent === element ? 0 : position.left)
426
438
  });
427
439
  },
428
440
 
@@ -433,19 +445,30 @@
433
445
  element.trigger(e);
434
446
  },
435
447
 
448
+ viewUpdate = function (e) {
449
+ if (e === 'y') {
450
+ e = 'YYYY';
451
+ }
452
+ notifyEvent({
453
+ type: 'dp.update',
454
+ change: e,
455
+ viewDate: viewDate.clone()
456
+ });
457
+ },
458
+
436
459
  showMode = function (dir) {
437
460
  if (!widget) {
438
461
  return;
439
462
  }
440
463
  if (dir) {
441
- currentViewMode = Math.max(minViewModeNumber, Math.min(2, currentViewMode + dir));
464
+ currentViewMode = Math.max(minViewModeNumber, Math.min(3, currentViewMode + dir));
442
465
  }
443
466
  widget.find('.datepicker > div').hide().filter('.datepicker-' + datePickerModes[currentViewMode].clsName).show();
444
467
  },
445
468
 
446
469
  fillDow = function () {
447
470
  var row = $('<tr>'),
448
- currentDate = viewDate.clone().startOf('w');
471
+ currentDate = viewDate.clone().startOf('w').startOf('d');
449
472
 
450
473
  if (options.calendarWeeks === true) {
451
474
  row.append($('<th>').addClass('cw').text('#'));
@@ -466,14 +489,22 @@
466
489
  return options.enabledDates[testDate.format('YYYY-MM-DD')] === true;
467
490
  },
468
491
 
492
+ isInDisabledHours = function (testDate) {
493
+ return options.disabledHours[testDate.format('H')] === true;
494
+ },
495
+
496
+ isInEnabledHours = function (testDate) {
497
+ return options.enabledHours[testDate.format('H')] === true;
498
+ },
499
+
469
500
  isValid = function (targetMoment, granularity) {
470
501
  if (!targetMoment.isValid()) {
471
502
  return false;
472
503
  }
473
- if (options.disabledDates && isInDisabledDates(targetMoment) && granularity !== 'M') {
504
+ if (options.disabledDates && granularity === 'd' && isInDisabledDates(targetMoment)) {
474
505
  return false;
475
506
  }
476
- if (options.enabledDates && !isInEnabledDates(targetMoment) && granularity !== 'M') {
507
+ if (options.enabledDates && granularity === 'd' && !isInEnabledDates(targetMoment)) {
477
508
  return false;
478
509
  }
479
510
  if (options.minDate && targetMoment.isBefore(options.minDate, granularity)) {
@@ -482,15 +513,33 @@
482
513
  if (options.maxDate && targetMoment.isAfter(options.maxDate, granularity)) {
483
514
  return false;
484
515
  }
485
- if (granularity === 'd' && options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) { //widget && widget.find('.datepicker-days').length > 0
516
+ if (options.daysOfWeekDisabled && granularity === 'd' && options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) {
517
+ return false;
518
+ }
519
+ if (options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && isInDisabledHours(targetMoment)) {
486
520
  return false;
487
521
  }
522
+ if (options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !isInEnabledHours(targetMoment)) {
523
+ return false;
524
+ }
525
+ if (options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) {
526
+ var found = false;
527
+ $.each(options.disabledTimeIntervals, function () {
528
+ if (targetMoment.isBetween(this[0], this[1])) {
529
+ found = true;
530
+ return false;
531
+ }
532
+ });
533
+ if (found) {
534
+ return false;
535
+ }
536
+ }
488
537
  return true;
489
538
  },
490
539
 
491
540
  fillMonths = function () {
492
541
  var spans = [],
493
- monthsShort = viewDate.clone().startOf('y').hour(12); // hour is changed to avoid DST issues in some browsers
542
+ monthsShort = viewDate.clone().startOf('y').startOf('d');
494
543
  while (monthsShort.isSame(viewDate, 'y')) {
495
544
  spans.push($('<span>').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM')));
496
545
  monthsShort.add(1, 'M');
@@ -503,6 +552,10 @@
503
552
  monthsViewHeader = monthsView.find('th'),
504
553
  months = monthsView.find('tbody').find('span');
505
554
 
555
+ monthsViewHeader.eq(0).find('span').attr('title', 'Previous Year');
556
+ monthsViewHeader.eq(1).attr('title', 'Select Year');
557
+ monthsViewHeader.eq(2).find('span').attr('title', 'Next Year');
558
+
506
559
  monthsView.find('.disabled').removeClass('disabled');
507
560
 
508
561
  if (!isValid(viewDate.clone().subtract(1, 'y'), 'y')) {
@@ -516,7 +569,7 @@
516
569
  }
517
570
 
518
571
  months.removeClass('active');
519
- if (date.isSame(viewDate, 'y')) {
572
+ if (date.isSame(viewDate, 'y') && !unset) {
520
573
  months.eq(date.month()).addClass('active');
521
574
  }
522
575
 
@@ -534,6 +587,10 @@
534
587
  endYear = viewDate.clone().add(6, 'y'),
535
588
  html = '';
536
589
 
590
+ yearsViewHeader.eq(0).find('span').attr('title', 'Previous Decade');
591
+ yearsViewHeader.eq(1).attr('title', 'Select Decade');
592
+ yearsViewHeader.eq(2).find('span').attr('title', 'Next Decade');
593
+
537
594
  yearsView.find('.disabled').removeClass('disabled');
538
595
 
539
596
  if (options.minDate && options.minDate.isAfter(startYear, 'y')) {
@@ -547,25 +604,62 @@
547
604
  }
548
605
 
549
606
  while (!startYear.isAfter(endYear, 'y')) {
550
- html += '<span data-action="selectYear" class="year' + (startYear.isSame(date, 'y') ? ' active' : '') + (!isValid(startYear, 'y') ? ' disabled' : '') + '">' + startYear.year() + '</span>';
607
+ html += '<span data-action="selectYear" class="year' + (startYear.isSame(date, 'y') && !unset ? ' active' : '') + (!isValid(startYear, 'y') ? ' disabled' : '') + '">' + startYear.year() + '</span>';
551
608
  startYear.add(1, 'y');
552
609
  }
553
610
 
554
611
  yearsView.find('td').html(html);
555
612
  },
556
613
 
614
+ updateDecades = function () {
615
+ var decadesView = widget.find('.datepicker-decades'),
616
+ decadesViewHeader = decadesView.find('th'),
617
+ startDecade = viewDate.isBefore(moment({y: 1999})) ? moment({y: 1899}) : moment({y: 1999}),
618
+ endDecade = startDecade.clone().add(100, 'y'),
619
+ html = '';
620
+
621
+ decadesViewHeader.eq(0).find('span').attr('title', 'Previous Century');
622
+ decadesViewHeader.eq(2).find('span').attr('title', 'Next Century');
623
+
624
+ decadesView.find('.disabled').removeClass('disabled');
625
+
626
+ if (startDecade.isSame(moment({y: 1900})) || (options.minDate && options.minDate.isAfter(startDecade, 'y'))) {
627
+ decadesViewHeader.eq(0).addClass('disabled');
628
+ }
629
+
630
+ decadesViewHeader.eq(1).text(startDecade.year() + '-' + endDecade.year());
631
+
632
+ if (startDecade.isSame(moment({y: 2000})) || (options.maxDate && options.maxDate.isBefore(endDecade, 'y'))) {
633
+ decadesViewHeader.eq(2).addClass('disabled');
634
+ }
635
+
636
+ while (!startDecade.isAfter(endDecade, 'y')) {
637
+ html += '<span data-action="selectDecade" class="decade' + (startDecade.isSame(date, 'y') ? ' active' : '') +
638
+ (!isValid(startDecade, 'y') ? ' disabled' : '') + '" data-selection="' + (startDecade.year() + 6) + '">' + (startDecade.year() + 1) + ' - ' + (startDecade.year() + 12) + '</span>';
639
+ startDecade.add(12, 'y');
640
+ }
641
+ html += '<span></span><span></span><span></span>'; //push the dangling block over, at least this way it's even
642
+
643
+ decadesView.find('td').html(html);
644
+ },
645
+
557
646
  fillDate = function () {
558
647
  var daysView = widget.find('.datepicker-days'),
559
648
  daysViewHeader = daysView.find('th'),
560
649
  currentDate,
561
650
  html = [],
562
651
  row,
563
- clsName;
652
+ clsName,
653
+ i;
564
654
 
565
655
  if (!hasDate()) {
566
656
  return;
567
657
  }
568
658
 
659
+ daysViewHeader.eq(0).find('span').attr('title', 'Previous Month');
660
+ daysViewHeader.eq(1).attr('title', 'Select Month');
661
+ daysViewHeader.eq(2).find('span').attr('title', 'Next Month');
662
+
569
663
  daysView.find('.disabled').removeClass('disabled');
570
664
  daysViewHeader.eq(1).text(viewDate.format(options.dayViewHeaderFormat));
571
665
 
@@ -576,9 +670,9 @@
576
670
  daysViewHeader.eq(2).addClass('disabled');
577
671
  }
578
672
 
579
- currentDate = viewDate.clone().startOf('M').startOf('week');
673
+ currentDate = viewDate.clone().startOf('M').startOf('w').startOf('d');
580
674
 
581
- while (!viewDate.clone().endOf('M').endOf('w').isBefore(currentDate, 'd')) {
675
+ for (i = 0; i < 42; i++) { //always display 42 days (should show 6 weeks)
582
676
  if (currentDate.weekday() === 0) {
583
677
  row = $('<tr>');
584
678
  if (options.calendarWeeks) {
@@ -605,7 +699,7 @@
605
699
  if (currentDate.day() === 0 || currentDate.day() === 6) {
606
700
  clsName += ' weekend';
607
701
  }
608
- row.append('<td data-action="selectDay" class="day' + clsName + '">' + currentDate.date() + '</td>');
702
+ row.append('<td data-action="selectDay" data-day="' + currentDate.format('L') + '" class="day' + clsName + '">' + currentDate.date() + '</td>');
609
703
  currentDate.add(1, 'd');
610
704
  }
611
705
 
@@ -614,6 +708,8 @@
614
708
  updateMonths();
615
709
 
616
710
  updateYears();
711
+
712
+ updateDecades();
617
713
  },
618
714
 
619
715
  fillHours = function () {
@@ -673,9 +769,19 @@
673
769
  },
674
770
 
675
771
  fillTime = function () {
676
- var timeComponents = widget.find('.timepicker span[data-time-component]');
772
+ var toggle, newDate, timeComponents = widget.find('.timepicker span[data-time-component]');
773
+
677
774
  if (!use24Hours) {
678
- widget.find('.timepicker [data-action=togglePeriod]').text(date.format('A'));
775
+ toggle = widget.find('.timepicker [data-action=togglePeriod]');
776
+ newDate = date.clone().add((date.hours() >= 12) ? -12 : 12, 'h');
777
+
778
+ toggle.text(date.format('A'));
779
+
780
+ if (isValid(newDate, 'h')) {
781
+ toggle.removeClass('disabled');
782
+ } else {
783
+ toggle.addClass('disabled');
784
+ }
679
785
  }
680
786
  timeComponents.filter('[data-time-component=hours]').text(date.format(use24Hours ? 'HH' : 'hh'));
681
787
  timeComponents.filter('[data-time-component=minutes]').text(date.format('mm'));
@@ -704,7 +810,7 @@
704
810
  element.data('date', '');
705
811
  notifyEvent({
706
812
  type: 'dp.change',
707
- date: null,
813
+ date: false,
708
814
  oldDate: oldDate
709
815
  });
710
816
  update();
@@ -722,8 +828,8 @@
722
828
  viewDate = date.clone();
723
829
  input.val(date.format(actualFormat));
724
830
  element.data('date', date.format(actualFormat));
725
- update();
726
831
  unset = false;
832
+ update();
727
833
  notifyEvent({
728
834
  type: 'dp.change',
729
835
  date: date.clone(),
@@ -741,6 +847,7 @@
741
847
  },
742
848
 
743
849
  hide = function () {
850
+ ///<summary>Hides the widget. Possibly will emit dp.hide</summary>
744
851
  var transitioning = false;
745
852
  if (!widget) {
746
853
  return picker;
@@ -787,13 +894,17 @@
787
894
  ********************************************************************************/
788
895
  actions = {
789
896
  next: function () {
790
- viewDate.add(datePickerModes[currentViewMode].navStep, datePickerModes[currentViewMode].navFnc);
897
+ var navFnc = datePickerModes[currentViewMode].navFnc;
898
+ viewDate.add(datePickerModes[currentViewMode].navStep, navFnc);
791
899
  fillDate();
900
+ viewUpdate(navFnc);
792
901
  },
793
902
 
794
903
  previous: function () {
795
- viewDate.subtract(datePickerModes[currentViewMode].navStep, datePickerModes[currentViewMode].navFnc);
904
+ var navFnc = datePickerModes[currentViewMode].navFnc;
905
+ viewDate.subtract(datePickerModes[currentViewMode].navStep, navFnc);
796
906
  fillDate();
907
+ viewUpdate(navFnc);
797
908
  },
798
909
 
799
910
  pickerSwitch: function () {
@@ -812,6 +923,7 @@
812
923
  showMode(-1);
813
924
  fillDate();
814
925
  }
926
+ viewUpdate('M');
815
927
  },
816
928
 
817
929
  selectYear: function (e) {
@@ -826,6 +938,22 @@
826
938
  showMode(-1);
827
939
  fillDate();
828
940
  }
941
+ viewUpdate('YYYY');
942
+ },
943
+
944
+ selectDecade: function (e) {
945
+ var year = parseInt($(e.target).data('selection'), 10) || 0;
946
+ viewDate.year(year);
947
+ if (currentViewMode === minViewModeNumber) {
948
+ setValue(date.clone().year(viewDate.year()));
949
+ if (!options.inline) {
950
+ hide();
951
+ }
952
+ } else {
953
+ showMode(-1);
954
+ fillDate();
955
+ }
956
+ viewUpdate('YYYY');
829
957
  },
830
958
 
831
959
  selectDay: function (e) {
@@ -843,27 +971,45 @@
843
971
  },
844
972
 
845
973
  incrementHours: function () {
846
- setValue(date.clone().add(1, 'h'));
974
+ var newDate = date.clone().add(1, 'h');
975
+ if (isValid(newDate, 'h')) {
976
+ setValue(newDate);
977
+ }
847
978
  },
848
979
 
849
980
  incrementMinutes: function () {
850
- setValue(date.clone().add(options.stepping, 'm'));
981
+ var newDate = date.clone().add(options.stepping, 'm');
982
+ if (isValid(newDate, 'm')) {
983
+ setValue(newDate);
984
+ }
851
985
  },
852
986
 
853
987
  incrementSeconds: function () {
854
- setValue(date.clone().add(1, 's'));
988
+ var newDate = date.clone().add(1, 's');
989
+ if (isValid(newDate, 's')) {
990
+ setValue(newDate);
991
+ }
855
992
  },
856
993
 
857
994
  decrementHours: function () {
858
- setValue(date.clone().subtract(1, 'h'));
995
+ var newDate = date.clone().subtract(1, 'h');
996
+ if (isValid(newDate, 'h')) {
997
+ setValue(newDate);
998
+ }
859
999
  },
860
1000
 
861
1001
  decrementMinutes: function () {
862
- setValue(date.clone().subtract(options.stepping, 'm'));
1002
+ var newDate = date.clone().subtract(options.stepping, 'm');
1003
+ if (isValid(newDate, 'm')) {
1004
+ setValue(newDate);
1005
+ }
863
1006
  },
864
1007
 
865
1008
  decrementSeconds: function () {
866
- setValue(date.clone().subtract(1, 's'));
1009
+ var newDate = date.clone().subtract(1, 's');
1010
+ if (isValid(newDate, 's')) {
1011
+ setValue(newDate);
1012
+ }
867
1013
  },
868
1014
 
869
1015
  togglePeriod: function () {
@@ -953,7 +1099,9 @@
953
1099
  clear: clear,
954
1100
 
955
1101
  today: function () {
956
- setValue(moment());
1102
+ if (isValid(moment(), 'd')) {
1103
+ setValue(moment());
1104
+ }
957
1105
  },
958
1106
 
959
1107
  close: hide
@@ -968,6 +1116,7 @@
968
1116
  },
969
1117
 
970
1118
  show = function () {
1119
+ ///<summary>Shows the widget. Possibly will emit dp.show and dp.change</summary>
971
1120
  var currentMoment,
972
1121
  useCurrentGranularity = {
973
1122
  'year': function (m) {
@@ -990,7 +1139,9 @@
990
1139
  if (input.prop('disabled') || (!options.ignoreReadonly && input.prop('readonly')) || widget) {
991
1140
  return picker;
992
1141
  }
993
- if (options.useCurrent && unset && ((input.is('input') && input.val().trim().length === 0) || options.inline)) {
1142
+ if (input.val() !== undefined && input.val().trim().length !== 0) {
1143
+ setValue(parseInputDate(input.val().trim()));
1144
+ } else if (options.useCurrent && unset && ((input.is('input') && input.val().trim().length === 0) || options.inline)) {
994
1145
  currentMoment = moment();
995
1146
  if (typeof options.useCurrent === 'string') {
996
1147
  currentMoment = useCurrentGranularity[options.useCurrent](currentMoment);
@@ -1020,7 +1171,7 @@
1020
1171
  widget.show();
1021
1172
  place();
1022
1173
 
1023
- if (!input.is(':focus')) {
1174
+ if (options.focusOnShow && !input.is(':focus')) {
1024
1175
  input.focus();
1025
1176
  }
1026
1177
 
@@ -1031,30 +1182,25 @@
1031
1182
  },
1032
1183
 
1033
1184
  toggle = function () {
1185
+ /// <summary>Shows or hides the widget</summary>
1034
1186
  return (widget ? hide() : show());
1035
1187
  },
1036
1188
 
1037
1189
  parseInputDate = function (inputDate) {
1038
- if (moment.isMoment(inputDate) || inputDate instanceof Date) {
1039
- inputDate = moment(inputDate);
1190
+ if (options.parseInputDate === undefined) {
1191
+ if (moment.isMoment(inputDate) || inputDate instanceof Date) {
1192
+ inputDate = moment(inputDate);
1193
+ } else {
1194
+ inputDate = moment(inputDate, parseFormats, options.useStrict);
1195
+ }
1040
1196
  } else {
1041
- inputDate = moment(inputDate, parseFormats, options.useStrict);
1197
+ inputDate = options.parseInputDate(inputDate);
1042
1198
  }
1043
1199
  inputDate.locale(options.locale);
1044
1200
  return inputDate;
1045
1201
  },
1046
1202
 
1047
1203
  keydown = function (e) {
1048
- //if (e.keyCode === 27 && widget) { // allow escape to hide picker
1049
- // hide();
1050
- // return false;
1051
- //}
1052
- //if (e.keyCode === 40 && !widget) { // allow down to show picker
1053
- // show();
1054
- // e.preventDefault();
1055
- //}
1056
- //return true;
1057
-
1058
1204
  var handler = null,
1059
1205
  index,
1060
1206
  index2,
@@ -1121,7 +1267,8 @@
1121
1267
  'change': change,
1122
1268
  'blur': options.debug ? '' : hide,
1123
1269
  'keydown': keydown,
1124
- 'keyup': keyup
1270
+ 'keyup': keyup,
1271
+ 'focus': options.allowInputToggle ? show : ''
1125
1272
  });
1126
1273
 
1127
1274
  if (element.is('input')) {
@@ -1139,7 +1286,8 @@
1139
1286
  'change': change,
1140
1287
  'blur': hide,
1141
1288
  'keydown': keydown,
1142
- 'keyup': keyup
1289
+ 'keyup': keyup,
1290
+ 'focus': options.allowInputToggle ? hide : ''
1143
1291
  });
1144
1292
 
1145
1293
  if (element.is('input')) {
@@ -1166,6 +1314,17 @@
1166
1314
  return (Object.keys(givenDatesIndexed).length) ? givenDatesIndexed : false;
1167
1315
  },
1168
1316
 
1317
+ indexGivenHours = function (givenHoursArray) {
1318
+ // Store given enabledHours and disabledHours as keys.
1319
+ // This way we can check their existence in O(1) time instead of looping through whole array.
1320
+ // (for example: options.enabledHours['2014-02-27'] === true)
1321
+ var givenHoursIndexed = {};
1322
+ $.each(givenHoursArray, function () {
1323
+ givenHoursIndexed[this] = true;
1324
+ });
1325
+ return (Object.keys(givenHoursIndexed).length) ? givenHoursIndexed : false;
1326
+ },
1327
+
1169
1328
  initFormatting = function () {
1170
1329
  var format = options.format || 'L LT';
1171
1330
 
@@ -1182,7 +1341,7 @@
1182
1341
  parseFormats.push(actualFormat);
1183
1342
  }
1184
1343
 
1185
- use24Hours = (actualFormat.toLowerCase().indexOf('a') < 1 && actualFormat.indexOf('h') < 1);
1344
+ use24Hours = (actualFormat.toLowerCase().indexOf('a') < 1 && actualFormat.replace(/\[.*?\]/g, '').indexOf('h') < 1);
1186
1345
 
1187
1346
  if (isEnabled('y')) {
1188
1347
  minViewModeNumber = 2;
@@ -1212,6 +1371,7 @@
1212
1371
  *
1213
1372
  ********************************************************************************/
1214
1373
  picker.destroy = function () {
1374
+ ///<summary>Destroys the widget and removes all attached event listeners</summary>
1215
1375
  hide();
1216
1376
  detachDatePickerElementEvents();
1217
1377
  element.removeData('DateTimePicker');
@@ -1225,6 +1385,8 @@
1225
1385
  picker.hide = hide;
1226
1386
 
1227
1387
  picker.disable = function () {
1388
+ ///<summary>Disables the input element, the component is attached to, by adding a disabled="true" attribute to it.
1389
+ ///If the widget was visible before that call it is hidden. Possibly emits dp.hide</summary>
1228
1390
  hide();
1229
1391
  if (component && component.hasClass('btn')) {
1230
1392
  component.addClass('disabled');
@@ -1234,6 +1396,7 @@
1234
1396
  };
1235
1397
 
1236
1398
  picker.enable = function () {
1399
+ ///<summary>Enables the input element, the component is attached to, by removing disabled attribute from it.</summary>
1237
1400
  if (component && component.hasClass('btn')) {
1238
1401
  component.removeClass('disabled');
1239
1402
  }
@@ -1272,6 +1435,14 @@
1272
1435
  };
1273
1436
 
1274
1437
  picker.date = function (newDate) {
1438
+ ///<signature helpKeyword="$.fn.datetimepicker.date">
1439
+ ///<summary>Returns the component's model current date, a moment object or null if not set.</summary>
1440
+ ///<returns type="Moment">date.clone()</returns>
1441
+ ///</signature>
1442
+ ///<signature>
1443
+ ///<summary>Sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.</summary>
1444
+ ///<param name="newDate" locid="$.fn.datetimepicker.date_p:newDate">Takes string, Date, moment, null parameter.</param>
1445
+ ///</signature>
1275
1446
  if (arguments.length === 0) {
1276
1447
  if (unset) {
1277
1448
  return null;
@@ -1288,6 +1459,9 @@
1288
1459
  };
1289
1460
 
1290
1461
  picker.format = function (newFormat) {
1462
+ ///<summary>test su</summary>
1463
+ ///<param name="newFormat">info about para</param>
1464
+ ///<returns type="string|boolean">returns foo</returns>
1291
1465
  if (arguments.length === 0) {
1292
1466
  return options.format;
1293
1467
  }
@@ -1333,6 +1507,15 @@
1333
1507
  };
1334
1508
 
1335
1509
  picker.disabledDates = function (dates) {
1510
+ ///<signature helpKeyword="$.fn.datetimepicker.disabledDates">
1511
+ ///<summary>Returns an array with the currently set disabled dates on the component.</summary>
1512
+ ///<returns type="array">options.disabledDates</returns>
1513
+ ///</signature>
1514
+ ///<signature>
1515
+ ///<summary>Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of
1516
+ ///options.enabledDates if such exist.</summary>
1517
+ ///<param name="dates" locid="$.fn.datetimepicker.disabledDates_p:dates">Takes an [ string or Date or moment ] of values and allows the user to select only from those days.</param>
1518
+ ///</signature>
1336
1519
  if (arguments.length === 0) {
1337
1520
  return (options.disabledDates ? $.extend({}, options.disabledDates) : options.disabledDates);
1338
1521
  }
@@ -1352,6 +1535,14 @@
1352
1535
  };
1353
1536
 
1354
1537
  picker.enabledDates = function (dates) {
1538
+ ///<signature helpKeyword="$.fn.datetimepicker.enabledDates">
1539
+ ///<summary>Returns an array with the currently set enabled dates on the component.</summary>
1540
+ ///<returns type="array">options.enabledDates</returns>
1541
+ ///</signature>
1542
+ ///<signature>
1543
+ ///<summary>Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledDates if such exist.</summary>
1544
+ ///<param name="dates" locid="$.fn.datetimepicker.enabledDates_p:dates">Takes an [ string or Date or moment ] of values and allows the user to select only from those days.</param>
1545
+ ///</signature>
1355
1546
  if (arguments.length === 0) {
1356
1547
  return (options.enabledDates ? $.extend({}, options.enabledDates) : options.enabledDates);
1357
1548
  }
@@ -1375,6 +1566,12 @@
1375
1566
  return options.daysOfWeekDisabled.splice(0);
1376
1567
  }
1377
1568
 
1569
+ if ((typeof daysOfWeekDisabled === 'boolean') && !daysOfWeekDisabled) {
1570
+ options.daysOfWeekDisabled = false;
1571
+ update();
1572
+ return picker;
1573
+ }
1574
+
1378
1575
  if (!(daysOfWeekDisabled instanceof Array)) {
1379
1576
  throw new TypeError('daysOfWeekDisabled() expects an array parameter');
1380
1577
  }
@@ -1388,6 +1585,17 @@
1388
1585
  }
1389
1586
  return previousValue;
1390
1587
  }, []).sort();
1588
+ if (options.useCurrent && !options.keepInvalid) {
1589
+ var tries = 0;
1590
+ while (!isValid(date, 'd')) {
1591
+ date.add(1, 'd');
1592
+ if (tries === 7) {
1593
+ throw 'Tried 7 times to find a valid date';
1594
+ }
1595
+ tries++;
1596
+ }
1597
+ setValue(date);
1598
+ }
1391
1599
  update();
1392
1600
  return picker;
1393
1601
  };
@@ -1418,7 +1626,7 @@
1418
1626
  throw new TypeError('maxDate() date parameter is before options.minDate: ' + parsedDate.format(actualFormat));
1419
1627
  }
1420
1628
  options.maxDate = parsedDate;
1421
- if (options.maxDate.isBefore(maxDate)) {
1629
+ if (options.useCurrent && !options.keepInvalid && date.isAfter(maxDate)) {
1422
1630
  setValue(options.maxDate);
1423
1631
  }
1424
1632
  if (viewDate.isAfter(parsedDate)) {
@@ -1454,7 +1662,7 @@
1454
1662
  throw new TypeError('minDate() date parameter is after options.maxDate: ' + parsedDate.format(actualFormat));
1455
1663
  }
1456
1664
  options.minDate = parsedDate;
1457
- if (options.minDate.isAfter(minDate)) {
1665
+ if (options.useCurrent && !options.keepInvalid && date.isBefore(minDate)) {
1458
1666
  setValue(options.minDate);
1459
1667
  }
1460
1668
  if (viewDate.isBefore(parsedDate)) {
@@ -1465,6 +1673,14 @@
1465
1673
  };
1466
1674
 
1467
1675
  picker.defaultDate = function (defaultDate) {
1676
+ ///<signature helpKeyword="$.fn.datetimepicker.defaultDate">
1677
+ ///<summary>Returns a moment with the options.defaultDate option configuration or false if not set</summary>
1678
+ ///<returns type="Moment">date.clone()</returns>
1679
+ ///</signature>
1680
+ ///<signature>
1681
+ ///<summary>Will set the picker's inital date. If a boolean:false value is passed the options.defaultDate parameter is cleared.</summary>
1682
+ ///<param name="defaultDate" locid="$.fn.datetimepicker.defaultDate_p:defaultDate">Takes a string, Date, moment, boolean:false</param>
1683
+ ///</signature>
1468
1684
  if (arguments.length === 0) {
1469
1685
  return options.defaultDate ? options.defaultDate.clone() : options.defaultDate;
1470
1686
  }
@@ -1489,7 +1705,7 @@
1489
1705
 
1490
1706
  options.defaultDate = parsedDate;
1491
1707
 
1492
- if (options.defaultDate && input.val().trim() === '' && input.attr('placeholder') === undefined) {
1708
+ if (options.defaultDate && options.inline || (input.val().trim() === '' && input.attr('placeholder') === undefined)) {
1493
1709
  setValue(options.defaultDate);
1494
1710
  }
1495
1711
  return picker;
@@ -1764,6 +1980,19 @@
1764
1980
  return picker;
1765
1981
  };
1766
1982
 
1983
+ picker.focusOnShow = function (focusOnShow) {
1984
+ if (arguments.length === 0) {
1985
+ return options.focusOnShow;
1986
+ }
1987
+
1988
+ if (typeof focusOnShow !== 'boolean') {
1989
+ throw new TypeError('focusOnShow() expects a boolean parameter');
1990
+ }
1991
+
1992
+ options.focusOnShow = focusOnShow;
1993
+ return picker;
1994
+ };
1995
+
1767
1996
  picker.inline = function (inline) {
1768
1997
  if (arguments.length === 0) {
1769
1998
  return options.inline;
@@ -1796,6 +2025,19 @@
1796
2025
  return picker;
1797
2026
  };
1798
2027
 
2028
+ picker.allowInputToggle = function (allowInputToggle) {
2029
+ if (arguments.length === 0) {
2030
+ return options.allowInputToggle;
2031
+ }
2032
+
2033
+ if (typeof allowInputToggle !== 'boolean') {
2034
+ throw new TypeError('allowInputToggle() expects a boolean parameter');
2035
+ }
2036
+
2037
+ options.allowInputToggle = allowInputToggle;
2038
+ return picker;
2039
+ };
2040
+
1799
2041
  picker.showClose = function (showClose) {
1800
2042
  if (arguments.length === 0) {
1801
2043
  return options.showClose;
@@ -1834,6 +2076,151 @@
1834
2076
  return picker;
1835
2077
  };
1836
2078
 
2079
+ picker.parseInputDate = function (parseInputDate) {
2080
+ if (arguments.length === 0) {
2081
+ return options.parseInputDate;
2082
+ }
2083
+
2084
+ if (typeof parseInputDate !== 'function') {
2085
+ throw new TypeError('parseInputDate() sholud be as function');
2086
+ }
2087
+
2088
+ options.parseInputDate = parseInputDate;
2089
+
2090
+ return picker;
2091
+ };
2092
+
2093
+ picker.disabledTimeIntervals = function (disabledTimeIntervals) {
2094
+ ///<signature helpKeyword="$.fn.datetimepicker.disabledTimeIntervals">
2095
+ ///<summary>Returns an array with the currently set disabled dates on the component.</summary>
2096
+ ///<returns type="array">options.disabledTimeIntervals</returns>
2097
+ ///</signature>
2098
+ ///<signature>
2099
+ ///<summary>Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of
2100
+ ///options.enabledDates if such exist.</summary>
2101
+ ///<param name="dates" locid="$.fn.datetimepicker.disabledTimeIntervals_p:dates">Takes an [ string or Date or moment ] of values and allows the user to select only from those days.</param>
2102
+ ///</signature>
2103
+ if (arguments.length === 0) {
2104
+ return (options.disabledTimeIntervals ? $.extend({}, options.disabledTimeIntervals) : options.disabledTimeIntervals);
2105
+ }
2106
+
2107
+ if (!disabledTimeIntervals) {
2108
+ options.disabledTimeIntervals = false;
2109
+ update();
2110
+ return picker;
2111
+ }
2112
+ if (!(disabledTimeIntervals instanceof Array)) {
2113
+ throw new TypeError('disabledTimeIntervals() expects an array parameter');
2114
+ }
2115
+ options.disabledTimeIntervals = disabledTimeIntervals;
2116
+ update();
2117
+ return picker;
2118
+ };
2119
+
2120
+ picker.disabledHours = function (hours) {
2121
+ ///<signature helpKeyword="$.fn.datetimepicker.disabledHours">
2122
+ ///<summary>Returns an array with the currently set disabled hours on the component.</summary>
2123
+ ///<returns type="array">options.disabledHours</returns>
2124
+ ///</signature>
2125
+ ///<signature>
2126
+ ///<summary>Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of
2127
+ ///options.enabledHours if such exist.</summary>
2128
+ ///<param name="hours" locid="$.fn.datetimepicker.disabledHours_p:hours">Takes an [ int ] of values and disallows the user to select only from those hours.</param>
2129
+ ///</signature>
2130
+ if (arguments.length === 0) {
2131
+ return (options.disabledHours ? $.extend({}, options.disabledHours) : options.disabledHours);
2132
+ }
2133
+
2134
+ if (!hours) {
2135
+ options.disabledHours = false;
2136
+ update();
2137
+ return picker;
2138
+ }
2139
+ if (!(hours instanceof Array)) {
2140
+ throw new TypeError('disabledHours() expects an array parameter');
2141
+ }
2142
+ options.disabledHours = indexGivenHours(hours);
2143
+ options.enabledHours = false;
2144
+ if (options.useCurrent && !options.keepInvalid) {
2145
+ var tries = 0;
2146
+ while (!isValid(date, 'h')) {
2147
+ date.add(1, 'h');
2148
+ if (tries === 24) {
2149
+ throw 'Tried 24 times to find a valid date';
2150
+ }
2151
+ tries++;
2152
+ }
2153
+ setValue(date);
2154
+ }
2155
+ update();
2156
+ return picker;
2157
+ };
2158
+
2159
+ picker.enabledHours = function (hours) {
2160
+ ///<signature helpKeyword="$.fn.datetimepicker.enabledHours">
2161
+ ///<summary>Returns an array with the currently set enabled hours on the component.</summary>
2162
+ ///<returns type="array">options.enabledHours</returns>
2163
+ ///</signature>
2164
+ ///<signature>
2165
+ ///<summary>Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledHours if such exist.</summary>
2166
+ ///<param name="hours" locid="$.fn.datetimepicker.enabledHours_p:hours">Takes an [ int ] of values and allows the user to select only from those hours.</param>
2167
+ ///</signature>
2168
+ if (arguments.length === 0) {
2169
+ return (options.enabledHours ? $.extend({}, options.enabledHours) : options.enabledHours);
2170
+ }
2171
+
2172
+ if (!hours) {
2173
+ options.enabledHours = false;
2174
+ update();
2175
+ return picker;
2176
+ }
2177
+ if (!(hours instanceof Array)) {
2178
+ throw new TypeError('enabledHours() expects an array parameter');
2179
+ }
2180
+ options.enabledHours = indexGivenHours(hours);
2181
+ options.disabledHours = false;
2182
+ if (options.useCurrent && !options.keepInvalid) {
2183
+ var tries = 0;
2184
+ while (!isValid(date, 'h')) {
2185
+ date.add(1, 'h');
2186
+ if (tries === 24) {
2187
+ throw 'Tried 24 times to find a valid date';
2188
+ }
2189
+ tries++;
2190
+ }
2191
+ setValue(date);
2192
+ }
2193
+ update();
2194
+ return picker;
2195
+ };
2196
+
2197
+ picker.viewDate = function (newDate) {
2198
+ ///<signature helpKeyword="$.fn.datetimepicker.viewDate">
2199
+ ///<summary>Returns the component's model current viewDate, a moment object or null if not set.</summary>
2200
+ ///<returns type="Moment">viewDate.clone()</returns>
2201
+ ///</signature>
2202
+ ///<signature>
2203
+ ///<summary>Sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.</summary>
2204
+ ///<param name="newDate" locid="$.fn.datetimepicker.date_p:newDate">Takes string, viewDate, moment, null parameter.</param>
2205
+ ///</signature>
2206
+ if (arguments.length === 0) {
2207
+ return viewDate.clone();
2208
+ }
2209
+
2210
+ if (!newDate) {
2211
+ viewDate = date.clone();
2212
+ return picker;
2213
+ }
2214
+
2215
+ if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) {
2216
+ throw new TypeError('viewDate() parameter must be one of [string, moment or Date]');
2217
+ }
2218
+
2219
+ viewDate = parseInputDate(newDate);
2220
+ viewUpdate();
2221
+ return picker;
2222
+ };
2223
+
1837
2224
  // initializing element and component attributes
1838
2225
  if (element.is('input')) {
1839
2226
  input = element;
@@ -1925,7 +2312,7 @@
1925
2312
  },
1926
2313
  useStrict: false,
1927
2314
  sideBySide: false,
1928
- daysOfWeekDisabled: [],
2315
+ daysOfWeekDisabled: false,
1929
2316
  calendarWeeks: false,
1930
2317
  viewMode: 'days',
1931
2318
  toolbarPlacement: 'default',
@@ -1939,6 +2326,7 @@
1939
2326
  widgetParent: null,
1940
2327
  ignoreReadonly: false,
1941
2328
  keepOpen: false,
2329
+ focusOnShow: true,
1942
2330
  inline: false,
1943
2331
  keepInvalid: false,
1944
2332
  datepickerInput: '.datepickerinput',
@@ -2046,6 +2434,11 @@
2046
2434
  this.clear();
2047
2435
  }
2048
2436
  },
2049
- debug: false
2437
+ debug: false,
2438
+ allowInputToggle: false,
2439
+ disabledTimeIntervals: false,
2440
+ disabledHours: false,
2441
+ enabledHours: false,
2442
+ viewDate: false
2050
2443
  };
2051
2444
  }));