flatpickr 2.2.4.0 → 2.2.5.0

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.
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() {