flatpickr 2.2.4.0 → 2.2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/lib/flatpickr/version.rb +1 -1
  3. data/vendor/assets/javascripts/flatpickr.js +158 -107
  4. data/vendor/assets/javascripts/flatpickr/l10n/ru.js +2 -0
  5. data/vendor/assets/javascripts/flatpickr/l10n/th.js +24 -0
  6. data/vendor/assets/stylesheets/flatpickr.css +1 -13
  7. data/vendor/assets/stylesheets/flatpickr/rtl/flatpickr.min.css +4 -4
  8. data/vendor/assets/stylesheets/flatpickr/rtl/themes/airbnb.rtl.css +645 -7
  9. data/vendor/assets/stylesheets/flatpickr/rtl/themes/base16_flat.rtl.css +608 -7
  10. data/vendor/assets/stylesheets/flatpickr/rtl/themes/confetti.rtl.css +613 -7
  11. data/vendor/assets/stylesheets/flatpickr/rtl/themes/dark.rtl.css +608 -7
  12. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_blue.rtl.css +613 -7
  13. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_green.rtl.css +613 -7
  14. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_orange.rtl.css +613 -7
  15. data/vendor/assets/stylesheets/flatpickr/rtl/themes/material_red.rtl.css +613 -7
  16. data/vendor/assets/stylesheets/flatpickr/themes/airbnb.css +1 -13
  17. data/vendor/assets/stylesheets/flatpickr/themes/base16_flat.css +1 -13
  18. data/vendor/assets/stylesheets/flatpickr/themes/confetti.css +1 -13
  19. data/vendor/assets/stylesheets/flatpickr/themes/dark.css +1 -13
  20. data/vendor/assets/stylesheets/flatpickr/themes/material_blue.css +1 -13
  21. data/vendor/assets/stylesheets/flatpickr/themes/material_green.css +1 -13
  22. data/vendor/assets/stylesheets/flatpickr/themes/material_orange.css +1 -13
  23. data/vendor/assets/stylesheets/flatpickr/themes/material_red.css +1 -13
  24. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4b72358023f1a34f6ba67d13f1e4718e21fc88f0
4
- data.tar.gz: 6316e78f69c7a4d45e230f57707bc5ee87b86f81
3
+ metadata.gz: 951054831d39a2959e61dce90834939bfeeec9f6
4
+ data.tar.gz: a46b5ec5ab3db38a4897cbad923f45e68f934a45
5
5
  SHA512:
6
- metadata.gz: a060d9dbad8ca861f01fd9572e86bd2cd0438412801faf446dc11d9783ad2126e8de7e559718ddca7541f8d1d121ff5af1b5b8da5699dd4c158cb7c8bc90fd73
7
- data.tar.gz: ef96d6f8adce50e4f93be5bb202c9d4692d3b07869f960e7a5e3be18593a67297b7cefbe01b03c6e73a027fd0c23e85109ac9fc83024af8523412c86d82910e5
6
+ metadata.gz: 315a6d09cc7103d0dfa7257723635fc7242d82dfe80a54bc110bb4d3219e29fdbf39d66507828f28a77be9a8170e83e41dad40be2ac67ca7b35f0c482cec5f77
7
+ data.tar.gz: 46ec2988ba6bd95a93208a76132944a7c530afe5d1f3f6c5ab72ffe19a9f236e018ac4b9cfa98c969e078e08b5626ed83eb9d158c46b8bf7aad6a097f5802933
@@ -1,3 +1,3 @@
1
1
  module Flatpickr
2
- VERSION = '2.2.4.0'
2
+ VERSION = '2.2.5.0'
3
3
  end
@@ -2,7 +2,7 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument
2
2
 
3
3
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
4
 
5
- /*! flatpickr v2.2.3, @license MIT */
5
+ /*! flatpickr v2.2.5, @license MIT */
6
6
  function Flatpickr(element, config) {
7
7
  var self = this;
8
8
 
@@ -31,7 +31,6 @@ function Flatpickr(element, config) {
31
31
  self.formatDate = formatDate;
32
32
  self.jumpToDate = jumpToDate;
33
33
  self.open = open;
34
- self.parseDate = parseDate;
35
34
  self.redraw = redraw;
36
35
  self.set = set;
37
36
  self.setDate = setDate;
@@ -63,7 +62,9 @@ function Flatpickr(element, config) {
63
62
  updateValue();
64
63
  }
65
64
 
66
- if (self.config.weekNumbers) self.calendarContainer.style.width = self.days.offsetWidth + self.weekWrapper.offsetWidth + 2 + "px";
65
+ if (self.config.weekNumbers) {
66
+ self.calendarContainer.style.width = self.days.clientWidth + self.weekWrapper.clientWidth + "px";
67
+ }
67
68
 
68
69
  triggerEvent("Ready");
69
70
  }
@@ -77,8 +78,10 @@ function Flatpickr(element, config) {
77
78
 
78
79
  if (!self.selectedDates.length) return;
79
80
 
80
- setHoursFromInputs();
81
- updateValue();
81
+ if (e.type !== "input" || e.target.value.length >= 2) {
82
+ setHoursFromInputs();
83
+ updateValue();
84
+ }
82
85
  }
83
86
 
84
87
  function setHoursFromInputs() {
@@ -90,10 +93,10 @@ function Flatpickr(element, config) {
90
93
 
91
94
  if (self.amPM) hours = hours % 12 + 12 * (self.amPM.innerHTML === "PM");
92
95
 
93
- if (self.minDateHasTime && compareDates(latestSelectedDateObj(), self.config.minDate) === 0) {
96
+ if (self.minDateHasTime && compareDates(self.latestSelectedDateObj, self.config.minDate) === 0) {
94
97
  hours = Math.max(hours, self.config.minDate.getHours());
95
98
  if (hours === self.config.minDate.getHours()) minutes = Math.max(minutes, self.config.minDate.getMinutes());
96
- } else if (self.maxDateHasTime && compareDates(latestSelectedDateObj(), self.config.maxDate) === 0) {
99
+ } else if (self.maxDateHasTime && compareDates(self.latestSelectedDateObj, self.config.maxDate) === 0) {
97
100
  hours = Math.min(hours, self.config.maxDate.getHours());
98
101
  if (hours === self.config.maxDate.getHours()) minutes = Math.min(minutes, self.config.maxDate.getMinutes());
99
102
  }
@@ -102,14 +105,14 @@ function Flatpickr(element, config) {
102
105
  }
103
106
 
104
107
  function setHoursFromDate(dateObj) {
105
- var date = dateObj || latestSelectedDateObj();
108
+ var date = dateObj || self.latestSelectedDateObj;
106
109
 
107
110
  if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds());
108
111
  }
109
112
 
110
113
  function setHours(hours, minutes, seconds) {
111
114
  if (self.selectedDates.length) {
112
- self.selectedDates[self.selectedDates.length - 1].setHours(hours % 24, minutes, seconds || 0, 0);
115
+ self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);
113
116
  }
114
117
 
115
118
  if (!self.config.enableTime || self.isMobile) return;
@@ -118,7 +121,7 @@ function Flatpickr(element, config) {
118
121
 
119
122
  self.minuteElement.value = self.pad(minutes);
120
123
 
121
- if (!self.config.time_24hr && self.selectedDates.length) self.amPM.textContent = latestSelectedDateObj().getHours() >= 12 ? "PM" : "AM";
124
+ if (!self.config.time_24hr && self.selectedDates.length) self.amPM.textContent = self.latestSelectedDateObj.getHours() >= 12 ? "PM" : "AM";
122
125
 
123
126
  if (self.config.enableSeconds) self.secondElement.value = self.pad(seconds);
124
127
  }
@@ -147,14 +150,14 @@ function Flatpickr(element, config) {
147
150
  };
148
151
  self.debouncedChange = debounce(self.triggerChange, 1000);
149
152
 
150
- if (self.config.mode === "range") self.days.addEventListener("mouseover", onMouseOver);
153
+ if (self.config.mode === "range" && self.days) self.days.addEventListener("mouseover", onMouseOver);
151
154
 
152
155
  document.addEventListener("keydown", onKeyDown);
153
156
  window.addEventListener("resize", self.debouncedResize);
154
157
 
155
- var clickEvent = typeof window.ontouchstart !== "undefined" ? "touchstart" : "click";
158
+ if (window.ontouchstart) document.addEventListener("touchstart", documentClick);
156
159
 
157
- document.addEventListener(clickEvent, documentClick);
160
+ document.addEventListener("click", documentClick);
158
161
  document.addEventListener("blur", documentClick);
159
162
 
160
163
  if (self.config.clickOpens) (self.altInput || self.input).addEventListener("focus", open);
@@ -217,7 +220,7 @@ function Flatpickr(element, config) {
217
220
  }
218
221
 
219
222
  function jumpToDate(jumpDate) {
220
- jumpDate = jumpDate ? parseDate(jumpDate) : latestSelectedDateObj() || (self.config.minDate > self.now ? self.config.minDate : self.now);
223
+ jumpDate = jumpDate ? self.parseDate(jumpDate) : self.latestSelectedDateObj || (self.config.minDate > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate < self.now ? self.config.maxDate : self.now);
221
224
 
222
225
  try {
223
226
  self.currentYear = jumpDate.getFullYear();
@@ -283,6 +286,8 @@ function Flatpickr(element, config) {
283
286
 
284
287
  if (self.config.enableTime) fragment.appendChild(buildTime());
285
288
 
289
+ if (self.config.mode === "range") self.calendarContainer.classList.add("rangeMode");
290
+
286
291
  self.calendarContainer.appendChild(fragment);
287
292
 
288
293
  if (self.config.inline || self.config.static) {
@@ -417,6 +422,7 @@ function Flatpickr(element, config) {
417
422
 
418
423
  function buildTime() {
419
424
  self.calendarContainer.classList.add("hasTime");
425
+ if (self.config.noCalendar) self.calendarContainer.classList.add("noCalendar");
420
426
  self.timeContainer = createElement("div", "flatpickr-time");
421
427
  self.timeContainer.tabIndex = -1;
422
428
  var separator = createElement("span", "flatpickr-time-separator", ":");
@@ -430,9 +436,9 @@ function Flatpickr(element, config) {
430
436
  self.hourElement.tabIndex = self.minuteElement.tabIndex = 0;
431
437
  self.hourElement.pattern = self.minuteElement.pattern = "\d*";
432
438
 
433
- self.hourElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getHours() : self.config.defaultHour);
439
+ self.hourElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.defaultHour);
434
440
 
435
- self.minuteElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getMinutes() : self.config.defaultMinute);
441
+ self.minuteElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute);
436
442
 
437
443
  self.hourElement.step = self.config.hourIncrement;
438
444
  self.minuteElement.step = self.config.minuteIncrement;
@@ -458,7 +464,7 @@ function Flatpickr(element, config) {
458
464
  self.secondElement = secondInput.childNodes[0];
459
465
 
460
466
  self.secondElement.pattern = self.hourElement.pattern;
461
- self.secondElement.value = latestSelectedDateObj() ? self.pad(latestSelectedDateObj().getSeconds()) : "00";
467
+ self.secondElement.value = self.latestSelectedDateObj ? self.pad(self.latestSelectedDateObj.getSeconds()) : "00";
462
468
 
463
469
  self.secondElement.step = self.minuteElement.step;
464
470
  self.secondElement.min = self.minuteElement.min;
@@ -494,6 +500,7 @@ function Flatpickr(element, config) {
494
500
  return self.weekdayContainer;
495
501
  }
496
502
 
503
+ /* istanbul ignore next */
497
504
  function buildWeeks() {
498
505
  self.calendarContainer.classList.add("hasWeeks");
499
506
  self.weekWrapper = createElement("div", "flatpickr-weekwrapper");
@@ -554,9 +561,10 @@ function Flatpickr(element, config) {
554
561
  window.removeEventListener("resize", instance.debouncedResize);
555
562
 
556
563
  document.removeEventListener("click", documentClick);
564
+ document.removeEventListener("touchstart", documentClick);
557
565
  document.removeEventListener("blur", documentClick);
558
566
 
559
- if (instance.isMobile && instance.mobileInput && instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);else if (instance.calendarContainer && instance.calendarContainer.parentNode) instance.calendarContainer.parentNode.removeChild(instance.calendarContainer);
567
+ if (instance.mobileInput && instance.mobileInput.parentNode) instance.mobileInput.parentNode.removeChild(instance.mobileInput);else if (instance.calendarContainer && instance.calendarContainer.parentNode) instance.calendarContainer.parentNode.removeChild(instance.calendarContainer);
560
568
 
561
569
  if (instance.altInput) {
562
570
  instance.input.type = "text";
@@ -566,6 +574,8 @@ function Flatpickr(element, config) {
566
574
  instance.input.classList.remove("flatpickr-input");
567
575
  instance.input.removeEventListener("focus", open);
568
576
  instance.input.removeAttribute("readonly");
577
+
578
+ delete instance.input._flatpickr;
569
579
  }
570
580
 
571
581
  function isCalendarElem(elem) {
@@ -581,7 +591,8 @@ function Flatpickr(element, config) {
581
591
  function documentClick(e) {
582
592
  var isInput = self.element.contains(e.target) || e.target === self.input || e.target === self.altInput;
583
593
 
584
- if (self.isOpen && !isCalendarElem(e.target) && !isInput) {
594
+ if (self.isOpen && !self.config.inline && !isCalendarElem(e.target) && !isInput) {
595
+ e.preventDefault();
585
596
  self.close();
586
597
 
587
598
  if (self.config.mode === "range" && self.selectedDates.length === 1) {
@@ -619,12 +630,12 @@ function Flatpickr(element, config) {
619
630
  }
620
631
  }
621
632
 
622
- function isEnabled(dateToCheck) {
623
- if (self.config.minDate && compareDates(dateToCheck, self.config.minDate) < 0 || self.config.maxDate && compareDates(dateToCheck, self.config.maxDate) > 0) return false;
633
+ function isEnabled(date) {
634
+ if (self.config.minDate && compareDates(date, self.config.minDate) < 0 || self.config.maxDate && compareDates(date, self.config.maxDate) > 0) return false;
624
635
 
625
636
  if (!self.config.enable.length && !self.config.disable.length) return true;
626
637
 
627
- dateToCheck = parseDate(dateToCheck, true); // timeless
638
+ var dateToCheck = self.parseDate(date, true); // timeless
628
639
 
629
640
  var bool = self.config.enable.length > 0,
630
641
  array = bool ? self.config.enable : self.config.disable;
@@ -633,10 +644,10 @@ function Flatpickr(element, config) {
633
644
  d = array[i];
634
645
 
635
646
  if (d instanceof Function && d(dateToCheck)) // disabled by function
636
- return bool;else if ((d instanceof Date || typeof d === "string") && parseDate(d, true).getTime() === dateToCheck.getTime())
647
+ return bool;else if (d instanceof Date && d.getTime() === dateToCheck.getTime())
637
648
  // disabled by date string
638
649
  return bool;else if ( // disabled by range
639
- (typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= parseDate(d.from) && dateToCheck <= parseDate(d.to)) return bool;
650
+ (typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= d.from && dateToCheck <= d.to) return bool;
640
651
  }
641
652
 
642
653
  return !bool;
@@ -694,7 +705,7 @@ function Flatpickr(element, config) {
694
705
  if (self.selectedDates.length !== 1 || !e.target.classList.contains("flatpickr-day")) return;
695
706
 
696
707
  var hoverDate = e.target.dateObj,
697
- initialDate = parseDate(self.selectedDates[0], true),
708
+ initialDate = self.parseDate(self.selectedDates[0], true),
698
709
  rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
699
710
  rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
700
711
  containsDisabled = false;
@@ -770,7 +781,7 @@ function Flatpickr(element, config) {
770
781
  return this._minDate;
771
782
  },
772
783
  set: function set(date) {
773
- this._minDate = parseDate(date);
784
+ this._minDate = self.parseDate(date);
774
785
 
775
786
  if (self.days) redraw();
776
787
 
@@ -791,7 +802,7 @@ function Flatpickr(element, config) {
791
802
  return this._maxDate;
792
803
  },
793
804
  set: function set(date) {
794
- this._maxDate = parseDate(date);
805
+ this._maxDate = self.parseDate(date);
795
806
  if (self.days) redraw();
796
807
 
797
808
  if (!self.currentYearElement) return;
@@ -824,60 +835,13 @@ function Flatpickr(element, config) {
824
835
  self.l10n = _extends(Object.create(Flatpickr.l10ns.default), _typeof(self.config.locale) === "object" ? self.config.locale : self.config.locale !== "default" ? Flatpickr.l10ns[self.config.locale] || {} : {});
825
836
  }
826
837
 
827
- function parseDate(date) {
828
- var timeless = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
829
-
830
- if (!date) return null;
831
-
832
- var dateTimeRegex = /(\d+)/g,
833
- timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p)?/i,
834
- timestamp = /^(\d+)$/g,
835
- date_orig = date;
836
-
837
- if (date.toFixed) // timestamp
838
- date = new Date(date);else if (typeof date === "string") {
839
- date = date.trim();
840
-
841
- if (date === "today") {
842
- date = new Date();
843
- timeless = true;
844
- } else if (self.config.parseDate) date = self.config.parseDate(date);else if (timeRegex.test(date)) {
845
- // time picker
846
- var m = date.match(timeRegex),
847
- hours = !m[4] ? m[1] // military time, no conversion needed
848
- : m[1] % 12 + (m[4].toLowerCase() === "p" ? 12 : 0); // am/pm
849
-
850
- date = new Date();
851
- date.setHours(hours, m[2] || 0, m[3] || 0);
852
- } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
853
- date = new Date(date);else if (dateTimeRegex.test(date) && /^[0-9]/.test(date)) {
854
- var d = date.match(dateTimeRegex);
855
- date = new Date(d[0] + "/" + (d[1] || 1) + "/" + (d[2] || 1) + " " + (d[3] || 0) + ":" + (d[4] || 0) + ":" + (d[5] || 0));
856
- } else // fallback
857
- date = new Date(date);
858
- }
859
-
860
- if (!(date instanceof Date)) {
861
- console.warn("flatpickr: invalid date " + date_orig);
862
- console.info(self.element);
863
- return null;
864
- }
865
-
866
- if (self.config.utc && !date.fp_isUTC) date = date.fp_toUTC();
867
-
868
- if (timeless) date.setHours(0, 0, 0, 0);
869
-
870
- return date;
871
- }
872
-
873
838
  function positionCalendar() {
874
839
  var calendarHeight = self.calendarContainer.offsetHeight,
875
840
  input = self.altInput || self.input,
876
841
  inputBounds = input.getBoundingClientRect(),
877
842
  distanceFromBottom = window.innerHeight - inputBounds.bottom + input.offsetHeight;
878
843
 
879
- var top = void 0,
880
- left = window.pageXOffset + inputBounds.left;
844
+ var top = void 0;
881
845
 
882
846
  if (distanceFromBottom < calendarHeight) {
883
847
  top = window.pageYOffset - calendarHeight + inputBounds.top - 2;
@@ -891,7 +855,21 @@ function Flatpickr(element, config) {
891
855
 
892
856
  if (!self.config.static && !self.config.inline) {
893
857
  self.calendarContainer.style.top = top + "px";
894
- self.calendarContainer.style.left = left + "px";
858
+
859
+ var left = window.pageXOffset + inputBounds.left;
860
+ var right = document.body.offsetWidth - inputBounds.right;
861
+
862
+ if (left + self.calendarContainer.offsetWidth <= document.body.offsetWidth) {
863
+ self.calendarContainer.style.left = left + "px";
864
+ self.calendarContainer.style.right = "auto";
865
+
866
+ self.calendarContainer.classList.remove("rightMost");
867
+ } else {
868
+ self.calendarContainer.style.left = "auto";
869
+ self.calendarContainer.style.right = right + "px";
870
+
871
+ self.calendarContainer.classList.add("rightMost");
872
+ }
895
873
  }
896
874
  }
897
875
 
@@ -904,18 +882,15 @@ function Flatpickr(element, config) {
904
882
  }
905
883
 
906
884
  function selectDate(e) {
885
+ e.preventDefault();
907
886
  if (self.config.allowInput && e.which === 13 && e.target === (self.altInput || self.input)) return self.setDate((self.altInput || self.input).value), e.target.blur();
908
887
 
909
888
  if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
910
889
 
911
- var selectedDate = e.target.dateObj;
890
+ var selectedDate = self.latestSelectedDateObj = e.target.dateObj;
912
891
  self.selectedDateElem = e.target;
913
892
 
914
- if (self.config.mode === "single") {
915
- self.selectedDates = [selectedDate];
916
-
917
- if (!self.config.enableTime) self.close();
918
- } else if (self.config.mode === "multiple") {
893
+ if (self.config.mode === "single") self.selectedDates = [selectedDate];else if (self.config.mode === "multiple") {
919
894
  var selectedIndex = isDateSelected(selectedDate);
920
895
  if (selectedIndex) self.selectedDates.splice(selectedIndex, 1);else self.selectedDates.push(selectedDate);
921
896
  } else if (self.config.mode === "range") {
@@ -947,6 +922,8 @@ function Flatpickr(element, config) {
947
922
 
948
923
  if (self.config.mode === "range" && self.selectedDates.length === 1) onMouseOver(e);
949
924
 
925
+ if (self.config.mode === "single" && !self.config.enableTime) self.close();
926
+
950
927
  triggerEvent("Change");
951
928
  }
952
929
 
@@ -959,37 +936,51 @@ function Flatpickr(element, config) {
959
936
  function setDate(date, triggerChange) {
960
937
  if (!date) return self.clear();
961
938
 
962
- self.selectedDates = (Array.isArray(date) ? date.map(parseDate) : [parseDate(date)]).filter(function (d) {
939
+ self.selectedDates = (Array.isArray(date) ? date.map(self.parseDate) : [self.parseDate(date)]).filter(function (d) {
963
940
  return d instanceof Date && isEnabled(d);
964
941
  });
942
+
965
943
  self.redraw();
966
944
  jumpToDate();
967
945
 
968
946
  setHoursFromDate();
969
947
  updateValue();
970
948
 
971
- self.dateIsPicked = self.selectedDates.length > 0;
949
+ if (self.selectedDates.length > 0) self.dateIsPicked = true;else self.latestSelectedDateObj = null;
972
950
 
973
- if (triggerChange) triggerEvent("Change");
951
+ if (triggerChange === true) triggerEvent("Change");
974
952
  }
975
953
 
976
954
  function setupDates() {
955
+ function parseDateRules(arr) {
956
+ for (var i = arr.length; i--;) {
957
+ if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], true);else if (arr[i] && arr[i].from && arr[i].to) {
958
+ arr[i].from = self.parseDate(arr[i].from);
959
+ arr[i].to = self.parseDate(arr[i].to);
960
+ }
961
+ }
962
+
963
+ return arr.filter(function (x) {
964
+ return x;
965
+ }); // remove falsy values
966
+ }
967
+
977
968
  self.selectedDates = [];
978
969
  self.now = new Date();
979
970
  var inputDate = self.config.defaultDate || self.input.value;
980
971
 
981
- if (Array.isArray(inputDate)) self.selectedDates = inputDate.map(parseDate);else if (inputDate) {
972
+ if (Array.isArray(inputDate)) self.selectedDates = inputDate.map(self.parseDate);else if (inputDate) {
982
973
  switch (self.config.mode) {
983
974
  case "single":
984
- self.selectedDates = [parseDate(inputDate)];
975
+ self.selectedDates = [self.parseDate(inputDate)];
985
976
  break;
986
977
 
987
978
  case "multiple":
988
- self.selectedDates = inputDate.split("; ").map(parseDate);
979
+ self.selectedDates = inputDate.split("; ").map(self.parseDate);
989
980
  break;
990
981
 
991
982
  case "range":
992
- self.selectedDates = inputDate.split(self.l10n.rangeSeparator).map(parseDate);
983
+ self.selectedDates = inputDate.split(self.l10n.rangeSeparator).map(self.parseDate);
993
984
  break;
994
985
 
995
986
  default:
@@ -997,6 +988,10 @@ function Flatpickr(element, config) {
997
988
  }
998
989
  }
999
990
 
991
+ if (self.config.disable.length) self.config.disable = parseDateRules(self.config.disable);
992
+
993
+ if (self.config.enable.length) self.config.enable = parseDateRules(self.config.enable);
994
+
1000
995
  self.selectedDates = self.selectedDates.filter(function (d) {
1001
996
  return d instanceof Date && d.getTime() && isEnabled(d);
1002
997
  });
@@ -1027,6 +1022,7 @@ function Flatpickr(element, config) {
1027
1022
  };
1028
1023
  }
1029
1024
 
1025
+ /* istanbul ignore next */
1030
1026
  function setupFormats() {
1031
1027
  self.formats = {
1032
1028
  // weekday name, short, e.g. Thu
@@ -1146,9 +1142,9 @@ function Flatpickr(element, config) {
1146
1142
  function setupMobile() {
1147
1143
  var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
1148
1144
 
1149
- self.mobileInput = createElement("input", "flatpickr-input flatpickr-mobile");
1145
+ self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile");
1150
1146
  self.mobileInput.step = "any";
1151
- self.mobileInput.tabIndex = -1;
1147
+ self.mobileInput.tabIndex = 1;
1152
1148
  self.mobileInput.type = inputType;
1153
1149
  self.mobileInput.disabled = self.input.disabled;
1154
1150
 
@@ -1172,7 +1168,8 @@ function Flatpickr(element, config) {
1172
1168
  }
1173
1169
 
1174
1170
  self.mobileInput.addEventListener("change", function (e) {
1175
- self.setDate(e.target.value);
1171
+ self.latestSelectedDateObj = self.parseDate(e.target.value);
1172
+ self.setDate(self.latestSelectedDateObj);
1176
1173
  triggerEvent("Change");
1177
1174
  triggerEvent("Close");
1178
1175
  });
@@ -1205,11 +1202,6 @@ function Flatpickr(element, config) {
1205
1202
  }
1206
1203
  }
1207
1204
 
1208
- function latestSelectedDateObj() {
1209
- if (self.selectedDates.length) return self.selectedDates[self.selectedDates.length - 1];
1210
- return null;
1211
- }
1212
-
1213
1205
  function isDateSelected(date) {
1214
1206
  for (var i = 0; i < self.selectedDates.length; i++) {
1215
1207
  if (compareDates(self.selectedDates[i], date) === 0) return "" + i;
@@ -1246,7 +1238,7 @@ function Flatpickr(element, config) {
1246
1238
  if (!self.selectedDates.length) return self.clear();
1247
1239
 
1248
1240
  if (self.isMobile) {
1249
- self.mobileInput.value = self.selectedDates.length ? formatDate(self.mobileFormatStr, latestSelectedDateObj()) : "";
1241
+ self.mobileInput.value = self.selectedDates.length ? formatDate(self.mobileFormatStr, self.latestSelectedDateObj) : "";
1250
1242
  }
1251
1243
 
1252
1244
  var joinChar = self.config.mode !== "range" ? "; " : self.l10n.rangeSeparator;
@@ -1286,6 +1278,7 @@ function Flatpickr(element, config) {
1286
1278
  return e;
1287
1279
  }
1288
1280
 
1281
+ /* istanbul ignore next */
1289
1282
  function debounce(func, wait, immediate) {
1290
1283
  var timeout = void 0;
1291
1284
  return function () {
@@ -1327,23 +1320,34 @@ function Flatpickr(element, config) {
1327
1320
 
1328
1321
  var newValue = Number(curValue);
1329
1322
 
1330
- if (e.type === "wheel") newValue = curValue + step * delta;else if (e.type === "keydown") newValue = curValue + step * (e.which === 38 ? 1 : -1);
1323
+ switch (e.type) {
1324
+ case "wheel":
1325
+ newValue = curValue + step * delta;
1326
+ break;
1331
1327
 
1332
- if (newValue < min) {
1333
- newValue = max + newValue + (e.target !== self.hourElement) + (e.target === self.hourElement && !self.amPM);
1334
- } else if (newValue > max) {
1335
- newValue = e.target === self.hourElement ? newValue - max - !self.amPM : min;
1328
+ case "keydown":
1329
+ newValue = curValue + step * (e.which === 38 ? 1 : -1);
1330
+ break;
1336
1331
  }
1337
1332
 
1338
- if (self.amPM && e.target === self.hourElement && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
1333
+ if (e.type !== "input" || e.target.value.length === 2) {
1334
+ if (newValue < min) {
1335
+ newValue = max + newValue + (e.target !== self.hourElement) + (e.target === self.hourElement && !self.amPM);
1336
+ } else if (newValue > max) {
1337
+ newValue = e.target === self.hourElement ? newValue - max - !self.amPM : min;
1338
+ }
1339
1339
 
1340
- e.target.value = self.pad(newValue);
1340
+ if (self.amPM && e.target === self.hourElement && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
1341
+
1342
+ e.target.value = self.pad(newValue);
1343
+ } else e.target.value = newValue;
1341
1344
  }
1342
1345
 
1343
1346
  init();
1344
1347
  return self;
1345
1348
  }
1346
1349
 
1350
+ /* istanbul ignore next */
1347
1351
  Flatpickr.defaultConfig = {
1348
1352
 
1349
1353
  mode: "single",
@@ -1383,7 +1387,7 @@ Flatpickr.defaultConfig = {
1383
1387
  altInput: false,
1384
1388
 
1385
1389
  // the created altInput element will have this class.
1386
- altInputClass: "form-control input",
1390
+ altInputClass: "flatpickr-input form-control input",
1387
1391
 
1388
1392
  // same as dateFormat, but for altInput
1389
1393
  altFormat: "F j, Y", // defaults to e.g. June 10, 2016
@@ -1476,6 +1480,7 @@ Flatpickr.defaultConfig = {
1476
1480
  onDayCreate: null
1477
1481
  };
1478
1482
 
1483
+ /* istanbul ignore next */
1479
1484
  Flatpickr.l10ns = {
1480
1485
  en: {
1481
1486
  weekdays: {
@@ -1509,7 +1514,7 @@ Flatpickr.l10ns = {
1509
1514
  }
1510
1515
  };
1511
1516
 
1512
- Flatpickr.l10ns.default = Flatpickr.l10ns.en;
1517
+ Flatpickr.l10ns.default = Object.create(Flatpickr.l10ns.en);
1513
1518
 
1514
1519
  Flatpickr.localize = function (l10n) {
1515
1520
  return _extends(Flatpickr.l10ns.default, l10n || {});
@@ -1518,6 +1523,51 @@ Flatpickr.localize = function (l10n) {
1518
1523
  Flatpickr.prototype = {
1519
1524
  pad: function pad(number) {
1520
1525
  return ("0" + number).slice(-2);
1526
+ },
1527
+ parseDate: function parseDate(date) {
1528
+ var timeless = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1529
+
1530
+ if (!date) return null;
1531
+
1532
+ var dateTimeRegex = /(\d+)/g,
1533
+ timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p)?/i,
1534
+ timestamp = /^(\d+)$/g,
1535
+ date_orig = date;
1536
+
1537
+ if (date.toFixed || timestamp.test(date)) // timestamp
1538
+ date = new Date(date);else if (typeof date === "string") {
1539
+ date = date.trim();
1540
+
1541
+ if (date === "today") {
1542
+ date = new Date();
1543
+ timeless = true;
1544
+ } else if (this.config && this.config.parseDate) date = this.config.parseDate(date);else if (timeRegex.test(date)) {
1545
+ // time picker
1546
+ var m = date.match(timeRegex),
1547
+ hours = !m[4] ? m[1] // military time, no conversion needed
1548
+ : m[1] % 12 + (m[4].toLowerCase() === "p" ? 12 : 0); // am/pm
1549
+
1550
+ date = new Date();
1551
+ date.setHours(hours, m[2] || 0, m[3] || 0);
1552
+ } else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
1553
+ date = new Date(date);else if (dateTimeRegex.test(date) && /^[0-9]/.test(date)) {
1554
+ var d = date.match(dateTimeRegex);
1555
+ date = new Date(d[0] + "/" + (d[1] || 1) + "/" + (d[2] || 1) + " " + (d[3] || 0) + ":" + (d[4] || 0) + ":" + (d[5] || 0));
1556
+ } else // fallback
1557
+ date = new Date(date);
1558
+ } else if (date instanceof Date) date = new Date(date.getTime()); // create a copy
1559
+
1560
+ if (!(date instanceof Date)) {
1561
+ console.warn("flatpickr: invalid date " + date_orig);
1562
+ console.info(this.element);
1563
+ return null;
1564
+ }
1565
+
1566
+ if (this.config && this.config.utc && !date.fp_isUTC) date = date.fp_toUTC();
1567
+
1568
+ if (timeless === true) date.setHours(0, 0, 0, 0);
1569
+
1570
+ return date;
1521
1571
  }
1522
1572
  };
1523
1573
 
@@ -1568,6 +1618,7 @@ Date.prototype.fp_toUTC = function () {
1568
1618
  };
1569
1619
 
1570
1620
  // IE9 classList polyfill
1621
+ /* istanbul ignore next */
1571
1622
  if (!("classList" in document.documentElement) && Object.defineProperty && typeof HTMLElement !== "undefined") {
1572
1623
  Object.defineProperty(HTMLElement.prototype, "classList", {
1573
1624
  get: function get() {