flatpickr_rails 0.0.2 → 0.0.3
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 +4 -4
- data/README.md +26 -21
- data/lib/flatpickr_rails/version.rb +1 -1
- data/vendor/assets/javascripts/flatpickr.js +1506 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ar.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/bg.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/bn.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/cat.js +36 -0
- data/vendor/assets/javascripts/flatpickr/l10n/cs.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/da.js +20 -0
- data/vendor/assets/javascripts/flatpickr/l10n/de.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/es.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/et.js +27 -0
- data/vendor/assets/javascripts/flatpickr/l10n/fa.js +20 -0
- data/vendor/assets/javascripts/flatpickr/l10n/fi.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/fr.js +26 -0
- data/vendor/assets/javascripts/flatpickr/l10n/he.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/hi.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/hr.js +19 -0
- data/vendor/assets/javascripts/flatpickr/l10n/hu.js +27 -0
- data/vendor/assets/javascripts/flatpickr/l10n/id.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/it.js +27 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ja.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ko.js +20 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ms.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/my.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/nl.js +26 -0
- data/vendor/assets/javascripts/flatpickr/l10n/no.js +20 -0
- data/vendor/assets/javascripts/flatpickr/l10n/pa.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/pl.js +20 -0
- data/vendor/assets/javascripts/flatpickr/l10n/pt.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ro.js +23 -0
- data/vendor/assets/javascripts/flatpickr/l10n/ru.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/si.js +17 -0
- data/vendor/assets/javascripts/flatpickr/l10n/sq.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/sv.js +22 -0
- data/vendor/assets/javascripts/flatpickr/l10n/tr.js +18 -0
- data/vendor/assets/javascripts/flatpickr/l10n/uk.js +16 -0
- data/vendor/assets/javascripts/flatpickr/l10n/vn.js +19 -0
- data/vendor/assets/javascripts/flatpickr/l10n/zh.js +17 -0
- data/vendor/assets/stylesheets/flatpickr.airbnb.css +1 -0
- data/vendor/assets/stylesheets/flatpickr.base16_flat.css +1 -0
- data/vendor/assets/stylesheets/flatpickr.confetti.css +1 -246
- data/vendor/assets/stylesheets/flatpickr.css +1 -242
- data/vendor/assets/stylesheets/flatpickr.dark.css +1 -243
- data/vendor/assets/stylesheets/flatpickr.material_blue.css +1 -246
- data/vendor/assets/stylesheets/flatpickr.material_green.css +1 -246
- data/vendor/assets/stylesheets/flatpickr.material_orange.css +1 -246
- data/vendor/assets/stylesheets/flatpickr.material_red.css +1 -246
- metadata +42 -6
- data/vendor/assets/javascripts/flatpickr/core.js +0 -1034
- data/vendor/assets/javascripts/flatpickr/index.js +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8e2453da60064417141c7f5d3b61669c73d3027
|
4
|
+
data.tar.gz: 2eb0b4f5699ae4f0101532dca9b9e339969f9fbb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb607125c876602b4546b54db379081fac4a45ece9a38a545df67bd77d8288e9efd2740bc251bca9e3e6b5fd9189fcfc746cab1c04dae99c276adc3542020ee5
|
7
|
+
data.tar.gz: a2b1250deb6cabd1154a34974e442be9bb1866ad3eaf14a5d735dfeea1bdaf4e385bfd43c219eccba02b1a4495317fa6a6678067a2306ec556261ddb1be9a338
|
data/README.md
CHANGED
@@ -26,31 +26,30 @@ Or install it yourself as:
|
|
26
26
|
|
27
27
|
Add this line to app/assets/stylesheets/application.css
|
28
28
|
|
29
|
-
```
|
30
|
-
*= require
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
*= require "flatpickr.material_green.css"
|
42
|
-
OR
|
43
|
-
*= require "flatpickr.material_orange.css"
|
44
|
-
OR
|
45
|
-
*= require "flatpickr.material_red.css"
|
46
|
-
```
|
47
|
-
|
29
|
+
```css
|
30
|
+
*= require flatpickr
|
31
|
+
```
|
32
|
+
|
33
|
+
To use one of the themes, add:
|
34
|
+
|
35
|
+
```css
|
36
|
+
*= require flatpickr.material_red
|
37
|
+
```
|
38
|
+
|
39
|
+
Available themes are: airbnb, base16_flat, confetti, dark, material_blue, material_green, material_orange, material_red.
|
40
|
+
|
48
41
|
Add this line to app/assets/javascripts/application.js
|
49
42
|
|
50
|
-
```
|
43
|
+
```javascript
|
51
44
|
//= require flatpickr
|
52
45
|
```
|
53
46
|
|
47
|
+
If you need locales, add them like this:
|
48
|
+
|
49
|
+
```javascript
|
50
|
+
//= require flatpickr/l10n/es
|
51
|
+
```
|
52
|
+
|
54
53
|
## Using flatpickr-rails
|
55
54
|
|
56
55
|
|
@@ -66,11 +65,17 @@ Add this line to app/assets/javascripts/application.js
|
|
66
65
|
</script>
|
67
66
|
```
|
68
67
|
|
68
|
+
or with jQuery:
|
69
|
+
|
70
|
+
```javascript
|
71
|
+
$('#flatpickr-input').flatpickr();
|
72
|
+
```
|
73
|
+
|
69
74
|
Examples:
|
70
75
|
|
71
76
|
https://github.com/chmln/flatpickr
|
72
77
|
|
73
|
-
There are a lot of options you can pass to
|
78
|
+
There are a lot of options you can pass to flatpickr(). They are documented at [https://chmln.github.io/flatpickr/](https://chmln.github.io/flatpickr/)
|
74
79
|
|
75
80
|
## Development
|
76
81
|
|
@@ -0,0 +1,1506 @@
|
|
1
|
+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
2
|
+
|
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
|
+
|
5
|
+
/*! flatpickr v2.1.1, @license MIT */
|
6
|
+
function Flatpickr(element, config) {
|
7
|
+
var self = this;
|
8
|
+
|
9
|
+
function init() {
|
10
|
+
if (element._flatpickr) destroy(element._flatpickr);
|
11
|
+
|
12
|
+
element._flatpickr = self;
|
13
|
+
|
14
|
+
self.element = element;
|
15
|
+
self.instanceConfig = config || {};
|
16
|
+
|
17
|
+
setupFormats();
|
18
|
+
|
19
|
+
parseConfig();
|
20
|
+
setupLocale();
|
21
|
+
setupInputs();
|
22
|
+
setupDates();
|
23
|
+
|
24
|
+
setupHelperFunctions();
|
25
|
+
|
26
|
+
self.isOpen = self.config.inline;
|
27
|
+
self.changeMonth = changeMonth;
|
28
|
+
self.clear = clear;
|
29
|
+
self.close = close;
|
30
|
+
self.destroy = destroy;
|
31
|
+
self.formatDate = formatDate;
|
32
|
+
self.jumpToDate = jumpToDate;
|
33
|
+
self.open = open;
|
34
|
+
self.parseDate = parseDate;
|
35
|
+
self.redraw = redraw;
|
36
|
+
self.set = set;
|
37
|
+
self.setDate = setDate;
|
38
|
+
self.toggle = toggle;
|
39
|
+
|
40
|
+
self.isMobile = !self.config.disableMobile && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
41
|
+
|
42
|
+
if (!self.isMobile) build();
|
43
|
+
|
44
|
+
bind();
|
45
|
+
|
46
|
+
if (self.selectedDates.length) {
|
47
|
+
if (self.config.enableTime) setHoursFromDate();
|
48
|
+
updateValue();
|
49
|
+
}
|
50
|
+
|
51
|
+
triggerEvent("Ready");
|
52
|
+
}
|
53
|
+
|
54
|
+
function updateTime(e) {
|
55
|
+
if (self.config.noCalendar && !self.selectedDates.length)
|
56
|
+
// picking time only
|
57
|
+
self.selectedDates = [self.now];
|
58
|
+
|
59
|
+
timeWrapper(e);
|
60
|
+
|
61
|
+
if (!self.selectedDates.length) return;
|
62
|
+
|
63
|
+
setHoursFromInputs();
|
64
|
+
updateValue();
|
65
|
+
}
|
66
|
+
|
67
|
+
function setHoursFromInputs() {
|
68
|
+
if (!self.config.enableTime) return;
|
69
|
+
|
70
|
+
var hours = parseInt(self.hourElement.value, 10) || 0,
|
71
|
+
minutes = (60 + (parseInt(self.minuteElement.value, 10) || 0)) % 60,
|
72
|
+
seconds = self.config.enableSeconds ? (60 + parseInt(self.secondElement.value, 10) || 0) % 60 : 0;
|
73
|
+
|
74
|
+
if (self.amPM) hours = hours % 12 + 12 * (self.amPM.innerHTML === "PM");
|
75
|
+
|
76
|
+
setHours(hours, minutes, seconds);
|
77
|
+
}
|
78
|
+
|
79
|
+
function setHoursFromDate(dateObj) {
|
80
|
+
setHours((dateObj || latestSelectedDateObj()).getHours(), (dateObj || latestSelectedDateObj()).getMinutes(), (dateObj || latestSelectedDateObj()).getSeconds());
|
81
|
+
}
|
82
|
+
|
83
|
+
function setHours(hours, minutes, seconds) {
|
84
|
+
if (self.selectedDates.length) self.selectedDates[self.selectedDates.length - 1].setHours(hours % 24, minutes, seconds || 0, 0);
|
85
|
+
|
86
|
+
if (!self.config.enableTime) return;
|
87
|
+
|
88
|
+
self.hourElement.value = self.pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * (hours % 12 === 0) : hours);
|
89
|
+
|
90
|
+
self.minuteElement.value = self.pad(minutes);
|
91
|
+
|
92
|
+
if (!self.config.time_24hr && self.selectedDates.length) self.amPM.textContent = latestSelectedDateObj().getHours() >= 12 ? "PM" : "AM";
|
93
|
+
|
94
|
+
if (self.config.enableSeconds) self.secondElement.value = self.pad(seconds);
|
95
|
+
}
|
96
|
+
|
97
|
+
function bind() {
|
98
|
+
if (self.config.wrap) {
|
99
|
+
["open", "close", "toggle", "clear"].forEach(function (el) {
|
100
|
+
try {
|
101
|
+
self.element.querySelector("[data-" + el + "]").addEventListener("click", self[el]);
|
102
|
+
} catch (e) {
|
103
|
+
//
|
104
|
+
}
|
105
|
+
});
|
106
|
+
}
|
107
|
+
|
108
|
+
if ("createEvent" in document) {
|
109
|
+
self.changeEvent = document.createEvent("HTMLEvents");
|
110
|
+
self.changeEvent.initEvent("change", false, true);
|
111
|
+
}
|
112
|
+
|
113
|
+
if (self.isMobile) return setupMobile();
|
114
|
+
|
115
|
+
self.debouncedResize = debounce(onResize, 100);
|
116
|
+
self.triggerChange = function () {
|
117
|
+
return triggerEvent("Change");
|
118
|
+
};
|
119
|
+
self.debouncedChange = debounce(self.triggerChange, 1000);
|
120
|
+
|
121
|
+
if (self.config.mode === "range") self.days.addEventListener("mouseover", onMouseOver);
|
122
|
+
|
123
|
+
document.addEventListener("keydown", onKeyDown);
|
124
|
+
window.addEventListener("resize", self.debouncedResize);
|
125
|
+
|
126
|
+
document.addEventListener("click", documentClick);
|
127
|
+
document.addEventListener("blur", documentClick);
|
128
|
+
|
129
|
+
if (self.config.clickOpens) (self.altInput || self.input).addEventListener("focus", open);
|
130
|
+
|
131
|
+
if (!self.config.noCalendar) {
|
132
|
+
self.prevMonthNav.addEventListener("click", function () {
|
133
|
+
return changeMonth(-1);
|
134
|
+
});
|
135
|
+
self.nextMonthNav.addEventListener("click", function () {
|
136
|
+
return changeMonth(1);
|
137
|
+
});
|
138
|
+
|
139
|
+
self.currentYearElement.addEventListener("wheel", function (e) {
|
140
|
+
return debounce(yearScroll(e), 50);
|
141
|
+
});
|
142
|
+
self.currentYearElement.addEventListener("focus", function () {
|
143
|
+
self.currentYearElement.select();
|
144
|
+
});
|
145
|
+
|
146
|
+
self.currentYearElement.addEventListener("input", function (event) {
|
147
|
+
if (event.target.value.length === 4) {
|
148
|
+
self.currentYearElement.blur();
|
149
|
+
handleYearChange(event.target.value);
|
150
|
+
event.target.value = self.currentYear;
|
151
|
+
}
|
152
|
+
});
|
153
|
+
|
154
|
+
self.days.addEventListener("click", selectDate);
|
155
|
+
}
|
156
|
+
|
157
|
+
if (self.config.enableTime) {
|
158
|
+
self.timeContainer.addEventListener("wheel", function (e) {
|
159
|
+
return debounce(updateTime(e), 5);
|
160
|
+
});
|
161
|
+
self.timeContainer.addEventListener("input", updateTime);
|
162
|
+
|
163
|
+
self.timeContainer.addEventListener("wheel", self.debouncedChange);
|
164
|
+
self.timeContainer.addEventListener("input", self.triggerChange);
|
165
|
+
|
166
|
+
self.hourElement.addEventListener("focus", function () {
|
167
|
+
self.hourElement.select();
|
168
|
+
});
|
169
|
+
self.minuteElement.addEventListener("focus", function () {
|
170
|
+
self.minuteElement.select();
|
171
|
+
});
|
172
|
+
|
173
|
+
if (self.secondElement) {
|
174
|
+
self.secondElement.addEventListener("focus", function () {
|
175
|
+
self.secondElement.select();
|
176
|
+
});
|
177
|
+
}
|
178
|
+
|
179
|
+
if (self.amPM) {
|
180
|
+
self.amPM.addEventListener("click", function (e) {
|
181
|
+
updateTime(e);
|
182
|
+
self.triggerChange(e);
|
183
|
+
});
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
function jumpToDate(jumpDate) {
|
189
|
+
jumpDate = jumpDate ? parseDate(jumpDate) : latestSelectedDateObj() || (self.config.minDate > self.now ? self.config.minDate : self.now);
|
190
|
+
|
191
|
+
try {
|
192
|
+
self.currentYear = jumpDate.getFullYear();
|
193
|
+
self.currentMonth = jumpDate.getMonth();
|
194
|
+
} catch (e) {
|
195
|
+
console.error(e.stack);
|
196
|
+
console.warn("Invalid date supplied: " + jumpDate);
|
197
|
+
}
|
198
|
+
|
199
|
+
self.redraw();
|
200
|
+
}
|
201
|
+
|
202
|
+
function build() {
|
203
|
+
var fragment = document.createDocumentFragment();
|
204
|
+
self.calendarContainer = createElement("div", "flatpickr-calendar");
|
205
|
+
self.numInputType = navigator.userAgent.indexOf("MSIE 9.0") > 0 ? "text" : "number";
|
206
|
+
|
207
|
+
if (!self.config.noCalendar) {
|
208
|
+
fragment.appendChild(buildMonthNav());
|
209
|
+
self.innerContainer = createElement("div", "flatpickr-innerContainer");
|
210
|
+
|
211
|
+
if (self.config.weekNumbers) self.innerContainer.appendChild(buildWeeks());
|
212
|
+
|
213
|
+
self.rContainer = createElement("div", "flatpickr-rContainer");
|
214
|
+
self.rContainer.appendChild(buildWeekdays());
|
215
|
+
self.rContainer.appendChild(buildDays());
|
216
|
+
self.innerContainer.appendChild(self.rContainer);
|
217
|
+
fragment.appendChild(self.innerContainer);
|
218
|
+
}
|
219
|
+
|
220
|
+
if (self.config.enableTime) fragment.appendChild(buildTime());
|
221
|
+
|
222
|
+
self.calendarContainer.appendChild(fragment);
|
223
|
+
|
224
|
+
if (self.config.inline || self.config.static) {
|
225
|
+
self.calendarContainer.classList.add(self.config.inline ? "inline" : "static");
|
226
|
+
positionCalendar();
|
227
|
+
|
228
|
+
if (self.config.appendTo && self.config.appendTo.nodeType) self.config.appendTo.appendChild(self.calendarContainer);else {
|
229
|
+
self.element.parentNode.insertBefore(self.calendarContainer, (self.altInput || self.input).nextSibling);
|
230
|
+
}
|
231
|
+
} else document.body.appendChild(self.calendarContainer);
|
232
|
+
}
|
233
|
+
|
234
|
+
function buildDays() {
|
235
|
+
if (!self.days) {
|
236
|
+
self.days = createElement("div", "flatpickr-days");
|
237
|
+
self.days.tabIndex = -1;
|
238
|
+
}
|
239
|
+
|
240
|
+
self.firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;
|
241
|
+
|
242
|
+
self.prevMonthDays = self.utils.getDaysinMonth((self.currentMonth - 1 + 12) % 12);
|
243
|
+
|
244
|
+
var daysInMonth = self.utils.getDaysinMonth(),
|
245
|
+
days = document.createDocumentFragment();
|
246
|
+
|
247
|
+
var dayNumber = self.prevMonthDays + 1 - self.firstOfMonth,
|
248
|
+
currentDate = void 0,
|
249
|
+
dateIsDisabled = void 0;
|
250
|
+
|
251
|
+
if (self.config.weekNumbers) self.weekNumbers.innerHTML = "";
|
252
|
+
|
253
|
+
if (self.config.mode === "range") {
|
254
|
+
var dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
|
255
|
+
self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
|
256
|
+
self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - self.firstOfMonth) % daysInMonth);
|
257
|
+
}
|
258
|
+
|
259
|
+
self.days.innerHTML = "";
|
260
|
+
|
261
|
+
// prepend days from the ending of previous month
|
262
|
+
for (var i = 0; dayNumber <= self.prevMonthDays; i++, dayNumber++) {
|
263
|
+
var curDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber, 0, 0, 0, 0, 0),
|
264
|
+
dateIsEnabled = isEnabled(curDate),
|
265
|
+
dayElement = createElement("span", "flatpickr-day prevMonthDay" + (!dateIsEnabled ? " disabled" : "") + (isDateInRange(curDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (curDate < self.minRangeDate || curDate > self.maxRangeDate) ? " notAllowed" : "") + (isDateSelected(curDate) !== false ? " selected" : ""), dayNumber);
|
266
|
+
|
267
|
+
dayElement.dateObj = curDate;
|
268
|
+
|
269
|
+
if (dateIsEnabled) dayElement.tabIndex = 0;else if (self.selectedDates[0] && curDate > self.minRangeDate && curDate < self.selectedDates[0]) self.minRangeDate = curDate;else if (self.selectedDates[0] && curDate < self.maxRangeDate && curDate > self.selectedDates[0]) self.maxRangeDate = curDate;
|
270
|
+
|
271
|
+
triggerEvent("DayCreate", dayElement);
|
272
|
+
days.appendChild(dayElement);
|
273
|
+
}
|
274
|
+
|
275
|
+
// Start at 1 since there is no 0th day
|
276
|
+
for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++) {
|
277
|
+
currentDate = new Date(self.currentYear, self.currentMonth, dayNumber, 0, 0, 0, 0, 0);
|
278
|
+
|
279
|
+
if (self.config.weekNumbers && dayNumber % 7 === 1) {
|
280
|
+
self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(currentDate) + "</span>");
|
281
|
+
}
|
282
|
+
|
283
|
+
dateIsDisabled = !isEnabled(currentDate);
|
284
|
+
|
285
|
+
var _dayElement = createElement("span", dateIsDisabled ? "flatpickr-day disabled" : "flatpickr-day" + (isDateInRange(currentDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (currentDate < self.minRangeDate || currentDate > self.maxRangeDate) ? " notAllowed" : ""), dayNumber);
|
286
|
+
|
287
|
+
_dayElement.dateObj = currentDate;
|
288
|
+
|
289
|
+
if (equalDates(currentDate, self.now)) _dayElement.classList.add("today");
|
290
|
+
|
291
|
+
if (!dateIsDisabled) {
|
292
|
+
_dayElement.tabIndex = 0;
|
293
|
+
|
294
|
+
if (isDateSelected(currentDate)) {
|
295
|
+
_dayElement.classList.add("selected");
|
296
|
+
self.selectedDateElem = _dayElement;
|
297
|
+
|
298
|
+
if (self.config.mode === "range") {
|
299
|
+
_dayElement.className += equalDates(currentDate, self.selectedDates[0]) ? " startRange" : self.selectedDates.length > 1 ? " endRange" : "";
|
300
|
+
}
|
301
|
+
}
|
302
|
+
} else if (self.selectedDates[0] && currentDate > self.minRangeDate && currentDate < self.selectedDates[0]) self.minRangeDate = currentDate;else if (self.selectedDates[0] && currentDate < self.maxRangeDate && currentDate > self.selectedDates[0]) self.maxRangeDate = currentDate;
|
303
|
+
|
304
|
+
triggerEvent("DayCreate", _dayElement);
|
305
|
+
days.appendChild(_dayElement);
|
306
|
+
}
|
307
|
+
|
308
|
+
// append days from the next month
|
309
|
+
for (var dayNum = daysInMonth + 1; dayNum <= 42 - self.firstOfMonth; dayNum++) {
|
310
|
+
var _curDate = new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth, 0, 0, 0, 0, 0),
|
311
|
+
_dateIsEnabled = isEnabled(_curDate),
|
312
|
+
_dayElement2 = createElement("span", "flatpickr-day nextMonthDay" + (!_dateIsEnabled ? " disabled" : "") + (isDateInRange(_curDate) ? " inRange" : "") + (self.selectedDates.length === 1 && (_curDate < self.minRangeDate || _curDate > self.maxRangeDate) ? " notAllowed" : "") + (isDateSelected(_curDate) !== false ? " selected" : ""), dayNum % daysInMonth);
|
313
|
+
|
314
|
+
_dayElement2.dateObj = _curDate;
|
315
|
+
|
316
|
+
if (self.config.weekNumbers && dayNum % 7 === 1) {
|
317
|
+
self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(_curDate) + "</span>");
|
318
|
+
}
|
319
|
+
|
320
|
+
if (_dateIsEnabled) _dayElement2.tabIndex = 0;else if (self.selectedDates[0] && _curDate > self.minRangeDate && _curDate < self.selectedDates[0]) self.minRangeDate = _curDate;else if (self.selectedDates[0] && _curDate < self.maxRangeDate && _curDate > self.selectedDates[0]) self.maxRangeDate = _curDate;
|
321
|
+
|
322
|
+
triggerEvent("DayCreate", _dayElement2);
|
323
|
+
days.appendChild(_dayElement2);
|
324
|
+
}
|
325
|
+
self.days.appendChild(days);
|
326
|
+
return self.days;
|
327
|
+
}
|
328
|
+
|
329
|
+
function buildMonthNav() {
|
330
|
+
var monthNavFragment = document.createDocumentFragment();
|
331
|
+
self.monthNav = createElement("div", "flatpickr-month");
|
332
|
+
|
333
|
+
self.prevMonthNav = createElement("span", "flatpickr-prev-month");
|
334
|
+
self.prevMonthNav.innerHTML = self.config.prevArrow;
|
335
|
+
|
336
|
+
self.currentMonthElement = createElement("span", "cur-month");
|
337
|
+
|
338
|
+
self.currentYearElement = createElement("input", "cur-year");
|
339
|
+
self.currentYearElement.type = self.numInputType;
|
340
|
+
self.currentYearElement.title = self.l10n.scrollTitle;
|
341
|
+
|
342
|
+
if (self.config.minDate) self.currentYearElement.min = self.config.minDate.getFullYear();
|
343
|
+
|
344
|
+
if (self.config.maxDate) {
|
345
|
+
self.currentYearElement.max = self.config.maxDate.getFullYear();
|
346
|
+
|
347
|
+
self.currentYearElement.disabled = self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();
|
348
|
+
}
|
349
|
+
|
350
|
+
self.nextMonthNav = createElement("span", "flatpickr-next-month");
|
351
|
+
self.nextMonthNav.innerHTML = self.config.nextArrow;
|
352
|
+
|
353
|
+
self.navigationCurrentMonth = createElement("span", "flatpickr-current-month");
|
354
|
+
self.navigationCurrentMonth.appendChild(self.currentMonthElement);
|
355
|
+
self.navigationCurrentMonth.appendChild(self.currentYearElement);
|
356
|
+
|
357
|
+
monthNavFragment.appendChild(self.prevMonthNav);
|
358
|
+
monthNavFragment.appendChild(self.navigationCurrentMonth);
|
359
|
+
monthNavFragment.appendChild(self.nextMonthNav);
|
360
|
+
self.monthNav.appendChild(monthNavFragment);
|
361
|
+
|
362
|
+
updateNavigationCurrentMonth();
|
363
|
+
|
364
|
+
return self.monthNav;
|
365
|
+
}
|
366
|
+
|
367
|
+
function buildTime() {
|
368
|
+
self.calendarContainer.classList.add("hasTime");
|
369
|
+
self.timeContainer = createElement("div", "flatpickr-time");
|
370
|
+
self.timeContainer.tabIndex = -1;
|
371
|
+
var separator = createElement("span", "flatpickr-time-separator", ":");
|
372
|
+
|
373
|
+
self.hourElement = createElement("input", "flatpickr-hour");
|
374
|
+
self.minuteElement = createElement("input", "flatpickr-minute");
|
375
|
+
|
376
|
+
self.hourElement.tabIndex = self.minuteElement.tabIndex = 0;
|
377
|
+
self.hourElement.type = self.minuteElement.type = self.numInputType;
|
378
|
+
self.hourElement.pattern = self.minuteElement.pattern = "\d*";
|
379
|
+
|
380
|
+
self.hourElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getHours() : self.config.defaultHour);
|
381
|
+
|
382
|
+
self.minuteElement.value = self.pad(latestSelectedDateObj() ? latestSelectedDateObj().getMinutes() : self.config.defaultMinute);
|
383
|
+
|
384
|
+
self.hourElement.step = self.config.hourIncrement;
|
385
|
+
self.minuteElement.step = self.config.minuteIncrement;
|
386
|
+
|
387
|
+
self.hourElement.min = -(self.config.time_24hr ? 1 : 0);
|
388
|
+
self.hourElement.max = self.config.time_24hr ? 24 : 13;
|
389
|
+
|
390
|
+
self.minuteElement.min = -self.minuteElement.step;
|
391
|
+
self.minuteElement.max = 60;
|
392
|
+
|
393
|
+
self.hourElement.title = self.minuteElement.title = self.l10n.scrollTitle;
|
394
|
+
|
395
|
+
self.timeContainer.appendChild(self.hourElement);
|
396
|
+
self.timeContainer.appendChild(separator);
|
397
|
+
self.timeContainer.appendChild(self.minuteElement);
|
398
|
+
|
399
|
+
if (self.config.enableSeconds) {
|
400
|
+
self.timeContainer.classList.add("has-seconds");
|
401
|
+
|
402
|
+
self.secondElement = createElement("input", "flatpickr-second");
|
403
|
+
self.secondElement.type = self.numInputType;
|
404
|
+
self.secondElement.pattern = self.hourElement.pattern;
|
405
|
+
self.secondElement.value = latestSelectedDateObj() ? self.pad(latestSelectedDateObj().getSeconds()) : "00";
|
406
|
+
|
407
|
+
self.secondElement.step = self.minuteElement.step;
|
408
|
+
self.secondElement.min = self.minuteElement.min;
|
409
|
+
self.secondElement.max = self.minuteElement.max;
|
410
|
+
|
411
|
+
self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":"));
|
412
|
+
self.timeContainer.appendChild(self.secondElement);
|
413
|
+
}
|
414
|
+
|
415
|
+
if (!self.config.time_24hr) {
|
416
|
+
// add self.amPM if appropriate
|
417
|
+
self.amPM = createElement("span", "flatpickr-am-pm", ["AM", "PM"][self.hourElement.value > 11 | 0]);
|
418
|
+
self.amPM.title = self.l10n.toggleTitle;
|
419
|
+
self.amPM.tabIndex = 0;
|
420
|
+
self.timeContainer.appendChild(self.amPM);
|
421
|
+
}
|
422
|
+
|
423
|
+
return self.timeContainer;
|
424
|
+
}
|
425
|
+
|
426
|
+
function buildWeekdays() {
|
427
|
+
if (!self.weekdayContainer) self.weekdayContainer = createElement("div", "flatpickr-weekdays");
|
428
|
+
|
429
|
+
var firstDayOfWeek = self.l10n.firstDayOfWeek;
|
430
|
+
var weekdays = self.l10n.weekdays.shorthand.slice();
|
431
|
+
|
432
|
+
if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {
|
433
|
+
weekdays = [].concat(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));
|
434
|
+
}
|
435
|
+
|
436
|
+
self.weekdayContainer.innerHTML = "\n\t\t<span class=flatpickr-weekday>\n\t\t\t" + weekdays.join("</span><span class=flatpickr-weekday>") + "\n\t\t</span>\n\t\t";
|
437
|
+
|
438
|
+
return self.weekdayContainer;
|
439
|
+
}
|
440
|
+
|
441
|
+
function buildWeeks() {
|
442
|
+
self.calendarContainer.classList.add("hasWeeks");
|
443
|
+
self.weekWrapper = createElement("div", "flatpickr-weekwrapper");
|
444
|
+
self.weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
|
445
|
+
self.weekNumbers = createElement("div", "flatpickr-weeks");
|
446
|
+
self.weekWrapper.appendChild(self.weekNumbers);
|
447
|
+
return self.weekWrapper;
|
448
|
+
}
|
449
|
+
|
450
|
+
function changeMonth(value, is_offset) {
|
451
|
+
self.currentMonth = typeof is_offset === "undefined" || is_offset ? self.currentMonth + value : value;
|
452
|
+
|
453
|
+
handleYearChange();
|
454
|
+
updateNavigationCurrentMonth();
|
455
|
+
buildDays();
|
456
|
+
|
457
|
+
if (!self.config.noCalendar) self.days.focus();
|
458
|
+
|
459
|
+
triggerEvent("MonthChange");
|
460
|
+
}
|
461
|
+
|
462
|
+
function clear() {
|
463
|
+
self.input.value = "";
|
464
|
+
|
465
|
+
if (self.altInput) self.altInput.value = "";
|
466
|
+
|
467
|
+
if (self.mobileInput) self.mobileInput.value = "";
|
468
|
+
|
469
|
+
self.selectedDates = [];
|
470
|
+
|
471
|
+
triggerEvent("Change");
|
472
|
+
}
|
473
|
+
|
474
|
+
function close() {
|
475
|
+
self.isOpen = false;
|
476
|
+
self.calendarContainer.classList.remove("open");
|
477
|
+
(self.altInput || self.input).classList.remove("active");
|
478
|
+
|
479
|
+
triggerEvent("Close");
|
480
|
+
}
|
481
|
+
|
482
|
+
function destroy(instance) {
|
483
|
+
instance = instance || self;
|
484
|
+
instance.clear();
|
485
|
+
|
486
|
+
document.removeEventListener("keydown", onKeyDown);
|
487
|
+
window.removeEventListener("resize", instance.debouncedResize);
|
488
|
+
|
489
|
+
document.removeEventListener("click", documentClick);
|
490
|
+
document.removeEventListener("blur", documentClick);
|
491
|
+
|
492
|
+
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);
|
493
|
+
|
494
|
+
if (instance.altInput) {
|
495
|
+
instance.input.type = "text";
|
496
|
+
if (instance.altInput.parentNode) instance.altInput.parentNode.removeChild(instance.altInput);
|
497
|
+
}
|
498
|
+
|
499
|
+
instance.input.classList.remove("flatpickr-input");
|
500
|
+
instance.input.removeEventListener("focus", open);
|
501
|
+
instance.input.removeAttribute("readonly");
|
502
|
+
}
|
503
|
+
|
504
|
+
function isCalendarElem(elem) {
|
505
|
+
var e = elem;
|
506
|
+
while (e) {
|
507
|
+
if (/flatpickr-day|flatpickr-calendar/.test(e.className)) return true;
|
508
|
+
e = e.parentNode;
|
509
|
+
}
|
510
|
+
|
511
|
+
return false;
|
512
|
+
}
|
513
|
+
|
514
|
+
function documentClick(e) {
|
515
|
+
var isInput = self.element.contains(e.target) || e.target === self.input || e.target === self.altInput;
|
516
|
+
|
517
|
+
if (self.isOpen && !isCalendarElem(e.target) && !isInput) {
|
518
|
+
self.close();
|
519
|
+
|
520
|
+
if (self.config.mode === "range" && self.selectedDates.length === 1) {
|
521
|
+
self.clear();
|
522
|
+
self.redraw();
|
523
|
+
}
|
524
|
+
}
|
525
|
+
}
|
526
|
+
|
527
|
+
function formatDate(frmt, dateObj) {
|
528
|
+
var chars = frmt.split("");
|
529
|
+
return chars.map(function (c, i) {
|
530
|
+
return self.formats[c] && chars[i - 1] !== "\\" ? self.formats[c](dateObj) : c !== "\\" ? c : "";
|
531
|
+
}).join("");
|
532
|
+
}
|
533
|
+
|
534
|
+
function handleYearChange(newYear) {
|
535
|
+
if (self.currentMonth < 0 || self.currentMonth > 11) {
|
536
|
+
self.currentYear += self.currentMonth % 11;
|
537
|
+
self.currentMonth = (self.currentMonth + 12) % 12;
|
538
|
+
triggerEvent("YearChange");
|
539
|
+
} else if (newYear && (!self.currentYearElement.min || newYear >= self.currentYearElement.min) && (!self.currentYearElement.max || newYear <= self.currentYearElement.max)) {
|
540
|
+
self.currentYear = parseInt(newYear, 10) || self.currentYear;
|
541
|
+
|
542
|
+
if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
|
543
|
+
|
544
|
+
self.redraw();
|
545
|
+
triggerEvent("YearChange");
|
546
|
+
}
|
547
|
+
}
|
548
|
+
|
549
|
+
function isEnabled(dateToCheck) {
|
550
|
+
if (self.config.minDate && dateToCheck < self.config.minDate || self.config.maxDate && dateToCheck > self.config.maxDate) return false;
|
551
|
+
|
552
|
+
if (!self.config.enable.length && !self.config.disable.length) return true;
|
553
|
+
|
554
|
+
dateToCheck = parseDate(dateToCheck, true); // timeless
|
555
|
+
|
556
|
+
var bool = self.config.enable.length > 0,
|
557
|
+
array = bool ? self.config.enable : self.config.disable;
|
558
|
+
|
559
|
+
for (var i = 0, d; i < array.length; i++) {
|
560
|
+
d = array[i];
|
561
|
+
|
562
|
+
if (d instanceof Function && d(dateToCheck)) // disabled by function
|
563
|
+
return bool;else if ((d instanceof Date || typeof d === "string") && parseDate(d, true).getTime() === dateToCheck.getTime())
|
564
|
+
// disabled by date string
|
565
|
+
return bool;else if ( // disabled by range
|
566
|
+
(typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= parseDate(d.from) && dateToCheck <= parseDate(d.to)) return bool;
|
567
|
+
}
|
568
|
+
|
569
|
+
return !bool;
|
570
|
+
}
|
571
|
+
|
572
|
+
function onKeyDown(e) {
|
573
|
+
if (self.isOpen) {
|
574
|
+
switch (e.which) {
|
575
|
+
case 13:
|
576
|
+
if (self.timeContainer && self.timeContainer.contains(e.target)) updateValue();else selectDate(e);
|
577
|
+
|
578
|
+
break;
|
579
|
+
|
580
|
+
case 27:
|
581
|
+
// escape
|
582
|
+
self.clear();
|
583
|
+
self.redraw();
|
584
|
+
self.close();
|
585
|
+
break;
|
586
|
+
|
587
|
+
case 37:
|
588
|
+
if (e.target !== self.input & e.target !== self.altInput) changeMonth(-1);
|
589
|
+
break;
|
590
|
+
|
591
|
+
case 38:
|
592
|
+
e.preventDefault();
|
593
|
+
|
594
|
+
if (self.timeContainer && self.timeContainer.contains(e.target)) updateTime(e);else {
|
595
|
+
self.currentYear++;
|
596
|
+
self.redraw();
|
597
|
+
}
|
598
|
+
|
599
|
+
break;
|
600
|
+
|
601
|
+
case 39:
|
602
|
+
if (e.target !== self.input & e.target !== self.altInput) changeMonth(1);
|
603
|
+
break;
|
604
|
+
|
605
|
+
case 40:
|
606
|
+
e.preventDefault();
|
607
|
+
if (self.timeContainer && self.timeContainer.contains(e.target)) updateTime(e);else {
|
608
|
+
self.currentYear--;
|
609
|
+
self.redraw();
|
610
|
+
}
|
611
|
+
|
612
|
+
break;
|
613
|
+
|
614
|
+
default:
|
615
|
+
break;
|
616
|
+
}
|
617
|
+
}
|
618
|
+
}
|
619
|
+
|
620
|
+
function onMouseOver(e) {
|
621
|
+
if (self.selectedDates.length !== 1 || !e.target.classList.contains("flatpickr-day")) return;
|
622
|
+
|
623
|
+
var hoverDate = e.target.dateObj,
|
624
|
+
rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
|
625
|
+
rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
|
626
|
+
containsDisabled = false;
|
627
|
+
|
628
|
+
for (var t = rangeStartDate; t < rangeEndDate; t += self.utils.duration.DAY) {
|
629
|
+
if (!isEnabled(new Date(t))) {
|
630
|
+
containsDisabled = true;
|
631
|
+
break;
|
632
|
+
}
|
633
|
+
}
|
634
|
+
|
635
|
+
for (var timestamp = self.days.childNodes[0].dateObj.getTime(), i = 0; i < 42; i++, timestamp += self.utils.duration.DAY) {
|
636
|
+
if (timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime()) {
|
637
|
+
self.days.childNodes[i].classList.add("notAllowed");
|
638
|
+
self.days.childNodes[i].classList.remove("inRange");
|
639
|
+
} else if (!containsDisabled && timestamp > Math.max(self.minRangeDate.getTime(), rangeStartDate) && timestamp < Math.min(self.maxRangeDate.getTime(), rangeEndDate)) self.days.childNodes[i].classList.add("inRange");else self.days.childNodes[i].classList.remove("inRange");
|
640
|
+
}
|
641
|
+
}
|
642
|
+
|
643
|
+
function onResize() {
|
644
|
+
if (self.isOpen && !self.config.inline && !self.config.static) positionCalendar();
|
645
|
+
}
|
646
|
+
|
647
|
+
function open(e) {
|
648
|
+
if (self.isMobile) {
|
649
|
+
e.preventDefault();
|
650
|
+
e.target.blur();
|
651
|
+
|
652
|
+
setTimeout(function () {
|
653
|
+
self.mobileInput.click();
|
654
|
+
}, 0);
|
655
|
+
|
656
|
+
triggerEvent("Open");
|
657
|
+
return;
|
658
|
+
} else if (self.isOpen || (self.altInput || self.input).disabled || self.config.inline) return;
|
659
|
+
|
660
|
+
self.calendarContainer.classList.add("open");
|
661
|
+
|
662
|
+
if (!self.config.static) positionCalendar();
|
663
|
+
|
664
|
+
self.isOpen = true;
|
665
|
+
|
666
|
+
if (!self.config.allowInput) {
|
667
|
+
(self.altInput || self.input).blur();
|
668
|
+
(self.config.noCalendar ? self.timeContainer : self.selectedDateElem ? self.selectedDateElem : self.days).focus();
|
669
|
+
}
|
670
|
+
|
671
|
+
(self.altInput || self.input).classList.add("active");
|
672
|
+
triggerEvent("Open");
|
673
|
+
}
|
674
|
+
|
675
|
+
function parseConfig() {
|
676
|
+
var boolOpts = ["utc", "wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
|
677
|
+
self.config = Object.create(Flatpickr.defaultConfig);
|
678
|
+
var userConfig = _extends({}, self.instanceConfig, self.element.dataset || {});
|
679
|
+
|
680
|
+
Object.defineProperty(self.config, "minDate", {
|
681
|
+
get: function get() {
|
682
|
+
return this._minDate;
|
683
|
+
},
|
684
|
+
set: function set(date) {
|
685
|
+
this._minDate = parseDate(date, true);
|
686
|
+
if (self.days) redraw();
|
687
|
+
|
688
|
+
if (!self.currentYearElement) return;
|
689
|
+
|
690
|
+
if (date && this._minDate instanceof Date) self.currentYearElement.min = this._minDate.getFullYear();else {
|
691
|
+
self.currentYearElement.removeAttribute("min");
|
692
|
+
}
|
693
|
+
|
694
|
+
self.currentYearElement.disabled = this._maxDate && this._minDate && this._maxDate.getFullYear() === this._minDate.getFullYear();
|
695
|
+
}
|
696
|
+
});
|
697
|
+
|
698
|
+
Object.defineProperty(self.config, "maxDate", {
|
699
|
+
get: function get() {
|
700
|
+
return this._maxDate;
|
701
|
+
},
|
702
|
+
set: function set(date) {
|
703
|
+
this._maxDate = parseDate(date);
|
704
|
+
this._maxDate instanceof Date && this._maxDate.setHours(23, 59, 59, 999);
|
705
|
+
if (self.days) redraw();
|
706
|
+
|
707
|
+
if (!self.currentYearElement) return;
|
708
|
+
|
709
|
+
if (date && this._maxDate instanceof Date) self.currentYearElement.max = this._maxDate.getFullYear();else self.currentYearElement.removeAttribute("max");
|
710
|
+
|
711
|
+
self.currentYearElement.disabled = this._maxDate && this._minDate && this._maxDate.getFullYear() === this._minDate.getFullYear();
|
712
|
+
}
|
713
|
+
});
|
714
|
+
|
715
|
+
_extends(self.config, userConfig);
|
716
|
+
|
717
|
+
for (var i = 0; i < boolOpts.length; i++) {
|
718
|
+
self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === "true";
|
719
|
+
}if (!userConfig.dateFormat && userConfig.enableTime) {
|
720
|
+
self.config.dateFormat = self.config.noCalendar ? "H:i" + (self.config.enableSeconds ? ":S" : "") : Flatpickr.defaultConfig.dateFormat + " H:i" + (self.config.enableSeconds ? ":S" : "");
|
721
|
+
}
|
722
|
+
|
723
|
+
if (userConfig.altInput && userConfig.enableTime && !userConfig.altFormat) {
|
724
|
+
self.config.altFormat = self.config.noCalendar ? "h:i" + (self.config.enableSeconds ? ":S K" : " K") : Flatpickr.defaultConfig.altFormat + (" h:i" + (self.config.enableSeconds ? ":S" : "") + " K");
|
725
|
+
}
|
726
|
+
}
|
727
|
+
|
728
|
+
function setupLocale() {
|
729
|
+
if (_typeof(self.config.locale) !== "object" && typeof Flatpickr.l10ns[self.config.locale] === "undefined") console.warn("flatpickr: invalid locale " + self.config.locale);
|
730
|
+
|
731
|
+
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] || {} : {});
|
732
|
+
}
|
733
|
+
|
734
|
+
function parseDate(date) {
|
735
|
+
var timeless = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
736
|
+
|
737
|
+
if (!date) return null;
|
738
|
+
|
739
|
+
var dateTimeRegex = /(\d+)/g,
|
740
|
+
timeRegex = /^(\d{1,2})[:\s](\d\d)?[:\s]?(\d\d)?\s?(a|p)?/i,
|
741
|
+
timestamp = /^(\d+)$/g,
|
742
|
+
date_orig = date;
|
743
|
+
|
744
|
+
if (date.toFixed) // timestamp
|
745
|
+
date = new Date(date);else if (typeof date === "string") {
|
746
|
+
date = date.trim();
|
747
|
+
|
748
|
+
if (date === "today") {
|
749
|
+
date = new Date();
|
750
|
+
timeless = true;
|
751
|
+
} else if (self.config.parseDate) date = self.config.parseDate(date);else if (timeRegex.test(date)) {
|
752
|
+
// time picker
|
753
|
+
var m = date.match(timeRegex),
|
754
|
+
hours = !m[4] ? m[1] // military time, no conversion needed
|
755
|
+
: m[1] % 12 + (m[4].toLowerCase() === "p" ? 12 : 0); // am/pm
|
756
|
+
|
757
|
+
date = new Date();
|
758
|
+
date.setHours(hours, m[2] || 0, m[3] || 0);
|
759
|
+
} else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
|
760
|
+
date = new Date(date);else if (dateTimeRegex.test(date) && /^[0-9]/.test(date)) {
|
761
|
+
var d = date.match(dateTimeRegex);
|
762
|
+
date = new Date(d[0] + "/" + (d[1] || 1) + "/" + (d[2] || 1) + " " + (d[3] || 0) + ":" + (d[4] || 0) + ":" + (d[5] || 0));
|
763
|
+
} else // fallback
|
764
|
+
date = new Date(date);
|
765
|
+
}
|
766
|
+
|
767
|
+
if (!(date instanceof Date)) {
|
768
|
+
console.warn("flatpickr: invalid date " + date_orig);
|
769
|
+
console.info(self.element);
|
770
|
+
return null;
|
771
|
+
}
|
772
|
+
|
773
|
+
if (self.config.utc && !date.fp_isUTC) date = date.fp_toUTC();
|
774
|
+
|
775
|
+
if (timeless) date.setHours(0, 0, 0, 0);
|
776
|
+
|
777
|
+
return date;
|
778
|
+
}
|
779
|
+
|
780
|
+
function positionCalendar() {
|
781
|
+
var calendarHeight = self.calendarContainer.offsetHeight,
|
782
|
+
input = self.altInput || self.input,
|
783
|
+
inputBounds = input.getBoundingClientRect(),
|
784
|
+
distanceFromBottom = window.innerHeight - inputBounds.bottom + input.offsetHeight;
|
785
|
+
|
786
|
+
var top = void 0,
|
787
|
+
left = window.pageXOffset + inputBounds.left;
|
788
|
+
|
789
|
+
if (distanceFromBottom < calendarHeight) {
|
790
|
+
top = window.pageYOffset - calendarHeight + inputBounds.top - 2;
|
791
|
+
self.calendarContainer.classList.remove("arrowTop");
|
792
|
+
self.calendarContainer.classList.add("arrowBottom");
|
793
|
+
} else {
|
794
|
+
top = window.pageYOffset + input.offsetHeight + inputBounds.top + 2;
|
795
|
+
self.calendarContainer.classList.remove("arrowBottom");
|
796
|
+
self.calendarContainer.classList.add("arrowTop");
|
797
|
+
}
|
798
|
+
|
799
|
+
if (!self.config.inline && !self.config.static) {
|
800
|
+
self.calendarContainer.style.top = top + "px";
|
801
|
+
self.calendarContainer.style.left = left + "px";
|
802
|
+
}
|
803
|
+
}
|
804
|
+
|
805
|
+
function redraw() {
|
806
|
+
if (self.config.noCalendar || self.isMobile) return;
|
807
|
+
|
808
|
+
buildWeekdays();
|
809
|
+
updateNavigationCurrentMonth();
|
810
|
+
buildDays();
|
811
|
+
}
|
812
|
+
|
813
|
+
function selectDate(e) {
|
814
|
+
if (self.config.allowInput && e.which === 13 && e.target === (self.altInput || self.input)) return self.setDate((self.altInput || self.input).value), e.target.blur();
|
815
|
+
|
816
|
+
if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
|
817
|
+
|
818
|
+
var selectedDate = e.target.dateObj;
|
819
|
+
self.selectedDateElem = e.target;
|
820
|
+
|
821
|
+
if (self.config.mode === "single") {
|
822
|
+
self.selectedDates = [selectedDate];
|
823
|
+
|
824
|
+
if (!self.config.enableTime) self.close();
|
825
|
+
} else if (self.config.mode === "multiple") {
|
826
|
+
var selectedIndex = isDateSelected(selectedDate);
|
827
|
+
if (selectedIndex) self.selectedDates.splice(selectedIndex, 1);else self.selectedDates.push(selectedDate);
|
828
|
+
} else if (self.config.mode === "range") {
|
829
|
+
if (self.selectedDates.length === 2) self.clear();
|
830
|
+
|
831
|
+
self.selectedDates.push(selectedDate);
|
832
|
+
self.selectedDates.sort(function (a, b) {
|
833
|
+
return a.getTime() - b.getTime();
|
834
|
+
});
|
835
|
+
}
|
836
|
+
|
837
|
+
setHoursFromInputs();
|
838
|
+
|
839
|
+
if (selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range") {
|
840
|
+
self.currentYear = selectedDate.getFullYear();
|
841
|
+
self.currentMonth = selectedDate.getMonth();
|
842
|
+
updateNavigationCurrentMonth();
|
843
|
+
}
|
844
|
+
|
845
|
+
updateValue();
|
846
|
+
buildDays();
|
847
|
+
triggerEvent("Change");
|
848
|
+
|
849
|
+
if (self.config.mode === "range" && self.selectedDates.length === 1) onMouseOver(e);
|
850
|
+
}
|
851
|
+
|
852
|
+
function set(option, value) {
|
853
|
+
self.config[option] = value;
|
854
|
+
self.redraw();
|
855
|
+
jumpToDate();
|
856
|
+
}
|
857
|
+
|
858
|
+
function setDate(date, triggerChange) {
|
859
|
+
if (!date) return self.clear();
|
860
|
+
|
861
|
+
self.selectedDates = (Array.isArray(date) ? date.map(parseDate) : [parseDate(date)]).filter(function (d) {
|
862
|
+
return d instanceof Date;
|
863
|
+
});
|
864
|
+
self.redraw();
|
865
|
+
jumpToDate();
|
866
|
+
|
867
|
+
setHoursFromDate();
|
868
|
+
updateValue();
|
869
|
+
|
870
|
+
if (triggerChange) triggerEvent("Change");
|
871
|
+
}
|
872
|
+
|
873
|
+
function setupDates() {
|
874
|
+
self.selectedDates = [];
|
875
|
+
self.now = new Date();
|
876
|
+
var inputDate = self.config.defaultDate || self.input.value;
|
877
|
+
|
878
|
+
if (Array.isArray(inputDate)) self.selectedDates = inputDate.map(parseDate);else if (inputDate) {
|
879
|
+
switch (self.config.mode) {
|
880
|
+
case "single":
|
881
|
+
self.selectedDates = [parseDate(inputDate)];
|
882
|
+
break;
|
883
|
+
|
884
|
+
case "multiple":
|
885
|
+
self.selectedDates = inputDate.split("; ").map(parseDate);
|
886
|
+
break;
|
887
|
+
|
888
|
+
case "range":
|
889
|
+
self.selectedDates = inputDate.split(" to ").map(parseDate);
|
890
|
+
break;
|
891
|
+
|
892
|
+
default:
|
893
|
+
break;
|
894
|
+
}
|
895
|
+
}
|
896
|
+
|
897
|
+
self.selectedDates = self.selectedDates.filter(function (d) {
|
898
|
+
return d instanceof Date && d.getTime() && isEnabled(d);
|
899
|
+
});
|
900
|
+
|
901
|
+
var initialDate = self.selectedDates.length ? self.selectedDates[0] : self.config.minDate > self.now ? self.config.minDate : self.now;
|
902
|
+
|
903
|
+
self.currentYear = initialDate.getFullYear();
|
904
|
+
self.currentMonth = initialDate.getMonth();
|
905
|
+
}
|
906
|
+
|
907
|
+
function setupHelperFunctions() {
|
908
|
+
self.utils = {
|
909
|
+
duration: {
|
910
|
+
DAY: 86400000
|
911
|
+
},
|
912
|
+
getDaysinMonth: function getDaysinMonth() {
|
913
|
+
var month = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : self.currentMonth;
|
914
|
+
var yr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : self.currentYear;
|
915
|
+
|
916
|
+
if (month === 1 && yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0) return 29;
|
917
|
+
return self.l10n.daysInMonth[month];
|
918
|
+
},
|
919
|
+
|
920
|
+
monthToStr: function monthToStr(monthNumber) {
|
921
|
+
var short = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : self.config.shorthandCurrentMonth;
|
922
|
+
return self.l10n.months[(short ? "short" : "long") + "hand"][monthNumber];
|
923
|
+
}
|
924
|
+
};
|
925
|
+
}
|
926
|
+
|
927
|
+
function setupFormats() {
|
928
|
+
self.formats = {
|
929
|
+
// weekday name, short, e.g. Thu
|
930
|
+
D: function D(date) {
|
931
|
+
return self.l10n.weekdays.shorthand[self.formats.w(date)];
|
932
|
+
},
|
933
|
+
|
934
|
+
// full month name e.g. January
|
935
|
+
F: function F(date) {
|
936
|
+
return self.utils.monthToStr(self.formats.n(date) - 1, false);
|
937
|
+
},
|
938
|
+
|
939
|
+
// hours with leading zero e.g. 03
|
940
|
+
H: function H(date) {
|
941
|
+
return Flatpickr.prototype.pad(date.getHours());
|
942
|
+
},
|
943
|
+
|
944
|
+
// day (1-30) with ordinal suffix e.g. 1st, 2nd
|
945
|
+
J: function J(date) {
|
946
|
+
return date.getDate() + self.l10n.ordinal(date.getDate());
|
947
|
+
},
|
948
|
+
|
949
|
+
// AM/PM
|
950
|
+
K: function K(date) {
|
951
|
+
return date.getHours() > 11 ? "PM" : "AM";
|
952
|
+
},
|
953
|
+
|
954
|
+
// shorthand month e.g. Jan, Sep, Oct, etc
|
955
|
+
M: function M(date) {
|
956
|
+
return self.utils.monthToStr(date.getMonth(), true);
|
957
|
+
},
|
958
|
+
|
959
|
+
// seconds 00-59
|
960
|
+
S: function S(date) {
|
961
|
+
return Flatpickr.prototype.pad(date.getSeconds());
|
962
|
+
},
|
963
|
+
|
964
|
+
// unix timestamp
|
965
|
+
U: function U(date) {
|
966
|
+
return date.getTime() / 1000;
|
967
|
+
},
|
968
|
+
|
969
|
+
// full year e.g. 2016
|
970
|
+
Y: function Y(date) {
|
971
|
+
return date.getFullYear();
|
972
|
+
},
|
973
|
+
|
974
|
+
// day in month, padded (01-30)
|
975
|
+
d: function d(date) {
|
976
|
+
return Flatpickr.prototype.pad(self.formats.j(date));
|
977
|
+
},
|
978
|
+
|
979
|
+
// hour from 1-12 (am/pm)
|
980
|
+
h: function h(date) {
|
981
|
+
return date.getHours() % 12 ? date.getHours() % 12 : 12;
|
982
|
+
},
|
983
|
+
|
984
|
+
// minutes, padded with leading zero e.g. 09
|
985
|
+
i: function i(date) {
|
986
|
+
return Flatpickr.prototype.pad(date.getMinutes());
|
987
|
+
},
|
988
|
+
|
989
|
+
// day in month (1-30)
|
990
|
+
j: function j(date) {
|
991
|
+
return date.getDate();
|
992
|
+
},
|
993
|
+
|
994
|
+
// weekday name, full, e.g. Thursday
|
995
|
+
l: function l(date) {
|
996
|
+
return self.l10n.weekdays.longhand[self.formats.w(date)];
|
997
|
+
},
|
998
|
+
|
999
|
+
// padded month number (01-12)
|
1000
|
+
m: function m(date) {
|
1001
|
+
return Flatpickr.prototype.pad(self.formats.n(date));
|
1002
|
+
},
|
1003
|
+
|
1004
|
+
// the month number (1-12)
|
1005
|
+
n: function n(date) {
|
1006
|
+
return date.getMonth() + 1;
|
1007
|
+
},
|
1008
|
+
|
1009
|
+
// seconds 0-59
|
1010
|
+
s: function s(date) {
|
1011
|
+
return date.getSeconds();
|
1012
|
+
},
|
1013
|
+
|
1014
|
+
// number of the day of the week
|
1015
|
+
w: function w(date) {
|
1016
|
+
return date.getDay();
|
1017
|
+
},
|
1018
|
+
|
1019
|
+
// last two digits of year e.g. 16 for 2016
|
1020
|
+
y: function y(date) {
|
1021
|
+
return String(self.formats.Y(date)).substring(2);
|
1022
|
+
}
|
1023
|
+
};
|
1024
|
+
}
|
1025
|
+
|
1026
|
+
function setupInputs() {
|
1027
|
+
self.input = self.config.wrap ? self.element.querySelector("[data-input]") : self.element;
|
1028
|
+
|
1029
|
+
self.input.classList.add("flatpickr-input");
|
1030
|
+
if (self.config.altInput) {
|
1031
|
+
// replicate self.element
|
1032
|
+
self.altInput = createElement(self.input.nodeName, self.config.altInputClass);
|
1033
|
+
self.altInput.placeholder = self.input.placeholder;
|
1034
|
+
self.altInput.type = "text";
|
1035
|
+
|
1036
|
+
self.input.type = "hidden";
|
1037
|
+
if (self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);
|
1038
|
+
}
|
1039
|
+
|
1040
|
+
if (!self.config.allowInput) (self.altInput || self.input).setAttribute("readonly", "readonly");
|
1041
|
+
}
|
1042
|
+
|
1043
|
+
function setupMobile() {
|
1044
|
+
var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
|
1045
|
+
|
1046
|
+
self.mobileInput = createElement("input", "flatpickr-input flatpickr-mobile");
|
1047
|
+
self.mobileInput.step = "any";
|
1048
|
+
self.mobileInput.tabIndex = -1;
|
1049
|
+
self.mobileInput.type = inputType;
|
1050
|
+
self.mobileInput.disabled = self.input.disabled;
|
1051
|
+
|
1052
|
+
self.mobileFormatStr = inputType === "datetime-local" ? "Y-m-d\\TH:i:S" : inputType === "date" ? "Y-m-d" : "H:i:S";
|
1053
|
+
|
1054
|
+
if (self.selectedDates.length) {
|
1055
|
+
self.mobileInput.defaultValue = self.mobileInput.value = formatDate(self.mobileFormatStr, self.selectedDates[0]);
|
1056
|
+
}
|
1057
|
+
|
1058
|
+
if (self.config.minDate) self.mobileInput.min = formatDate("Y-m-d", self.config.minDate);
|
1059
|
+
|
1060
|
+
if (self.config.maxDate) self.mobileInput.max = formatDate("Y-m-d", self.config.maxDate);
|
1061
|
+
|
1062
|
+
self.input.type = "hidden";
|
1063
|
+
if (self.config.altInput) self.altInput.type = "hidden";
|
1064
|
+
|
1065
|
+
try {
|
1066
|
+
self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);
|
1067
|
+
} catch (e) {
|
1068
|
+
//
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
self.mobileInput.addEventListener("change", function (e) {
|
1072
|
+
self.setDate(e.target.value);
|
1073
|
+
triggerEvent("Change");
|
1074
|
+
triggerEvent("Close");
|
1075
|
+
});
|
1076
|
+
}
|
1077
|
+
|
1078
|
+
function toggle() {
|
1079
|
+
if (self.isOpen) self.close();else self.open();
|
1080
|
+
}
|
1081
|
+
|
1082
|
+
function triggerEvent(event, data) {
|
1083
|
+
if (self.config["on" + event]) {
|
1084
|
+
var hooks = Array.isArray(self.config["on" + event]) ? self.config["on" + event] : [self.config["on" + event]];
|
1085
|
+
|
1086
|
+
for (var i = 0; i < hooks.length; i++) {
|
1087
|
+
hooks[i](self.selectedDates, self.input.value, self, data);
|
1088
|
+
}
|
1089
|
+
}
|
1090
|
+
|
1091
|
+
if (event === "Change") {
|
1092
|
+
try {
|
1093
|
+
self.input.dispatchEvent(new Event("change", { "bubbles": true }));
|
1094
|
+
|
1095
|
+
// many front-end frameworks bind to the input event
|
1096
|
+
self.input.dispatchEvent(new Event("input", { "bubbles": true }));
|
1097
|
+
} catch (e) {
|
1098
|
+
if ("createEvent" in document) return self.input.dispatchEvent(self.changeEvent);
|
1099
|
+
|
1100
|
+
self.input.fireEvent("onchange");
|
1101
|
+
}
|
1102
|
+
}
|
1103
|
+
}
|
1104
|
+
|
1105
|
+
function latestSelectedDateObj() {
|
1106
|
+
if (self.selectedDates.length) return self.selectedDates[self.selectedDates.length - 1];
|
1107
|
+
return null;
|
1108
|
+
}
|
1109
|
+
|
1110
|
+
function isDateSelected(date) {
|
1111
|
+
for (var i = 0; i < self.selectedDates.length; i++) {
|
1112
|
+
if (equalDates(self.selectedDates[i], date)) return "" + i;
|
1113
|
+
}
|
1114
|
+
|
1115
|
+
return false;
|
1116
|
+
}
|
1117
|
+
|
1118
|
+
function isDateInRange(date) {
|
1119
|
+
if (self.config.mode !== "range" || self.selectedDates.length < 2) return false;
|
1120
|
+
return date > self.selectedDates[0] && date < self.selectedDates[1];
|
1121
|
+
}
|
1122
|
+
|
1123
|
+
function updateNavigationCurrentMonth() {
|
1124
|
+
if (self.config.noCalendar || self.isMobile || !self.monthNav) return;
|
1125
|
+
|
1126
|
+
self.currentMonthElement.textContent = self.utils.monthToStr(self.currentMonth) + " ";
|
1127
|
+
self.currentYearElement.value = self.currentYear;
|
1128
|
+
|
1129
|
+
if (self.config.minDate) {
|
1130
|
+
var hidePrevMonthArrow = self.currentYear === self.config.minDate.getFullYear() ? (self.currentMonth + 11) % 12 < self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear();
|
1131
|
+
|
1132
|
+
self.prevMonthNav.style.display = hidePrevMonthArrow ? "none" : "block";
|
1133
|
+
} else self.prevMonthNav.style.display = "block";
|
1134
|
+
|
1135
|
+
if (self.config.maxDate) {
|
1136
|
+
var hideNextMonthArrow = self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear();
|
1137
|
+
|
1138
|
+
self.nextMonthNav.style.display = hideNextMonthArrow ? "none" : "block";
|
1139
|
+
} else self.nextMonthNav.style.display = "block";
|
1140
|
+
}
|
1141
|
+
|
1142
|
+
function updateValue() {
|
1143
|
+
if (!self.selectedDates.length) return self.clear();
|
1144
|
+
|
1145
|
+
if (self.isMobile) {
|
1146
|
+
self.mobileInput.value = self.selectedDates.length ? formatDate(self.mobileFormatStr, latestSelectedDateObj()) : "";
|
1147
|
+
}
|
1148
|
+
|
1149
|
+
var joinChar = self.config.mode !== "range" ? "; " : " to ";
|
1150
|
+
|
1151
|
+
self.input.value = self.selectedDates.map(function (dObj) {
|
1152
|
+
return formatDate(self.config.dateFormat, dObj);
|
1153
|
+
}).join(joinChar);
|
1154
|
+
|
1155
|
+
if (self.config.altInput) {
|
1156
|
+
self.altInput.value = self.selectedDates.map(function (dObj) {
|
1157
|
+
return formatDate(self.config.altFormat, dObj);
|
1158
|
+
}).join(joinChar);
|
1159
|
+
}
|
1160
|
+
|
1161
|
+
triggerEvent("ValueUpdate");
|
1162
|
+
}
|
1163
|
+
|
1164
|
+
function yearScroll(e) {
|
1165
|
+
e.preventDefault();
|
1166
|
+
|
1167
|
+
var delta = Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)),
|
1168
|
+
newYear = parseInt(e.target.value, 10) + delta;
|
1169
|
+
|
1170
|
+
handleYearChange(newYear);
|
1171
|
+
e.target.value = self.currentYear;
|
1172
|
+
}
|
1173
|
+
|
1174
|
+
function createElement(tag) {
|
1175
|
+
var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
1176
|
+
var content = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
1177
|
+
|
1178
|
+
var e = document.createElement(tag);
|
1179
|
+
e.className = className;
|
1180
|
+
|
1181
|
+
if (content) e.textContent = content;
|
1182
|
+
|
1183
|
+
return e;
|
1184
|
+
}
|
1185
|
+
|
1186
|
+
function debounce(func, wait, immediate) {
|
1187
|
+
var timeout = void 0;
|
1188
|
+
return function () {
|
1189
|
+
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
1190
|
+
args[_key] = arguments[_key];
|
1191
|
+
}
|
1192
|
+
|
1193
|
+
var context = this;
|
1194
|
+
var later = function later() {
|
1195
|
+
timeout = null;
|
1196
|
+
if (!immediate) func.apply(context, args);
|
1197
|
+
};
|
1198
|
+
|
1199
|
+
clearTimeout(timeout);
|
1200
|
+
timeout = setTimeout(later, wait);
|
1201
|
+
if (immediate && !timeout) func.apply(context, args);
|
1202
|
+
};
|
1203
|
+
}
|
1204
|
+
|
1205
|
+
function equalDates(date1, date2) {
|
1206
|
+
if (!(date1 instanceof Date) || !(date2 instanceof Date)) return false;
|
1207
|
+
return date1.getDate() === date2.getDate() && date1.getMonth() === date2.getMonth() && date1.getFullYear() === date2.getFullYear();
|
1208
|
+
}
|
1209
|
+
|
1210
|
+
function timeWrapper(e) {
|
1211
|
+
e.preventDefault();
|
1212
|
+
if (e && ((e.target.value || e.target.textContent).length >= 2 || e.type !== "keydown" && e.type !== "input")) e.target.blur();
|
1213
|
+
|
1214
|
+
if (e.target.className === "flatpickr-am-pm") {
|
1215
|
+
e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
|
1216
|
+
return;
|
1217
|
+
}
|
1218
|
+
|
1219
|
+
var min = parseInt(e.target.min, 10),
|
1220
|
+
max = parseInt(e.target.max, 10),
|
1221
|
+
step = parseInt(e.target.step, 10),
|
1222
|
+
value = parseInt(e.target.value, 10);
|
1223
|
+
|
1224
|
+
var newValue = value;
|
1225
|
+
|
1226
|
+
if (e.type === "wheel") newValue = value + step * Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));else if (e.type === "keydown") newValue = value + step * (e.which === 38 ? 1 : -1);
|
1227
|
+
|
1228
|
+
if (newValue <= min) newValue = max - step;else if (newValue >= max) newValue = min + step;
|
1229
|
+
|
1230
|
+
if (self.amPM && (value === 11 && newValue === 12 || value === 12 && newValue === 11)) self.amPM.textContent = self.amPM.innerHTML === "PM" ? "AM" : "PM";
|
1231
|
+
|
1232
|
+
e.target.value = self.pad(newValue);
|
1233
|
+
}
|
1234
|
+
|
1235
|
+
init();
|
1236
|
+
return self;
|
1237
|
+
}
|
1238
|
+
|
1239
|
+
Flatpickr.defaultConfig = {
|
1240
|
+
|
1241
|
+
mode: "single",
|
1242
|
+
|
1243
|
+
/* if true, dates will be parsed, formatted, and displayed in UTC.
|
1244
|
+
preloading date strings w/ timezones is recommended but not necessary */
|
1245
|
+
utc: false,
|
1246
|
+
|
1247
|
+
// wrap: see https://chmln.github.io/flatpickr/#strap
|
1248
|
+
wrap: false,
|
1249
|
+
|
1250
|
+
// enables week numbers
|
1251
|
+
weekNumbers: false,
|
1252
|
+
|
1253
|
+
// allow manual datetime input
|
1254
|
+
allowInput: false,
|
1255
|
+
|
1256
|
+
/*
|
1257
|
+
clicking on input opens the date(time)picker.
|
1258
|
+
disable if you wish to open the calendar manually with .open()
|
1259
|
+
*/
|
1260
|
+
clickOpens: true,
|
1261
|
+
|
1262
|
+
// display time picker in 24 hour mode
|
1263
|
+
time_24hr: false,
|
1264
|
+
|
1265
|
+
// enables the time picker functionality
|
1266
|
+
enableTime: false,
|
1267
|
+
|
1268
|
+
// noCalendar: true will hide the calendar. use for a time picker along w/ enableTime
|
1269
|
+
noCalendar: false,
|
1270
|
+
|
1271
|
+
// more date format chars at https://chmln.github.io/flatpickr/#dateformat
|
1272
|
+
dateFormat: "Y-m-d",
|
1273
|
+
|
1274
|
+
// altInput - see https://chmln.github.io/flatpickr/#altinput
|
1275
|
+
altInput: false,
|
1276
|
+
|
1277
|
+
// the created altInput element will have this class.
|
1278
|
+
altInputClass: "form-control input",
|
1279
|
+
|
1280
|
+
// same as dateFormat, but for altInput
|
1281
|
+
altFormat: "F j, Y", // defaults to e.g. June 10, 2016
|
1282
|
+
|
1283
|
+
// defaultDate - either a datestring or a date object. used for datetimepicker"s initial value
|
1284
|
+
defaultDate: null,
|
1285
|
+
|
1286
|
+
// the minimum date that user can pick (inclusive)
|
1287
|
+
minDate: null,
|
1288
|
+
|
1289
|
+
// the maximum date that user can pick (inclusive)
|
1290
|
+
maxDate: null,
|
1291
|
+
|
1292
|
+
// dateparser that transforms a given string to a date object
|
1293
|
+
parseDate: null,
|
1294
|
+
|
1295
|
+
getWeek: function getWeek(givenDate) {
|
1296
|
+
var date = new Date(givenDate.getTime());
|
1297
|
+
date.setHours(0, 0, 0, 0);
|
1298
|
+
|
1299
|
+
// Thursday in current week decides the year.
|
1300
|
+
date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
|
1301
|
+
// January 4 is always in week 1.
|
1302
|
+
var week1 = new Date(date.getFullYear(), 0, 4);
|
1303
|
+
// Adjust to Thursday in week 1 and count number of weeks from date to week1.
|
1304
|
+
return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
|
1305
|
+
},
|
1306
|
+
|
1307
|
+
// see https://chmln.github.io/flatpickr/#disable
|
1308
|
+
enable: [],
|
1309
|
+
|
1310
|
+
// see https://chmln.github.io/flatpickr/#disable
|
1311
|
+
disable: [],
|
1312
|
+
|
1313
|
+
// display the short version of month names - e.g. Sep instead of September
|
1314
|
+
shorthandCurrentMonth: false,
|
1315
|
+
|
1316
|
+
// displays calendar inline. see https://chmln.github.io/flatpickr/#inline-calendar
|
1317
|
+
inline: false,
|
1318
|
+
|
1319
|
+
// position calendar inside wrapper and next to the input element
|
1320
|
+
// leave at false unless you know what you"re doing
|
1321
|
+
static: false,
|
1322
|
+
|
1323
|
+
// DOM node to append the calendar to in *static* mode
|
1324
|
+
appendTo: null,
|
1325
|
+
|
1326
|
+
// code for previous/next icons. this is where you put your custom icon code e.g. fontawesome
|
1327
|
+
prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",
|
1328
|
+
nextArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",
|
1329
|
+
|
1330
|
+
// enables seconds in the time picker
|
1331
|
+
enableSeconds: false,
|
1332
|
+
|
1333
|
+
// step size used when scrolling/incrementing the hour element
|
1334
|
+
hourIncrement: 1,
|
1335
|
+
|
1336
|
+
// step size used when scrolling/incrementing the minute element
|
1337
|
+
minuteIncrement: 5,
|
1338
|
+
|
1339
|
+
// initial value in the hour element
|
1340
|
+
defaultHour: 12,
|
1341
|
+
|
1342
|
+
// initial value in the minute element
|
1343
|
+
defaultMinute: 0,
|
1344
|
+
|
1345
|
+
// disable native mobile datetime input support
|
1346
|
+
disableMobile: false,
|
1347
|
+
|
1348
|
+
// default locale
|
1349
|
+
locale: "default",
|
1350
|
+
|
1351
|
+
// onChange callback when user selects a date or time
|
1352
|
+
onChange: null, // function (dateObj, dateStr) {}
|
1353
|
+
|
1354
|
+
// called every time calendar is opened
|
1355
|
+
onOpen: null, // function (dateObj, dateStr) {}
|
1356
|
+
|
1357
|
+
// called every time calendar is closed
|
1358
|
+
onClose: null, // function (dateObj, dateStr) {}
|
1359
|
+
|
1360
|
+
// called after calendar is ready
|
1361
|
+
onReady: null, // function (dateObj, dateStr) {}
|
1362
|
+
|
1363
|
+
onValueUpdate: null,
|
1364
|
+
|
1365
|
+
onDayCreate: null
|
1366
|
+
};
|
1367
|
+
|
1368
|
+
Flatpickr.l10ns = {
|
1369
|
+
en: {
|
1370
|
+
weekdays: {
|
1371
|
+
shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
1372
|
+
longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
1373
|
+
},
|
1374
|
+
months: {
|
1375
|
+
shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
1376
|
+
longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
1377
|
+
},
|
1378
|
+
daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
|
1379
|
+
firstDayOfWeek: 0,
|
1380
|
+
ordinal: function ordinal(nth) {
|
1381
|
+
var s = nth % 100;
|
1382
|
+
if (s > 3 && s < 21) return "th";
|
1383
|
+
switch (s % 10) {
|
1384
|
+
case 1:
|
1385
|
+
return "st";
|
1386
|
+
case 2:
|
1387
|
+
return "nd";
|
1388
|
+
case 3:
|
1389
|
+
return "rd";
|
1390
|
+
default:
|
1391
|
+
return "th";
|
1392
|
+
}
|
1393
|
+
},
|
1394
|
+
weekAbbreviation: "Wk",
|
1395
|
+
scrollTitle: "Scroll to increment",
|
1396
|
+
toggleTitle: "Click to toggle"
|
1397
|
+
}
|
1398
|
+
};
|
1399
|
+
|
1400
|
+
Flatpickr.l10ns.default = Flatpickr.l10ns.en;
|
1401
|
+
|
1402
|
+
Flatpickr.localize = function (l10n) {
|
1403
|
+
return _extends(Flatpickr.l10ns.default, l10n || {});
|
1404
|
+
};
|
1405
|
+
|
1406
|
+
Flatpickr.prototype = {
|
1407
|
+
pad: function pad(number) {
|
1408
|
+
return ("0" + number).slice(-2);
|
1409
|
+
}
|
1410
|
+
};
|
1411
|
+
|
1412
|
+
function _flatpickr(nodeList, config) {
|
1413
|
+
var instances = [];
|
1414
|
+
for (var i = 0; i < nodeList.length; i++) {
|
1415
|
+
try {
|
1416
|
+
nodeList[i]._flatpickr = new Flatpickr(nodeList[i], config || {});
|
1417
|
+
instances.push(nodeList[i]._flatpickr);
|
1418
|
+
} catch (e) {
|
1419
|
+
console.warn(e, e.stack);
|
1420
|
+
}
|
1421
|
+
}
|
1422
|
+
|
1423
|
+
return instances.length === 1 ? instances[0] : instances;
|
1424
|
+
}
|
1425
|
+
if (typeof HTMLElement !== "undefined") {
|
1426
|
+
// browser env
|
1427
|
+
HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {
|
1428
|
+
return _flatpickr(this, config);
|
1429
|
+
};
|
1430
|
+
|
1431
|
+
HTMLElement.prototype.flatpickr = function (config) {
|
1432
|
+
return _flatpickr([this], config);
|
1433
|
+
};
|
1434
|
+
}
|
1435
|
+
|
1436
|
+
function flatpickr(selector, config) {
|
1437
|
+
return _flatpickr(document.querySelectorAll(selector), config);
|
1438
|
+
}
|
1439
|
+
|
1440
|
+
if (typeof jQuery !== "undefined") {
|
1441
|
+
jQuery.fn.flatpickr = function (config) {
|
1442
|
+
return _flatpickr(this, config);
|
1443
|
+
};
|
1444
|
+
}
|
1445
|
+
|
1446
|
+
Date.prototype.fp_incr = function (days) {
|
1447
|
+
return new Date(this.getFullYear(), this.getMonth(), this.getDate() + parseInt(days, 10));
|
1448
|
+
};
|
1449
|
+
|
1450
|
+
Date.prototype.fp_isUTC = false;
|
1451
|
+
Date.prototype.fp_toUTC = function () {
|
1452
|
+
var newDate = new Date(this.getUTCFullYear(), this.getUTCMonth(), this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds());
|
1453
|
+
|
1454
|
+
newDate.fp_isUTC = true;
|
1455
|
+
return newDate;
|
1456
|
+
};
|
1457
|
+
|
1458
|
+
// IE9 classList polyfill
|
1459
|
+
if (!("classList" in document.documentElement) && Object.defineProperty && typeof HTMLElement !== "undefined") {
|
1460
|
+
Object.defineProperty(HTMLElement.prototype, "classList", {
|
1461
|
+
get: function get() {
|
1462
|
+
var self = this;
|
1463
|
+
function update(fn) {
|
1464
|
+
return function (value) {
|
1465
|
+
var classes = self.className.split(/\s+/),
|
1466
|
+
index = classes.indexOf(value);
|
1467
|
+
|
1468
|
+
fn(classes, index, value);
|
1469
|
+
self.className = classes.join(" ");
|
1470
|
+
};
|
1471
|
+
}
|
1472
|
+
|
1473
|
+
var ret = {
|
1474
|
+
add: update(function (classes, index, value) {
|
1475
|
+
if (!~index) classes.push(value);
|
1476
|
+
}),
|
1477
|
+
|
1478
|
+
remove: update(function (classes, index) {
|
1479
|
+
if (~index) classes.splice(index, 1);
|
1480
|
+
}),
|
1481
|
+
|
1482
|
+
toggle: update(function (classes, index, value) {
|
1483
|
+
if (~index) classes.splice(index, 1);else classes.push(value);
|
1484
|
+
}),
|
1485
|
+
|
1486
|
+
contains: function contains(value) {
|
1487
|
+
return !!~self.className.split(/\s+/).indexOf(value);
|
1488
|
+
},
|
1489
|
+
|
1490
|
+
item: function item(i) {
|
1491
|
+
return self.className.split(/\s+/)[i] || null;
|
1492
|
+
}
|
1493
|
+
};
|
1494
|
+
|
1495
|
+
Object.defineProperty(ret, "length", {
|
1496
|
+
get: function get() {
|
1497
|
+
return self.className.split(/\s+/).length;
|
1498
|
+
}
|
1499
|
+
});
|
1500
|
+
|
1501
|
+
return ret;
|
1502
|
+
}
|
1503
|
+
});
|
1504
|
+
}
|
1505
|
+
|
1506
|
+
if (typeof module !== "undefined") module.exports = Flatpickr;
|