scrivito_advanced_editors 1.4.1 → 1.5.0.dev1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6e42f492c809f1048e45500bf17b5415a819054
|
4
|
+
data.tar.gz: 4e923f5e8094524bb175b53744d561559e8b506b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e61a4e15f2df82b8f4a5ac6e61a002348bbb31aaafac73a2a41249f896873f868e09219336fa421c70a100ef51d945d6fe0462411f3f2276f173a480f859183
|
7
|
+
data.tar.gz: 72126deb30f169fefea31557ca38f2f2337785bf03bd9895b2728c7b2477697c035edc18340f40c0bcfaa9c07ba545abfab9fffa70b9ce87891c21a5930bab8f
|
@@ -0,0 +1,55 @@
|
|
1
|
+
(function($, App) {
|
2
|
+
'use strict';
|
3
|
+
|
4
|
+
var activate, config, save;
|
5
|
+
|
6
|
+
var date_editor = {
|
7
|
+
can_edit: function(element) {
|
8
|
+
return $(element).is('[data-scrivito-field-type=date]');
|
9
|
+
},
|
10
|
+
activate: function(element) {
|
11
|
+
return activate($(element));
|
12
|
+
}
|
13
|
+
};
|
14
|
+
|
15
|
+
scrivito.on('content', function() {
|
16
|
+
if(scrivito.in_editable_view()) {
|
17
|
+
scrivito.define_editor('datetime_editor', date_editor);
|
18
|
+
}
|
19
|
+
});
|
20
|
+
|
21
|
+
activate = function(cmsField) {
|
22
|
+
cmsField.on('click', function(event) {
|
23
|
+
var content = new Date(cmsField.scrivito('content'));
|
24
|
+
var isoOffset = content.getTimezoneOffset() / 60;
|
25
|
+
var date = content.setHours(content.getHours() + isoOffset);
|
26
|
+
var elem = $('<input value="'+ new Date(date) +'">').insertAfter(cmsField);
|
27
|
+
var options = cmsField.data("scrivito-datetimepicker-config");
|
28
|
+
cmsField.hide();
|
29
|
+
cmsField.next().flatpickr($.extend(config, options)).open();
|
30
|
+
})
|
31
|
+
};
|
32
|
+
|
33
|
+
save = function(cmsField, value) {
|
34
|
+
var isoOffset = value.getTimezoneOffset() / 60;
|
35
|
+
var date = value.setHours(value.getHours() - isoOffset);
|
36
|
+
return cmsField.scrivito('save', new Date(date)).done(function() { cmsField.trigger('scrivito_editors:save'); });
|
37
|
+
};
|
38
|
+
|
39
|
+
config = {
|
40
|
+
enableTime: true,
|
41
|
+
enableSeconds: true,
|
42
|
+
time_24hr: true,
|
43
|
+
parseDate: function(date) { return date=="null" ? new Date() : new Date(date); },
|
44
|
+
onChange: function(selectedDates, dateStr, instance) {
|
45
|
+
var cmsField = $(instance.element).prev();
|
46
|
+
save(cmsField, new Date(dateStr));
|
47
|
+
},
|
48
|
+
onClose: function(selectedDates, dateStr, instance) {
|
49
|
+
var cmsField = $(instance.element).prev();
|
50
|
+
save(cmsField, new Date(dateStr));
|
51
|
+
$(instance.element).remove();
|
52
|
+
cmsField.html(dateStr).show();
|
53
|
+
}
|
54
|
+
}
|
55
|
+
})(jQuery, this);
|
@@ -0,0 +1,2351 @@
|
|
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 v3.0.6, @license MIT */
|
6
|
+
function FlatpickrInstance(element, config) {
|
7
|
+
var self = this;
|
8
|
+
|
9
|
+
self._ = {};
|
10
|
+
self._.afterDayAnim = afterDayAnim;
|
11
|
+
self._bind = bind;
|
12
|
+
self._compareDates = compareDates;
|
13
|
+
self._setHoursFromDate = setHoursFromDate;
|
14
|
+
self.changeMonth = changeMonth;
|
15
|
+
self.changeYear = changeYear;
|
16
|
+
self.clear = clear;
|
17
|
+
self.close = close;
|
18
|
+
self._createElement = createElement;
|
19
|
+
self.destroy = destroy;
|
20
|
+
self.isEnabled = isEnabled;
|
21
|
+
self.jumpToDate = jumpToDate;
|
22
|
+
self.open = open;
|
23
|
+
self.redraw = redraw;
|
24
|
+
self.set = set;
|
25
|
+
self.setDate = setDate;
|
26
|
+
self.toggle = toggle;
|
27
|
+
|
28
|
+
function init() {
|
29
|
+
self.element = self.input = element;
|
30
|
+
self.instanceConfig = config || {};
|
31
|
+
self.parseDate = FlatpickrInstance.prototype.parseDate.bind(self);
|
32
|
+
self.formatDate = FlatpickrInstance.prototype.formatDate.bind(self);
|
33
|
+
|
34
|
+
setupFormats();
|
35
|
+
parseConfig();
|
36
|
+
setupLocale();
|
37
|
+
setupInputs();
|
38
|
+
setupDates();
|
39
|
+
setupHelperFunctions();
|
40
|
+
|
41
|
+
self.isOpen = false;
|
42
|
+
|
43
|
+
self.isMobile = !self.config.disableMobile && !self.config.inline && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && !self.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
44
|
+
|
45
|
+
if (!self.isMobile) build();
|
46
|
+
|
47
|
+
bindEvents();
|
48
|
+
|
49
|
+
if (self.selectedDates.length || self.config.noCalendar) {
|
50
|
+
if (self.config.enableTime) {
|
51
|
+
setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj || self.config.minDate : null);
|
52
|
+
}
|
53
|
+
updateValue(false);
|
54
|
+
}
|
55
|
+
|
56
|
+
self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;
|
57
|
+
|
58
|
+
if (self.config.weekNumbers) {
|
59
|
+
self.calendarContainer.style.width = self.daysContainer.offsetWidth + self.weekWrapper.offsetWidth + "px";
|
60
|
+
}
|
61
|
+
|
62
|
+
if (!self.isMobile) positionCalendar();
|
63
|
+
|
64
|
+
triggerEvent("Ready");
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Binds a function to the current flatpickr instance
|
69
|
+
* @param {Function} fn the function
|
70
|
+
* @return {Function} the function bound to the instance
|
71
|
+
*/
|
72
|
+
function bindToInstance(fn) {
|
73
|
+
return fn.bind(self);
|
74
|
+
}
|
75
|
+
|
76
|
+
/**
|
77
|
+
* The handler for all events targeting the time inputs
|
78
|
+
* @param {Event} e the event - "input", "wheel", "increment", etc
|
79
|
+
*/
|
80
|
+
function updateTime(e) {
|
81
|
+
if (self.config.noCalendar && !self.selectedDates.length)
|
82
|
+
// picking time only
|
83
|
+
self.selectedDates = [self.now];
|
84
|
+
|
85
|
+
timeWrapper(e);
|
86
|
+
|
87
|
+
if (!self.selectedDates.length) return;
|
88
|
+
|
89
|
+
if (!self.minDateHasTime || e.type !== "input" || e.target.value.length >= 2) {
|
90
|
+
setHoursFromInputs();
|
91
|
+
updateValue();
|
92
|
+
} else {
|
93
|
+
setTimeout(function () {
|
94
|
+
setHoursFromInputs();
|
95
|
+
updateValue();
|
96
|
+
}, 1000);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
/**
|
101
|
+
* Syncs the selected date object time with user's time input
|
102
|
+
*/
|
103
|
+
function setHoursFromInputs() {
|
104
|
+
if (!self.config.enableTime) return;
|
105
|
+
|
106
|
+
var hours = (parseInt(self.hourElement.value, 10) || 0) % (self.amPM ? 12 : 24),
|
107
|
+
minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60,
|
108
|
+
seconds = self.config.enableSeconds ? (parseInt(self.secondElement.value, 10) || 0) % 60 : 0;
|
109
|
+
|
110
|
+
if (self.amPM !== undefined) hours = hours % 12 + 12 * (self.amPM.textContent === "PM");
|
111
|
+
|
112
|
+
if (self.minDateHasTime && compareDates(self.latestSelectedDateObj, self.config.minDate) === 0) {
|
113
|
+
|
114
|
+
hours = Math.max(hours, self.config.minDate.getHours());
|
115
|
+
if (hours === self.config.minDate.getHours()) minutes = Math.max(minutes, self.config.minDate.getMinutes());
|
116
|
+
}
|
117
|
+
|
118
|
+
if (self.maxDateHasTime && compareDates(self.latestSelectedDateObj, self.config.maxDate) === 0) {
|
119
|
+
hours = Math.min(hours, self.config.maxDate.getHours());
|
120
|
+
if (hours === self.config.maxDate.getHours()) minutes = Math.min(minutes, self.config.maxDate.getMinutes());
|
121
|
+
}
|
122
|
+
|
123
|
+
setHours(hours, minutes, seconds);
|
124
|
+
}
|
125
|
+
|
126
|
+
/**
|
127
|
+
* Syncs time input values with a date
|
128
|
+
* @param {Date} dateObj the date to sync with
|
129
|
+
*/
|
130
|
+
function setHoursFromDate(dateObj) {
|
131
|
+
var date = dateObj || self.latestSelectedDateObj;
|
132
|
+
|
133
|
+
if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds());
|
134
|
+
}
|
135
|
+
|
136
|
+
/**
|
137
|
+
* Sets the hours, minutes, and optionally seconds
|
138
|
+
* of the latest selected date object and the
|
139
|
+
* corresponding time inputs
|
140
|
+
* @param {Number} hours the hour. whether its military
|
141
|
+
* or am-pm gets inferred from config
|
142
|
+
* @param {Number} minutes the minutes
|
143
|
+
* @param {Number} seconds the seconds (optional)
|
144
|
+
*/
|
145
|
+
function setHours(hours, minutes, seconds) {
|
146
|
+
if (self.selectedDates.length) {
|
147
|
+
self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);
|
148
|
+
}
|
149
|
+
|
150
|
+
if (!self.config.enableTime || self.isMobile) return;
|
151
|
+
|
152
|
+
self.hourElement.value = self.pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * (hours % 12 === 0) : hours);
|
153
|
+
|
154
|
+
self.minuteElement.value = self.pad(minutes);
|
155
|
+
|
156
|
+
if (!self.config.time_24hr) self.amPM.textContent = hours >= 12 ? "PM" : "AM";
|
157
|
+
|
158
|
+
if (self.config.enableSeconds === true) self.secondElement.value = self.pad(seconds);
|
159
|
+
}
|
160
|
+
|
161
|
+
/**
|
162
|
+
* Handles the year input and incrementing events
|
163
|
+
* @param {Event} event the keyup or increment event
|
164
|
+
*/
|
165
|
+
function onYearInput(event) {
|
166
|
+
var year = event.target.value;
|
167
|
+
if (event.delta) year = (parseInt(year) + event.delta).toString();
|
168
|
+
|
169
|
+
if (year.length === 4 || event.key === "Enter") {
|
170
|
+
self.currentYearElement.blur();
|
171
|
+
if (!/[^\d]/.test(year)) changeYear(year);
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
/**
|
176
|
+
* Essentially addEventListener + tracking
|
177
|
+
* @param {Element} element the element to addEventListener to
|
178
|
+
* @param {String} event the event name
|
179
|
+
* @param {Function} handler the event handler
|
180
|
+
*/
|
181
|
+
function bind(element, event, handler) {
|
182
|
+
if (event instanceof Array) return event.forEach(function (ev) {
|
183
|
+
return bind(element, ev, handler);
|
184
|
+
});
|
185
|
+
|
186
|
+
if (element instanceof Array) return element.forEach(function (el) {
|
187
|
+
return bind(el, event, handler);
|
188
|
+
});
|
189
|
+
|
190
|
+
element.addEventListener(event, handler);
|
191
|
+
self._handlers.push({ element: element, event: event, handler: handler });
|
192
|
+
}
|
193
|
+
|
194
|
+
/**
|
195
|
+
* A mousedown handler which mimics click.
|
196
|
+
* Minimizes latency, since we don't need to wait for mouseup in most cases.
|
197
|
+
* Also, avoids handling right clicks.
|
198
|
+
*
|
199
|
+
* @param {Function} handler the event handler
|
200
|
+
*/
|
201
|
+
function onClick(handler) {
|
202
|
+
return function (evt) {
|
203
|
+
return evt.which === 1 && handler(evt);
|
204
|
+
};
|
205
|
+
}
|
206
|
+
|
207
|
+
/**
|
208
|
+
* Adds all the necessary event listeners
|
209
|
+
*/
|
210
|
+
function bindEvents() {
|
211
|
+
self._handlers = [];
|
212
|
+
self._animationLoop = [];
|
213
|
+
if (self.config.wrap) {
|
214
|
+
["open", "close", "toggle", "clear"].forEach(function (evt) {
|
215
|
+
Array.prototype.forEach.call(self.element.querySelectorAll("[data-" + evt + "]"), function (el) {
|
216
|
+
return bind(el, "mousedown", onClick(self[evt]));
|
217
|
+
});
|
218
|
+
});
|
219
|
+
}
|
220
|
+
|
221
|
+
if (self.isMobile) return setupMobile();
|
222
|
+
|
223
|
+
self.debouncedResize = debounce(onResize, 50);
|
224
|
+
self.triggerChange = function () {
|
225
|
+
triggerEvent("Change");
|
226
|
+
};
|
227
|
+
self.debouncedChange = debounce(self.triggerChange, 300);
|
228
|
+
|
229
|
+
if (self.config.mode === "range" && self.daysContainer) bind(self.daysContainer, "mouseover", function (e) {
|
230
|
+
return onMouseOver(e.target);
|
231
|
+
});
|
232
|
+
|
233
|
+
bind(window.document.body, "keydown", onKeyDown);
|
234
|
+
|
235
|
+
if (!self.config.static) bind(self._input, "keydown", onKeyDown);
|
236
|
+
|
237
|
+
if (!self.config.inline && !self.config.static) bind(window, "resize", self.debouncedResize);
|
238
|
+
|
239
|
+
if (window.ontouchstart !== undefined) bind(window.document, "touchstart", documentClick);
|
240
|
+
|
241
|
+
bind(window.document, "mousedown", onClick(documentClick));
|
242
|
+
bind(self._input, "blur", documentClick);
|
243
|
+
|
244
|
+
if (self.config.clickOpens === true) {
|
245
|
+
bind(self._input, "focus", self.open);
|
246
|
+
bind(self._input, "mousedown", onClick(self.open));
|
247
|
+
}
|
248
|
+
|
249
|
+
if (!self.config.noCalendar) {
|
250
|
+
self.monthNav.addEventListener("wheel", function (e) {
|
251
|
+
return e.preventDefault();
|
252
|
+
});
|
253
|
+
bind(self.monthNav, "wheel", debounce(onMonthNavScroll, 10));
|
254
|
+
bind(self.monthNav, "mousedown", onClick(onMonthNavClick));
|
255
|
+
|
256
|
+
bind(self.monthNav, ["keyup", "increment"], onYearInput);
|
257
|
+
bind(self.daysContainer, "mousedown", onClick(selectDate));
|
258
|
+
|
259
|
+
if (self.config.animate) {
|
260
|
+
bind(self.daysContainer, ["webkitAnimationEnd", "animationend"], animateDays);
|
261
|
+
bind(self.monthNav, ["webkitAnimationEnd", "animationend"], animateMonths);
|
262
|
+
}
|
263
|
+
}
|
264
|
+
|
265
|
+
if (self.config.enableTime) {
|
266
|
+
var selText = function selText(e) {
|
267
|
+
return e.target.select();
|
268
|
+
};
|
269
|
+
bind(self.timeContainer, ["wheel", "input", "increment"], updateTime);
|
270
|
+
bind(self.timeContainer, "mousedown", onClick(timeIncrement));
|
271
|
+
|
272
|
+
bind(self.timeContainer, ["wheel", "increment"], self.debouncedChange);
|
273
|
+
bind(self.timeContainer, "input", self.triggerChange);
|
274
|
+
|
275
|
+
bind([self.hourElement, self.minuteElement], "focus", selText);
|
276
|
+
|
277
|
+
if (self.secondElement !== undefined) bind(self.secondElement, "focus", function () {
|
278
|
+
return self.secondElement.select();
|
279
|
+
});
|
280
|
+
|
281
|
+
if (self.amPM !== undefined) {
|
282
|
+
bind(self.amPM, "mousedown", onClick(function (e) {
|
283
|
+
updateTime(e);
|
284
|
+
self.triggerChange(e);
|
285
|
+
}));
|
286
|
+
}
|
287
|
+
}
|
288
|
+
}
|
289
|
+
|
290
|
+
function processPostDayAnimation() {
|
291
|
+
for (var i = self._animationLoop.length; i--;) {
|
292
|
+
self._animationLoop[i]();
|
293
|
+
self._animationLoop.splice(i, 1);
|
294
|
+
}
|
295
|
+
}
|
296
|
+
|
297
|
+
/**
|
298
|
+
* Removes the day container that slided out of view
|
299
|
+
* @param {Event} e the animation event
|
300
|
+
*/
|
301
|
+
function animateDays(e) {
|
302
|
+
if (self.daysContainer.childNodes.length > 1) {
|
303
|
+
switch (e.animationName) {
|
304
|
+
case "fpSlideLeft":
|
305
|
+
self.daysContainer.lastChild.classList.remove("slideLeftNew");
|
306
|
+
self.daysContainer.removeChild(self.daysContainer.firstChild);
|
307
|
+
self.days = self.daysContainer.firstChild;
|
308
|
+
processPostDayAnimation();
|
309
|
+
|
310
|
+
break;
|
311
|
+
|
312
|
+
case "fpSlideRight":
|
313
|
+
self.daysContainer.firstChild.classList.remove("slideRightNew");
|
314
|
+
self.daysContainer.removeChild(self.daysContainer.lastChild);
|
315
|
+
self.days = self.daysContainer.firstChild;
|
316
|
+
processPostDayAnimation();
|
317
|
+
|
318
|
+
break;
|
319
|
+
|
320
|
+
default:
|
321
|
+
break;
|
322
|
+
}
|
323
|
+
}
|
324
|
+
}
|
325
|
+
|
326
|
+
/**
|
327
|
+
* Removes the month element that animated out of view
|
328
|
+
* @param {Event} e the animation event
|
329
|
+
*/
|
330
|
+
function animateMonths(e) {
|
331
|
+
switch (e.animationName) {
|
332
|
+
case "fpSlideLeftNew":
|
333
|
+
case "fpSlideRightNew":
|
334
|
+
self.navigationCurrentMonth.classList.remove("slideLeftNew");
|
335
|
+
self.navigationCurrentMonth.classList.remove("slideRightNew");
|
336
|
+
var nav = self.navigationCurrentMonth;
|
337
|
+
|
338
|
+
while (nav.nextSibling && /curr/.test(nav.nextSibling.className)) {
|
339
|
+
self.monthNav.removeChild(nav.nextSibling);
|
340
|
+
}while (nav.previousSibling && /curr/.test(nav.previousSibling.className)) {
|
341
|
+
self.monthNav.removeChild(nav.previousSibling);
|
342
|
+
}self.oldCurMonth = null;
|
343
|
+
break;
|
344
|
+
}
|
345
|
+
}
|
346
|
+
|
347
|
+
/**
|
348
|
+
* Set the calendar view to a particular date.
|
349
|
+
* @param {Date} jumpDate the date to set the view to
|
350
|
+
*/
|
351
|
+
function jumpToDate(jumpDate) {
|
352
|
+
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);
|
353
|
+
|
354
|
+
try {
|
355
|
+
self.currentYear = jumpDate.getFullYear();
|
356
|
+
self.currentMonth = jumpDate.getMonth();
|
357
|
+
} catch (e) {
|
358
|
+
/* istanbul ignore next */
|
359
|
+
console.error(e.stack);
|
360
|
+
/* istanbul ignore next */
|
361
|
+
console.warn("Invalid date supplied: " + jumpDate);
|
362
|
+
}
|
363
|
+
|
364
|
+
self.redraw();
|
365
|
+
}
|
366
|
+
|
367
|
+
/**
|
368
|
+
* The up/down arrow handler for time inputs
|
369
|
+
* @param {Event} e the click event
|
370
|
+
*/
|
371
|
+
function timeIncrement(e) {
|
372
|
+
if (~e.target.className.indexOf("arrow")) incrementNumInput(e, e.target.classList.contains("arrowUp") ? 1 : -1);
|
373
|
+
}
|
374
|
+
|
375
|
+
/**
|
376
|
+
* Increments/decrements the value of input associ-
|
377
|
+
* ated with the up/down arrow by dispatching an
|
378
|
+
* "increment" event on the input.
|
379
|
+
*
|
380
|
+
* @param {Event} e the click event
|
381
|
+
* @param {Number} delta the diff (usually 1 or -1)
|
382
|
+
* @param {Element} inputElem the input element
|
383
|
+
*/
|
384
|
+
function incrementNumInput(e, delta, inputElem) {
|
385
|
+
var input = inputElem || e.target.parentNode.childNodes[0];
|
386
|
+
var event = createEvent("increment");
|
387
|
+
event.delta = delta;
|
388
|
+
input.dispatchEvent(event);
|
389
|
+
}
|
390
|
+
|
391
|
+
function createNumberInput(inputClassName) {
|
392
|
+
var wrapper = createElement("div", "numInputWrapper"),
|
393
|
+
numInput = createElement("input", "numInput " + inputClassName),
|
394
|
+
arrowUp = createElement("span", "arrowUp"),
|
395
|
+
arrowDown = createElement("span", "arrowDown");
|
396
|
+
|
397
|
+
numInput.type = "text";
|
398
|
+
numInput.pattern = "\\d*";
|
399
|
+
|
400
|
+
wrapper.appendChild(numInput);
|
401
|
+
wrapper.appendChild(arrowUp);
|
402
|
+
wrapper.appendChild(arrowDown);
|
403
|
+
|
404
|
+
return wrapper;
|
405
|
+
}
|
406
|
+
|
407
|
+
function build() {
|
408
|
+
var fragment = window.document.createDocumentFragment();
|
409
|
+
self.calendarContainer = createElement("div", "flatpickr-calendar");
|
410
|
+
self.calendarContainer.tabIndex = -1;
|
411
|
+
|
412
|
+
if (!self.config.noCalendar) {
|
413
|
+
fragment.appendChild(buildMonthNav());
|
414
|
+
self.innerContainer = createElement("div", "flatpickr-innerContainer");
|
415
|
+
|
416
|
+
if (self.config.weekNumbers) self.innerContainer.appendChild(buildWeeks());
|
417
|
+
|
418
|
+
self.rContainer = createElement("div", "flatpickr-rContainer");
|
419
|
+
self.rContainer.appendChild(buildWeekdays());
|
420
|
+
|
421
|
+
if (!self.daysContainer) {
|
422
|
+
self.daysContainer = createElement("div", "flatpickr-days");
|
423
|
+
self.daysContainer.tabIndex = -1;
|
424
|
+
}
|
425
|
+
|
426
|
+
buildDays();
|
427
|
+
self.rContainer.appendChild(self.daysContainer);
|
428
|
+
|
429
|
+
self.innerContainer.appendChild(self.rContainer);
|
430
|
+
fragment.appendChild(self.innerContainer);
|
431
|
+
}
|
432
|
+
|
433
|
+
if (self.config.enableTime) fragment.appendChild(buildTime());
|
434
|
+
|
435
|
+
toggleClass(self.calendarContainer, "rangeMode", self.config.mode === "range");
|
436
|
+
toggleClass(self.calendarContainer, "animate", self.config.animate);
|
437
|
+
|
438
|
+
self.calendarContainer.appendChild(fragment);
|
439
|
+
|
440
|
+
var customAppend = self.config.appendTo && self.config.appendTo.nodeType;
|
441
|
+
|
442
|
+
if (self.config.inline || self.config.static) {
|
443
|
+
self.calendarContainer.classList.add(self.config.inline ? "inline" : "static");
|
444
|
+
|
445
|
+
if (self.config.inline && !customAppend) {
|
446
|
+
return self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);
|
447
|
+
}
|
448
|
+
|
449
|
+
if (self.config.static) {
|
450
|
+
var wrapper = createElement("div", "flatpickr-wrapper");
|
451
|
+
self.element.parentNode.insertBefore(wrapper, self.element);
|
452
|
+
wrapper.appendChild(self.element);
|
453
|
+
|
454
|
+
if (self.altInput) wrapper.appendChild(self.altInput);
|
455
|
+
|
456
|
+
wrapper.appendChild(self.calendarContainer);
|
457
|
+
return;
|
458
|
+
}
|
459
|
+
}
|
460
|
+
|
461
|
+
(customAppend ? self.config.appendTo : window.document.body).appendChild(self.calendarContainer);
|
462
|
+
}
|
463
|
+
|
464
|
+
function createDay(className, date, dayNumber, i) {
|
465
|
+
var dateIsEnabled = isEnabled(date, true),
|
466
|
+
dayElement = createElement("span", "flatpickr-day " + className, date.getDate());
|
467
|
+
|
468
|
+
dayElement.dateObj = date;
|
469
|
+
dayElement.$i = i;
|
470
|
+
dayElement.setAttribute("aria-label", self.formatDate(date, self.config.ariaDateFormat));
|
471
|
+
|
472
|
+
if (compareDates(date, self.now) === 0) {
|
473
|
+
self.todayDateElem = dayElement;
|
474
|
+
dayElement.classList.add("today");
|
475
|
+
}
|
476
|
+
|
477
|
+
if (dateIsEnabled) {
|
478
|
+
dayElement.tabIndex = -1;
|
479
|
+
if (isDateSelected(date)) {
|
480
|
+
dayElement.classList.add("selected");
|
481
|
+
self.selectedDateElem = dayElement;
|
482
|
+
if (self.config.mode === "range") {
|
483
|
+
toggleClass(dayElement, "startRange", compareDates(date, self.selectedDates[0]) === 0);
|
484
|
+
|
485
|
+
toggleClass(dayElement, "endRange", compareDates(date, self.selectedDates[1]) === 0);
|
486
|
+
}
|
487
|
+
}
|
488
|
+
} else {
|
489
|
+
dayElement.classList.add("disabled");
|
490
|
+
if (self.selectedDates[0] && date > self.minRangeDate && date < self.selectedDates[0]) self.minRangeDate = date;else if (self.selectedDates[0] && date < self.maxRangeDate && date > self.selectedDates[0]) self.maxRangeDate = date;
|
491
|
+
}
|
492
|
+
|
493
|
+
if (self.config.mode === "range") {
|
494
|
+
if (isDateInRange(date) && !isDateSelected(date)) dayElement.classList.add("inRange");
|
495
|
+
|
496
|
+
if (self.selectedDates.length === 1 && (date < self.minRangeDate || date > self.maxRangeDate)) dayElement.classList.add("notAllowed");
|
497
|
+
}
|
498
|
+
|
499
|
+
if (self.config.weekNumbers && className !== "prevMonthDay" && dayNumber % 7 === 1) {
|
500
|
+
self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" + self.config.getWeek(date) + "</span>");
|
501
|
+
}
|
502
|
+
|
503
|
+
triggerEvent("DayCreate", dayElement);
|
504
|
+
|
505
|
+
return dayElement;
|
506
|
+
}
|
507
|
+
|
508
|
+
function focusOnDay(currentIndex, offset) {
|
509
|
+
var newIndex = currentIndex + offset || 0,
|
510
|
+
targetNode = currentIndex !== undefined ? self.days.childNodes[newIndex] : self.selectedDateElem || self.todayDateElem || self.days.childNodes[0],
|
511
|
+
focus = function focus() {
|
512
|
+
targetNode = targetNode || self.days.childNodes[newIndex];
|
513
|
+
targetNode.focus();
|
514
|
+
|
515
|
+
if (self.config.mode === "range") onMouseOver(targetNode);
|
516
|
+
};
|
517
|
+
|
518
|
+
if (targetNode === undefined && offset !== 0) {
|
519
|
+
if (offset > 0) {
|
520
|
+
self.changeMonth(1);
|
521
|
+
newIndex = newIndex % 42;
|
522
|
+
} else if (offset < 0) {
|
523
|
+
self.changeMonth(-1);
|
524
|
+
newIndex += 42;
|
525
|
+
}
|
526
|
+
|
527
|
+
return afterDayAnim(focus);
|
528
|
+
}
|
529
|
+
|
530
|
+
focus();
|
531
|
+
}
|
532
|
+
|
533
|
+
function afterDayAnim(fn) {
|
534
|
+
if (self.config.animate === true) return self._animationLoop.push(fn);
|
535
|
+
fn();
|
536
|
+
}
|
537
|
+
|
538
|
+
function buildDays(delta) {
|
539
|
+
var firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7,
|
540
|
+
isRangeMode = self.config.mode === "range";
|
541
|
+
|
542
|
+
self.prevMonthDays = self.utils.getDaysinMonth((self.currentMonth - 1 + 12) % 12);
|
543
|
+
self.selectedDateElem = undefined;
|
544
|
+
self.todayDateElem = undefined;
|
545
|
+
|
546
|
+
var daysInMonth = self.utils.getDaysinMonth(),
|
547
|
+
days = window.document.createDocumentFragment();
|
548
|
+
|
549
|
+
var dayNumber = self.prevMonthDays + 1 - firstOfMonth,
|
550
|
+
dayIndex = 0;
|
551
|
+
|
552
|
+
if (self.config.weekNumbers && self.weekNumbers.firstChild) self.weekNumbers.textContent = "";
|
553
|
+
|
554
|
+
if (isRangeMode) {
|
555
|
+
// const dateLimits = self.config.enable.length || self.config.disable.length || self.config.mixDate || self.config.maxDate;
|
556
|
+
self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
|
557
|
+
self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - firstOfMonth) % daysInMonth);
|
558
|
+
}
|
559
|
+
|
560
|
+
// prepend days from the ending of previous month
|
561
|
+
for (; dayNumber <= self.prevMonthDays; dayNumber++, dayIndex++) {
|
562
|
+
days.appendChild(createDay("prevMonthDay", new Date(self.currentYear, self.currentMonth - 1, dayNumber), dayNumber, dayIndex));
|
563
|
+
}
|
564
|
+
|
565
|
+
// Start at 1 since there is no 0th day
|
566
|
+
for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {
|
567
|
+
days.appendChild(createDay("", new Date(self.currentYear, self.currentMonth, dayNumber), dayNumber, dayIndex));
|
568
|
+
}
|
569
|
+
|
570
|
+
// append days from the next month
|
571
|
+
for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth; dayNum++, dayIndex++) {
|
572
|
+
days.appendChild(createDay("nextMonthDay", new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth), dayNum, dayIndex));
|
573
|
+
}
|
574
|
+
|
575
|
+
if (isRangeMode && self.selectedDates.length === 1 && days.childNodes[0]) {
|
576
|
+
self._hidePrevMonthArrow = self._hidePrevMonthArrow || self.minRangeDate > days.childNodes[0].dateObj;
|
577
|
+
|
578
|
+
self._hideNextMonthArrow = self._hideNextMonthArrow || self.maxRangeDate < new Date(self.currentYear, self.currentMonth + 1, 1);
|
579
|
+
} else updateNavigationCurrentMonth();
|
580
|
+
|
581
|
+
var dayContainer = createElement("div", "dayContainer");
|
582
|
+
dayContainer.appendChild(days);
|
583
|
+
|
584
|
+
if (!self.config.animate || delta === undefined) clearNode(self.daysContainer);else {
|
585
|
+
while (self.daysContainer.childNodes.length > 1) {
|
586
|
+
self.daysContainer.removeChild(self.daysContainer.firstChild);
|
587
|
+
}
|
588
|
+
}
|
589
|
+
|
590
|
+
if (delta >= 0) self.daysContainer.appendChild(dayContainer);else self.daysContainer.insertBefore(dayContainer, self.daysContainer.firstChild);
|
591
|
+
|
592
|
+
self.days = self.daysContainer.firstChild;
|
593
|
+
return self.daysContainer;
|
594
|
+
}
|
595
|
+
|
596
|
+
function clearNode(node) {
|
597
|
+
while (node.firstChild) {
|
598
|
+
node.removeChild(node.firstChild);
|
599
|
+
}
|
600
|
+
}
|
601
|
+
|
602
|
+
function buildMonthNav() {
|
603
|
+
var monthNavFragment = window.document.createDocumentFragment();
|
604
|
+
self.monthNav = createElement("div", "flatpickr-month");
|
605
|
+
|
606
|
+
self.prevMonthNav = createElement("span", "flatpickr-prev-month");
|
607
|
+
self.prevMonthNav.innerHTML = self.config.prevArrow;
|
608
|
+
|
609
|
+
self.currentMonthElement = createElement("span", "cur-month");
|
610
|
+
self.currentMonthElement.title = self.l10n.scrollTitle;
|
611
|
+
|
612
|
+
var yearInput = createNumberInput("cur-year");
|
613
|
+
self.currentYearElement = yearInput.childNodes[0];
|
614
|
+
self.currentYearElement.title = self.l10n.scrollTitle;
|
615
|
+
|
616
|
+
if (self.config.minDate) self.currentYearElement.min = self.config.minDate.getFullYear();
|
617
|
+
|
618
|
+
if (self.config.maxDate) {
|
619
|
+
self.currentYearElement.max = self.config.maxDate.getFullYear();
|
620
|
+
|
621
|
+
self.currentYearElement.disabled = self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();
|
622
|
+
}
|
623
|
+
|
624
|
+
self.nextMonthNav = createElement("span", "flatpickr-next-month");
|
625
|
+
self.nextMonthNav.innerHTML = self.config.nextArrow;
|
626
|
+
|
627
|
+
self.navigationCurrentMonth = createElement("span", "flatpickr-current-month");
|
628
|
+
self.navigationCurrentMonth.appendChild(self.currentMonthElement);
|
629
|
+
self.navigationCurrentMonth.appendChild(yearInput);
|
630
|
+
|
631
|
+
monthNavFragment.appendChild(self.prevMonthNav);
|
632
|
+
monthNavFragment.appendChild(self.navigationCurrentMonth);
|
633
|
+
monthNavFragment.appendChild(self.nextMonthNav);
|
634
|
+
self.monthNav.appendChild(monthNavFragment);
|
635
|
+
|
636
|
+
Object.defineProperty(self, "_hidePrevMonthArrow", {
|
637
|
+
get: function get() {
|
638
|
+
return this.__hidePrevMonthArrow;
|
639
|
+
},
|
640
|
+
set: function set(bool) {
|
641
|
+
if (this.__hidePrevMonthArrow !== bool) self.prevMonthNav.style.display = bool ? "none" : "block";
|
642
|
+
this.__hidePrevMonthArrow = bool;
|
643
|
+
}
|
644
|
+
});
|
645
|
+
|
646
|
+
Object.defineProperty(self, "_hideNextMonthArrow", {
|
647
|
+
get: function get() {
|
648
|
+
return this.__hideNextMonthArrow;
|
649
|
+
},
|
650
|
+
set: function set(bool) {
|
651
|
+
if (this.__hideNextMonthArrow !== bool) self.nextMonthNav.style.display = bool ? "none" : "block";
|
652
|
+
this.__hideNextMonthArrow = bool;
|
653
|
+
}
|
654
|
+
});
|
655
|
+
|
656
|
+
updateNavigationCurrentMonth();
|
657
|
+
|
658
|
+
return self.monthNav;
|
659
|
+
}
|
660
|
+
|
661
|
+
function buildTime() {
|
662
|
+
self.calendarContainer.classList.add("hasTime");
|
663
|
+
if (self.config.noCalendar) self.calendarContainer.classList.add("noCalendar");
|
664
|
+
self.timeContainer = createElement("div", "flatpickr-time");
|
665
|
+
self.timeContainer.tabIndex = -1;
|
666
|
+
var separator = createElement("span", "flatpickr-time-separator", ":");
|
667
|
+
|
668
|
+
var hourInput = createNumberInput("flatpickr-hour");
|
669
|
+
self.hourElement = hourInput.childNodes[0];
|
670
|
+
|
671
|
+
var minuteInput = createNumberInput("flatpickr-minute");
|
672
|
+
self.minuteElement = minuteInput.childNodes[0];
|
673
|
+
|
674
|
+
self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;
|
675
|
+
|
676
|
+
self.hourElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.defaultHour % (self.time_24hr ? 24 : 12));
|
677
|
+
|
678
|
+
self.minuteElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute);
|
679
|
+
|
680
|
+
self.hourElement.step = self.config.hourIncrement;
|
681
|
+
self.minuteElement.step = self.config.minuteIncrement;
|
682
|
+
|
683
|
+
self.hourElement.min = self.config.time_24hr ? 0 : 1;
|
684
|
+
self.hourElement.max = self.config.time_24hr ? 23 : 12;
|
685
|
+
|
686
|
+
self.minuteElement.min = 0;
|
687
|
+
self.minuteElement.max = 59;
|
688
|
+
|
689
|
+
self.hourElement.title = self.minuteElement.title = self.l10n.scrollTitle;
|
690
|
+
|
691
|
+
self.timeContainer.appendChild(hourInput);
|
692
|
+
self.timeContainer.appendChild(separator);
|
693
|
+
self.timeContainer.appendChild(minuteInput);
|
694
|
+
|
695
|
+
if (self.config.time_24hr) self.timeContainer.classList.add("time24hr");
|
696
|
+
|
697
|
+
if (self.config.enableSeconds) {
|
698
|
+
self.timeContainer.classList.add("hasSeconds");
|
699
|
+
|
700
|
+
var secondInput = createNumberInput("flatpickr-second");
|
701
|
+
self.secondElement = secondInput.childNodes[0];
|
702
|
+
|
703
|
+
self.secondElement.value = self.pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getSeconds() : self.config.defaultSeconds);
|
704
|
+
|
705
|
+
self.secondElement.step = self.minuteElement.step;
|
706
|
+
self.secondElement.min = self.minuteElement.min;
|
707
|
+
self.secondElement.max = self.minuteElement.max;
|
708
|
+
|
709
|
+
self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":"));
|
710
|
+
self.timeContainer.appendChild(secondInput);
|
711
|
+
}
|
712
|
+
|
713
|
+
if (!self.config.time_24hr) {
|
714
|
+
// add self.amPM if appropriate
|
715
|
+
self.amPM = createElement("span", "flatpickr-am-pm", ["AM", "PM"][(self.latestSelectedDateObj ? self.hourElement.value : self.config.defaultHour) > 11 | 0]);
|
716
|
+
self.amPM.title = self.l10n.toggleTitle;
|
717
|
+
self.amPM.tabIndex = -1;
|
718
|
+
self.timeContainer.appendChild(self.amPM);
|
719
|
+
}
|
720
|
+
|
721
|
+
return self.timeContainer;
|
722
|
+
}
|
723
|
+
|
724
|
+
function buildWeekdays() {
|
725
|
+
if (!self.weekdayContainer) self.weekdayContainer = createElement("div", "flatpickr-weekdays");
|
726
|
+
|
727
|
+
var firstDayOfWeek = self.l10n.firstDayOfWeek;
|
728
|
+
var weekdays = self.l10n.weekdays.shorthand.slice();
|
729
|
+
|
730
|
+
if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {
|
731
|
+
weekdays = [].concat(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));
|
732
|
+
}
|
733
|
+
|
734
|
+
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";
|
735
|
+
|
736
|
+
return self.weekdayContainer;
|
737
|
+
}
|
738
|
+
|
739
|
+
/* istanbul ignore next */
|
740
|
+
function buildWeeks() {
|
741
|
+
self.calendarContainer.classList.add("hasWeeks");
|
742
|
+
self.weekWrapper = createElement("div", "flatpickr-weekwrapper");
|
743
|
+
self.weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
|
744
|
+
self.weekNumbers = createElement("div", "flatpickr-weeks");
|
745
|
+
self.weekWrapper.appendChild(self.weekNumbers);
|
746
|
+
|
747
|
+
return self.weekWrapper;
|
748
|
+
}
|
749
|
+
|
750
|
+
function changeMonth(value, is_offset, animate) {
|
751
|
+
is_offset = is_offset === undefined || is_offset;
|
752
|
+
var delta = is_offset ? value : value - self.currentMonth;
|
753
|
+
var skipAnimations = !self.config.animate || animate === false;
|
754
|
+
|
755
|
+
if (delta < 0 && self._hidePrevMonthArrow || delta > 0 && self._hideNextMonthArrow) return;
|
756
|
+
|
757
|
+
self.currentMonth += delta;
|
758
|
+
|
759
|
+
if (self.currentMonth < 0 || self.currentMonth > 11) {
|
760
|
+
self.currentYear += self.currentMonth > 11 ? 1 : -1;
|
761
|
+
self.currentMonth = (self.currentMonth + 12) % 12;
|
762
|
+
|
763
|
+
triggerEvent("YearChange");
|
764
|
+
}
|
765
|
+
|
766
|
+
buildDays(!skipAnimations ? delta : undefined);
|
767
|
+
|
768
|
+
if (skipAnimations) {
|
769
|
+
triggerEvent("MonthChange");
|
770
|
+
return updateNavigationCurrentMonth();
|
771
|
+
}
|
772
|
+
|
773
|
+
// remove possible remnants from clicking too fast
|
774
|
+
var nav = self.navigationCurrentMonth;
|
775
|
+
if (delta < 0) {
|
776
|
+
while (nav.nextSibling && /curr/.test(nav.nextSibling.className)) {
|
777
|
+
self.monthNav.removeChild(nav.nextSibling);
|
778
|
+
}
|
779
|
+
} else if (delta > 0) {
|
780
|
+
while (nav.previousSibling && /curr/.test(nav.previousSibling.className)) {
|
781
|
+
self.monthNav.removeChild(nav.previousSibling);
|
782
|
+
}
|
783
|
+
}
|
784
|
+
|
785
|
+
self.oldCurMonth = self.navigationCurrentMonth;
|
786
|
+
|
787
|
+
self.navigationCurrentMonth = self.monthNav.insertBefore(self.oldCurMonth.cloneNode(true), delta > 0 ? self.oldCurMonth.nextSibling : self.oldCurMonth);
|
788
|
+
|
789
|
+
if (delta > 0) {
|
790
|
+
self.daysContainer.firstChild.classList.add("slideLeft");
|
791
|
+
self.daysContainer.lastChild.classList.add("slideLeftNew");
|
792
|
+
|
793
|
+
self.oldCurMonth.classList.add("slideLeft");
|
794
|
+
self.navigationCurrentMonth.classList.add("slideLeftNew");
|
795
|
+
} else if (delta < 0) {
|
796
|
+
self.daysContainer.firstChild.classList.add("slideRightNew");
|
797
|
+
self.daysContainer.lastChild.classList.add("slideRight");
|
798
|
+
|
799
|
+
self.oldCurMonth.classList.add("slideRight");
|
800
|
+
self.navigationCurrentMonth.classList.add("slideRightNew");
|
801
|
+
}
|
802
|
+
|
803
|
+
self.currentMonthElement = self.navigationCurrentMonth.firstChild;
|
804
|
+
self.currentYearElement = self.navigationCurrentMonth.lastChild.childNodes[0];
|
805
|
+
|
806
|
+
updateNavigationCurrentMonth();
|
807
|
+
self.oldCurMonth.firstChild.textContent = self.utils.monthToStr(self.currentMonth - delta);
|
808
|
+
|
809
|
+
triggerEvent("MonthChange");
|
810
|
+
|
811
|
+
if (document.activeElement && document.activeElement.$i) {
|
812
|
+
var index = document.activeElement.$i;
|
813
|
+
afterDayAnim(function () {
|
814
|
+
focusOnDay(index, 0);
|
815
|
+
});
|
816
|
+
}
|
817
|
+
}
|
818
|
+
|
819
|
+
function clear(triggerChangeEvent) {
|
820
|
+
self.input.value = "";
|
821
|
+
|
822
|
+
if (self.altInput) self.altInput.value = "";
|
823
|
+
|
824
|
+
if (self.mobileInput) self.mobileInput.value = "";
|
825
|
+
|
826
|
+
self.selectedDates = [];
|
827
|
+
self.latestSelectedDateObj = undefined;
|
828
|
+
self.showTimeInput = false;
|
829
|
+
|
830
|
+
self.redraw();
|
831
|
+
|
832
|
+
if (triggerChangeEvent !== false)
|
833
|
+
// triggerChangeEvent is true (default) or an Event
|
834
|
+
triggerEvent("Change");
|
835
|
+
}
|
836
|
+
|
837
|
+
function close() {
|
838
|
+
self.isOpen = false;
|
839
|
+
|
840
|
+
if (!self.isMobile) {
|
841
|
+
self.calendarContainer.classList.remove("open");
|
842
|
+
self._input.classList.remove("active");
|
843
|
+
}
|
844
|
+
|
845
|
+
triggerEvent("Close");
|
846
|
+
}
|
847
|
+
|
848
|
+
function destroy() {
|
849
|
+
if (self.config !== undefined) triggerEvent("Destroy");
|
850
|
+
|
851
|
+
for (var i = self._handlers.length; i--;) {
|
852
|
+
var h = self._handlers[i];
|
853
|
+
h.element.removeEventListener(h.event, h.handler);
|
854
|
+
}
|
855
|
+
|
856
|
+
self._handlers = [];
|
857
|
+
|
858
|
+
if (self.mobileInput) {
|
859
|
+
if (self.mobileInput.parentNode) self.mobileInput.parentNode.removeChild(self.mobileInput);
|
860
|
+
self.mobileInput = null;
|
861
|
+
} else if (self.calendarContainer && self.calendarContainer.parentNode) self.calendarContainer.parentNode.removeChild(self.calendarContainer);
|
862
|
+
|
863
|
+
if (self.altInput) {
|
864
|
+
self.input.type = "text";
|
865
|
+
if (self.altInput.parentNode) self.altInput.parentNode.removeChild(self.altInput);
|
866
|
+
delete self.altInput;
|
867
|
+
}
|
868
|
+
|
869
|
+
if (self.input) {
|
870
|
+
self.input.type = self.input._type;
|
871
|
+
self.input.classList.remove("flatpickr-input");
|
872
|
+
self.input.removeAttribute("readonly");
|
873
|
+
self.input.value = "";
|
874
|
+
}
|
875
|
+
|
876
|
+
["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach(function (k) {
|
877
|
+
try {
|
878
|
+
delete self[k];
|
879
|
+
} catch (e) {}
|
880
|
+
});
|
881
|
+
}
|
882
|
+
|
883
|
+
function isCalendarElem(elem) {
|
884
|
+
if (self.config.appendTo && self.config.appendTo.contains(elem)) return true;
|
885
|
+
|
886
|
+
return self.calendarContainer.contains(elem);
|
887
|
+
}
|
888
|
+
|
889
|
+
function documentClick(e) {
|
890
|
+
if (self.isOpen && !self.config.inline) {
|
891
|
+
var isCalendarElement = isCalendarElem(e.target);
|
892
|
+
var isInput = e.target === self.input || e.target === self.altInput || self.element.contains(e.target) ||
|
893
|
+
// web components
|
894
|
+
e.path && e.path.indexOf && (~e.path.indexOf(self.input) || ~e.path.indexOf(self.altInput));
|
895
|
+
|
896
|
+
var lostFocus = e.type === "blur" ? isInput && e.relatedTarget && !isCalendarElem(e.relatedTarget) : !isInput && !isCalendarElement;
|
897
|
+
|
898
|
+
if (lostFocus && self.config.ignoredFocusElements.indexOf(e.target) === -1) {
|
899
|
+
self.close();
|
900
|
+
|
901
|
+
if (self.config.mode === "range" && self.selectedDates.length === 1) {
|
902
|
+
self.clear(false);
|
903
|
+
self.redraw();
|
904
|
+
}
|
905
|
+
}
|
906
|
+
}
|
907
|
+
}
|
908
|
+
|
909
|
+
function changeYear(newYear) {
|
910
|
+
if (!newYear || self.currentYearElement.min && newYear < self.currentYearElement.min || self.currentYearElement.max && newYear > self.currentYearElement.max) return;
|
911
|
+
|
912
|
+
var newYearNum = parseInt(newYear, 10),
|
913
|
+
isNewYear = self.currentYear !== newYearNum;
|
914
|
+
|
915
|
+
self.currentYear = newYearNum || self.currentYear;
|
916
|
+
|
917
|
+
if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) {
|
918
|
+
self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);
|
919
|
+
} else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) {
|
920
|
+
self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);
|
921
|
+
}
|
922
|
+
|
923
|
+
if (isNewYear) {
|
924
|
+
self.redraw();
|
925
|
+
triggerEvent("YearChange");
|
926
|
+
}
|
927
|
+
}
|
928
|
+
|
929
|
+
function isEnabled(date, timeless) {
|
930
|
+
if (self.config.minDate && compareDates(date, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0 || self.config.maxDate && compareDates(date, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0) return false;
|
931
|
+
|
932
|
+
if (!self.config.enable.length && !self.config.disable.length) return true;
|
933
|
+
|
934
|
+
var dateToCheck = self.parseDate(date, null, true); // timeless
|
935
|
+
|
936
|
+
var bool = self.config.enable.length > 0,
|
937
|
+
array = bool ? self.config.enable : self.config.disable;
|
938
|
+
|
939
|
+
for (var i = 0, d; i < array.length; i++) {
|
940
|
+
d = array[i];
|
941
|
+
|
942
|
+
if (d instanceof Function && d(dateToCheck)) // disabled by function
|
943
|
+
return bool;else if (d instanceof Date && d.getTime() === dateToCheck.getTime())
|
944
|
+
// disabled by date
|
945
|
+
return bool;else if (typeof d === "string" && self.parseDate(d, null, true).getTime() === dateToCheck.getTime())
|
946
|
+
// disabled by date string
|
947
|
+
return bool;else if ( // disabled by range
|
948
|
+
(typeof d === "undefined" ? "undefined" : _typeof(d)) === "object" && d.from && d.to && dateToCheck >= d.from && dateToCheck <= d.to) return bool;
|
949
|
+
}
|
950
|
+
|
951
|
+
return !bool;
|
952
|
+
}
|
953
|
+
|
954
|
+
function onKeyDown(e) {
|
955
|
+
var isInput = e.target === self._input;
|
956
|
+
var calendarElem = isCalendarElem(e.target);
|
957
|
+
var allowInput = self.config.allowInput;
|
958
|
+
var allowKeydown = self.isOpen && (!allowInput || !isInput);
|
959
|
+
var allowInlineKeydown = self.config.inline && isInput && !allowInput;
|
960
|
+
|
961
|
+
if (e.key === "Enter" && allowInput && isInput) {
|
962
|
+
self.setDate(self._input.value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat);
|
963
|
+
return e.target.blur();
|
964
|
+
} else if (calendarElem || allowKeydown || allowInlineKeydown) {
|
965
|
+
var isTimeObj = self.timeContainer && self.timeContainer.contains(e.target);
|
966
|
+
switch (e.key) {
|
967
|
+
case "Enter":
|
968
|
+
if (isTimeObj) updateValue();else selectDate(e);
|
969
|
+
|
970
|
+
break;
|
971
|
+
|
972
|
+
case "Escape":
|
973
|
+
// escape
|
974
|
+
e.preventDefault();
|
975
|
+
self.close();
|
976
|
+
break;
|
977
|
+
|
978
|
+
case "Backspace":
|
979
|
+
case "Delete":
|
980
|
+
if (!self.config.allowInput) self.clear();
|
981
|
+
break;
|
982
|
+
|
983
|
+
case "ArrowLeft":
|
984
|
+
case "ArrowRight":
|
985
|
+
if (!isTimeObj) {
|
986
|
+
e.preventDefault();
|
987
|
+
|
988
|
+
if (self.daysContainer) {
|
989
|
+
var _delta = e.key === "ArrowRight" ? 1 : -1;
|
990
|
+
|
991
|
+
if (!e.ctrlKey) focusOnDay(e.target.$i, _delta);else changeMonth(_delta, true);
|
992
|
+
} else if (self.config.enableTime && !isTimeObj) self.hourElement.focus();
|
993
|
+
}
|
994
|
+
|
995
|
+
break;
|
996
|
+
|
997
|
+
case "ArrowUp":
|
998
|
+
case "ArrowDown":
|
999
|
+
e.preventDefault();
|
1000
|
+
var delta = e.key === "ArrowDown" ? 1 : -1;
|
1001
|
+
|
1002
|
+
if (self.daysContainer) {
|
1003
|
+
if (e.ctrlKey) {
|
1004
|
+
changeYear(self.currentYear - delta);
|
1005
|
+
focusOnDay(e.target.$i, 0);
|
1006
|
+
} else if (!isTimeObj) focusOnDay(e.target.$i, delta * 7);
|
1007
|
+
} else if (self.config.enableTime) {
|
1008
|
+
if (!isTimeObj) self.hourElement.focus();
|
1009
|
+
updateTime(e);
|
1010
|
+
self.debouncedChange();
|
1011
|
+
}
|
1012
|
+
|
1013
|
+
break;
|
1014
|
+
|
1015
|
+
case "Tab":
|
1016
|
+
if (e.target === self.hourElement) {
|
1017
|
+
e.preventDefault();
|
1018
|
+
self.minuteElement.select();
|
1019
|
+
} else if (e.target === self.minuteElement && (self.secondElement || self.amPM)) {
|
1020
|
+
e.preventDefault();
|
1021
|
+
(self.secondElement || self.amPM).focus();
|
1022
|
+
} else if (e.target === self.secondElement) {
|
1023
|
+
e.preventDefault();
|
1024
|
+
self.amPM.focus();
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
break;
|
1028
|
+
|
1029
|
+
case "a":
|
1030
|
+
if (e.target === self.amPM) {
|
1031
|
+
self.amPM.textContent = "AM";
|
1032
|
+
setHoursFromInputs();
|
1033
|
+
updateValue();
|
1034
|
+
}
|
1035
|
+
break;
|
1036
|
+
|
1037
|
+
case "p":
|
1038
|
+
if (e.target === self.amPM) {
|
1039
|
+
self.amPM.textContent = "PM";
|
1040
|
+
setHoursFromInputs();
|
1041
|
+
updateValue();
|
1042
|
+
}
|
1043
|
+
break;
|
1044
|
+
|
1045
|
+
default:
|
1046
|
+
break;
|
1047
|
+
|
1048
|
+
}
|
1049
|
+
|
1050
|
+
triggerEvent("KeyDown", e);
|
1051
|
+
}
|
1052
|
+
}
|
1053
|
+
|
1054
|
+
function onMouseOver(elem) {
|
1055
|
+
if (self.selectedDates.length !== 1 || !elem.classList.contains("flatpickr-day")) return;
|
1056
|
+
|
1057
|
+
var hoverDate = elem.dateObj,
|
1058
|
+
initialDate = self.parseDate(self.selectedDates[0], null, true),
|
1059
|
+
rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()),
|
1060
|
+
rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()),
|
1061
|
+
containsDisabled = false;
|
1062
|
+
|
1063
|
+
for (var t = rangeStartDate; t < rangeEndDate; t += self.utils.duration.DAY) {
|
1064
|
+
if (!isEnabled(new Date(t))) {
|
1065
|
+
containsDisabled = true;
|
1066
|
+
break;
|
1067
|
+
}
|
1068
|
+
}
|
1069
|
+
|
1070
|
+
var _loop = function _loop(timestamp, i) {
|
1071
|
+
var outOfRange = timestamp < self.minRangeDate.getTime() || timestamp > self.maxRangeDate.getTime(),
|
1072
|
+
dayElem = self.days.childNodes[i];
|
1073
|
+
|
1074
|
+
if (outOfRange) {
|
1075
|
+
self.days.childNodes[i].classList.add("notAllowed");
|
1076
|
+
["inRange", "startRange", "endRange"].forEach(function (c) {
|
1077
|
+
dayElem.classList.remove(c);
|
1078
|
+
});
|
1079
|
+
return "continue";
|
1080
|
+
} else if (containsDisabled && !outOfRange) return "continue";
|
1081
|
+
|
1082
|
+
["startRange", "inRange", "endRange", "notAllowed"].forEach(function (c) {
|
1083
|
+
dayElem.classList.remove(c);
|
1084
|
+
});
|
1085
|
+
|
1086
|
+
var minRangeDate = Math.max(self.minRangeDate.getTime(), rangeStartDate),
|
1087
|
+
maxRangeDate = Math.min(self.maxRangeDate.getTime(), rangeEndDate);
|
1088
|
+
|
1089
|
+
elem.classList.add(hoverDate < self.selectedDates[0] ? "startRange" : "endRange");
|
1090
|
+
|
1091
|
+
if (initialDate < hoverDate && timestamp === initialDate.getTime()) dayElem.classList.add("startRange");else if (initialDate > hoverDate && timestamp === initialDate.getTime()) dayElem.classList.add("endRange");
|
1092
|
+
|
1093
|
+
if (timestamp >= minRangeDate && timestamp <= maxRangeDate) dayElem.classList.add("inRange");
|
1094
|
+
};
|
1095
|
+
|
1096
|
+
for (var timestamp = self.days.childNodes[0].dateObj.getTime(), i = 0; i < 42; i++, timestamp += self.utils.duration.DAY) {
|
1097
|
+
var _ret = _loop(timestamp, i);
|
1098
|
+
|
1099
|
+
if (_ret === "continue") continue;
|
1100
|
+
}
|
1101
|
+
}
|
1102
|
+
|
1103
|
+
function onResize() {
|
1104
|
+
if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar();
|
1105
|
+
}
|
1106
|
+
|
1107
|
+
function open(e, positionElement) {
|
1108
|
+
if (self.isMobile) {
|
1109
|
+
if (e) {
|
1110
|
+
e.preventDefault();
|
1111
|
+
e.target.blur();
|
1112
|
+
}
|
1113
|
+
|
1114
|
+
setTimeout(function () {
|
1115
|
+
self.mobileInput.click();
|
1116
|
+
}, 0);
|
1117
|
+
|
1118
|
+
triggerEvent("Open");
|
1119
|
+
return;
|
1120
|
+
}
|
1121
|
+
|
1122
|
+
if (self.isOpen || self._input.disabled || self.config.inline) return;
|
1123
|
+
|
1124
|
+
self.isOpen = true;
|
1125
|
+
self.calendarContainer.classList.add("open");
|
1126
|
+
positionCalendar(positionElement);
|
1127
|
+
self._input.classList.add("active");
|
1128
|
+
|
1129
|
+
triggerEvent("Open");
|
1130
|
+
}
|
1131
|
+
|
1132
|
+
function minMaxDateSetter(type) {
|
1133
|
+
return function (date) {
|
1134
|
+
var dateObj = self.config["_" + type + "Date"] = self.parseDate(date);
|
1135
|
+
|
1136
|
+
var inverseDateObj = self.config["_" + (type === "min" ? "max" : "min") + "Date"];
|
1137
|
+
var isValidDate = date && dateObj instanceof Date;
|
1138
|
+
|
1139
|
+
if (isValidDate) {
|
1140
|
+
self[type + "DateHasTime"] = dateObj.getHours() || dateObj.getMinutes() || dateObj.getSeconds();
|
1141
|
+
}
|
1142
|
+
|
1143
|
+
if (self.selectedDates) {
|
1144
|
+
self.selectedDates = self.selectedDates.filter(function (d) {
|
1145
|
+
return isEnabled(d);
|
1146
|
+
});
|
1147
|
+
if (!self.selectedDates.length && type === "min") setHoursFromDate(dateObj);
|
1148
|
+
updateValue();
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
if (self.daysContainer) {
|
1152
|
+
redraw();
|
1153
|
+
|
1154
|
+
if (isValidDate) self.currentYearElement[type] = dateObj.getFullYear();else self.currentYearElement.removeAttribute(type);
|
1155
|
+
|
1156
|
+
self.currentYearElement.disabled = inverseDateObj && dateObj && inverseDateObj.getFullYear() === dateObj.getFullYear();
|
1157
|
+
}
|
1158
|
+
};
|
1159
|
+
}
|
1160
|
+
|
1161
|
+
function parseConfig() {
|
1162
|
+
var boolOpts = ["wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"];
|
1163
|
+
|
1164
|
+
var hooks = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange"];
|
1165
|
+
|
1166
|
+
self.config = Object.create(flatpickr.defaultConfig);
|
1167
|
+
|
1168
|
+
var userConfig = _extends({}, self.instanceConfig, JSON.parse(JSON.stringify(self.element.dataset || {})));
|
1169
|
+
|
1170
|
+
self.config.parseDate = userConfig.parseDate;
|
1171
|
+
self.config.formatDate = userConfig.formatDate;
|
1172
|
+
|
1173
|
+
Object.defineProperty(self.config, "enable", {
|
1174
|
+
get: function get() {
|
1175
|
+
return self.config._enable || [];
|
1176
|
+
},
|
1177
|
+
set: function set(dates) {
|
1178
|
+
return self.config._enable = parseDateRules(dates);
|
1179
|
+
}
|
1180
|
+
});
|
1181
|
+
|
1182
|
+
Object.defineProperty(self.config, "disable", {
|
1183
|
+
get: function get() {
|
1184
|
+
return self.config._disable || [];
|
1185
|
+
},
|
1186
|
+
set: function set(dates) {
|
1187
|
+
return self.config._disable = parseDateRules(dates);
|
1188
|
+
}
|
1189
|
+
});
|
1190
|
+
|
1191
|
+
_extends(self.config, userConfig);
|
1192
|
+
|
1193
|
+
if (!userConfig.dateFormat && userConfig.enableTime) {
|
1194
|
+
self.config.dateFormat = self.config.noCalendar ? "H:i" + (self.config.enableSeconds ? ":S" : "") : flatpickr.defaultConfig.dateFormat + " H:i" + (self.config.enableSeconds ? ":S" : "");
|
1195
|
+
}
|
1196
|
+
|
1197
|
+
if (userConfig.altInput && userConfig.enableTime && !userConfig.altFormat) {
|
1198
|
+
self.config.altFormat = self.config.noCalendar ? "h:i" + (self.config.enableSeconds ? ":S K" : " K") : flatpickr.defaultConfig.altFormat + (" h:i" + (self.config.enableSeconds ? ":S" : "") + " K");
|
1199
|
+
}
|
1200
|
+
|
1201
|
+
Object.defineProperty(self.config, "minDate", {
|
1202
|
+
get: function get() {
|
1203
|
+
return this._minDate;
|
1204
|
+
},
|
1205
|
+
set: minMaxDateSetter("min")
|
1206
|
+
});
|
1207
|
+
|
1208
|
+
Object.defineProperty(self.config, "maxDate", {
|
1209
|
+
get: function get() {
|
1210
|
+
return this._maxDate;
|
1211
|
+
},
|
1212
|
+
set: minMaxDateSetter("max")
|
1213
|
+
});
|
1214
|
+
|
1215
|
+
self.config.minDate = userConfig.minDate;
|
1216
|
+
self.config.maxDate = userConfig.maxDate;
|
1217
|
+
|
1218
|
+
for (var i = 0; i < boolOpts.length; i++) {
|
1219
|
+
self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === "true";
|
1220
|
+
}for (var _i = hooks.length; _i--;) {
|
1221
|
+
if (self.config[hooks[_i]] !== undefined) {
|
1222
|
+
self.config[hooks[_i]] = arrayify(self.config[hooks[_i]] || []).map(bindToInstance);
|
1223
|
+
}
|
1224
|
+
}
|
1225
|
+
|
1226
|
+
for (var _i2 = 0; _i2 < self.config.plugins.length; _i2++) {
|
1227
|
+
var pluginConf = self.config.plugins[_i2](self) || {};
|
1228
|
+
for (var key in pluginConf) {
|
1229
|
+
|
1230
|
+
if (self.config[key] instanceof Array || ~hooks.indexOf(key)) {
|
1231
|
+
self.config[key] = arrayify(pluginConf[key]).map(bindToInstance).concat(self.config[key]);
|
1232
|
+
} else if (typeof userConfig[key] === "undefined") self.config[key] = pluginConf[key];
|
1233
|
+
}
|
1234
|
+
}
|
1235
|
+
|
1236
|
+
triggerEvent("ParseConfig");
|
1237
|
+
}
|
1238
|
+
|
1239
|
+
function setupLocale() {
|
1240
|
+
if (_typeof(self.config.locale) !== "object" && typeof flatpickr.l10ns[self.config.locale] === "undefined") console.warn("flatpickr: invalid locale " + self.config.locale);
|
1241
|
+
|
1242
|
+
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] || {} : {});
|
1243
|
+
}
|
1244
|
+
|
1245
|
+
function positionCalendar() {
|
1246
|
+
var positionElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : self._positionElement;
|
1247
|
+
|
1248
|
+
if (self.calendarContainer === undefined) return;
|
1249
|
+
|
1250
|
+
var calendarHeight = self.calendarContainer.offsetHeight,
|
1251
|
+
calendarWidth = self.calendarContainer.offsetWidth,
|
1252
|
+
configPos = self.config.position,
|
1253
|
+
inputBounds = positionElement.getBoundingClientRect(),
|
1254
|
+
distanceFromBottom = window.innerHeight - inputBounds.bottom,
|
1255
|
+
showOnTop = configPos === "above" || configPos !== "below" && distanceFromBottom < calendarHeight && inputBounds.top > calendarHeight;
|
1256
|
+
|
1257
|
+
var top = window.pageYOffset + inputBounds.top + (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);
|
1258
|
+
|
1259
|
+
toggleClass(self.calendarContainer, "arrowTop", !showOnTop);
|
1260
|
+
toggleClass(self.calendarContainer, "arrowBottom", showOnTop);
|
1261
|
+
|
1262
|
+
if (self.config.inline) return;
|
1263
|
+
|
1264
|
+
var left = window.pageXOffset + inputBounds.left;
|
1265
|
+
var right = window.document.body.offsetWidth - inputBounds.right;
|
1266
|
+
var rightMost = left + calendarWidth > window.document.body.offsetWidth;
|
1267
|
+
|
1268
|
+
toggleClass(self.calendarContainer, "rightMost", rightMost);
|
1269
|
+
|
1270
|
+
if (self.config.static) return;
|
1271
|
+
|
1272
|
+
self.calendarContainer.style.top = top + "px";
|
1273
|
+
|
1274
|
+
if (!rightMost) {
|
1275
|
+
self.calendarContainer.style.left = left + "px";
|
1276
|
+
self.calendarContainer.style.right = "auto";
|
1277
|
+
} else {
|
1278
|
+
self.calendarContainer.style.left = "auto";
|
1279
|
+
self.calendarContainer.style.right = right + "px";
|
1280
|
+
}
|
1281
|
+
}
|
1282
|
+
|
1283
|
+
function redraw() {
|
1284
|
+
if (self.config.noCalendar || self.isMobile) return;
|
1285
|
+
|
1286
|
+
buildWeekdays();
|
1287
|
+
updateNavigationCurrentMonth();
|
1288
|
+
buildDays();
|
1289
|
+
}
|
1290
|
+
|
1291
|
+
function selectDate(e) {
|
1292
|
+
e.preventDefault();
|
1293
|
+
e.stopPropagation();
|
1294
|
+
|
1295
|
+
if (!e.target.classList.contains("flatpickr-day") || e.target.classList.contains("disabled") || e.target.classList.contains("notAllowed")) return;
|
1296
|
+
|
1297
|
+
var selectedDate = self.latestSelectedDateObj = new Date(e.target.dateObj.getTime());
|
1298
|
+
|
1299
|
+
var shouldChangeMonth = selectedDate.getMonth() !== self.currentMonth && self.config.mode !== "range";
|
1300
|
+
|
1301
|
+
self.selectedDateElem = e.target;
|
1302
|
+
|
1303
|
+
if (self.config.mode === "single") self.selectedDates = [selectedDate];else if (self.config.mode === "multiple") {
|
1304
|
+
var selectedIndex = isDateSelected(selectedDate);
|
1305
|
+
if (selectedIndex) self.selectedDates.splice(selectedIndex, 1);else self.selectedDates.push(selectedDate);
|
1306
|
+
} else if (self.config.mode === "range") {
|
1307
|
+
if (self.selectedDates.length === 2) self.clear();
|
1308
|
+
|
1309
|
+
self.selectedDates.push(selectedDate);
|
1310
|
+
|
1311
|
+
// unless selecting same date twice, sort ascendingly
|
1312
|
+
if (compareDates(selectedDate, self.selectedDates[0], true) !== 0) self.selectedDates.sort(function (a, b) {
|
1313
|
+
return a.getTime() - b.getTime();
|
1314
|
+
});
|
1315
|
+
}
|
1316
|
+
|
1317
|
+
setHoursFromInputs();
|
1318
|
+
|
1319
|
+
if (shouldChangeMonth) {
|
1320
|
+
var isNewYear = self.currentYear !== selectedDate.getFullYear();
|
1321
|
+
self.currentYear = selectedDate.getFullYear();
|
1322
|
+
self.currentMonth = selectedDate.getMonth();
|
1323
|
+
|
1324
|
+
if (isNewYear) triggerEvent("YearChange");
|
1325
|
+
|
1326
|
+
triggerEvent("MonthChange");
|
1327
|
+
}
|
1328
|
+
|
1329
|
+
buildDays();
|
1330
|
+
|
1331
|
+
if (self.minDateHasTime && self.config.enableTime && compareDates(selectedDate, self.config.minDate) === 0) setHoursFromDate(self.config.minDate);
|
1332
|
+
|
1333
|
+
updateValue();
|
1334
|
+
|
1335
|
+
if (self.config.enableTime) setTimeout(function () {
|
1336
|
+
return self.showTimeInput = true;
|
1337
|
+
}, 50);
|
1338
|
+
|
1339
|
+
if (self.config.mode === "range") {
|
1340
|
+
if (self.selectedDates.length === 1) {
|
1341
|
+
onMouseOver(e.target);
|
1342
|
+
|
1343
|
+
self._hidePrevMonthArrow = self._hidePrevMonthArrow || self.minRangeDate > self.days.childNodes[0].dateObj;
|
1344
|
+
|
1345
|
+
self._hideNextMonthArrow = self._hideNextMonthArrow || self.maxRangeDate < new Date(self.currentYear, self.currentMonth + 1, 1);
|
1346
|
+
} else updateNavigationCurrentMonth();
|
1347
|
+
}
|
1348
|
+
|
1349
|
+
triggerEvent("Change");
|
1350
|
+
|
1351
|
+
// maintain focus
|
1352
|
+
if (!shouldChangeMonth) focusOnDay(e.target.$i, 0);else afterDayAnim(function () {
|
1353
|
+
return self.selectedDateElem && self.selectedDateElem.focus();
|
1354
|
+
});
|
1355
|
+
|
1356
|
+
if (self.config.enableTime) setTimeout(function () {
|
1357
|
+
return self.hourElement.select();
|
1358
|
+
}, 451);
|
1359
|
+
|
1360
|
+
if (self.config.closeOnSelect) {
|
1361
|
+
var single = self.config.mode === "single" && !self.config.enableTime;
|
1362
|
+
var range = self.config.mode === "range" && self.selectedDates.length === 2 && !self.config.enableTime;
|
1363
|
+
|
1364
|
+
if (single || range) self.close();
|
1365
|
+
}
|
1366
|
+
}
|
1367
|
+
|
1368
|
+
function set(option, value) {
|
1369
|
+
if (option !== null && (typeof option === "undefined" ? "undefined" : _typeof(option)) === "object") _extends(self.config, option);else self.config[option] = value;
|
1370
|
+
|
1371
|
+
self.redraw();
|
1372
|
+
jumpToDate();
|
1373
|
+
}
|
1374
|
+
|
1375
|
+
function setSelectedDate(inputDate, format) {
|
1376
|
+
if (inputDate instanceof Array) self.selectedDates = inputDate.map(function (d) {
|
1377
|
+
return self.parseDate(d, format);
|
1378
|
+
});else if (inputDate instanceof Date || !isNaN(inputDate)) self.selectedDates = [self.parseDate(inputDate, format)];else if (inputDate && inputDate.substring) {
|
1379
|
+
switch (self.config.mode) {
|
1380
|
+
case "single":
|
1381
|
+
self.selectedDates = [self.parseDate(inputDate, format)];
|
1382
|
+
break;
|
1383
|
+
|
1384
|
+
case "multiple":
|
1385
|
+
self.selectedDates = inputDate.split("; ").map(function (date) {
|
1386
|
+
return self.parseDate(date, format);
|
1387
|
+
});
|
1388
|
+
break;
|
1389
|
+
|
1390
|
+
case "range":
|
1391
|
+
self.selectedDates = inputDate.split(self.l10n.rangeSeparator).map(function (date) {
|
1392
|
+
return self.parseDate(date, format);
|
1393
|
+
});
|
1394
|
+
|
1395
|
+
break;
|
1396
|
+
|
1397
|
+
default:
|
1398
|
+
break;
|
1399
|
+
}
|
1400
|
+
}
|
1401
|
+
|
1402
|
+
self.selectedDates = self.selectedDates.filter(function (d) {
|
1403
|
+
return d instanceof Date && isEnabled(d, false);
|
1404
|
+
});
|
1405
|
+
|
1406
|
+
self.selectedDates.sort(function (a, b) {
|
1407
|
+
return a.getTime() - b.getTime();
|
1408
|
+
});
|
1409
|
+
}
|
1410
|
+
|
1411
|
+
function setDate(date, triggerChange, format) {
|
1412
|
+
if (date !== 0 && !date) return self.clear(triggerChange);
|
1413
|
+
|
1414
|
+
setSelectedDate(date, format);
|
1415
|
+
|
1416
|
+
self.showTimeInput = self.selectedDates.length > 0;
|
1417
|
+
self.latestSelectedDateObj = self.selectedDates[0];
|
1418
|
+
|
1419
|
+
self.redraw();
|
1420
|
+
jumpToDate();
|
1421
|
+
|
1422
|
+
setHoursFromDate();
|
1423
|
+
updateValue(triggerChange);
|
1424
|
+
|
1425
|
+
if (triggerChange) triggerEvent("Change");
|
1426
|
+
}
|
1427
|
+
|
1428
|
+
function parseDateRules(arr) {
|
1429
|
+
for (var i = arr.length; i--;) {
|
1430
|
+
if (typeof arr[i] === "string" || +arr[i]) arr[i] = self.parseDate(arr[i], null, true);else if (arr[i] && arr[i].from && arr[i].to) {
|
1431
|
+
arr[i].from = self.parseDate(arr[i].from);
|
1432
|
+
arr[i].to = self.parseDate(arr[i].to);
|
1433
|
+
}
|
1434
|
+
}
|
1435
|
+
|
1436
|
+
return arr.filter(function (x) {
|
1437
|
+
return x;
|
1438
|
+
}); // remove falsy values
|
1439
|
+
}
|
1440
|
+
|
1441
|
+
function setupDates() {
|
1442
|
+
self.selectedDates = [];
|
1443
|
+
self.now = new Date();
|
1444
|
+
|
1445
|
+
var preloadedDate = self.config.defaultDate || self.input.value;
|
1446
|
+
if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat);
|
1447
|
+
|
1448
|
+
var initialDate = self.selectedDates.length ? self.selectedDates[0] : self.config.minDate && self.config.minDate.getTime() > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate.getTime() < self.now ? self.config.maxDate : self.now;
|
1449
|
+
|
1450
|
+
self.currentYear = initialDate.getFullYear();
|
1451
|
+
self.currentMonth = initialDate.getMonth();
|
1452
|
+
|
1453
|
+
if (self.selectedDates.length) self.latestSelectedDateObj = self.selectedDates[0];
|
1454
|
+
|
1455
|
+
self.minDateHasTime = self.config.minDate && (self.config.minDate.getHours() || self.config.minDate.getMinutes() || self.config.minDate.getSeconds());
|
1456
|
+
|
1457
|
+
self.maxDateHasTime = self.config.maxDate && (self.config.maxDate.getHours() || self.config.maxDate.getMinutes() || self.config.maxDate.getSeconds());
|
1458
|
+
|
1459
|
+
Object.defineProperty(self, "latestSelectedDateObj", {
|
1460
|
+
get: function get() {
|
1461
|
+
return self._selectedDateObj || self.selectedDates[self.selectedDates.length - 1];
|
1462
|
+
},
|
1463
|
+
set: function set(date) {
|
1464
|
+
self._selectedDateObj = date;
|
1465
|
+
}
|
1466
|
+
});
|
1467
|
+
|
1468
|
+
if (!self.isMobile) {
|
1469
|
+
Object.defineProperty(self, "showTimeInput", {
|
1470
|
+
get: function get() {
|
1471
|
+
return self._showTimeInput;
|
1472
|
+
},
|
1473
|
+
set: function set(bool) {
|
1474
|
+
self._showTimeInput = bool;
|
1475
|
+
if (self.calendarContainer) toggleClass(self.calendarContainer, "showTimeInput", bool);
|
1476
|
+
positionCalendar();
|
1477
|
+
}
|
1478
|
+
});
|
1479
|
+
}
|
1480
|
+
}
|
1481
|
+
|
1482
|
+
function setupHelperFunctions() {
|
1483
|
+
self.utils = {
|
1484
|
+
duration: {
|
1485
|
+
DAY: 86400000
|
1486
|
+
},
|
1487
|
+
getDaysinMonth: function getDaysinMonth(month, yr) {
|
1488
|
+
month = typeof month === "undefined" ? self.currentMonth : month;
|
1489
|
+
|
1490
|
+
yr = typeof yr === "undefined" ? self.currentYear : yr;
|
1491
|
+
|
1492
|
+
if (month === 1 && (yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0)) return 29;
|
1493
|
+
|
1494
|
+
return self.l10n.daysInMonth[month];
|
1495
|
+
},
|
1496
|
+
monthToStr: function monthToStr(monthNumber, shorthand) {
|
1497
|
+
shorthand = typeof shorthand === "undefined" ? self.config.shorthandCurrentMonth : shorthand;
|
1498
|
+
|
1499
|
+
return self.l10n.months[(shorthand ? "short" : "long") + "hand"][monthNumber];
|
1500
|
+
}
|
1501
|
+
};
|
1502
|
+
}
|
1503
|
+
|
1504
|
+
/* istanbul ignore next */
|
1505
|
+
function setupFormats() {
|
1506
|
+
self.formats = Object.create(FlatpickrInstance.prototype.formats);
|
1507
|
+
["D", "F", "J", "M", "W", "l"].forEach(function (f) {
|
1508
|
+
self.formats[f] = FlatpickrInstance.prototype.formats[f].bind(self);
|
1509
|
+
});
|
1510
|
+
|
1511
|
+
self.revFormat.F = FlatpickrInstance.prototype.revFormat.F.bind(self);
|
1512
|
+
self.revFormat.M = FlatpickrInstance.prototype.revFormat.M.bind(self);
|
1513
|
+
}
|
1514
|
+
|
1515
|
+
function setupInputs() {
|
1516
|
+
self.input = self.config.wrap ? self.element.querySelector("[data-input]") : self.element;
|
1517
|
+
|
1518
|
+
/* istanbul ignore next */
|
1519
|
+
if (!self.input) return console.warn("Error: invalid input element specified", self.input);
|
1520
|
+
|
1521
|
+
self.input._type = self.input.type;
|
1522
|
+
self.input.type = "text";
|
1523
|
+
|
1524
|
+
self.input.classList.add("flatpickr-input");
|
1525
|
+
self._input = self.input;
|
1526
|
+
|
1527
|
+
if (self.config.altInput) {
|
1528
|
+
// replicate self.element
|
1529
|
+
self.altInput = createElement(self.input.nodeName, self.input.className + " " + self.config.altInputClass);
|
1530
|
+
self._input = self.altInput;
|
1531
|
+
self.altInput.placeholder = self.input.placeholder;
|
1532
|
+
self.altInput.disabled = self.input.disabled;
|
1533
|
+
self.altInput.required = self.input.required;
|
1534
|
+
self.altInput.type = "text";
|
1535
|
+
self.input.type = "hidden";
|
1536
|
+
|
1537
|
+
if (!self.config.static && self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);
|
1538
|
+
}
|
1539
|
+
|
1540
|
+
if (!self.config.allowInput) self._input.setAttribute("readonly", "readonly");
|
1541
|
+
|
1542
|
+
self._positionElement = self.config.positionElement || self._input;
|
1543
|
+
}
|
1544
|
+
|
1545
|
+
function setupMobile() {
|
1546
|
+
var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date";
|
1547
|
+
|
1548
|
+
self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile");
|
1549
|
+
self.mobileInput.step = self.input.getAttribute("step") || "any";
|
1550
|
+
self.mobileInput.tabIndex = 1;
|
1551
|
+
self.mobileInput.type = inputType;
|
1552
|
+
self.mobileInput.disabled = self.input.disabled;
|
1553
|
+
self.mobileInput.placeholder = self.input.placeholder;
|
1554
|
+
|
1555
|
+
self.mobileFormatStr = inputType === "datetime-local" ? "Y-m-d\\TH:i:S" : inputType === "date" ? "Y-m-d" : "H:i:S";
|
1556
|
+
|
1557
|
+
if (self.selectedDates.length) {
|
1558
|
+
self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);
|
1559
|
+
}
|
1560
|
+
|
1561
|
+
if (self.config.minDate) self.mobileInput.min = self.formatDate(self.config.minDate, "Y-m-d");
|
1562
|
+
|
1563
|
+
if (self.config.maxDate) self.mobileInput.max = self.formatDate(self.config.maxDate, "Y-m-d");
|
1564
|
+
|
1565
|
+
self.input.type = "hidden";
|
1566
|
+
if (self.config.altInput) self.altInput.type = "hidden";
|
1567
|
+
|
1568
|
+
try {
|
1569
|
+
self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);
|
1570
|
+
} catch (e) {
|
1571
|
+
//
|
1572
|
+
}
|
1573
|
+
|
1574
|
+
self.mobileInput.addEventListener("change", function (e) {
|
1575
|
+
self.setDate(e.target.value, false, self.mobileFormatStr);
|
1576
|
+
triggerEvent("Change");
|
1577
|
+
triggerEvent("Close");
|
1578
|
+
});
|
1579
|
+
}
|
1580
|
+
|
1581
|
+
function toggle() {
|
1582
|
+
if (self.isOpen) return self.close();
|
1583
|
+
self.open();
|
1584
|
+
}
|
1585
|
+
|
1586
|
+
function triggerEvent(event, data) {
|
1587
|
+
var hooks = self.config["on" + event];
|
1588
|
+
|
1589
|
+
if (hooks !== undefined && hooks.length > 0) {
|
1590
|
+
for (var i = 0; hooks[i] && i < hooks.length; i++) {
|
1591
|
+
hooks[i](self.selectedDates, self.input.value, self, data);
|
1592
|
+
}
|
1593
|
+
}
|
1594
|
+
|
1595
|
+
if (event === "Change") {
|
1596
|
+
self.input.dispatchEvent(createEvent("change"));
|
1597
|
+
|
1598
|
+
// many front-end frameworks bind to the input event
|
1599
|
+
self.input.dispatchEvent(createEvent("input"));
|
1600
|
+
}
|
1601
|
+
}
|
1602
|
+
|
1603
|
+
/**
|
1604
|
+
* Creates an Event, normalized across browsers
|
1605
|
+
* @param {String} name the event name, e.g. "click"
|
1606
|
+
* @return {Event} the created event
|
1607
|
+
*/
|
1608
|
+
function createEvent(name) {
|
1609
|
+
if (self._supportsEvents) return new Event(name, { bubbles: true });
|
1610
|
+
|
1611
|
+
self._[name + "Event"] = document.createEvent("Event");
|
1612
|
+
self._[name + "Event"].initEvent(name, true, true);
|
1613
|
+
return self._[name + "Event"];
|
1614
|
+
}
|
1615
|
+
|
1616
|
+
function isDateSelected(date) {
|
1617
|
+
for (var i = 0; i < self.selectedDates.length; i++) {
|
1618
|
+
if (compareDates(self.selectedDates[i], date) === 0) return "" + i;
|
1619
|
+
}
|
1620
|
+
|
1621
|
+
return false;
|
1622
|
+
}
|
1623
|
+
|
1624
|
+
function isDateInRange(date) {
|
1625
|
+
if (self.config.mode !== "range" || self.selectedDates.length < 2) return false;
|
1626
|
+
return compareDates(date, self.selectedDates[0]) >= 0 && compareDates(date, self.selectedDates[1]) <= 0;
|
1627
|
+
}
|
1628
|
+
|
1629
|
+
function updateNavigationCurrentMonth() {
|
1630
|
+
if (self.config.noCalendar || self.isMobile || !self.monthNav) return;
|
1631
|
+
|
1632
|
+
self.currentMonthElement.textContent = self.utils.monthToStr(self.currentMonth) + " ";
|
1633
|
+
self.currentYearElement.value = self.currentYear;
|
1634
|
+
|
1635
|
+
self._hidePrevMonthArrow = self.config.minDate && (self.currentYear === self.config.minDate.getFullYear() ? self.currentMonth <= self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear());
|
1636
|
+
|
1637
|
+
self._hideNextMonthArrow = self.config.maxDate && (self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear());
|
1638
|
+
}
|
1639
|
+
|
1640
|
+
/**
|
1641
|
+
* Updates the values of inputs associated with the calendar
|
1642
|
+
* @return {void}
|
1643
|
+
*/
|
1644
|
+
function updateValue(triggerChange) {
|
1645
|
+
if (!self.selectedDates.length) return self.clear(triggerChange);
|
1646
|
+
|
1647
|
+
if (self.isMobile) {
|
1648
|
+
self.mobileInput.value = self.selectedDates.length ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr) : "";
|
1649
|
+
}
|
1650
|
+
|
1651
|
+
var joinChar = self.config.mode !== "range" ? "; " : self.l10n.rangeSeparator;
|
1652
|
+
|
1653
|
+
self.input.value = self.selectedDates.map(function (dObj) {
|
1654
|
+
return self.formatDate(dObj, self.config.dateFormat);
|
1655
|
+
}).join(joinChar);
|
1656
|
+
|
1657
|
+
if (self.config.altInput) {
|
1658
|
+
self.altInput.value = self.selectedDates.map(function (dObj) {
|
1659
|
+
return self.formatDate(dObj, self.config.altFormat);
|
1660
|
+
}).join(joinChar);
|
1661
|
+
}
|
1662
|
+
|
1663
|
+
if (triggerChange !== false) triggerEvent("ValueUpdate");
|
1664
|
+
}
|
1665
|
+
|
1666
|
+
function mouseDelta(e) {
|
1667
|
+
return Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY));
|
1668
|
+
}
|
1669
|
+
|
1670
|
+
function onMonthNavScroll(e) {
|
1671
|
+
e.preventDefault();
|
1672
|
+
var isYear = self.currentYearElement.parentNode.contains(e.target);
|
1673
|
+
|
1674
|
+
if (e.target === self.currentMonthElement || isYear) {
|
1675
|
+
|
1676
|
+
var delta = mouseDelta(e);
|
1677
|
+
|
1678
|
+
if (isYear) {
|
1679
|
+
changeYear(self.currentYear + delta);
|
1680
|
+
e.target.value = self.currentYear;
|
1681
|
+
} else self.changeMonth(delta, true, false);
|
1682
|
+
}
|
1683
|
+
}
|
1684
|
+
|
1685
|
+
function onMonthNavClick(e) {
|
1686
|
+
var isPrevMonth = self.prevMonthNav.contains(e.target);
|
1687
|
+
var isNextMonth = self.nextMonthNav.contains(e.target);
|
1688
|
+
|
1689
|
+
if (isPrevMonth || isNextMonth) changeMonth(isPrevMonth ? -1 : 1);else if (e.target === self.currentYearElement) {
|
1690
|
+
e.preventDefault();
|
1691
|
+
self.currentYearElement.select();
|
1692
|
+
} else if (e.target.className === "arrowUp") self.changeYear(self.currentYear + 1);else if (e.target.className === "arrowDown") self.changeYear(self.currentYear - 1);
|
1693
|
+
}
|
1694
|
+
|
1695
|
+
/**
|
1696
|
+
* Creates an HTMLElement with given tag, class, and textual content
|
1697
|
+
* @param {String} tag the HTML tag
|
1698
|
+
* @param {String} className the new element's class name
|
1699
|
+
* @param {String} content The new element's text content
|
1700
|
+
* @return {HTMLElement} the created HTML element
|
1701
|
+
*/
|
1702
|
+
function createElement(tag, className, content) {
|
1703
|
+
var e = window.document.createElement(tag);
|
1704
|
+
className = className || "";
|
1705
|
+
content = content || "";
|
1706
|
+
|
1707
|
+
e.className = className;
|
1708
|
+
|
1709
|
+
if (content !== undefined) e.textContent = content;
|
1710
|
+
|
1711
|
+
return e;
|
1712
|
+
}
|
1713
|
+
|
1714
|
+
function arrayify(obj) {
|
1715
|
+
if (obj instanceof Array) return obj;
|
1716
|
+
return [obj];
|
1717
|
+
}
|
1718
|
+
|
1719
|
+
function toggleClass(elem, className, bool) {
|
1720
|
+
if (bool) return elem.classList.add(className);
|
1721
|
+
elem.classList.remove(className);
|
1722
|
+
}
|
1723
|
+
|
1724
|
+
/* istanbul ignore next */
|
1725
|
+
function debounce(func, wait, immediate) {
|
1726
|
+
var timeout = void 0;
|
1727
|
+
return function () {
|
1728
|
+
var context = this,
|
1729
|
+
args = arguments;
|
1730
|
+
clearTimeout(timeout);
|
1731
|
+
timeout = setTimeout(function () {
|
1732
|
+
timeout = null;
|
1733
|
+
if (!immediate) func.apply(context, args);
|
1734
|
+
}, wait);
|
1735
|
+
if (immediate && !timeout) func.apply(context, args);
|
1736
|
+
};
|
1737
|
+
}
|
1738
|
+
|
1739
|
+
/**
|
1740
|
+
* Compute the difference in dates, measured in ms
|
1741
|
+
* @param {Date} date1
|
1742
|
+
* @param {Date} date2
|
1743
|
+
* @param {Boolean} timeless whether to reset times of both dates to 00:00
|
1744
|
+
* @return {Number} the difference in ms
|
1745
|
+
*/
|
1746
|
+
function compareDates(date1, date2, timeless) {
|
1747
|
+
if (!(date1 instanceof Date) || !(date2 instanceof Date)) return false;
|
1748
|
+
|
1749
|
+
if (timeless !== false) {
|
1750
|
+
return new Date(date1.getTime()).setHours(0, 0, 0, 0) - new Date(date2.getTime()).setHours(0, 0, 0, 0);
|
1751
|
+
}
|
1752
|
+
|
1753
|
+
return date1.getTime() - date2.getTime();
|
1754
|
+
}
|
1755
|
+
|
1756
|
+
function timeWrapper(e) {
|
1757
|
+
e.preventDefault();
|
1758
|
+
|
1759
|
+
var isKeyDown = e.type === "keydown",
|
1760
|
+
isWheel = e.type === "wheel",
|
1761
|
+
isIncrement = e.type === "increment",
|
1762
|
+
input = e.target;
|
1763
|
+
|
1764
|
+
if (self.amPM && e.target === self.amPM) return e.target.textContent = ["AM", "PM"][e.target.textContent === "AM" | 0];
|
1765
|
+
|
1766
|
+
var min = Number(input.min),
|
1767
|
+
max = Number(input.max),
|
1768
|
+
step = Number(input.step),
|
1769
|
+
curValue = parseInt(input.value, 10),
|
1770
|
+
delta = e.delta || (!isKeyDown ? Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)) || 0 : e.which === 38 ? 1 : -1);
|
1771
|
+
|
1772
|
+
var newValue = curValue + step * delta;
|
1773
|
+
|
1774
|
+
if (typeof input.value !== "undefined" && input.value.length === 2) {
|
1775
|
+
var isHourElem = input === self.hourElement,
|
1776
|
+
isMinuteElem = input === self.minuteElement;
|
1777
|
+
|
1778
|
+
if (newValue < min) {
|
1779
|
+
newValue = max + newValue + !isHourElem + (isHourElem && !self.amPM);
|
1780
|
+
|
1781
|
+
if (isMinuteElem) incrementNumInput(null, -1, self.hourElement);
|
1782
|
+
} else if (newValue > max) {
|
1783
|
+
newValue = input === self.hourElement ? newValue - max - !self.amPM : min;
|
1784
|
+
|
1785
|
+
if (isMinuteElem) incrementNumInput(null, 1, self.hourElement);
|
1786
|
+
}
|
1787
|
+
|
1788
|
+
if (self.amPM && isHourElem && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) self.amPM.textContent = self.amPM.textContent === "PM" ? "AM" : "PM";
|
1789
|
+
|
1790
|
+
input.value = self.pad(newValue);
|
1791
|
+
}
|
1792
|
+
}
|
1793
|
+
|
1794
|
+
init();
|
1795
|
+
return self;
|
1796
|
+
}
|
1797
|
+
|
1798
|
+
FlatpickrInstance.prototype = {
|
1799
|
+
formats: {
|
1800
|
+
// get the date in UTC
|
1801
|
+
Z: function Z(date) {
|
1802
|
+
return date.toISOString();
|
1803
|
+
},
|
1804
|
+
|
1805
|
+
// weekday name, short, e.g. Thu
|
1806
|
+
D: function D(date) {
|
1807
|
+
return this.l10n.weekdays.shorthand[this.formats.w(date)];
|
1808
|
+
},
|
1809
|
+
|
1810
|
+
// full month name e.g. January
|
1811
|
+
F: function F(date) {
|
1812
|
+
return this.utils.monthToStr(this.formats.n(date) - 1, false);
|
1813
|
+
},
|
1814
|
+
|
1815
|
+
// padded hour 1-12
|
1816
|
+
G: function G(date) {
|
1817
|
+
return FlatpickrInstance.prototype.pad(FlatpickrInstance.prototype.formats.h(date));
|
1818
|
+
},
|
1819
|
+
|
1820
|
+
// hours with leading zero e.g. 03
|
1821
|
+
H: function H(date) {
|
1822
|
+
return FlatpickrInstance.prototype.pad(date.getHours());
|
1823
|
+
},
|
1824
|
+
|
1825
|
+
// day (1-30) with ordinal suffix e.g. 1st, 2nd
|
1826
|
+
J: function J(date) {
|
1827
|
+
return date.getDate() + this.l10n.ordinal(date.getDate());
|
1828
|
+
},
|
1829
|
+
|
1830
|
+
// AM/PM
|
1831
|
+
K: function K(date) {
|
1832
|
+
return date.getHours() > 11 ? "PM" : "AM";
|
1833
|
+
},
|
1834
|
+
|
1835
|
+
// shorthand month e.g. Jan, Sep, Oct, etc
|
1836
|
+
M: function M(date) {
|
1837
|
+
return this.utils.monthToStr(date.getMonth(), true);
|
1838
|
+
},
|
1839
|
+
|
1840
|
+
// seconds 00-59
|
1841
|
+
S: function S(date) {
|
1842
|
+
return FlatpickrInstance.prototype.pad(date.getSeconds());
|
1843
|
+
},
|
1844
|
+
|
1845
|
+
// unix timestamp
|
1846
|
+
U: function U(date) {
|
1847
|
+
return date.getTime() / 1000;
|
1848
|
+
},
|
1849
|
+
|
1850
|
+
W: function W(date) {
|
1851
|
+
return this.config.getWeek(date);
|
1852
|
+
},
|
1853
|
+
|
1854
|
+
// full year e.g. 2016
|
1855
|
+
Y: function Y(date) {
|
1856
|
+
return date.getFullYear();
|
1857
|
+
},
|
1858
|
+
|
1859
|
+
// day in month, padded (01-30)
|
1860
|
+
d: function d(date) {
|
1861
|
+
return FlatpickrInstance.prototype.pad(date.getDate());
|
1862
|
+
},
|
1863
|
+
|
1864
|
+
// hour from 1-12 (am/pm)
|
1865
|
+
h: function h(date) {
|
1866
|
+
return date.getHours() % 12 ? date.getHours() % 12 : 12;
|
1867
|
+
},
|
1868
|
+
|
1869
|
+
// minutes, padded with leading zero e.g. 09
|
1870
|
+
i: function i(date) {
|
1871
|
+
return FlatpickrInstance.prototype.pad(date.getMinutes());
|
1872
|
+
},
|
1873
|
+
|
1874
|
+
// day in month (1-30)
|
1875
|
+
j: function j(date) {
|
1876
|
+
return date.getDate();
|
1877
|
+
},
|
1878
|
+
|
1879
|
+
// weekday name, full, e.g. Thursday
|
1880
|
+
l: function l(date) {
|
1881
|
+
return this.l10n.weekdays.longhand[date.getDay()];
|
1882
|
+
},
|
1883
|
+
|
1884
|
+
// padded month number (01-12)
|
1885
|
+
m: function m(date) {
|
1886
|
+
return FlatpickrInstance.prototype.pad(date.getMonth() + 1);
|
1887
|
+
},
|
1888
|
+
|
1889
|
+
// the month number (1-12)
|
1890
|
+
n: function n(date) {
|
1891
|
+
return date.getMonth() + 1;
|
1892
|
+
},
|
1893
|
+
|
1894
|
+
// seconds 0-59
|
1895
|
+
s: function s(date) {
|
1896
|
+
return date.getSeconds();
|
1897
|
+
},
|
1898
|
+
|
1899
|
+
// number of the day of the week
|
1900
|
+
w: function w(date) {
|
1901
|
+
return date.getDay();
|
1902
|
+
},
|
1903
|
+
|
1904
|
+
// last two digits of year e.g. 16 for 2016
|
1905
|
+
y: function y(date) {
|
1906
|
+
return String(date.getFullYear()).substring(2);
|
1907
|
+
}
|
1908
|
+
},
|
1909
|
+
|
1910
|
+
/**
|
1911
|
+
* Formats a given Date object into a string based on supplied format
|
1912
|
+
* @param {Date} dateObj the date object
|
1913
|
+
* @param {String} frmt a string composed of formatting tokens e.g. "Y-m-d"
|
1914
|
+
* @return {String} The textual representation of the date e.g. 2017-02-03
|
1915
|
+
*/
|
1916
|
+
formatDate: function formatDate(dateObj, frmt) {
|
1917
|
+
var _this = this;
|
1918
|
+
|
1919
|
+
if (this.config !== undefined && this.config.formatDate !== undefined) return this.config.formatDate(dateObj, frmt);
|
1920
|
+
|
1921
|
+
return frmt.split("").map(function (c, i, arr) {
|
1922
|
+
return _this.formats[c] && arr[i - 1] !== "\\" ? _this.formats[c](dateObj) : c !== "\\" ? c : "";
|
1923
|
+
}).join("");
|
1924
|
+
},
|
1925
|
+
|
1926
|
+
|
1927
|
+
revFormat: {
|
1928
|
+
D: function D() {},
|
1929
|
+
F: function F(dateObj, monthName) {
|
1930
|
+
dateObj.setMonth(this.l10n.months.longhand.indexOf(monthName));
|
1931
|
+
},
|
1932
|
+
G: function G(dateObj, hour) {
|
1933
|
+
dateObj.setHours(parseFloat(hour));
|
1934
|
+
},
|
1935
|
+
H: function H(dateObj, hour) {
|
1936
|
+
dateObj.setHours(parseFloat(hour));
|
1937
|
+
},
|
1938
|
+
J: function J(dateObj, day) {
|
1939
|
+
dateObj.setDate(parseFloat(day));
|
1940
|
+
},
|
1941
|
+
K: function K(dateObj, amPM) {
|
1942
|
+
var hours = dateObj.getHours();
|
1943
|
+
|
1944
|
+
if (hours !== 12) dateObj.setHours(hours % 12 + 12 * /pm/i.test(amPM));
|
1945
|
+
},
|
1946
|
+
M: function M(dateObj, shortMonth) {
|
1947
|
+
dateObj.setMonth(this.l10n.months.shorthand.indexOf(shortMonth));
|
1948
|
+
},
|
1949
|
+
S: function S(dateObj, seconds) {
|
1950
|
+
dateObj.setSeconds(seconds);
|
1951
|
+
},
|
1952
|
+
U: function U(dateObj, unixSeconds) {
|
1953
|
+
return new Date(parseFloat(unixSeconds) * 1000);
|
1954
|
+
},
|
1955
|
+
|
1956
|
+
W: function W(dateObj, weekNumber) {
|
1957
|
+
weekNumber = parseInt(weekNumber);
|
1958
|
+
return new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0, 0);
|
1959
|
+
},
|
1960
|
+
Y: function Y(dateObj, year) {
|
1961
|
+
dateObj.setFullYear(year);
|
1962
|
+
},
|
1963
|
+
Z: function Z(dateObj, ISODate) {
|
1964
|
+
return new Date(ISODate);
|
1965
|
+
},
|
1966
|
+
|
1967
|
+
d: function d(dateObj, day) {
|
1968
|
+
dateObj.setDate(parseFloat(day));
|
1969
|
+
},
|
1970
|
+
h: function h(dateObj, hour) {
|
1971
|
+
dateObj.setHours(parseFloat(hour));
|
1972
|
+
},
|
1973
|
+
i: function i(dateObj, minutes) {
|
1974
|
+
dateObj.setMinutes(parseFloat(minutes));
|
1975
|
+
},
|
1976
|
+
j: function j(dateObj, day) {
|
1977
|
+
dateObj.setDate(parseFloat(day));
|
1978
|
+
},
|
1979
|
+
l: function l() {},
|
1980
|
+
m: function m(dateObj, month) {
|
1981
|
+
dateObj.setMonth(parseFloat(month) - 1);
|
1982
|
+
},
|
1983
|
+
n: function n(dateObj, month) {
|
1984
|
+
dateObj.setMonth(parseFloat(month) - 1);
|
1985
|
+
},
|
1986
|
+
s: function s(dateObj, seconds) {
|
1987
|
+
dateObj.setSeconds(parseFloat(seconds));
|
1988
|
+
},
|
1989
|
+
w: function w() {},
|
1990
|
+
y: function y(dateObj, year) {
|
1991
|
+
dateObj.setFullYear(2000 + parseFloat(year));
|
1992
|
+
}
|
1993
|
+
},
|
1994
|
+
|
1995
|
+
tokenRegex: {
|
1996
|
+
D: "(\\w+)",
|
1997
|
+
F: "(\\w+)",
|
1998
|
+
G: "(\\d\\d|\\d)",
|
1999
|
+
H: "(\\d\\d|\\d)",
|
2000
|
+
J: "(\\d\\d|\\d)\\w+",
|
2001
|
+
K: "(am|AM|Am|aM|pm|PM|Pm|pM)",
|
2002
|
+
M: "(\\w+)",
|
2003
|
+
S: "(\\d\\d|\\d)",
|
2004
|
+
U: "(.+)",
|
2005
|
+
W: "(\\d\\d|\\d)",
|
2006
|
+
Y: "(\\d{4})",
|
2007
|
+
Z: "(.+)",
|
2008
|
+
d: "(\\d\\d|\\d)",
|
2009
|
+
h: "(\\d\\d|\\d)",
|
2010
|
+
i: "(\\d\\d|\\d)",
|
2011
|
+
j: "(\\d\\d|\\d)",
|
2012
|
+
l: "(\\w+)",
|
2013
|
+
m: "(\\d\\d|\\d)",
|
2014
|
+
n: "(\\d\\d|\\d)",
|
2015
|
+
s: "(\\d\\d|\\d)",
|
2016
|
+
w: "(\\d\\d|\\d)",
|
2017
|
+
y: "(\\d{2})"
|
2018
|
+
},
|
2019
|
+
|
2020
|
+
pad: function pad(number) {
|
2021
|
+
return ("0" + number).slice(-2);
|
2022
|
+
},
|
2023
|
+
|
2024
|
+
/**
|
2025
|
+
* Parses a date(+time) string into a Date object
|
2026
|
+
* @param {String} date the date string, e.g. 2017-02-03 14:45
|
2027
|
+
* @param {String} givenFormat the date format, e.g. Y-m-d H:i
|
2028
|
+
* @param {Boolean} timeless whether to reset the time of Date object
|
2029
|
+
* @return {Date} the parsed Date object
|
2030
|
+
*/
|
2031
|
+
parseDate: function parseDate(date, givenFormat, timeless) {
|
2032
|
+
var _this2 = this;
|
2033
|
+
|
2034
|
+
if (date !== 0 && !date) return null;
|
2035
|
+
|
2036
|
+
var date_orig = date;
|
2037
|
+
|
2038
|
+
if (date instanceof Date) date = new Date(date.getTime()); // create a copy
|
2039
|
+
|
2040
|
+
else if (date.toFixed !== undefined) // timestamp
|
2041
|
+
date = new Date(date);else {
|
2042
|
+
// date string
|
2043
|
+
var format = givenFormat || (this.config || flatpickr.defaultConfig).dateFormat;
|
2044
|
+
date = String(date).trim();
|
2045
|
+
|
2046
|
+
if (date === "today") {
|
2047
|
+
date = new Date();
|
2048
|
+
timeless = true;
|
2049
|
+
} else if (/Z$/.test(date) || /GMT$/.test(date)) // datestrings w/ timezone
|
2050
|
+
date = new Date(date);else if (this.config && this.config.parseDate) date = this.config.parseDate(date, format);else {
|
2051
|
+
(function () {
|
2052
|
+
var parsedDate = !_this2.config || !_this2.config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0));
|
2053
|
+
|
2054
|
+
var matched = void 0,
|
2055
|
+
ops = [];
|
2056
|
+
|
2057
|
+
for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
|
2058
|
+
var token = format[i];
|
2059
|
+
var isBackSlash = token === "\\";
|
2060
|
+
var escaped = format[i - 1] === "\\" || isBackSlash;
|
2061
|
+
|
2062
|
+
if (_this2.tokenRegex[token] && !escaped) {
|
2063
|
+
regexStr += _this2.tokenRegex[token];
|
2064
|
+
var match = new RegExp(regexStr).exec(date);
|
2065
|
+
if (match && (matched = true)) {
|
2066
|
+
ops[token !== "Y" ? "push" : "unshift"]({
|
2067
|
+
fn: _this2.revFormat[token],
|
2068
|
+
val: match[++matchIndex]
|
2069
|
+
});
|
2070
|
+
}
|
2071
|
+
} else if (!isBackSlash) regexStr += "."; // don't really care
|
2072
|
+
|
2073
|
+
ops.forEach(function (_ref) {
|
2074
|
+
var fn = _ref.fn,
|
2075
|
+
val = _ref.val;
|
2076
|
+
return parsedDate = fn(parsedDate, val) || parsedDate;
|
2077
|
+
});
|
2078
|
+
}
|
2079
|
+
|
2080
|
+
date = matched ? parsedDate : null;
|
2081
|
+
})();
|
2082
|
+
}
|
2083
|
+
}
|
2084
|
+
|
2085
|
+
/* istanbul ignore next */
|
2086
|
+
if (!(date instanceof Date)) {
|
2087
|
+
console.warn("flatpickr: invalid date " + date_orig);
|
2088
|
+
console.info(this.element);
|
2089
|
+
return null;
|
2090
|
+
}
|
2091
|
+
|
2092
|
+
if (timeless === true) date.setHours(0, 0, 0, 0);
|
2093
|
+
|
2094
|
+
return date;
|
2095
|
+
}
|
2096
|
+
};
|
2097
|
+
|
2098
|
+
/* istanbul ignore next */
|
2099
|
+
function _flatpickr(nodeList, config) {
|
2100
|
+
var nodes = Array.prototype.slice.call(nodeList); // static list
|
2101
|
+
var instances = [];
|
2102
|
+
for (var i = 0; i < nodes.length; i++) {
|
2103
|
+
try {
|
2104
|
+
if (nodes[i].getAttribute("data-fp-omit") !== null) continue;
|
2105
|
+
|
2106
|
+
if (nodes[i]._flatpickr) {
|
2107
|
+
nodes[i]._flatpickr.destroy();
|
2108
|
+
nodes[i]._flatpickr = null;
|
2109
|
+
}
|
2110
|
+
|
2111
|
+
nodes[i]._flatpickr = new FlatpickrInstance(nodes[i], config || {});
|
2112
|
+
instances.push(nodes[i]._flatpickr);
|
2113
|
+
} catch (e) {
|
2114
|
+
console.warn(e, e.stack);
|
2115
|
+
}
|
2116
|
+
}
|
2117
|
+
|
2118
|
+
return instances.length === 1 ? instances[0] : instances;
|
2119
|
+
}
|
2120
|
+
|
2121
|
+
/* istanbul ignore next */
|
2122
|
+
if (typeof HTMLElement !== "undefined") {
|
2123
|
+
// browser env
|
2124
|
+
HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {
|
2125
|
+
return _flatpickr(this, config);
|
2126
|
+
};
|
2127
|
+
|
2128
|
+
HTMLElement.prototype.flatpickr = function (config) {
|
2129
|
+
return _flatpickr([this], config);
|
2130
|
+
};
|
2131
|
+
}
|
2132
|
+
|
2133
|
+
/* istanbul ignore next */
|
2134
|
+
function flatpickr(selector, config) {
|
2135
|
+
if (selector instanceof NodeList) return _flatpickr(selector, config);else if (!(selector instanceof HTMLElement)) return _flatpickr(window.document.querySelectorAll(selector), config);
|
2136
|
+
|
2137
|
+
return _flatpickr([selector], config);
|
2138
|
+
}
|
2139
|
+
|
2140
|
+
/* istanbul ignore next */
|
2141
|
+
flatpickr.defaultConfig = FlatpickrInstance.defaultConfig = {
|
2142
|
+
mode: "single",
|
2143
|
+
|
2144
|
+
position: "auto",
|
2145
|
+
|
2146
|
+
animate: typeof window !== "undefined" && window.navigator.userAgent.indexOf("MSIE") === -1,
|
2147
|
+
|
2148
|
+
// wrap: see https://chmln.github.io/flatpickr/examples/#flatpickr-external-elements
|
2149
|
+
wrap: false,
|
2150
|
+
|
2151
|
+
// enables week numbers
|
2152
|
+
weekNumbers: false,
|
2153
|
+
|
2154
|
+
// allow manual datetime input
|
2155
|
+
allowInput: false,
|
2156
|
+
|
2157
|
+
/*
|
2158
|
+
clicking on input opens the date(time)picker.
|
2159
|
+
disable if you wish to open the calendar manually with .open()
|
2160
|
+
*/
|
2161
|
+
clickOpens: true,
|
2162
|
+
|
2163
|
+
/*
|
2164
|
+
closes calendar after date selection,
|
2165
|
+
unless 'mode' is 'multiple' or enableTime is true
|
2166
|
+
*/
|
2167
|
+
closeOnSelect: true,
|
2168
|
+
|
2169
|
+
// display time picker in 24 hour mode
|
2170
|
+
time_24hr: false,
|
2171
|
+
|
2172
|
+
// enables the time picker functionality
|
2173
|
+
enableTime: false,
|
2174
|
+
|
2175
|
+
// noCalendar: true will hide the calendar. use for a time picker along w/ enableTime
|
2176
|
+
noCalendar: false,
|
2177
|
+
|
2178
|
+
// more date format chars at https://chmln.github.io/flatpickr/#dateformat
|
2179
|
+
dateFormat: "Y-m-d",
|
2180
|
+
|
2181
|
+
// date format used in aria-label for days
|
2182
|
+
ariaDateFormat: "F j, Y",
|
2183
|
+
|
2184
|
+
// altInput - see https://chmln.github.io/flatpickr/#altinput
|
2185
|
+
altInput: false,
|
2186
|
+
|
2187
|
+
// the created altInput element will have this class.
|
2188
|
+
altInputClass: "form-control input",
|
2189
|
+
|
2190
|
+
// same as dateFormat, but for altInput
|
2191
|
+
altFormat: "F j, Y", // defaults to e.g. June 10, 2016
|
2192
|
+
|
2193
|
+
// defaultDate - either a datestring or a date object. used for datetimepicker"s initial value
|
2194
|
+
defaultDate: null,
|
2195
|
+
|
2196
|
+
// the minimum date that user can pick (inclusive)
|
2197
|
+
minDate: null,
|
2198
|
+
|
2199
|
+
// the maximum date that user can pick (inclusive)
|
2200
|
+
maxDate: null,
|
2201
|
+
|
2202
|
+
// dateparser that transforms a given string to a date object
|
2203
|
+
parseDate: null,
|
2204
|
+
|
2205
|
+
// dateformatter that transforms a given date object to a string, according to passed format
|
2206
|
+
formatDate: null,
|
2207
|
+
|
2208
|
+
getWeek: function getWeek(givenDate) {
|
2209
|
+
var date = new Date(givenDate.getTime());
|
2210
|
+
var onejan = new Date(date.getFullYear(), 0, 1);
|
2211
|
+
return Math.ceil(((date - onejan) / 86400000 + onejan.getDay() + 1) / 7);
|
2212
|
+
},
|
2213
|
+
|
2214
|
+
|
2215
|
+
// see https://chmln.github.io/flatpickr/#disable
|
2216
|
+
enable: [],
|
2217
|
+
|
2218
|
+
// see https://chmln.github.io/flatpickr/#disable
|
2219
|
+
disable: [],
|
2220
|
+
|
2221
|
+
// display the short version of month names - e.g. Sep instead of September
|
2222
|
+
shorthandCurrentMonth: false,
|
2223
|
+
|
2224
|
+
// displays calendar inline. see https://chmln.github.io/flatpickr/#inline-calendar
|
2225
|
+
inline: false,
|
2226
|
+
|
2227
|
+
// position calendar inside wrapper and next to the input element
|
2228
|
+
// leave at false unless you know what you"re doing
|
2229
|
+
"static": false,
|
2230
|
+
|
2231
|
+
// DOM node to append the calendar to in *static* mode
|
2232
|
+
appendTo: null,
|
2233
|
+
|
2234
|
+
// code for previous/next icons. this is where you put your custom icon code e.g. fontawesome
|
2235
|
+
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>",
|
2236
|
+
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>",
|
2237
|
+
|
2238
|
+
// enables seconds in the time picker
|
2239
|
+
enableSeconds: false,
|
2240
|
+
|
2241
|
+
// step size used when scrolling/incrementing the hour element
|
2242
|
+
hourIncrement: 1,
|
2243
|
+
|
2244
|
+
// step size used when scrolling/incrementing the minute element
|
2245
|
+
minuteIncrement: 5,
|
2246
|
+
|
2247
|
+
// initial value in the hour element
|
2248
|
+
defaultHour: 12,
|
2249
|
+
|
2250
|
+
// initial value in the minute element
|
2251
|
+
defaultMinute: 0,
|
2252
|
+
|
2253
|
+
// initial value in the seconds element
|
2254
|
+
defaultSeconds: 0,
|
2255
|
+
|
2256
|
+
// disable native mobile datetime input support
|
2257
|
+
disableMobile: false,
|
2258
|
+
|
2259
|
+
// default locale
|
2260
|
+
locale: "default",
|
2261
|
+
|
2262
|
+
plugins: [],
|
2263
|
+
|
2264
|
+
ignoredFocusElements: [],
|
2265
|
+
|
2266
|
+
// called every time calendar is closed
|
2267
|
+
onClose: undefined, // function (dateObj, dateStr) {}
|
2268
|
+
|
2269
|
+
// onChange callback when user selects a date or time
|
2270
|
+
onChange: undefined, // function (dateObj, dateStr) {}
|
2271
|
+
|
2272
|
+
// called for every day element
|
2273
|
+
onDayCreate: undefined,
|
2274
|
+
|
2275
|
+
// called every time the month is changed
|
2276
|
+
onMonthChange: undefined,
|
2277
|
+
|
2278
|
+
// called every time calendar is opened
|
2279
|
+
onOpen: undefined, // function (dateObj, dateStr) {}
|
2280
|
+
|
2281
|
+
// called after the configuration has been parsed
|
2282
|
+
onParseConfig: undefined,
|
2283
|
+
|
2284
|
+
// called after calendar is ready
|
2285
|
+
onReady: undefined, // function (dateObj, dateStr) {}
|
2286
|
+
|
2287
|
+
// called after input value updated
|
2288
|
+
onValueUpdate: undefined,
|
2289
|
+
|
2290
|
+
// called every time the year is changed
|
2291
|
+
onYearChange: undefined,
|
2292
|
+
|
2293
|
+
onKeyDown: undefined,
|
2294
|
+
|
2295
|
+
onDestroy: undefined
|
2296
|
+
};
|
2297
|
+
|
2298
|
+
/* istanbul ignore next */
|
2299
|
+
flatpickr.l10ns = {
|
2300
|
+
en: {
|
2301
|
+
weekdays: {
|
2302
|
+
shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
2303
|
+
longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
2304
|
+
},
|
2305
|
+
months: {
|
2306
|
+
shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
2307
|
+
longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
2308
|
+
},
|
2309
|
+
daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
|
2310
|
+
firstDayOfWeek: 0,
|
2311
|
+
ordinal: function ordinal(nth) {
|
2312
|
+
var s = nth % 100;
|
2313
|
+
if (s > 3 && s < 21) return "th";
|
2314
|
+
switch (s % 10) {
|
2315
|
+
case 1:
|
2316
|
+
return "st";
|
2317
|
+
case 2:
|
2318
|
+
return "nd";
|
2319
|
+
case 3:
|
2320
|
+
return "rd";
|
2321
|
+
default:
|
2322
|
+
return "th";
|
2323
|
+
}
|
2324
|
+
},
|
2325
|
+
rangeSeparator: " to ",
|
2326
|
+
weekAbbreviation: "Wk",
|
2327
|
+
scrollTitle: "Scroll to increment",
|
2328
|
+
toggleTitle: "Click to toggle"
|
2329
|
+
}
|
2330
|
+
};
|
2331
|
+
|
2332
|
+
flatpickr.l10ns.default = Object.create(flatpickr.l10ns.en);
|
2333
|
+
flatpickr.localize = function (l10n) {
|
2334
|
+
return _extends(flatpickr.l10ns.default, l10n || {});
|
2335
|
+
};
|
2336
|
+
flatpickr.setDefaults = function (config) {
|
2337
|
+
return _extends(flatpickr.defaultConfig, config || {});
|
2338
|
+
};
|
2339
|
+
|
2340
|
+
/* istanbul ignore next */
|
2341
|
+
if (typeof jQuery !== "undefined") {
|
2342
|
+
jQuery.fn.flatpickr = function (config) {
|
2343
|
+
return _flatpickr(this, config);
|
2344
|
+
};
|
2345
|
+
}
|
2346
|
+
|
2347
|
+
Date.prototype.fp_incr = function (days) {
|
2348
|
+
return new Date(this.getFullYear(), this.getMonth(), this.getDate() + parseInt(days, 10));
|
2349
|
+
};
|
2350
|
+
|
2351
|
+
if (typeof module !== "undefined") module.exports = flatpickr;
|