PluginProbe
Elementor Website Builder – more than just a page builder / 3.5.6
Elementor Website Builder – more than just a page builder v3.5.6
4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 All 452 releases
← All changes | assets/lib/flatpickr/flatpickr.js +827 -1403 4.1.0-beta23.5.6 View file →
@@ -1,70 +1,66 @@
1 -/* flatpickr v4.6.13, @license MIT */
1 +/* flatpickr v4.1.4, @license MIT */
2 2 (function (global, factory) {
3 3 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4 4 typeof define === 'function' && define.amd ? define(factory) :
5 - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.flatpickr = factory());
5 + (global.flatpickr = factory());
6 6 }(this, (function () { 'use strict';
7 7
8 8 /*! *****************************************************************************
9 - Copyright (c) Microsoft Corporation.
9 + Copyright (c) Microsoft Corporation. All rights reserved.
10 + Licensed under the Apache License, Version 2.0 (the "License"); you may not use
11 + this file except in compliance with the License. You may obtain a copy of the
12 + License at http://www.apache.org/licenses/LICENSE-2.0
10 13
11 - Permission to use, copy, modify, and/or distribute this software for any
12 - purpose with or without fee is hereby granted.
14 + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
16 + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
17 + MERCHANTABLITY OR NON-INFRINGEMENT.
13 18
14 - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
15 - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
16 - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
17 - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
18 - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
19 - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 - PERFORMANCE OF THIS SOFTWARE.
19 + See the Apache Version 2.0 License for specific language governing permissions
20 + and limitations under the License.
21 21 ***************************************************************************** */
22 + /* global Reflect, Promise */
22 23
23 - var __assign = function() {
24 - __assign = Object.assign || function __assign(t) {
25 - for (var s, i = 1, n = arguments.length; i < n; i++) {
26 - s = arguments[i];
27 - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
28 - }
29 - return t;
30 - };
31 - return __assign.apply(this, arguments);
24 +
25 +
26 + var __assign = Object.assign || function __assign(t) {
27 + for (var s, i = 1, n = arguments.length; i < n; i++) {
28 + s = arguments[i];
29 + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
30 + }
31 + return t;
32 32 };
33 33
34 - function __spreadArrays() {
35 - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
36 - for (var r = Array(s), k = 0, i = 0; i < il; i++)
37 - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
38 - r[k] = a[j];
39 - return r;
34 + function compareDates(date1, date2, timeless) {
35 + if (timeless !== false) {
36 + return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -
37 + new Date(date2.getTime()).setHours(0, 0, 0, 0));
38 + }
39 + return date1.getTime() - date2.getTime();
40 40 }
41 + var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? "shorthand" : "longhand"][monthNumber]; };
42 + var getWeek = function (givenDate) {
43 + var onejan = new Date(givenDate.getFullYear(), 0, 1);
44 + return Math.ceil(((givenDate.getTime() - onejan.getTime()) / 86400000 +
45 + onejan.getDay() +
46 + 1) /
47 + 7);
48 + };
49 + var duration = {
50 + DAY: 86400000,
51 + };
41 52
42 - var HOOKS = [
43 - "onChange",
44 - "onClose",
45 - "onDayCreate",
46 - "onDestroy",
47 - "onKeyDown",
48 - "onMonthChange",
49 - "onOpen",
50 - "onParseConfig",
51 - "onReady",
52 - "onValueUpdate",
53 - "onYearChange",
54 - "onPreCalendarPosition",
55 - ];
56 53 var defaults = {
57 54 _disable: [],
55 + _enable: [],
58 56 allowInput: false,
59 - allowInvalidPreload: false,
60 57 altFormat: "F j, Y",
61 58 altInput: false,
62 59 altInputClass: "form-control input",
63 60 animate: typeof window === "object" &&
64 - window.navigator.userAgent.indexOf("MSIE") === -1,
61 + window.navigator.userAgent.indexOf("MSIE") === -1,
65 62 ariaDateFormat: "F j, Y",
66 - autoFillDefaultTime: true,
67 63 clickOpens: true,
68 64 closeOnSelect: true,
69 65 conjunction: ", ",
70 66 dateFormat: "Y-m-d",
@@ -72,27 +68,13 @@
72 68 defaultMinute: 0,
73 69 defaultSeconds: 0,
74 70 disable: [],
75 71 disableMobile: false,
72 + enable: [],
76 73 enableSeconds: false,
77 74 enableTime: false,
78 - errorHandler: function (err) {
79 - return typeof console !== "undefined" && console.warn(err);
80 - },
81 - getWeek: function (givenDate) {
82 - var date = new Date(givenDate.getTime());
83 - date.setHours(0, 0, 0, 0);
84 - // Thursday in current week decides the year.
85 - date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));
86 - // January 4 is always in week 1.
87 - var week1 = new Date(date.getFullYear(), 0, 4);
88 - // Adjust to Thursday in week 1 and count number of weeks from date to week1.
89 - return (1 +
90 - Math.round(((date.getTime() - week1.getTime()) / 86400000 -
91 - 3 +
92 - ((week1.getDay() + 6) % 7)) /
93 - 7));
94 - },
75 + errorHandler: console.warn,
76 + getWeek: getWeek,
95 77 hourIncrement: 1,
96 78 ignoredFocusElements: [],
97 79 inline: false,
98 80 locale: "default",
@@ -97,12 +79,10 @@
97 79 inline: false,
98 80 locale: "default",
99 81 minuteIncrement: 5,
100 82 mode: "single",
101 - monthSelectorType: "dropdown",
102 83 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>",
103 84 noCalendar: false,
104 - now: new Date(),
105 85 onChange: [],
106 86 onClose: [],
107 87 onDayCreate: [],
108 88 onDestroy: [],
@@ -112,15 +92,13 @@
112 92 onParseConfig: [],
113 93 onReady: [],
114 94 onValueUpdate: [],
115 95 onYearChange: [],
116 - onPreCalendarPosition: [],
117 96 plugins: [],
118 97 position: "auto",
119 98 positionElement: undefined,
120 99 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>",
121 100 shorthandCurrentMonth: false,
122 - showMonths: 1,
123 101 static: false,
124 102 time_24hr: false,
125 103 weekNumbers: false,
126 104 wrap: false,
@@ -190,33 +168,34 @@
190 168 weekAbbreviation: "Wk",
191 169 scrollTitle: "Scroll to increment",
192 170 toggleTitle: "Click to toggle",
193 171 amPM: ["AM", "PM"],
194 - yearAriaLabel: "Year",
195 - monthAriaLabel: "Month",
196 - hourAriaLabel: "Hour",
197 - minuteAriaLabel: "Minute",
198 - time_24hr: false,
199 172 };
200 173
201 - var pad = function (number, length) {
202 - if (length === void 0) { length = 2; }
203 - return ("000" + number).slice(length * -1);
204 - };
174 + var pad = function (number) { return ("0" + number).slice(-2); };
205 175 var int = function (bool) { return (bool === true ? 1 : 0); };
206 - /* istanbul ignore next */
207 - function debounce(fn, wait) {
208 - var t;
176 + function debounce(func, wait, immediate) {
177 + if (immediate === void 0) { immediate = false; }
178 + var timeout;
209 179 return function () {
210 - var _this = this;
211 - var args = arguments;
212 - clearTimeout(t);
213 - t = setTimeout(function () { return fn.apply(_this, args); }, wait);
180 + var context = this, args = arguments;
181 + timeout !== null && clearTimeout(timeout);
182 + timeout = window.setTimeout(function () {
183 + timeout = null;
184 + if (!immediate)
185 + func.apply(context, args);
186 + }, wait);
187 + if (immediate && !timeout)
188 + func.apply(context, args);
214 189 };
215 190 }
216 191 var arrayify = function (obj) {
217 192 return obj instanceof Array ? obj : [obj];
218 193 };
194 + function mouseDelta(e) {
195 + var delta = e.wheelDelta || -e.deltaY;
196 + return delta >= 0 ? 1 : -1;
197 + }
219 198
220 199 function toggleClass(elem, className, bool) {
221 200 if (bool === true)
222 201 return elem.classList.add(className);
@@ -239,49 +218,28 @@
239 218 if (condition(node))
240 219 return node;
241 220 else if (node.parentNode)
242 221 return findParent(node.parentNode, condition);
243 - return undefined; // nothing found
222 + return undefined;
244 223 }
245 - function createNumberInput(inputClassName, opts) {
224 + function createNumberInput(inputClassName) {
246 225 var wrapper = createElement("div", "numInputWrapper"), numInput = createElement("input", "numInput " + inputClassName), arrowUp = createElement("span", "arrowUp"), arrowDown = createElement("span", "arrowDown");
247 - if (navigator.userAgent.indexOf("MSIE 9.0") === -1) {
248 - numInput.type = "number";
249 - }
250 - else {
251 - numInput.type = "text";
252 - numInput.pattern = "\\d*";
253 - }
254 - if (opts !== undefined)
255 - for (var key in opts)
256 - numInput.setAttribute(key, opts[key]);
226 + numInput.type = "text";
227 + numInput.pattern = "\\d*";
257 228 wrapper.appendChild(numInput);
258 229 wrapper.appendChild(arrowUp);
259 230 wrapper.appendChild(arrowDown);
260 231 return wrapper;
261 232 }
262 - function getEventTarget(event) {
263 - try {
264 - if (typeof event.composedPath === "function") {
265 - var path = event.composedPath();
266 - return path[0];
267 - }
268 - return event.target;
269 - }
270 - catch (error) {
271 - return event.target;
272 - }
273 - }
274 233
275 - var doNothing = function () { return undefined; };
276 - var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? "shorthand" : "longhand"][monthNumber]; };
234 + var do_nothing = function () { return undefined; };
277 235 var revFormat = {
278 - D: doNothing,
236 + D: do_nothing,
279 237 F: function (dateObj, monthName, locale) {
280 238 dateObj.setMonth(locale.months.longhand.indexOf(monthName));
281 239 },
282 240 G: function (dateObj, hour) {
283 - dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));
241 + dateObj.setHours(parseFloat(hour));
284 242 },
285 243 H: function (dateObj, hour) {
286 244 dateObj.setHours(parseFloat(hour));
287 245 },
@@ -288,9 +246,9 @@
288 246 J: function (dateObj, day) {
289 247 dateObj.setDate(parseFloat(day));
290 248 },
291 249 K: function (dateObj, amPM, locale) {
292 - dateObj.setHours((dateObj.getHours() % 12) +
250 + dateObj.setHours(dateObj.getHours() % 12 +
293 251 12 * int(new RegExp(locale.amPM[1], "i").test(amPM)));
294 252 },
295 253 M: function (dateObj, shortMonth, locale) {
296 254 dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));
@@ -298,13 +256,11 @@
298 256 S: function (dateObj, seconds) {
299 257 dateObj.setSeconds(parseFloat(seconds));
300 258 },
301 259 U: function (_, unixSeconds) { return new Date(parseFloat(unixSeconds) * 1000); },
302 - W: function (dateObj, weekNum, locale) {
260 + W: function (dateObj, weekNum) {
303 261 var weekNumber = parseInt(weekNum);
304 - var date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);
305 - date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);
306 - return date;
262 + return new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);
307 263 },
308 264 Y: function (dateObj, year) {
309 265 dateObj.setFullYear(parseFloat(year));
310 266 },
@@ -312,9 +268,9 @@
312 268 d: function (dateObj, day) {
313 269 dateObj.setDate(parseFloat(day));
314 270 },
315 271 h: function (dateObj, hour) {
316 - dateObj.setHours((dateObj.getHours() >= 12 ? 12 : 0) + parseFloat(hour));
272 + dateObj.setHours(parseFloat(hour));
317 273 },
318 274 i: function (dateObj, minutes) {
319 275 dateObj.setMinutes(parseFloat(minutes));
320 276 },
@@ -320,9 +276,9 @@
320 276 },
321 277 j: function (dateObj, day) {
322 278 dateObj.setDate(parseFloat(day));
323 279 },
324 - l: doNothing,
280 + l: do_nothing,
325 281 m: function (dateObj, month) {
326 282 dateObj.setMonth(parseFloat(month) - 1);
327 283 },
328 284 n: function (dateObj, month) {
@@ -330,24 +286,21 @@
330 286 },
331 287 s: function (dateObj, seconds) {
332 288 dateObj.setSeconds(parseFloat(seconds));
333 289 },
334 - u: function (_, unixMillSeconds) {
335 - return new Date(parseFloat(unixMillSeconds));
336 - },
337 - w: doNothing,
290 + w: do_nothing,
338 291 y: function (dateObj, year) {
339 292 dateObj.setFullYear(2000 + parseFloat(year));
340 293 },
341 294 };
342 295 var tokenRegex = {
343 - D: "",
344 - F: "",
296 + D: "(\\w+)",
297 + F: "(\\w+)",
345 298 G: "(\\d\\d|\\d)",
346 299 H: "(\\d\\d|\\d)",
347 300 J: "(\\d\\d|\\d)\\w+",
348 301 K: "",
349 - M: "",
302 + M: "(\\w+)",
350 303 S: "(\\d\\d|\\d)",
351 304 U: "(.+)",
352 305 W: "(\\d\\d|\\d)",
353 306 Y: "(\\d{4})",
@@ -355,223 +308,56 @@
355 308 d: "(\\d\\d|\\d)",
356 309 h: "(\\d\\d|\\d)",
357 310 i: "(\\d\\d|\\d)",
358 311 j: "(\\d\\d|\\d)",
359 - l: "",
312 + l: "(\\w+)",
360 313 m: "(\\d\\d|\\d)",
361 314 n: "(\\d\\d|\\d)",
362 315 s: "(\\d\\d|\\d)",
363 - u: "(.+)",
364 316 w: "(\\d\\d|\\d)",
365 317 y: "(\\d{2})",
366 318 };
367 319 var formats = {
368 - // get the date in UTC
369 320 Z: function (date) { return date.toISOString(); },
370 - // weekday name, short, e.g. Thu
371 321 D: function (date, locale, options) {
372 322 return locale.weekdays.shorthand[formats.w(date, locale, options)];
373 323 },
374 - // full month name e.g. January
375 324 F: function (date, locale, options) {
376 325 return monthToStr(formats.n(date, locale, options) - 1, false, locale);
377 326 },
378 - // padded hour 1-12
379 327 G: function (date, locale, options) {
380 328 return pad(formats.h(date, locale, options));
381 329 },
382 - // hours with leading zero e.g. 03
383 330 H: function (date) { return pad(date.getHours()); },
384 - // day (1-30) with ordinal suffix e.g. 1st, 2nd
385 331 J: function (date, locale) {
386 332 return locale.ordinal !== undefined
387 333 ? date.getDate() + locale.ordinal(date.getDate())
388 334 : date.getDate();
389 335 },
390 - // AM/PM
391 336 K: function (date, locale) { return locale.amPM[int(date.getHours() > 11)]; },
392 - // shorthand month e.g. Jan, Sep, Oct, etc
393 337 M: function (date, locale) {
394 338 return monthToStr(date.getMonth(), true, locale);
395 339 },
396 - // seconds 00-59
397 340 S: function (date) { return pad(date.getSeconds()); },
398 - // unix timestamp
399 341 U: function (date) { return date.getTime() / 1000; },
400 342 W: function (date, _, options) {
401 343 return options.getWeek(date);
402 344 },
403 - // full year e.g. 2016, padded (0001-9999)
404 - Y: function (date) { return pad(date.getFullYear(), 4); },
405 - // day in month, padded (01-30)
345 + Y: function (date) { return date.getFullYear(); },
406 346 d: function (date) { return pad(date.getDate()); },
407 - // hour from 1-12 (am/pm)
408 347 h: function (date) { return (date.getHours() % 12 ? date.getHours() % 12 : 12); },
409 - // minutes, padded with leading zero e.g. 09
410 348 i: function (date) { return pad(date.getMinutes()); },
411 - // day in month (1-30)
412 349 j: function (date) { return date.getDate(); },
413 - // weekday name, full, e.g. Thursday
414 350 l: function (date, locale) {
415 351 return locale.weekdays.longhand[date.getDay()];
416 352 },
417 - // padded month number (01-12)
418 353 m: function (date) { return pad(date.getMonth() + 1); },
419 - // the month number (1-12)
420 354 n: function (date) { return date.getMonth() + 1; },
421 - // seconds 0-59
422 355 s: function (date) { return date.getSeconds(); },
423 - // Unix Milliseconds
424 - u: function (date) { return date.getTime(); },
425 - // number of the day of the week
426 356 w: function (date) { return date.getDay(); },
427 - // last two digits of year e.g. 16 for 2016
428 357 y: function (date) { return String(date.getFullYear()).substring(2); },
429 358 };
430 359
431 - var createDateFormatter = function (_a) {
432 - var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c, _d = _a.isMobile, isMobile = _d === void 0 ? false : _d;
433 - return function (dateObj, frmt, overrideLocale) {
434 - var locale = overrideLocale || l10n;
435 - if (config.formatDate !== undefined && !isMobile) {
436 - return config.formatDate(dateObj, frmt, locale);
437 - }
438 - return frmt
439 - .split("")
440 - .map(function (c, i, arr) {
441 - return formats[c] && arr[i - 1] !== "\\"
442 - ? formats[c](dateObj, locale, config)
443 - : c !== "\\"
444 - ? c
445 - : "";
446 - })
447 - .join("");
448 - };
449 - };
450 - var createDateParser = function (_a) {
451 - var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;
452 - return function (date, givenFormat, timeless, customLocale) {
453 - if (date !== 0 && !date)
454 - return undefined;
455 - var locale = customLocale || l10n;
456 - var parsedDate;
457 - var dateOrig = date;
458 - if (date instanceof Date)
459 - parsedDate = new Date(date.getTime());
460 - else if (typeof date !== "string" &&
461 - date.toFixed !== undefined // timestamp
462 - )
463 - // create a copy
464 - parsedDate = new Date(date);
465 - else if (typeof date === "string") {
466 - // date string
467 - var format = givenFormat || (config || defaults).dateFormat;
468 - var datestr = String(date).trim();
469 - if (datestr === "today") {
470 - parsedDate = new Date();
471 - timeless = true;
472 - }
473 - else if (config && config.parseDate) {
474 - parsedDate = config.parseDate(date, format);
475 - }
476 - else if (/Z$/.test(datestr) ||
477 - /GMT$/.test(datestr) // datestrings w/ timezone
478 - ) {
479 - parsedDate = new Date(date);
480 - }
481 - else {
482 - var matched = void 0, ops = [];
483 - for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
484 - var token_1 = format[i];
485 - var isBackSlash = token_1 === "\\";
486 - var escaped = format[i - 1] === "\\" || isBackSlash;
487 - if (tokenRegex[token_1] && !escaped) {
488 - regexStr += tokenRegex[token_1];
489 - var match = new RegExp(regexStr).exec(date);
490 - if (match && (matched = true)) {
491 - ops[token_1 !== "Y" ? "push" : "unshift"]({
492 - fn: revFormat[token_1],
493 - val: match[++matchIndex],
494 - });
495 - }
496 - }
497 - else if (!isBackSlash)
498 - regexStr += "."; // don't really care
499 - }
500 - parsedDate =
501 - !config || !config.noCalendar
502 - ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)
503 - : new Date(new Date().setHours(0, 0, 0, 0));
504 - ops.forEach(function (_a) {
505 - var fn = _a.fn, val = _a.val;
506 - return (parsedDate = fn(parsedDate, val, locale) || parsedDate);
507 - });
508 - parsedDate = matched ? parsedDate : undefined;
509 - }
510 - }
511 - /* istanbul ignore next */
512 - if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {
513 - config.errorHandler(new Error("Invalid date provided: " + dateOrig));
514 - return undefined;
515 - }
516 - if (timeless === true)
517 - parsedDate.setHours(0, 0, 0, 0);
518 - return parsedDate;
519 - };
520 - };
521 - /**
522 - * Compute the difference in dates, measured in ms
523 - */
524 - function compareDates(date1, date2, timeless) {
525 - if (timeless === void 0) { timeless = true; }
526 - if (timeless !== false) {
527 - return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -
528 - new Date(date2.getTime()).setHours(0, 0, 0, 0));
529 - }
530 - return date1.getTime() - date2.getTime();
531 - }
532 - var isBetween = function (ts, ts1, ts2) {
533 - return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);
534 - };
535 - var calculateSecondsSinceMidnight = function (hours, minutes, seconds) {
536 - return hours * 3600 + minutes * 60 + seconds;
537 - };
538 - var parseSeconds = function (secondsSinceMidnight) {
539 - var hours = Math.floor(secondsSinceMidnight / 3600), minutes = (secondsSinceMidnight - hours * 3600) / 60;
540 - return [hours, minutes, secondsSinceMidnight - hours * 3600 - minutes * 60];
541 - };
542 - var duration = {
543 - DAY: 86400000,
544 - };
545 - function getDefaultHours(config) {
546 - var hours = config.defaultHour;
547 - var minutes = config.defaultMinute;
548 - var seconds = config.defaultSeconds;
549 - if (config.minDate !== undefined) {
550 - var minHour = config.minDate.getHours();
551 - var minMinutes = config.minDate.getMinutes();
552 - var minSeconds = config.minDate.getSeconds();
553 - if (hours < minHour) {
554 - hours = minHour;
555 - }
556 - if (hours === minHour && minutes < minMinutes) {
557 - minutes = minMinutes;
558 - }
559 - if (hours === minHour && minutes === minMinutes && seconds < minSeconds)
560 - seconds = config.minDate.getSeconds();
561 - }
562 - if (config.maxDate !== undefined) {
563 - var maxHr = config.maxDate.getHours();
564 - var maxMinutes = config.maxDate.getMinutes();
565 - hours = Math.min(hours, maxHr);
566 - if (hours === maxHr)
567 - minutes = Math.min(maxMinutes, minutes);
568 - if (hours === maxHr && minutes === maxMinutes)
569 - seconds = config.maxDate.getSeconds();
570 - }
571 - return { hours: hours, minutes: minutes, seconds: seconds };
572 - }
573 -
574 360 if (typeof Object.assign !== "function") {
575 361 Object.assign = function (target) {
576 362 var args = [];
577 363 for (var _i = 1; _i < arguments.length; _i++) {
@@ -592,32 +378,24 @@
592 378 return target;
593 379 };
594 380 }
595 381
596 - var DEBOUNCED_CHANGE_MS = 300;
597 382 function FlatpickrInstance(element, instanceConfig) {
598 - var self = {
599 - config: __assign(__assign({}, defaults), flatpickr.defaultConfig),
600 - l10n: english,
601 - };
602 - self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });
383 + var self = {};
384 + self.parseDate = parseDate;
385 + self.formatDate = formatDate;
386 + self._animationLoop = [];
603 387 self._handlers = [];
604 - self.pluginElements = [];
605 - self.loadedPlugins = [];
606 388 self._bind = bind;
607 389 self._setHoursFromDate = setHoursFromDate;
608 - self._positionCalendar = positionCalendar;
609 390 self.changeMonth = changeMonth;
610 391 self.changeYear = changeYear;
611 392 self.clear = clear;
612 393 self.close = close;
613 - self.onMouseOver = onMouseOver;
614 394 self._createElement = createElement;
615 - self.createDay = createDay;
616 395 self.destroy = destroy;
617 396 self.isEnabled = isEnabled;
618 397 self.jumpToDate = jumpToDate;
619 - self.updateValue = updateValue;
620 398 self.open = open;
621 399 self.redraw = redraw;
622 400 self.set = set;
623 401 self.setDate = setDate;
@@ -645,87 +423,54 @@
645 423 build();
646 424 bindEvents();
647 425 if (self.selectedDates.length || self.config.noCalendar) {
648 426 if (self.config.enableTime) {
649 - setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj : undefined);
427 + setHoursFromDate(self.config.noCalendar
428 + ? self.latestSelectedDateObj || self.config.minDate
429 + : undefined);
650 430 }
651 431 updateValue(false);
652 432 }
653 - setCalendarWidth();
654 - var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
655 - /* TODO: investigate this further
656 -
657 - Currently, there is weird positioning behavior in safari causing pages
658 - to scroll up. https://github.com/chmln/flatpickr/issues/563
659 -
660 - However, most browsers are not Safari and positioning is expensive when used
661 - in scale. https://github.com/chmln/flatpickr/issues/1096
662 - */
663 - if (!self.isMobile && isSafari) {
433 + self.showTimeInput =
434 + self.selectedDates.length > 0 || self.config.noCalendar;
435 + if (self.weekWrapper !== undefined && self.daysContainer !== undefined) {
436 + self.calendarContainer.style.width =
437 + self.daysContainer.offsetWidth + self.weekWrapper.offsetWidth + "px";
438 + }
439 + if (!self.isMobile)
664 440 positionCalendar();
665 - }
666 441 triggerEvent("onReady");
667 442 }
668 - function getClosestActiveElement() {
669 - var _a;
670 - return (((_a = self.calendarContainer) === null || _a === void 0 ? void 0 : _a.getRootNode())
671 - .activeElement || document.activeElement);
672 - }
673 443 function bindToInstance(fn) {
674 444 return fn.bind(self);
675 445 }
676 - function setCalendarWidth() {
677 - var config = self.config;
678 - if (config.weekNumbers === false && config.showMonths === 1) {
679 - return;
680 - }
681 - else if (config.noCalendar !== true) {
682 - window.requestAnimationFrame(function () {
683 - if (self.calendarContainer !== undefined) {
684 - self.calendarContainer.style.visibility = "hidden";
685 - self.calendarContainer.style.display = "block";
686 - }
687 - if (self.daysContainer !== undefined) {
688 - var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;
689 - self.daysContainer.style.width = daysWidth + "px";
690 - self.calendarContainer.style.width =
691 - daysWidth +
692 - (self.weekWrapper !== undefined
693 - ? self.weekWrapper.offsetWidth
694 - : 0) +
695 - "px";
696 - self.calendarContainer.style.removeProperty("visibility");
697 - self.calendarContainer.style.removeProperty("display");
698 - }
699 - });
700 - }
701 - }
702 - /**
703 - * The handler for all events targeting the time inputs
704 - */
705 446 function updateTime(e) {
706 - if (self.selectedDates.length === 0) {
707 - var defaultDate = self.config.minDate === undefined ||
708 - compareDates(new Date(), self.config.minDate) >= 0
709 - ? new Date()
710 - : new Date(self.config.minDate.getTime());
711 - var defaults = getDefaultHours(self.config);
712 - defaultDate.setHours(defaults.hours, defaults.minutes, defaults.seconds, defaultDate.getMilliseconds());
713 - self.selectedDates = [defaultDate];
714 - self.latestSelectedDateObj = defaultDate;
447 + if (self.config.noCalendar && self.selectedDates.length === 0) {
448 + var minDate = self.config.minDate;
449 + self.setDate(new Date().setHours(!minDate ? self.config.defaultHour : minDate.getHours(), !minDate ? self.config.defaultMinute : minDate.getMinutes(), !minDate || !self.config.enableSeconds
450 + ? self.config.defaultSeconds
451 + : minDate.getSeconds()), false);
452 + setHoursFromInputs();
453 + updateValue();
715 454 }
716 - if (e !== undefined && e.type !== "blur") {
717 - timeWrapper(e);
455 + timeWrapper(e);
456 + if (self.selectedDates.length === 0)
457 + return;
458 + if (!self.minDateHasTime ||
459 + e.type !== "input" ||
460 + e.target.value.length >= 2) {
461 + setHoursFromInputs();
462 + updateValue();
718 463 }
719 - var prevValue = self._input.value;
720 - setHoursFromInputs();
721 - updateValue();
722 - if (self._input.value !== prevValue) {
723 - self._debouncedChange();
464 + else {
465 + setTimeout(function () {
466 + setHoursFromInputs();
467 + updateValue();
468 + }, 1000);
724 469 }
725 470 }
726 471 function ampm2military(hour, amPM) {
727 - return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);
472 + return hour % 12 + 12 * int(amPM === self.l10n.amPM[1]);
728 473 }
729 474 function military2ampm(hour) {
730 475 switch (hour % 24) {
731 476 case 0:
@@ -734,11 +479,8 @@
734 479 default:
735 480 return hour % 12;
736 481 }
737 482 }
738 - /**
739 - * Syncs the selected date object time with user's time input
740 - */
741 483 function setHoursFromInputs() {
742 484 if (self.hourElement === undefined || self.minuteElement === undefined)
743 485 return;
744 486 var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined
@@ -743,78 +485,33 @@
743 485 return;
744 486 var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined
745 487 ? (parseInt(self.secondElement.value, 10) || 0) % 60
746 488 : 0;
747 - if (self.amPM !== undefined) {
489 + if (self.amPM !== undefined)
748 490 hours = ampm2military(hours, self.amPM.textContent);
491 + if (self.config.minDate &&
492 + self.minDateHasTime &&
493 + self.latestSelectedDateObj &&
494 + compareDates(self.latestSelectedDateObj, self.config.minDate) === 0) {
495 + hours = Math.max(hours, self.config.minDate.getHours());
496 + if (hours === self.config.minDate.getHours())
497 + minutes = Math.max(minutes, self.config.minDate.getMinutes());
749 498 }
750 - var limitMinHours = self.config.minTime !== undefined ||
751 - (self.config.minDate &&
752 - self.minDateHasTime &&
753 - self.latestSelectedDateObj &&
754 - compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===
755 - 0);
756 - var limitMaxHours = self.config.maxTime !== undefined ||
757 - (self.config.maxDate &&
758 - self.maxDateHasTime &&
759 - self.latestSelectedDateObj &&
760 - compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===
761 - 0);
762 - if (self.config.maxTime !== undefined &&
763 - self.config.minTime !== undefined &&
764 - self.config.minTime > self.config.maxTime) {
765 - var minBound = calculateSecondsSinceMidnight(self.config.minTime.getHours(), self.config.minTime.getMinutes(), self.config.minTime.getSeconds());
766 - var maxBound = calculateSecondsSinceMidnight(self.config.maxTime.getHours(), self.config.maxTime.getMinutes(), self.config.maxTime.getSeconds());
767 - var currentTime = calculateSecondsSinceMidnight(hours, minutes, seconds);
768 - if (currentTime > maxBound && currentTime < minBound) {
769 - var result = parseSeconds(minBound);
770 - hours = result[0];
771 - minutes = result[1];
772 - seconds = result[2];
773 - }
499 + if (self.config.maxDate &&
500 + self.maxDateHasTime &&
501 + self.latestSelectedDateObj &&
502 + compareDates(self.latestSelectedDateObj, self.config.maxDate) === 0) {
503 + hours = Math.min(hours, self.config.maxDate.getHours());
504 + if (hours === self.config.maxDate.getHours())
505 + minutes = Math.min(minutes, self.config.maxDate.getMinutes());
774 506 }
775 - else {
776 - if (limitMaxHours) {
777 - var maxTime = self.config.maxTime !== undefined
778 - ? self.config.maxTime
779 - : self.config.maxDate;
780 - hours = Math.min(hours, maxTime.getHours());
781 - if (hours === maxTime.getHours())
782 - minutes = Math.min(minutes, maxTime.getMinutes());
783 - if (minutes === maxTime.getMinutes())
784 - seconds = Math.min(seconds, maxTime.getSeconds());
785 - }
786 - if (limitMinHours) {
787 - var minTime = self.config.minTime !== undefined
788 - ? self.config.minTime
789 - : self.config.minDate;
790 - hours = Math.max(hours, minTime.getHours());
791 - if (hours === minTime.getHours() && minutes < minTime.getMinutes())
792 - minutes = minTime.getMinutes();
793 - if (minutes === minTime.getMinutes())
794 - seconds = Math.max(seconds, minTime.getSeconds());
795 - }
796 - }
797 507 setHours(hours, minutes, seconds);
798 508 }
799 - /**
800 - * Syncs time input values with a date
801 - */
802 509 function setHoursFromDate(dateObj) {
803 510 var date = dateObj || self.latestSelectedDateObj;
804 - if (date && date instanceof Date) {
511 + if (date)
805 512 setHours(date.getHours(), date.getMinutes(), date.getSeconds());
806 - }
807 513 }
808 - /**
809 - * Sets the hours, minutes, and optionally seconds
810 - * of the latest selected date object and the
811 - * corresponding time inputs
812 - * @param {Number} hours the hour. whether its military
813 - * or am-pm gets inferred from config
814 - * @param {Number} minutes the minutes
815 - * @param {Number} seconds the seconds (optional)
816 - */
817 514 function setHours(hours, minutes, seconds) {
818 515 if (self.latestSelectedDateObj !== undefined) {
819 516 self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);
820 517 }
@@ -820,9 +517,9 @@
820 517 }
821 518 if (!self.hourElement || !self.minuteElement || self.isMobile)
822 519 return;
823 520 self.hourElement.value = pad(!self.config.time_24hr
824 - ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)
521 + ? (12 + hours) % 12 + 12 * int(hours % 12 === 0)
825 522 : hours);
826 523 self.minuteElement.value = pad(minutes);
827 524 if (self.amPM !== undefined)
828 525 self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];
@@ -828,42 +525,32 @@
828 525 self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];
829 526 if (self.secondElement !== undefined)
830 527 self.secondElement.value = pad(seconds);
831 528 }
832 - /**
833 - * Handles the year input and incrementing events
834 - * @param {Event} event the keyup or increment event
835 - */
836 529 function onYearInput(event) {
837 - var eventTarget = getEventTarget(event);
838 - var year = parseInt(eventTarget.value) + (event.delta || 0);
839 - if (year / 1000 > 1 ||
840 - (event.key === "Enter" && !/[^\d]/.test(year.toString()))) {
841 - changeYear(year);
530 + var year = parseInt(event.target.value) + (event.delta || 0);
531 + if (year.toString().length === 4 || event.key === "Enter") {
532 + self.currentYearElement.blur();
533 + if (!/[^\d]/.test(year.toString()))
534 + changeYear(year);
842 535 }
843 536 }
844 - /**
845 - * Essentially addEventListener + tracking
846 - * @param {Element} element the element to addEventListener to
847 - * @param {String} event the event name
848 - * @param {Function} handler the event handler
849 - */
850 - function bind(element, event, handler, options) {
537 + function bind(element, event, handler) {
851 538 if (event instanceof Array)
852 - return event.forEach(function (ev) { return bind(element, ev, handler, options); });
539 + return event.forEach(function (ev) { return bind(element, ev, handler); });
853 540 if (element instanceof Array)
854 - return element.forEach(function (el) { return bind(el, event, handler, options); });
855 - element.addEventListener(event, handler, options);
856 - self._handlers.push({
857 - remove: function () { return element.removeEventListener(event, handler, options); },
858 - });
541 + return element.forEach(function (el) { return bind(el, event, handler); });
542 + element.addEventListener(event, handler);
543 + self._handlers.push({ element: element, event: event, handler: handler });
859 544 }
545 + function onClick(handler) {
546 + return function (evt) {
547 + evt.which === 1 && handler(evt);
548 + };
549 + }
860 550 function triggerChange() {
861 551 triggerEvent("onChange");
862 552 }
863 - /**
864 - * Adds all the necessary event listeners
865 - */
866 553 function bindEvents() {
867 554 if (self.config.wrap) {
868 555 ["open", "close", "toggle", "clear"].forEach(function (evt) {
869 556 Array.prototype.forEach.call(self.element.querySelectorAll("[data-" + evt + "]"), function (el) {
@@ -875,64 +562,108 @@
875 562 setupMobile();
876 563 return;
877 564 }
878 565 var debouncedResize = debounce(onResize, 50);
879 - self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);
880 - if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))
566 + self._debouncedChange = debounce(triggerChange, 300);
567 + if (self.config.mode === "range" &&
568 + self.daysContainer &&
569 + !/iPhone|iPad|iPod/i.test(navigator.userAgent))
881 570 bind(self.daysContainer, "mouseover", function (e) {
882 - if (self.config.mode === "range")
883 - onMouseOver(getEventTarget(e));
571 + return onMouseOver(e.target);
884 572 });
885 - bind(self._input, "keydown", onKeyDown);
886 - if (self.calendarContainer !== undefined) {
887 - bind(self.calendarContainer, "keydown", onKeyDown);
888 - }
573 + bind(window.document.body, "keydown", onKeyDown);
574 + if (!self.config.static)
575 + bind(self._input, "keydown", onKeyDown);
889 576 if (!self.config.inline && !self.config.static)
890 577 bind(window, "resize", debouncedResize);
891 578 if (window.ontouchstart !== undefined)
892 - bind(window.document, "touchstart", documentClick);
893 - else
894 - bind(window.document, "mousedown", documentClick);
895 - bind(window.document, "focus", documentClick, { capture: true });
579 + bind(window.document.body, "touchstart", documentClick);
580 + bind(window.document.body, "mousedown", onClick(documentClick));
581 + bind(self._input, "blur", documentClick);
896 582 if (self.config.clickOpens === true) {
897 583 bind(self._input, "focus", self.open);
898 - bind(self._input, "click", self.open);
584 + bind(self._input, "mousedown", onClick(self.open));
899 585 }
900 586 if (self.daysContainer !== undefined) {
901 - bind(self.monthNav, "click", onMonthNavClick);
587 + self.monthNav.addEventListener("wheel", function (e) { return e.preventDefault(); });
588 + bind(self.monthNav, "wheel", debounce(onMonthNavScroll, 10));
589 + bind(self.monthNav, "mousedown", onClick(onMonthNavClick));
902 590 bind(self.monthNav, ["keyup", "increment"], onYearInput);
903 - bind(self.daysContainer, "click", selectDate);
591 + bind(self.daysContainer, "mousedown", onClick(selectDate));
592 + if (self.config.animate) {
593 + bind(self.daysContainer, ["webkitAnimationEnd", "animationend"], animateDays);
594 + bind(self.monthNav, ["webkitAnimationEnd", "animationend"], animateMonths);
595 + }
904 596 }
905 597 if (self.timeContainer !== undefined &&
906 598 self.minuteElement !== undefined &&
907 599 self.hourElement !== undefined) {
908 600 var selText = function (e) {
909 - return getEventTarget(e).select();
601 + return e.target.select();
910 602 };
911 - bind(self.timeContainer, ["increment"], updateTime);
912 - bind(self.timeContainer, "blur", updateTime, { capture: true });
913 - bind(self.timeContainer, "click", timeIncrement);
603 + bind(self.timeContainer, ["wheel", "input", "increment"], updateTime);
604 + bind(self.timeContainer, "mousedown", onClick(timeIncrement));
605 + bind(self.timeContainer, ["wheel", "increment"], self._debouncedChange);
606 + bind(self.timeContainer, "input", triggerChange);
914 607 bind([self.hourElement, self.minuteElement], ["focus", "click"], selText);
915 608 if (self.secondElement !== undefined)
916 609 bind(self.secondElement, "focus", function () { return self.secondElement && self.secondElement.select(); });
917 610 if (self.amPM !== undefined) {
918 - bind(self.amPM, "click", function (e) {
611 + bind(self.amPM, "mousedown", onClick(function (e) {
919 612 updateTime(e);
920 - });
613 + triggerChange();
614 + }));
921 615 }
922 616 }
923 - if (self.config.allowInput) {
924 - bind(self._input, "blur", onBlur);
617 + }
618 + function processPostDayAnimation() {
619 + self._animationLoop.forEach(function (f) { return f(); });
620 + self._animationLoop = [];
621 + }
622 + function animateDays(e) {
623 + if (self.daysContainer && self.daysContainer.childNodes.length > 1) {
624 + switch (e.animationName) {
625 + case "fpSlideLeft":
626 + self.daysContainer.lastChild &&
627 + self.daysContainer.lastChild.classList.remove("slideLeftNew");
628 + self.daysContainer.removeChild(self.daysContainer
629 + .firstChild);
630 + self.days = self.daysContainer.firstChild;
631 + processPostDayAnimation();
632 + break;
633 + case "fpSlideRight":
634 + self.daysContainer.firstChild &&
635 + self.daysContainer.firstChild.classList.remove("slideRightNew");
636 + self.daysContainer.removeChild(self.daysContainer
637 + .lastChild);
638 + self.days = self.daysContainer.firstChild;
639 + processPostDayAnimation();
640 + break;
641 + default:
642 + break;
643 + }
925 644 }
926 645 }
927 - /**
928 - * Set the calendar view to a particular date.
929 - * @param {Date} jumpDate the date to set the view to
930 - * @param {boolean} triggerChange if change events should be triggered
931 - */
932 - function jumpToDate(jumpDate, triggerChange) {
646 + function animateMonths(e) {
647 + switch (e.animationName) {
648 + case "fpSlideLeftNew":
649 + case "fpSlideRightNew":
650 + self.navigationCurrentMonth.classList.remove("slideLeftNew");
651 + self.navigationCurrentMonth.classList.remove("slideRightNew");
652 + var nav = self.navigationCurrentMonth;
653 + while (nav.nextSibling &&
654 + /curr/.test(nav.nextSibling.className))
655 + self.monthNav.removeChild(nav.nextSibling);
656 + while (nav.previousSibling &&
657 + /curr/.test(nav.previousSibling.className))
658 + self.monthNav.removeChild(nav.previousSibling);
659 + self.oldCurMonth = undefined;
660 + break;
661 + }
662 + }
663 + function jumpToDate(jumpDate) {
933 664 var jumpTo = jumpDate !== undefined
934 - ? self.parseDate(jumpDate)
665 + ? parseDate(jumpDate)
935 666 : self.latestSelectedDateObj ||
936 667 (self.config.minDate && self.config.minDate > self.now
937 668 ? self.config.minDate
938 669 : self.config.maxDate && self.config.maxDate < self.now
@@ -937,10 +668,8 @@
937 668 ? self.config.minDate
938 669 : self.config.maxDate && self.config.maxDate < self.now
939 670 ? self.config.maxDate
940 671 : self.now);
941 - var oldYear = self.currentYear;
942 - var oldMonth = self.currentMonth;
943 672 try {
944 673 if (jumpTo !== undefined) {
945 674 self.currentYear = jumpTo.getFullYear();
946 675 self.currentMonth = jumpTo.getMonth();
@@ -946,42 +675,19 @@
946 675 self.currentMonth = jumpTo.getMonth();
947 676 }
948 677 }
949 678 catch (e) {
950 - /* istanbul ignore next */
951 679 e.message = "Invalid date supplied: " + jumpTo;
952 680 self.config.errorHandler(e);
953 681 }
954 - if (triggerChange && self.currentYear !== oldYear) {
955 - triggerEvent("onYearChange");
956 - buildMonthSwitch();
957 - }
958 - if (triggerChange &&
959 - (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {
960 - triggerEvent("onMonthChange");
961 - }
962 682 self.redraw();
963 683 }
964 - /**
965 - * The up/down arrow handler for time inputs
966 - * @param {Event} e the click event
967 - */
968 684 function timeIncrement(e) {
969 - var eventTarget = getEventTarget(e);
970 - if (~eventTarget.className.indexOf("arrow"))
971 - incrementNumInput(e, eventTarget.classList.contains("arrowUp") ? 1 : -1);
685 + if (~e.target.className.indexOf("arrow"))
686 + incrementNumInput(e, e.target.classList.contains("arrowUp") ? 1 : -1);
972 687 }
973 - /**
974 - * Increments/decrements the value of input associ-
975 - * ated with the up/down arrow by dispatching an
976 - * "increment" event on the input.
977 - *
978 - * @param {Event} e the click event
979 - * @param {Number} delta the diff (usually 1 or -1)
980 - * @param {Element} inputElem the input element
981 - */
982 688 function incrementNumInput(e, delta, inputElem) {
983 - var target = e && getEventTarget(e);
689 + var target = e && e.target;
984 690 var input = inputElem ||
985 691 (target && target.parentNode && target.parentNode.firstChild);
986 692 var event = createEvent("increment");
987 693 event.delta = delta;
@@ -1014,13 +720,11 @@
1014 720 if (self.config.enableTime) {
1015 721 fragment.appendChild(buildTime());
1016 722 }
1017 723 toggleClass(self.calendarContainer, "rangeMode", self.config.mode === "range");
1018 - toggleClass(self.calendarContainer, "animate", self.config.animate === true);
1019 - toggleClass(self.calendarContainer, "multiMonth", self.config.showMonths > 1);
724 + toggleClass(self.calendarContainer, "animate", self.config.animate);
1020 725 self.calendarContainer.appendChild(fragment);
1021 - var customAppend = self.config.appendTo !== undefined &&
1022 - self.config.appendTo.nodeType !== undefined;
726 + var customAppend = self.config.appendTo !== undefined && self.config.appendTo.nodeType;
1023 727 if (self.config.inline || self.config.static) {
1024 728 self.calendarContainer.classList.add(self.config.inline ? "inline" : "static");
1025 729 if (self.config.inline) {
1026 730 if (!customAppend && self.element.parentNode)
@@ -1042,18 +746,16 @@
1042 746 (self.config.appendTo !== undefined
1043 747 ? self.config.appendTo
1044 748 : window.document.body).appendChild(self.calendarContainer);
1045 749 }
1046 - function createDay(className, date, _dayNumber, i) {
1047 - var dateIsEnabled = isEnabled(date, true), dayElement = createElement("span", className, date.getDate().toString());
750 + function createDay(className, date, dayNumber, i) {
751 + var dateIsEnabled = isEnabled(date, true), dayElement = createElement("span", "flatpickr-day " + className, date.getDate().toString());
1048 752 dayElement.dateObj = date;
1049 753 dayElement.$i = i;
1050 754 dayElement.setAttribute("aria-label", self.formatDate(date, self.config.ariaDateFormat));
1051 - if (className.indexOf("hidden") === -1 &&
1052 - compareDates(date, self.now) === 0) {
755 + if (compareDates(date, self.now) === 0) {
1053 756 self.todayDateElem = dayElement;
1054 757 dayElement.classList.add("today");
1055 - dayElement.setAttribute("aria-current", "date");
1056 758 }
1057 759 if (dateIsEnabled) {
1058 760 dayElement.tabIndex = -1;
1059 761 if (isDateSelected(date)) {
@@ -1060,258 +762,174 @@
1060 762 dayElement.classList.add("selected");
1061 763 self.selectedDateElem = dayElement;
1062 764 if (self.config.mode === "range") {
1063 765 toggleClass(dayElement, "startRange", self.selectedDates[0] &&
1064 - compareDates(date, self.selectedDates[0], true) === 0);
766 + compareDates(date, self.selectedDates[0]) === 0);
1065 767 toggleClass(dayElement, "endRange", self.selectedDates[1] &&
1066 - compareDates(date, self.selectedDates[1], true) === 0);
1067 - if (className === "nextMonthDay")
1068 - dayElement.classList.add("inRange");
768 + compareDates(date, self.selectedDates[1]) === 0);
1069 769 }
1070 770 }
1071 771 }
1072 772 else {
1073 - dayElement.classList.add("flatpickr-disabled");
773 + dayElement.classList.add("disabled");
774 + if (self.selectedDates[0] &&
775 + self.minRangeDate &&
776 + date > self.minRangeDate &&
777 + date < self.selectedDates[0])
778 + self.minRangeDate = date;
779 + else if (self.selectedDates[0] &&
780 + self.maxRangeDate &&
781 + date < self.maxRangeDate &&
782 + date > self.selectedDates[0])
783 + self.maxRangeDate = date;
1074 784 }
1075 785 if (self.config.mode === "range") {
1076 786 if (isDateInRange(date) && !isDateSelected(date))
1077 787 dayElement.classList.add("inRange");
788 + if (self.selectedDates.length === 1 &&
789 + self.minRangeDate !== undefined &&
790 + self.maxRangeDate !== undefined &&
791 + (date < self.minRangeDate || date > self.maxRangeDate))
792 + dayElement.classList.add("notAllowed");
1078 793 }
1079 794 if (self.weekNumbers &&
1080 - self.config.showMonths === 1 &&
1081 795 className !== "prevMonthDay" &&
1082 - i % 7 === 6) {
1083 - self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + self.config.getWeek(date) + "</span>");
796 + dayNumber % 7 === 1) {
797 + self.weekNumbers.insertAdjacentHTML("beforeend", "<span class='disabled flatpickr-day'>" +
798 + self.config.getWeek(date) +
799 + "</span>");
1084 800 }
1085 801 triggerEvent("onDayCreate", dayElement);
1086 802 return dayElement;
1087 803 }
1088 - function focusOnDayElem(targetNode) {
1089 - targetNode.focus();
1090 - if (self.config.mode === "range")
1091 - onMouseOver(targetNode);
1092 - }
1093 - function getFirstAvailableDay(delta) {
1094 - var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;
1095 - var endMonth = delta > 0 ? self.config.showMonths : -1;
1096 - for (var m = startMonth; m != endMonth; m += delta) {
1097 - var month = self.daysContainer.children[m];
1098 - var startIndex = delta > 0 ? 0 : month.children.length - 1;
1099 - var endIndex = delta > 0 ? month.children.length : -1;
1100 - for (var i = startIndex; i != endIndex; i += delta) {
1101 - var c = month.children[i];
1102 - if (c.className.indexOf("hidden") === -1 && isEnabled(c.dateObj))
1103 - return c;
804 + function focusOnDay(currentIndex, offset) {
805 + var newIndex = currentIndex + offset || 0, targetNode = (currentIndex !== undefined
806 + ? self.days.childNodes[newIndex]
807 + : self.selectedDateElem ||
808 + self.todayDateElem ||
809 + self.days.childNodes[0]);
810 + var focus = function () {
811 + targetNode = targetNode || self.days.childNodes[newIndex];
812 + targetNode.focus();
813 + if (self.config.mode === "range")
814 + onMouseOver(targetNode);
815 + };
816 + if (targetNode === undefined && offset !== 0) {
817 + if (offset > 0) {
818 + self.changeMonth(1, true, undefined, true);
819 + newIndex = newIndex % 42;
1104 820 }
821 + else if (offset < 0) {
822 + self.changeMonth(-1, true, undefined, true);
823 + newIndex += 42;
824 + }
825 + return afterDayAnim(focus);
1105 826 }
1106 - return undefined;
827 + focus();
1107 828 }
1108 - function getNextAvailableDay(current, delta) {
1109 - var givenMonth = current.className.indexOf("Month") === -1
1110 - ? current.dateObj.getMonth()
1111 - : self.currentMonth;
1112 - var endMonth = delta > 0 ? self.config.showMonths : -1;
1113 - var loopDelta = delta > 0 ? 1 : -1;
1114 - for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {
1115 - var month = self.daysContainer.children[m];
1116 - var startIndex = givenMonth - self.currentMonth === m
1117 - ? current.$i + delta
1118 - : delta < 0
1119 - ? month.children.length - 1
1120 - : 0;
1121 - var numMonthDays = month.children.length;
1122 - for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {
1123 - var c = month.children[i];
1124 - if (c.className.indexOf("hidden") === -1 &&
1125 - isEnabled(c.dateObj) &&
1126 - Math.abs(current.$i - i) >= Math.abs(delta))
1127 - return focusOnDayElem(c);
1128 - }
1129 - }
1130 - self.changeMonth(loopDelta);
1131 - focusOnDay(getFirstAvailableDay(loopDelta), 0);
1132 - return undefined;
829 + function afterDayAnim(fn) {
830 + self.config.animate === true ? self._animationLoop.push(fn) : fn();
1133 831 }
1134 - function focusOnDay(current, offset) {
1135 - var activeElement = getClosestActiveElement();
1136 - var dayFocused = isInView(activeElement || document.body);
1137 - var startElem = current !== undefined
1138 - ? current
1139 - : dayFocused
1140 - ? activeElement
1141 - : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)
1142 - ? self.selectedDateElem
1143 - : self.todayDateElem !== undefined && isInView(self.todayDateElem)
1144 - ? self.todayDateElem
1145 - : getFirstAvailableDay(offset > 0 ? 1 : -1);
1146 - if (startElem === undefined) {
1147 - self._input.focus();
832 + function buildDays(delta) {
833 + if (self.daysContainer === undefined) {
834 + return;
1148 835 }
1149 - else if (!dayFocused) {
1150 - focusOnDayElem(startElem);
836 + var firstOfMonth = (new Date(self.currentYear, self.currentMonth, 1).getDay() -
837 + self.l10n.firstDayOfWeek +
838 + 7) %
839 + 7, isRangeMode = self.config.mode === "range";
840 + var prevMonthDays = self.utils.getDaysInMonth((self.currentMonth - 1 + 12) % 12);
841 + var daysInMonth = self.utils.getDaysInMonth(), days = window.document.createDocumentFragment();
842 + var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;
843 + if (self.weekNumbers && self.weekNumbers.firstChild)
844 + self.weekNumbers.textContent = "";
845 + if (isRangeMode) {
846 + self.minRangeDate = new Date(self.currentYear, self.currentMonth - 1, dayNumber);
847 + self.maxRangeDate = new Date(self.currentYear, self.currentMonth + 1, (42 - firstOfMonth) % daysInMonth);
1151 848 }
1152 - else {
1153 - getNextAvailableDay(startElem, offset);
1154 - }
1155 - }
1156 - function buildMonthDays(year, month) {
1157 - var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;
1158 - var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12, year);
1159 - var daysInMonth = self.utils.getDaysInMonth(month, year), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? "prevMonthDay hidden" : "prevMonthDay", nextMonthDayClass = isMultiMonth ? "nextMonthDay hidden" : "nextMonthDay";
1160 - var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;
1161 - // prepend days from the ending of previous month
1162 849 for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {
1163 - days.appendChild(createDay("flatpickr-day " + prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));
850 + days.appendChild(createDay("prevMonthDay", new Date(self.currentYear, self.currentMonth - 1, dayNumber), dayNumber, dayIndex));
1164 851 }
1165 - // Start at 1 since there is no 0th day
1166 852 for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {
1167 - days.appendChild(createDay("flatpickr-day", new Date(year, month, dayNumber), dayNumber, dayIndex));
853 + days.appendChild(createDay("", new Date(self.currentYear, self.currentMonth, dayNumber), dayNumber, dayIndex));
1168 854 }
1169 - // append days from the next month
1170 - for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&
1171 - (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {
1172 - days.appendChild(createDay("flatpickr-day " + nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));
855 + for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth; dayNum++, dayIndex++) {
856 + days.appendChild(createDay("nextMonthDay", new Date(self.currentYear, self.currentMonth + 1, dayNum % daysInMonth), dayNum, dayIndex));
1173 857 }
1174 - //updateNavigationCurrentMonth();
858 + if (isRangeMode && self.selectedDates.length === 1 && days.childNodes[0]) {
859 + self._hidePrevMonthArrow =
860 + self._hidePrevMonthArrow ||
861 + (!!self.minRangeDate &&
862 + self.minRangeDate > days.childNodes[0].dateObj);
863 + self._hideNextMonthArrow =
864 + self._hideNextMonthArrow ||
865 + (!!self.maxRangeDate &&
866 + self.maxRangeDate <
867 + new Date(self.currentYear, self.currentMonth + 1, 1));
868 + }
869 + else
870 + updateNavigationCurrentMonth();
1175 871 var dayContainer = createElement("div", "dayContainer");
1176 872 dayContainer.appendChild(days);
1177 - return dayContainer;
1178 - }
1179 - function buildDays() {
1180 - if (self.daysContainer === undefined) {
1181 - return;
873 + if (!self.config.animate || delta === undefined)
874 + clearNode(self.daysContainer);
875 + else {
876 + while (self.daysContainer.childNodes.length > 1)
877 + self.daysContainer.removeChild(self.daysContainer.firstChild);
1182 878 }
1183 - clearNode(self.daysContainer);
1184 - // TODO: week numbers for each month
1185 - if (self.weekNumbers)
1186 - clearNode(self.weekNumbers);
1187 - var frag = document.createDocumentFragment();
1188 - for (var i = 0; i < self.config.showMonths; i++) {
1189 - var d = new Date(self.currentYear, self.currentMonth, 1);
1190 - d.setMonth(self.currentMonth + i);
1191 - frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));
1192 - }
1193 - self.daysContainer.appendChild(frag);
1194 - self.days = self.daysContainer.firstChild;
1195 - if (self.config.mode === "range" && self.selectedDates.length === 1) {
1196 - onMouseOver();
1197 - }
879 + if (delta && delta >= 0)
880 + self.daysContainer.appendChild(dayContainer);
881 + else
882 + self.daysContainer.insertBefore(dayContainer, self.daysContainer.firstChild);
883 + self.days = self.daysContainer.childNodes[0];
1198 884 }
1199 - function buildMonthSwitch() {
1200 - if (self.config.showMonths > 1 ||
1201 - self.config.monthSelectorType !== "dropdown")
1202 - return;
1203 - var shouldBuildMonth = function (month) {
1204 - if (self.config.minDate !== undefined &&
1205 - self.currentYear === self.config.minDate.getFullYear() &&
1206 - month < self.config.minDate.getMonth()) {
1207 - return false;
1208 - }
1209 - return !(self.config.maxDate !== undefined &&
1210 - self.currentYear === self.config.maxDate.getFullYear() &&
1211 - month > self.config.maxDate.getMonth());
1212 - };
1213 - self.monthsDropdownContainer.tabIndex = -1;
1214 - self.monthsDropdownContainer.innerHTML = "";
1215 - for (var i = 0; i < 12; i++) {
1216 - if (!shouldBuildMonth(i))
1217 - continue;
1218 - var month = createElement("option", "flatpickr-monthDropdown-month");
1219 - month.value = new Date(self.currentYear, i).getMonth().toString();
1220 - month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);
1221 - month.tabIndex = -1;
1222 - if (self.currentMonth === i) {
1223 - month.selected = true;
1224 - }
1225 - self.monthsDropdownContainer.appendChild(month);
1226 - }
1227 - }
1228 - function buildMonth() {
1229 - var container = createElement("div", "flatpickr-month");
885 + function buildMonthNav() {
1230 886 var monthNavFragment = window.document.createDocumentFragment();
1231 - var monthElement;
1232 - if (self.config.showMonths > 1 ||
1233 - self.config.monthSelectorType === "static") {
1234 - monthElement = createElement("span", "cur-month");
1235 - }
1236 - else {
1237 - self.monthsDropdownContainer = createElement("select", "flatpickr-monthDropdown-months");
1238 - self.monthsDropdownContainer.setAttribute("aria-label", self.l10n.monthAriaLabel);
1239 - bind(self.monthsDropdownContainer, "change", function (e) {
1240 - var target = getEventTarget(e);
1241 - var selectedMonth = parseInt(target.value, 10);
1242 - self.changeMonth(selectedMonth - self.currentMonth);
1243 - triggerEvent("onMonthChange");
1244 - });
1245 - buildMonthSwitch();
1246 - monthElement = self.monthsDropdownContainer;
1247 - }
1248 - var yearInput = createNumberInput("cur-year", { tabindex: "-1" });
1249 - var yearElement = yearInput.getElementsByTagName("input")[0];
1250 - yearElement.setAttribute("aria-label", self.l10n.yearAriaLabel);
1251 - if (self.config.minDate) {
1252 - yearElement.setAttribute("min", self.config.minDate.getFullYear().toString());
1253 - }
887 + self.monthNav = createElement("div", "flatpickr-month");
888 + self.prevMonthNav = createElement("span", "flatpickr-prev-month");
889 + self.prevMonthNav.innerHTML = self.config.prevArrow;
890 + self.currentMonthElement = createElement("span", "cur-month");
891 + self.currentMonthElement.title = self.l10n.scrollTitle;
892 + var yearInput = createNumberInput("cur-year");
893 + self.currentYearElement = yearInput.childNodes[0];
894 + self.currentYearElement.title = self.l10n.scrollTitle;
895 + if (self.config.minDate)
896 + self.currentYearElement.min = self.config.minDate
897 + .getFullYear()
898 + .toString();
1254 899 if (self.config.maxDate) {
1255 - yearElement.setAttribute("max", self.config.maxDate.getFullYear().toString());
1256 - yearElement.disabled =
900 + self.currentYearElement.max = self.config.maxDate
901 + .getFullYear()
902 + .toString();
903 + self.currentYearElement.disabled =
1257 904 !!self.config.minDate &&
1258 905 self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();
1259 906 }
1260 - var currentMonth = createElement("div", "flatpickr-current-month");
1261 - currentMonth.appendChild(monthElement);
1262 - currentMonth.appendChild(yearInput);
1263 - monthNavFragment.appendChild(currentMonth);
1264 - container.appendChild(monthNavFragment);
1265 - return {
1266 - container: container,
1267 - yearElement: yearElement,
1268 - monthElement: monthElement,
1269 - };
1270 - }
1271 - function buildMonths() {
1272 - clearNode(self.monthNav);
1273 - self.monthNav.appendChild(self.prevMonthNav);
1274 - if (self.config.showMonths) {
1275 - self.yearElements = [];
1276 - self.monthElements = [];
1277 - }
1278 - for (var m = self.config.showMonths; m--;) {
1279 - var month = buildMonth();
1280 - self.yearElements.push(month.yearElement);
1281 - self.monthElements.push(month.monthElement);
1282 - self.monthNav.appendChild(month.container);
1283 - }
1284 - self.monthNav.appendChild(self.nextMonthNav);
1285 - }
1286 - function buildMonthNav() {
1287 - self.monthNav = createElement("div", "flatpickr-months");
1288 - self.yearElements = [];
1289 - self.monthElements = [];
1290 - self.prevMonthNav = createElement("span", "flatpickr-prev-month");
1291 - self.prevMonthNav.innerHTML = self.config.prevArrow;
1292 907 self.nextMonthNav = createElement("span", "flatpickr-next-month");
1293 908 self.nextMonthNav.innerHTML = self.config.nextArrow;
1294 - buildMonths();
909 + self.navigationCurrentMonth = createElement("div", "flatpickr-current-month");
910 + self.navigationCurrentMonth.appendChild(self.currentMonthElement);
911 + self.navigationCurrentMonth.appendChild(yearInput);
912 + monthNavFragment.appendChild(self.prevMonthNav);
913 + monthNavFragment.appendChild(self.navigationCurrentMonth);
914 + monthNavFragment.appendChild(self.nextMonthNav);
915 + self.monthNav.appendChild(monthNavFragment);
1295 916 Object.defineProperty(self, "_hidePrevMonthArrow", {
1296 917 get: function () { return self.__hidePrevMonthArrow; },
1297 918 set: function (bool) {
1298 - if (self.__hidePrevMonthArrow !== bool) {
1299 - toggleClass(self.prevMonthNav, "flatpickr-disabled", bool);
1300 - self.__hidePrevMonthArrow = bool;
1301 - }
919 + if (self.__hidePrevMonthArrow !== bool)
920 + self.prevMonthNav.style.display = bool ? "none" : "block";
921 + self.__hidePrevMonthArrow = bool;
1302 922 },
1303 923 });
1304 924 Object.defineProperty(self, "_hideNextMonthArrow", {
1305 925 get: function () { return self.__hideNextMonthArrow; },
1306 926 set: function (bool) {
1307 - if (self.__hideNextMonthArrow !== bool) {
1308 - toggleClass(self.nextMonthNav, "flatpickr-disabled", bool);
1309 - self.__hideNextMonthArrow = bool;
1310 - }
927 + if (self.__hideNextMonthArrow !== bool)
928 + self.nextMonthNav.style.display = bool ? "none" : "block";
929 + self.__hideNextMonthArrow = bool;
1311 930 },
1312 931 });
1313 - self.currentYearElement = self.yearElements[0];
1314 932 updateNavigationCurrentMonth();
1315 933 return self.monthNav;
1316 934 }
1317 935 function buildTime() {
@@ -1317,37 +935,31 @@
1317 935 function buildTime() {
1318 936 self.calendarContainer.classList.add("hasTime");
1319 937 if (self.config.noCalendar)
1320 938 self.calendarContainer.classList.add("noCalendar");
1321 - var defaults = getDefaultHours(self.config);
1322 939 self.timeContainer = createElement("div", "flatpickr-time");
1323 940 self.timeContainer.tabIndex = -1;
1324 941 var separator = createElement("span", "flatpickr-time-separator", ":");
1325 - var hourInput = createNumberInput("flatpickr-hour", {
1326 - "aria-label": self.l10n.hourAriaLabel,
1327 - });
1328 - self.hourElement = hourInput.getElementsByTagName("input")[0];
1329 - var minuteInput = createNumberInput("flatpickr-minute", {
1330 - "aria-label": self.l10n.minuteAriaLabel,
1331 - });
1332 - self.minuteElement = minuteInput.getElementsByTagName("input")[0];
942 + var hourInput = createNumberInput("flatpickr-hour");
943 + self.hourElement = hourInput.childNodes[0];
944 + var minuteInput = createNumberInput("flatpickr-minute");
945 + self.minuteElement = minuteInput.childNodes[0];
1333 946 self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;
1334 947 self.hourElement.value = pad(self.latestSelectedDateObj
1335 948 ? self.latestSelectedDateObj.getHours()
1336 949 : self.config.time_24hr
1337 - ? defaults.hours
1338 - : military2ampm(defaults.hours));
950 + ? self.config.defaultHour
951 + : military2ampm(self.config.defaultHour));
1339 952 self.minuteElement.value = pad(self.latestSelectedDateObj
1340 953 ? self.latestSelectedDateObj.getMinutes()
1341 - : defaults.minutes);
1342 - self.hourElement.setAttribute("step", self.config.hourIncrement.toString());
1343 - self.minuteElement.setAttribute("step", self.config.minuteIncrement.toString());
1344 - self.hourElement.setAttribute("min", self.config.time_24hr ? "0" : "1");
1345 - self.hourElement.setAttribute("max", self.config.time_24hr ? "23" : "12");
1346 - self.hourElement.setAttribute("maxlength", "2");
1347 - self.minuteElement.setAttribute("min", "0");
1348 - self.minuteElement.setAttribute("max", "59");
1349 - self.minuteElement.setAttribute("maxlength", "2");
954 + : self.config.defaultMinute);
955 + self.hourElement.step = self.config.hourIncrement.toString();
956 + self.minuteElement.step = self.config.minuteIncrement.toString();
957 + self.hourElement.min = self.config.time_24hr ? "0" : "1";
958 + self.hourElement.max = self.config.time_24hr ? "23" : "12";
959 + self.minuteElement.min = "0";
960 + self.minuteElement.max = "59";
961 + self.hourElement.title = self.minuteElement.title = self.l10n.scrollTitle;
1350 962 self.timeContainer.appendChild(hourInput);
1351 963 self.timeContainer.appendChild(separator);
1352 964 self.timeContainer.appendChild(minuteInput);
1353 965 if (self.config.time_24hr)
@@ -1354,21 +966,19 @@
1354 966 self.timeContainer.classList.add("time24hr");
1355 967 if (self.config.enableSeconds) {
1356 968 self.timeContainer.classList.add("hasSeconds");
1357 969 var secondInput = createNumberInput("flatpickr-second");
1358 - self.secondElement = secondInput.getElementsByTagName("input")[0];
970 + self.secondElement = secondInput.childNodes[0];
1359 971 self.secondElement.value = pad(self.latestSelectedDateObj
1360 972 ? self.latestSelectedDateObj.getSeconds()
1361 - : defaults.seconds);
1362 - self.secondElement.setAttribute("step", self.minuteElement.getAttribute("step"));
1363 - self.secondElement.setAttribute("min", "0");
1364 - self.secondElement.setAttribute("max", "59");
1365 - self.secondElement.setAttribute("maxlength", "2");
973 + : self.config.defaultSeconds);
974 + self.secondElement.step = self.minuteElement.step;
975 + self.secondElement.min = self.minuteElement.min;
976 + self.secondElement.max = self.minuteElement.max;
1366 977 self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":"));
1367 978 self.timeContainer.appendChild(secondInput);
1368 979 }
1369 980 if (!self.config.time_24hr) {
1370 - // add self.amPM if appropriate
1371 981 self.amPM = createElement("span", "flatpickr-am-pm", self.l10n.amPM[int((self.latestSelectedDateObj
1372 982 ? self.hourElement.value
1373 983 : self.config.defaultHour) > 11)]);
1374 984 self.amPM.title = self.l10n.toggleTitle;
@@ -1379,31 +989,16 @@
1379 989 }
1380 990 function buildWeekdays() {
1381 991 if (!self.weekdayContainer)
1382 992 self.weekdayContainer = createElement("div", "flatpickr-weekdays");
1383 - else
1384 - clearNode(self.weekdayContainer);
1385 - for (var i = self.config.showMonths; i--;) {
1386 - var container = createElement("div", "flatpickr-weekdaycontainer");
1387 - self.weekdayContainer.appendChild(container);
1388 - }
1389 - updateWeekdays();
1390 - return self.weekdayContainer;
1391 - }
1392 - function updateWeekdays() {
1393 - if (!self.weekdayContainer) {
1394 - return;
1395 - }
1396 993 var firstDayOfWeek = self.l10n.firstDayOfWeek;
1397 - var weekdays = __spreadArrays(self.l10n.weekdays.shorthand);
994 + var weekdays = self.l10n.weekdays.shorthand.slice();
1398 995 if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {
1399 - weekdays = __spreadArrays(weekdays.splice(firstDayOfWeek, weekdays.length), weekdays.splice(0, firstDayOfWeek));
996 + weekdays = weekdays.splice(firstDayOfWeek, weekdays.length).concat(weekdays.splice(0, firstDayOfWeek));
1400 997 }
1401 - for (var i = self.config.showMonths; i--;) {
1402 - self.weekdayContainer.children[i].innerHTML = "\n <span class='flatpickr-weekday'>\n " + weekdays.join("</span><span class='flatpickr-weekday'>") + "\n </span>\n ";
1403 - }
998 + self.weekdayContainer.innerHTML = "\n <span class=flatpickr-weekday>\n " + weekdays.join("</span><span class=flatpickr-weekday>") + "\n </span>\n ";
999 + return self.weekdayContainer;
1404 1000 }
1405 - /* istanbul ignore next */
1406 1001 function buildWeeks() {
1407 1002 self.calendarContainer.classList.add("hasWeeks");
1408 1003 var weekWrapper = createElement("div", "flatpickr-weekwrapper");
1409 1004 weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation));
@@ -1413,13 +1008,15 @@
1413 1008 weekWrapper: weekWrapper,
1414 1009 weekNumbers: weekNumbers,
1415 1010 };
1416 1011 }
1417 - function changeMonth(value, isOffset) {
1418 - if (isOffset === void 0) { isOffset = true; }
1419 - var delta = isOffset ? value : value - self.currentMonth;
1420 - if ((delta < 0 && self._hidePrevMonthArrow === true) ||
1421 - (delta > 0 && self._hideNextMonthArrow === true))
1012 + function changeMonth(value, is_offset, animate, from_keyboard) {
1013 + if (is_offset === void 0) { is_offset = true; }
1014 + if (animate === void 0) { animate = self.config.animate; }
1015 + if (from_keyboard === void 0) { from_keyboard = false; }
1016 + var delta = is_offset ? value : value - self.currentMonth;
1017 + if ((delta < 0 && self._hidePrevMonthArrow) ||
1018 + (delta > 0 && self._hideNextMonthArrow))
1422 1019 return;
1423 1020 self.currentMonth += delta;
1424 1021 if (self.currentMonth < 0 || self.currentMonth > 11) {
1425 1022 self.currentYear += self.currentMonth > 11 ? 1 : -1;
@@ -1424,46 +1021,78 @@
1424 1021 if (self.currentMonth < 0 || self.currentMonth > 11) {
1425 1022 self.currentYear += self.currentMonth > 11 ? 1 : -1;
1426 1023 self.currentMonth = (self.currentMonth + 12) % 12;
1427 1024 triggerEvent("onYearChange");
1428 - buildMonthSwitch();
1429 1025 }
1430 - buildDays();
1431 - triggerEvent("onMonthChange");
1026 + buildDays(animate ? delta : undefined);
1027 + if (!animate) {
1028 + triggerEvent("onMonthChange");
1029 + return updateNavigationCurrentMonth();
1030 + }
1031 + var nav = self.navigationCurrentMonth;
1032 + if (delta < 0) {
1033 + while (nav.nextSibling &&
1034 + /curr/.test(nav.nextSibling.className))
1035 + self.monthNav.removeChild(nav.nextSibling);
1036 + }
1037 + else if (delta > 0) {
1038 + while (nav.previousSibling &&
1039 + /curr/.test(nav.previousSibling.className))
1040 + self.monthNav.removeChild(nav.previousSibling);
1041 + }
1042 + self.oldCurMonth = self.navigationCurrentMonth;
1043 + self.navigationCurrentMonth = self.monthNav.insertBefore(self.oldCurMonth.cloneNode(true), delta > 0 ? self.oldCurMonth.nextSibling : self.oldCurMonth);
1044 + var daysContainer = self.daysContainer;
1045 + if (daysContainer.firstChild && daysContainer.lastChild) {
1046 + if (delta > 0) {
1047 + daysContainer.firstChild.classList.add("slideLeft");
1048 + daysContainer.lastChild.classList.add("slideLeftNew");
1049 + self.oldCurMonth.classList.add("slideLeft");
1050 + self.navigationCurrentMonth.classList.add("slideLeftNew");
1051 + }
1052 + else if (delta < 0) {
1053 + daysContainer.firstChild.classList.add("slideRightNew");
1054 + daysContainer.lastChild.classList.add("slideRight");
1055 + self.oldCurMonth.classList.add("slideRight");
1056 + self.navigationCurrentMonth.classList.add("slideRightNew");
1057 + }
1058 + }
1059 + self.currentMonthElement = self.navigationCurrentMonth
1060 + .firstChild;
1061 + self.currentYearElement = self.navigationCurrentMonth.lastChild
1062 + .childNodes[0];
1432 1063 updateNavigationCurrentMonth();
1064 + if (self.oldCurMonth.firstChild)
1065 + self.oldCurMonth.firstChild.textContent = monthToStr(self.currentMonth - delta, self.config.shorthandCurrentMonth, self.l10n);
1066 + afterDayAnim(function () { return triggerEvent("onMonthChange"); });
1067 + if (from_keyboard &&
1068 + document.activeElement &&
1069 + document.activeElement.$i) {
1070 + var index_1 = document.activeElement.$i;
1071 + afterDayAnim(function () {
1072 + focusOnDay(index_1, 0);
1073 + });
1074 + }
1433 1075 }
1434 - function clear(triggerChangeEvent, toInitial) {
1076 + function clear(triggerChangeEvent) {
1435 1077 if (triggerChangeEvent === void 0) { triggerChangeEvent = true; }
1436 - if (toInitial === void 0) { toInitial = true; }
1437 1078 self.input.value = "";
1438 - if (self.altInput !== undefined)
1079 + if (self.altInput)
1439 1080 self.altInput.value = "";
1440 - if (self.mobileInput !== undefined)
1081 + if (self.mobileInput)
1441 1082 self.mobileInput.value = "";
1442 1083 self.selectedDates = [];
1443 1084 self.latestSelectedDateObj = undefined;
1444 - if (toInitial === true) {
1445 - self.currentYear = self._initialDate.getFullYear();
1446 - self.currentMonth = self._initialDate.getMonth();
1447 - }
1448 - if (self.config.enableTime === true) {
1449 - var _a = getDefaultHours(self.config), hours = _a.hours, minutes = _a.minutes, seconds = _a.seconds;
1450 - setHours(hours, minutes, seconds);
1451 - }
1085 + self.showTimeInput = false;
1452 1086 self.redraw();
1453 1087 if (triggerChangeEvent)
1454 - // triggerChangeEvent is true (default) or an Event
1455 1088 triggerEvent("onChange");
1456 1089 }
1457 1090 function close() {
1458 1091 self.isOpen = false;
1459 1092 if (!self.isMobile) {
1460 - if (self.calendarContainer !== undefined) {
1461 - self.calendarContainer.classList.remove("open");
1462 - }
1463 - if (self._input !== undefined) {
1464 - self._input.classList.remove("active");
1465 - }
1093 + self.calendarContainer.classList.remove("open");
1094 + self._input.classList.remove("active");
1466 1095 }
1467 1096 triggerEvent("onClose");
1468 1097 }
1469 1098 function destroy() {
@@ -1469,9 +1098,10 @@
1469 1098 function destroy() {
1470 1099 if (self.config !== undefined)
1471 1100 triggerEvent("onDestroy");
1472 1101 for (var i = self._handlers.length; i--;) {
1473 - self._handlers[i].remove();
1102 + var h = self._handlers[i];
1103 + h.element.removeEventListener(h.event, h.handler);
1474 1104 }
1475 1105 self._handlers = [];
1476 1106 if (self.mobileInput) {
1477 1107 if (self.mobileInput.parentNode)
@@ -1477,21 +1107,10 @@
1477 1107 if (self.mobileInput.parentNode)
1478 1108 self.mobileInput.parentNode.removeChild(self.mobileInput);
1479 1109 self.mobileInput = undefined;
1480 1110 }
1481 - else if (self.calendarContainer && self.calendarContainer.parentNode) {
1482 - if (self.config.static && self.calendarContainer.parentNode) {
1483 - var wrapper = self.calendarContainer.parentNode;
1484 - wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);
1485 - if (wrapper.parentNode) {
1486 - while (wrapper.firstChild)
1487 - wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);
1488 - wrapper.parentNode.removeChild(wrapper);
1489 - }
1490 - }
1491 - else
1492 - self.calendarContainer.parentNode.removeChild(self.calendarContainer);
1493 - }
1111 + else if (self.calendarContainer && self.calendarContainer.parentNode)
1112 + self.calendarContainer.parentNode.removeChild(self.calendarContainer);
1494 1113 if (self.altInput) {
1495 1114 self.input.type = "text";
1496 1115 if (self.altInput.parentNode)
1497 1116 self.altInput.parentNode.removeChild(self.altInput);
@@ -1500,8 +1119,9 @@
1500 1119 if (self.input) {
1501 1120 self.input.type = self.input._type;
1502 1121 self.input.classList.remove("flatpickr-input");
1503 1122 self.input.removeAttribute("readonly");
1123 + self.input.value = "";
1504 1124 }
1505 1125 [
1506 1126 "_showTimeInput",
1507 1127 "latestSelectedDateObj",
@@ -1525,9 +1145,8 @@
1525 1145 "calendarContainer",
1526 1146 "weekdayContainer",
1527 1147 "prevMonthNav",
1528 1148 "nextMonthNav",
1529 - "monthsDropdownContainer",
1530 1149 "currentMonthElement",
1531 1150 "currentYearElement",
1532 1151 "navigationCurrentMonth",
1533 1152 "selectedDateElem",
@@ -1539,54 +1158,43 @@
1539 1158 catch (_) { }
1540 1159 });
1541 1160 }
1542 1161 function isCalendarElem(elem) {
1162 + if (self.config.appendTo && self.config.appendTo.contains(elem))
1163 + return true;
1543 1164 return self.calendarContainer.contains(elem);
1544 1165 }
1545 1166 function documentClick(e) {
1546 1167 if (self.isOpen && !self.config.inline) {
1547 - var eventTarget_1 = getEventTarget(e);
1548 - var isCalendarElement = isCalendarElem(eventTarget_1);
1549 - var isInput = eventTarget_1 === self.input ||
1550 - eventTarget_1 === self.altInput ||
1551 - self.element.contains(eventTarget_1) ||
1552 - // web components
1553 - // e.path is not present in all browsers. circumventing typechecks
1168 + var isCalendarElement = isCalendarElem(e.target);
1169 + var isInput = e.target === self.input ||
1170 + e.target === self.altInput ||
1171 + self.element.contains(e.target) ||
1554 1172 (e.path &&
1555 1173 e.path.indexOf &&
1556 1174 (~e.path.indexOf(self.input) ||
1557 1175 ~e.path.indexOf(self.altInput)));
1558 - var lostFocus = !isInput &&
1559 - !isCalendarElement &&
1560 - !isCalendarElem(e.relatedTarget);
1561 - var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {
1562 - return elem.contains(eventTarget_1);
1563 - });
1564 - if (lostFocus && isIgnored) {
1565 - if (self.config.allowInput) {
1566 - self.setDate(self._input.value, false, self.config.altInput
1567 - ? self.config.altFormat
1568 - : self.config.dateFormat);
1569 - }
1570 - if (self.timeContainer !== undefined &&
1571 - self.minuteElement !== undefined &&
1572 - self.hourElement !== undefined &&
1573 - self.input.value !== "" &&
1574 - self.input.value !== undefined) {
1575 - updateTime();
1576 - }
1176 + var lostFocus = e.type === "blur"
1177 + ? isInput &&
1178 + e.relatedTarget &&
1179 + !isCalendarElem(e.relatedTarget)
1180 + : !isInput && !isCalendarElement;
1181 + if (lostFocus &&
1182 + self.config.ignoredFocusElements.indexOf(e.target) === -1) {
1577 1183 self.close();
1578 - if (self.config &&
1579 - self.config.mode === "range" &&
1580 - self.selectedDates.length === 1)
1184 + if (self.config.mode === "range" && self.selectedDates.length === 1) {
1581 1185 self.clear(false);
1186 + self.redraw();
1187 + }
1582 1188 }
1583 1189 }
1584 1190 }
1585 1191 function changeYear(newYear) {
1586 1192 if (!newYear ||
1587 - (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||
1588 - (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))
1193 + (self.currentYearElement.min &&
1194 + newYear < parseInt(self.currentYearElement.min)) ||
1195 + (self.currentYearElement.max &&
1196 + newYear > parseInt(self.currentYearElement.max)))
1589 1197 return;
1590 1198 var newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;
1591 1199 self.currentYear = newYearNum || self.currentYear;
1592 1200 if (self.config.maxDate &&
@@ -1599,15 +1207,13 @@
1599 1207 }
1600 1208 if (isNewYear) {
1601 1209 self.redraw();
1602 1210 triggerEvent("onYearChange");
1603 - buildMonthSwitch();
1604 1211 }
1605 1212 }
1606 1213 function isEnabled(date, timeless) {
1607 - var _a;
1608 1214 if (timeless === void 0) { timeless = true; }
1609 - var dateToCheck = self.parseDate(date, undefined, timeless); // timeless
1215 + var dateToCheck = self.parseDate(date, undefined, timeless);
1610 1216 if ((self.config.minDate &&
1611 1217 dateToCheck &&
1612 1218 compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||
1613 1219 (self.config.maxDate &&
@@ -1613,34 +1219,29 @@
1613 1219 (self.config.maxDate &&
1614 1220 dateToCheck &&
1615 1221 compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))
1616 1222 return false;
1617 - if (!self.config.enable && self.config.disable.length === 0)
1223 + if (!self.config.enable.length && !self.config.disable.length)
1618 1224 return true;
1619 1225 if (dateToCheck === undefined)
1620 1226 return false;
1621 - var bool = !!self.config.enable, array = (_a = self.config.enable) !== null && _a !== void 0 ? _a : self.config.disable;
1227 + var bool = self.config.enable.length > 0, array = bool ? self.config.enable : self.config.disable;
1622 1228 for (var i = 0, d = void 0; i < array.length; i++) {
1623 1229 d = array[i];
1624 1230 if (typeof d === "function" &&
1625 - d(dateToCheck) // disabled by function
1626 - )
1231 + d(dateToCheck))
1627 1232 return bool;
1628 1233 else if (d instanceof Date &&
1629 1234 dateToCheck !== undefined &&
1630 1235 d.getTime() === dateToCheck.getTime())
1631 - // disabled by date
1632 1236 return bool;
1633 - else if (typeof d === "string") {
1634 - // disabled by date string
1237 + else if (typeof d === "string" && dateToCheck !== undefined) {
1635 1238 var parsed = self.parseDate(d, undefined, true);
1636 1239 return parsed && parsed.getTime() === dateToCheck.getTime()
1637 1240 ? bool
1638 1241 : !bool;
1639 1242 }
1640 - else if (
1641 - // disabled by range
1642 - typeof d === "object" &&
1243 + else if (typeof d === "object" &&
1643 1244 dateToCheck !== undefined &&
1644 1245 d.from &&
1645 1246 d.to &&
1646 1247 dateToCheck.getTime() >= d.from.getTime() &&
@@ -1648,122 +1249,70 @@
1648 1249 return bool;
1649 1250 }
1650 1251 return !bool;
1651 1252 }
1652 - function isInView(elem) {
1653 - if (self.daysContainer !== undefined)
1654 - return (elem.className.indexOf("hidden") === -1 &&
1655 - elem.className.indexOf("flatpickr-disabled") === -1 &&
1656 - self.daysContainer.contains(elem));
1657 - return false;
1658 - }
1659 - function onBlur(e) {
1253 + function onKeyDown(e) {
1660 1254 var isInput = e.target === self._input;
1661 - var valueChanged = self._input.value.trimEnd() !== getDateStr();
1662 - if (isInput &&
1663 - valueChanged &&
1664 - !(e.relatedTarget && isCalendarElem(e.relatedTarget))) {
1665 - self.setDate(self._input.value, true, e.target === self.altInput
1666 - ? self.config.altFormat
1667 - : self.config.dateFormat);
1668 - }
1669 - }
1670 - function onKeyDown(e) {
1671 - // e.key e.keyCode
1672 - // "Backspace" 8
1673 - // "Tab" 9
1674 - // "Enter" 13
1675 - // "Escape" (IE "Esc") 27
1676 - // "ArrowLeft" (IE "Left") 37
1677 - // "ArrowUp" (IE "Up") 38
1678 - // "ArrowRight" (IE "Right") 39
1679 - // "ArrowDown" (IE "Down") 40
1680 - // "Delete" (IE "Del") 46
1681 - var eventTarget = getEventTarget(e);
1682 - var isInput = self.config.wrap
1683 - ? element.contains(eventTarget)
1684 - : eventTarget === self._input;
1255 + var calendarElem = isCalendarElem(e.target);
1685 1256 var allowInput = self.config.allowInput;
1686 1257 var allowKeydown = self.isOpen && (!allowInput || !isInput);
1687 1258 var allowInlineKeydown = self.config.inline && isInput && !allowInput;
1688 - if (e.keyCode === 13 && isInput) {
1259 + if (e.key === "Enter" && isInput) {
1689 1260 if (allowInput) {
1690 - self.setDate(self._input.value, true, eventTarget === self.altInput
1261 + self.setDate(self._input.value, true, e.target === self.altInput
1691 1262 ? self.config.altFormat
1692 1263 : self.config.dateFormat);
1693 - self.close();
1694 - return eventTarget.blur();
1264 + return e.target.blur();
1695 1265 }
1696 - else {
1266 + else
1697 1267 self.open();
1698 - }
1699 1268 }
1700 - else if (isCalendarElem(eventTarget) ||
1701 - allowKeydown ||
1702 - allowInlineKeydown) {
1269 + else if (calendarElem || allowKeydown || allowInlineKeydown) {
1703 1270 var isTimeObj = !!self.timeContainer &&
1704 - self.timeContainer.contains(eventTarget);
1705 - switch (e.keyCode) {
1706 - case 13:
1707 - if (isTimeObj) {
1708 - e.preventDefault();
1709 - updateTime();
1710 - focusAndClose();
1711 - }
1271 + self.timeContainer.contains(e.target);
1272 + switch (e.key) {
1273 + case "Enter":
1274 + if (isTimeObj)
1275 + updateValue();
1712 1276 else
1713 1277 selectDate(e);
1714 1278 break;
1715 - case 27: // escape
1279 + case "Escape":
1716 1280 e.preventDefault();
1717 - focusAndClose();
1281 + self.close();
1718 1282 break;
1719 - case 8:
1720 - case 46:
1721 - if (isInput && !self.config.allowInput) {
1722 - e.preventDefault();
1283 + case "Backspace":
1284 + case "Delete":
1285 + if (isInput && !self.config.allowInput)
1723 1286 self.clear();
1724 - }
1725 1287 break;
1726 - case 37:
1727 - case 39:
1728 - if (!isTimeObj && !isInput) {
1288 + case "ArrowLeft":
1289 + case "ArrowRight":
1290 + if (!isTimeObj) {
1729 1291 e.preventDefault();
1730 - var activeElement = getClosestActiveElement();
1731 - if (self.daysContainer !== undefined &&
1732 - (allowInput === false ||
1733 - (activeElement && isInView(activeElement)))) {
1734 - var delta_1 = e.keyCode === 39 ? 1 : -1;
1292 + if (self.daysContainer) {
1293 + var delta_1 = e.key === "ArrowRight" ? 1 : -1;
1735 1294 if (!e.ctrlKey)
1736 - focusOnDay(undefined, delta_1);
1737 - else {
1738 - e.stopPropagation();
1739 - changeMonth(delta_1);
1740 - focusOnDay(getFirstAvailableDay(1), 0);
1741 - }
1295 + focusOnDay(e.target.$i, delta_1);
1296 + else
1297 + changeMonth(delta_1, true, undefined, true);
1742 1298 }
1743 1299 }
1744 1300 else if (self.hourElement)
1745 1301 self.hourElement.focus();
1746 1302 break;
1747 - case 38:
1748 - case 40:
1303 + case "ArrowUp":
1304 + case "ArrowDown":
1749 1305 e.preventDefault();
1750 - var delta = e.keyCode === 40 ? 1 : -1;
1751 - if ((self.daysContainer &&
1752 - eventTarget.$i !== undefined) ||
1753 - eventTarget === self.input ||
1754 - eventTarget === self.altInput) {
1306 + var delta = e.key === "ArrowDown" ? 1 : -1;
1307 + if (self.daysContainer && e.target.$i !== undefined) {
1755 1308 if (e.ctrlKey) {
1756 - e.stopPropagation();
1757 1309 changeYear(self.currentYear - delta);
1758 - focusOnDay(getFirstAvailableDay(1), 0);
1310 + focusOnDay(e.target.$i, 0);
1759 1311 }
1760 1312 else if (!isTimeObj)
1761 - focusOnDay(undefined, delta * 7);
1313 + focusOnDay(e.target.$i, delta * 7);
1762 1314 }
1763 - else if (eventTarget === self.currentYearElement) {
1764 - changeYear(self.currentYear - delta);
1765 - }
1766 1315 else if (self.config.enableTime) {
1767 1316 if (!isTimeObj && self.hourElement)
1768 1317 self.hourElement.focus();
1769 1318 updateTime(e);
@@ -1769,109 +1318,89 @@
1769 1318 updateTime(e);
1770 1319 self._debouncedChange();
1771 1320 }
1772 1321 break;
1773 - case 9:
1774 - if (isTimeObj) {
1775 - var elems = [
1776 - self.hourElement,
1777 - self.minuteElement,
1778 - self.secondElement,
1779 - self.amPM,
1780 - ]
1781 - .concat(self.pluginElements)
1782 - .filter(function (x) { return x; });
1783 - var i = elems.indexOf(eventTarget);
1784 - if (i !== -1) {
1785 - var target = elems[i + (e.shiftKey ? -1 : 1)];
1786 - e.preventDefault();
1787 - (target || self._input).focus();
1788 - }
1322 + case "Tab":
1323 + if (e.target === self.hourElement) {
1324 + e.preventDefault();
1325 + self.minuteElement.select();
1789 1326 }
1790 - else if (!self.config.noCalendar &&
1791 - self.daysContainer &&
1792 - self.daysContainer.contains(eventTarget) &&
1793 - e.shiftKey) {
1327 + else if (e.target === self.minuteElement &&
1328 + (self.secondElement || self.amPM)) {
1794 1329 e.preventDefault();
1795 - self._input.focus();
1330 + if (self.secondElement !== undefined)
1331 + self.secondElement.focus();
1332 + else if (self.amPM !== undefined)
1333 + self.amPM.focus();
1796 1334 }
1335 + else if (e.target === self.secondElement && self.amPM) {
1336 + e.preventDefault();
1337 + self.amPM.focus();
1338 + }
1797 1339 break;
1798 - }
1799 - }
1800 - if (self.amPM !== undefined && eventTarget === self.amPM) {
1801 - switch (e.key) {
1802 1340 case self.l10n.amPM[0].charAt(0):
1803 - case self.l10n.amPM[0].charAt(0).toLowerCase():
1804 - self.amPM.textContent = self.l10n.amPM[0];
1805 - setHoursFromInputs();
1806 - updateValue();
1341 + if (self.amPM !== undefined && e.target === self.amPM) {
1342 + self.amPM.textContent = self.l10n.amPM[0];
1343 + setHoursFromInputs();
1344 + updateValue();
1345 + }
1807 1346 break;
1808 1347 case self.l10n.amPM[1].charAt(0):
1809 - case self.l10n.amPM[1].charAt(0).toLowerCase():
1810 - self.amPM.textContent = self.l10n.amPM[1];
1811 - setHoursFromInputs();
1812 - updateValue();
1348 + if (self.amPM !== undefined && e.target === self.amPM) {
1349 + self.amPM.textContent = self.l10n.amPM[1];
1350 + setHoursFromInputs();
1351 + updateValue();
1352 + }
1813 1353 break;
1354 + default:
1355 + break;
1814 1356 }
1815 - }
1816 - if (isInput || isCalendarElem(eventTarget)) {
1817 1357 triggerEvent("onKeyDown", e);
1818 1358 }
1819 1359 }
1820 - function onMouseOver(elem, cellClass) {
1821 - if (cellClass === void 0) { cellClass = "flatpickr-day"; }
1360 + function onMouseOver(elem) {
1822 1361 if (self.selectedDates.length !== 1 ||
1823 - (elem &&
1824 - (!elem.classList.contains(cellClass) ||
1825 - elem.classList.contains("flatpickr-disabled"))))
1362 + !elem.classList.contains("flatpickr-day") ||
1363 + self.minRangeDate === undefined ||
1364 + self.maxRangeDate === undefined)
1826 1365 return;
1827 - var hoverDate = elem
1828 - ? elem.dateObj.getTime()
1829 - : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());
1830 - var containsDisabled = false;
1831 - var minRange = 0, maxRange = 0;
1366 + var hoverDate = elem.dateObj, initialDate = self.parseDate(self.selectedDates[0], undefined, true), rangeStartDate = Math.min(hoverDate.getTime(), self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate.getTime(), self.selectedDates[0].getTime()), containsDisabled = false;
1832 1367 for (var t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {
1833 - if (!isEnabled(new Date(t), true)) {
1834 - containsDisabled =
1835 - containsDisabled || (t > rangeStartDate && t < rangeEndDate);
1836 - if (t < initialDate && (!minRange || t > minRange))
1837 - minRange = t;
1838 - else if (t > initialDate && (!maxRange || t < maxRange))
1839 - maxRange = t;
1368 + if (!isEnabled(new Date(t))) {
1369 + containsDisabled = true;
1370 + break;
1840 1371 }
1841 1372 }
1842 - var hoverableCells = Array.from(self.rContainer.querySelectorAll("*:nth-child(-n+" + self.config.showMonths + ") > ." + cellClass));
1843 - hoverableCells.forEach(function (dayElem) {
1844 - var date = dayElem.dateObj;
1373 + var _loop_1 = function (i, date) {
1845 1374 var timestamp = date.getTime();
1846 - var outOfRange = (minRange > 0 && timestamp < minRange) ||
1847 - (maxRange > 0 && timestamp > maxRange);
1375 + var outOfRange = timestamp < self.minRangeDate.getTime() ||
1376 + timestamp > self.maxRangeDate.getTime(), dayElem = self.days.childNodes[i];
1848 1377 if (outOfRange) {
1849 1378 dayElem.classList.add("notAllowed");
1850 1379 ["inRange", "startRange", "endRange"].forEach(function (c) {
1851 1380 dayElem.classList.remove(c);
1852 1381 });
1853 - return;
1382 + return "continue";
1854 1383 }
1855 1384 else if (containsDisabled && !outOfRange)
1856 - return;
1385 + return "continue";
1857 1386 ["startRange", "inRange", "endRange", "notAllowed"].forEach(function (c) {
1858 1387 dayElem.classList.remove(c);
1859 1388 });
1860 - if (elem !== undefined) {
1861 - elem.classList.add(hoverDate <= self.selectedDates[0].getTime()
1862 - ? "startRange"
1863 - : "endRange");
1864 - if (initialDate < hoverDate && timestamp === initialDate)
1865 - dayElem.classList.add("startRange");
1866 - else if (initialDate > hoverDate && timestamp === initialDate)
1867 - dayElem.classList.add("endRange");
1868 - if (timestamp >= minRange &&
1869 - (maxRange === 0 || timestamp <= maxRange) &&
1870 - isBetween(timestamp, initialDate, hoverDate))
1871 - dayElem.classList.add("inRange");
1872 - }
1873 - });
1389 + var minRangeDate = Math.max(self.minRangeDate.getTime(), rangeStartDate), maxRangeDate = Math.min(self.maxRangeDate.getTime(), rangeEndDate);
1390 + elem.classList.add(hoverDate < self.selectedDates[0] ? "startRange" : "endRange");
1391 + if (initialDate < hoverDate && timestamp === initialDate.getTime())
1392 + dayElem.classList.add("startRange");
1393 + else if (initialDate > hoverDate && timestamp === initialDate.getTime())
1394 + dayElem.classList.add("endRange");
1395 + if (timestamp >= minRangeDate && timestamp <= maxRangeDate)
1396 + dayElem.classList.add("inRange");
1397 + };
1398 + for (var i = 0, date = self.days.childNodes[i].dateObj; i < 42; i++, date =
1399 + self.days.childNodes[i] &&
1400 + self.days.childNodes[i].dateObj) {
1401 + _loop_1(i, date);
1402 + }
1874 1403 }
1875 1404 function onResize() {
1876 1405 if (self.isOpen && !self.config.static && !self.config.inline)
1877 1406 positionCalendar();
@@ -1876,46 +1405,32 @@
1876 1405 if (self.isOpen && !self.config.static && !self.config.inline)
1877 1406 positionCalendar();
1878 1407 }
1879 1408 function open(e, positionElement) {
1880 - if (positionElement === void 0) { positionElement = self._positionElement; }
1881 - if (self.isMobile === true) {
1409 + if (positionElement === void 0) { positionElement = self._input; }
1410 + if (self.isMobile) {
1882 1411 if (e) {
1883 1412 e.preventDefault();
1884 - var eventTarget = getEventTarget(e);
1885 - if (eventTarget) {
1886 - eventTarget.blur();
1887 - }
1413 + e.target && e.target.blur();
1888 1414 }
1889 - if (self.mobileInput !== undefined) {
1890 - self.mobileInput.focus();
1891 - self.mobileInput.click();
1892 - }
1415 + setTimeout(function () {
1416 + self.mobileInput !== undefined && self.mobileInput.click();
1417 + }, 0);
1893 1418 triggerEvent("onOpen");
1894 1419 return;
1895 1420 }
1896 - else if (self._input.disabled || self.config.inline) {
1421 + if (self._input.disabled || self.config.inline)
1897 1422 return;
1898 - }
1899 1423 var wasOpen = self.isOpen;
1900 1424 self.isOpen = true;
1901 - if (!wasOpen) {
1902 - self.calendarContainer.classList.add("open");
1903 - self._input.classList.add("active");
1904 - triggerEvent("onOpen");
1905 - positionCalendar(positionElement);
1906 - }
1907 - if (self.config.enableTime === true && self.config.noCalendar === true) {
1908 - if (self.config.allowInput === false &&
1909 - (e === undefined ||
1910 - !self.timeContainer.contains(e.relatedTarget))) {
1911 - setTimeout(function () { return self.hourElement.select(); }, 50);
1912 - }
1913 - }
1425 + positionCalendar(positionElement);
1426 + self.calendarContainer.classList.add("open");
1427 + self._input.classList.add("active");
1428 + !wasOpen && triggerEvent("onOpen");
1914 1429 }
1915 1430 function minMaxDateSetter(type) {
1916 1431 return function (date) {
1917 - var dateObj = (self.config["_" + type + "Date"] = self.parseDate(date, self.config.dateFormat));
1432 + var dateObj = (self.config["_" + type + "Date"] = self.parseDate(date));
1918 1433 var inverseDateObj = self.config["_" + (type === "min" ? "max" : "min") + "Date"];
1919 1434 if (dateObj !== undefined) {
1920 1435 self[type === "min" ? "minDateHasTime" : "maxDateHasTime"] =
1921 1436 dateObj.getHours() > 0 ||
@@ -1945,9 +1460,8 @@
1945 1460 var boolOpts = [
1946 1461 "wrap",
1947 1462 "weekNumbers",
1948 1463 "allowInput",
1949 - "allowInvalidPreload",
1950 1464 "clickOpens",
1951 1465 "time_24hr",
1952 1466 "enableTime",
1953 1467 "noCalendar",
@@ -1957,40 +1471,48 @@
1957 1471 "static",
1958 1472 "enableSeconds",
1959 1473 "disableMobile",
1960 1474 ];
1961 - var userConfig = __assign(__assign({}, JSON.parse(JSON.stringify(element.dataset || {}))), instanceConfig);
1962 - var formats = {};
1963 - self.config.parseDate = userConfig.parseDate;
1964 - self.config.formatDate = userConfig.formatDate;
1475 + var hooks = [
1476 + "onChange",
1477 + "onClose",
1478 + "onDayCreate",
1479 + "onDestroy",
1480 + "onKeyDown",
1481 + "onMonthChange",
1482 + "onOpen",
1483 + "onParseConfig",
1484 + "onReady",
1485 + "onValueUpdate",
1486 + "onYearChange",
1487 + ];
1488 + self.config = __assign({}, flatpickr.defaultConfig);
1489 + var userConfig = __assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {})));
1490 + var formats$$1 = {};
1965 1491 Object.defineProperty(self.config, "enable", {
1966 - get: function () { return self.config._enable; },
1492 + get: function () { return self.config._enable || []; },
1967 1493 set: function (dates) {
1968 1494 self.config._enable = parseDateRules(dates);
1969 1495 },
1970 1496 });
1971 1497 Object.defineProperty(self.config, "disable", {
1972 - get: function () { return self.config._disable; },
1498 + get: function () { return self.config._disable || []; },
1973 1499 set: function (dates) {
1974 1500 self.config._disable = parseDateRules(dates);
1975 1501 },
1976 1502 });
1977 - var timeMode = userConfig.mode === "time";
1978 - if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {
1979 - var defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaults.dateFormat;
1980 - formats.dateFormat =
1981 - userConfig.noCalendar || timeMode
1982 - ? "H:i" + (userConfig.enableSeconds ? ":S" : "")
1983 - : defaultDateFormat + " H:i" + (userConfig.enableSeconds ? ":S" : "");
1503 + if (!userConfig.dateFormat && userConfig.enableTime) {
1504 + formats$$1.dateFormat = userConfig.noCalendar
1505 + ? "H:i" + (userConfig.enableSeconds ? ":S" : "")
1506 + : flatpickr.defaultConfig.dateFormat +
1507 + " H:i" +
1508 + (userConfig.enableSeconds ? ":S" : "");
1984 1509 }
1985 - if (userConfig.altInput &&
1986 - (userConfig.enableTime || timeMode) &&
1987 - !userConfig.altFormat) {
1988 - var defaultAltFormat = flatpickr.defaultConfig.altFormat || defaults.altFormat;
1989 - formats.altFormat =
1990 - userConfig.noCalendar || timeMode
1991 - ? "h:i" + (userConfig.enableSeconds ? ":S K" : " K")
1992 - : defaultAltFormat + (" h:i" + (userConfig.enableSeconds ? ":S" : "") + " K");
1510 + if (userConfig.altInput && userConfig.enableTime && !userConfig.altFormat) {
1511 + formats$$1.altFormat = userConfig.noCalendar
1512 + ? "h:i" + (userConfig.enableSeconds ? ":S K" : " K")
1513 + : flatpickr.defaultConfig.altFormat +
1514 + (" h:i" + (userConfig.enableSeconds ? ":S" : "") + " K");
1993 1515 }
1994 1516 Object.defineProperty(self.config, "minDate", {
1995 1517 get: function () { return self.config._minDate; },
1996 1518 set: minMaxDateSetter("min"),
@@ -1998,44 +1520,22 @@
1998 1520 Object.defineProperty(self.config, "maxDate", {
1999 1521 get: function () { return self.config._maxDate; },
2000 1522 set: minMaxDateSetter("max"),
2001 1523 });
2002 - var minMaxTimeSetter = function (type) { return function (val) {
2003 - self.config[type === "min" ? "_minTime" : "_maxTime"] = self.parseDate(val, "H:i:S");
2004 - }; };
2005 - Object.defineProperty(self.config, "minTime", {
2006 - get: function () { return self.config._minTime; },
2007 - set: minMaxTimeSetter("min"),
2008 - });
2009 - Object.defineProperty(self.config, "maxTime", {
2010 - get: function () { return self.config._maxTime; },
2011 - set: minMaxTimeSetter("max"),
2012 - });
2013 - if (userConfig.mode === "time") {
2014 - self.config.noCalendar = true;
2015 - self.config.enableTime = true;
2016 - }
2017 - Object.assign(self.config, formats, userConfig);
1524 + Object.assign(self.config, formats$$1, userConfig);
2018 1525 for (var i = 0; i < boolOpts.length; i++)
2019 - // https://github.com/microsoft/TypeScript/issues/31663
2020 1526 self.config[boolOpts[i]] =
2021 1527 self.config[boolOpts[i]] === true ||
2022 1528 self.config[boolOpts[i]] === "true";
2023 - HOOKS.filter(function (hook) { return self.config[hook] !== undefined; }).forEach(function (hook) {
2024 - self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);
2025 - });
2026 - self.isMobile =
2027 - !self.config.disableMobile &&
2028 - !self.config.inline &&
2029 - self.config.mode === "single" &&
2030 - !self.config.disable.length &&
2031 - !self.config.enable &&
2032 - !self.config.weekNumbers &&
2033 - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
1529 + for (var i = hooks.length; i--;) {
1530 + if (self.config[hooks[i]] !== undefined) {
1531 + self.config[hooks[i]] = arrayify(self.config[hooks[i]] || []).map(bindToInstance);
1532 + }
1533 + }
2034 1534 for (var i = 0; i < self.config.plugins.length; i++) {
2035 1535 var pluginConf = self.config.plugins[i](self) || {};
2036 1536 for (var key in pluginConf) {
2037 - if (HOOKS.indexOf(key) > -1) {
1537 + if (~hooks.indexOf(key)) {
2038 1538 self.config[key] = arrayify(pluginConf[key])
2039 1539 .map(bindToInstance)
2040 1540 .concat(self.config[key]);
2041 1541 }
@@ -2042,51 +1542,35 @@
2042 1542 else if (typeof userConfig[key] === "undefined")
2043 1543 self.config[key] = pluginConf[key];
2044 1544 }
2045 1545 }
2046 - if (!userConfig.altInputClass) {
2047 - self.config.altInputClass =
2048 - getInputElem().className + " " + self.config.altInputClass;
2049 - }
1546 + self.isMobile =
1547 + !self.config.disableMobile &&
1548 + !self.config.inline &&
1549 + self.config.mode === "single" &&
1550 + !self.config.disable.length &&
1551 + !self.config.enable.length &&
1552 + !self.config.weekNumbers &&
1553 + /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
2050 1554 triggerEvent("onParseConfig");
2051 1555 }
2052 - function getInputElem() {
2053 - return self.config.wrap
2054 - ? element.querySelector("[data-input]")
2055 - : element;
2056 - }
2057 1556 function setupLocale() {
2058 1557 if (typeof self.config.locale !== "object" &&
2059 1558 typeof flatpickr.l10ns[self.config.locale] === "undefined")
2060 1559 self.config.errorHandler(new Error("flatpickr: invalid locale " + self.config.locale));
2061 - self.l10n = __assign(__assign({}, flatpickr.l10ns.default), (typeof self.config.locale === "object"
1560 + self.l10n = __assign({}, flatpickr.l10ns.default, typeof self.config.locale === "object"
2062 1561 ? self.config.locale
2063 1562 : self.config.locale !== "default"
2064 1563 ? flatpickr.l10ns[self.config.locale]
2065 - : undefined));
2066 - tokenRegex.D = "(" + self.l10n.weekdays.shorthand.join("|") + ")";
2067 - tokenRegex.l = "(" + self.l10n.weekdays.longhand.join("|") + ")";
2068 - tokenRegex.M = "(" + self.l10n.months.shorthand.join("|") + ")";
2069 - tokenRegex.F = "(" + self.l10n.months.longhand.join("|") + ")";
1564 + : undefined);
2070 1565 tokenRegex.K = "(" + self.l10n.amPM[0] + "|" + self.l10n.amPM[1] + "|" + self.l10n.amPM[0].toLowerCase() + "|" + self.l10n.amPM[1].toLowerCase() + ")";
2071 - var userConfig = __assign(__assign({}, instanceConfig), JSON.parse(JSON.stringify(element.dataset || {})));
2072 - if (userConfig.time_24hr === undefined &&
2073 - flatpickr.defaultConfig.time_24hr === undefined) {
2074 - self.config.time_24hr = self.l10n.time_24hr;
2075 - }
2076 - self.formatDate = createDateFormatter(self);
2077 - self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });
2078 1566 }
2079 - function positionCalendar(customPositionElement) {
2080 - if (typeof self.config.position === "function") {
2081 - return void self.config.position(self, customPositionElement);
2082 - }
1567 + function positionCalendar(positionElement) {
1568 + if (positionElement === void 0) { positionElement = self._positionElement; }
2083 1569 if (self.calendarContainer === undefined)
2084 1570 return;
2085 - triggerEvent("onPreCalendarPosition");
2086 - var positionElement = customPositionElement || self._positionElement;
2087 - var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, (function (acc, child) { return acc + child.offsetHeight; }), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(" "), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === "above" ||
2088 - (configPosVertical !== "below" &&
1571 + var calendarHeight = self.calendarContainer.offsetHeight, calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPos === "above" ||
1572 + (configPos !== "below" &&
2089 1573 distanceFromBottom < calendarHeight &&
2090 1574 inputBounds.top > calendarHeight);
2091 1575 var top = window.pageYOffset +
2092 1576 inputBounds.top +
@@ -2095,25 +1579,10 @@
2095 1579 toggleClass(self.calendarContainer, "arrowBottom", showOnTop);
2096 1580 if (self.config.inline)
2097 1581 return;
2098 1582 var left = window.pageXOffset + inputBounds.left;
2099 - var isCenter = false;
2100 - var isRight = false;
2101 - if (configPosHorizontal === "center") {
2102 - left -= (calendarWidth - inputBounds.width) / 2;
2103 - isCenter = true;
2104 - }
2105 - else if (configPosHorizontal === "right") {
2106 - left -= calendarWidth - inputBounds.width;
2107 - isRight = true;
2108 - }
2109 - toggleClass(self.calendarContainer, "arrowLeft", !isCenter && !isRight);
2110 - toggleClass(self.calendarContainer, "arrowCenter", isCenter);
2111 - toggleClass(self.calendarContainer, "arrowRight", isRight);
2112 - var right = window.document.body.offsetWidth -
2113 - (window.pageXOffset + inputBounds.right);
1583 + var right = window.document.body.offsetWidth - inputBounds.right;
2114 1584 var rightMost = left + calendarWidth > window.document.body.offsetWidth;
2115 - var centerMost = right + calendarWidth > window.document.body.offsetWidth;
2116 1585 toggleClass(self.calendarContainer, "rightMost", rightMost);
2117 1586 if (self.config.static)
2118 1587 return;
2119 1588 self.calendarContainer.style.top = top + "px";
@@ -2120,70 +1589,20 @@
2120 1589 if (!rightMost) {
2121 1590 self.calendarContainer.style.left = left + "px";
2122 1591 self.calendarContainer.style.right = "auto";
2123 1592 }
2124 - else if (!centerMost) {
1593 + else {
2125 1594 self.calendarContainer.style.left = "auto";
2126 1595 self.calendarContainer.style.right = right + "px";
2127 1596 }
2128 - else {
2129 - var doc = getDocumentStyleSheet();
2130 - // some testing environments don't have css support
2131 - if (doc === undefined)
2132 - return;
2133 - var bodyWidth = window.document.body.offsetWidth;
2134 - var centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);
2135 - var centerBefore = ".flatpickr-calendar.centerMost:before";
2136 - var centerAfter = ".flatpickr-calendar.centerMost:after";
2137 - var centerIndex = doc.cssRules.length;
2138 - var centerStyle = "{left:" + inputBounds.left + "px;right:auto;}";
2139 - toggleClass(self.calendarContainer, "rightMost", false);
2140 - toggleClass(self.calendarContainer, "centerMost", true);
2141 - doc.insertRule(centerBefore + "," + centerAfter + centerStyle, centerIndex);
2142 - self.calendarContainer.style.left = centerLeft + "px";
2143 - self.calendarContainer.style.right = "auto";
2144 - }
2145 1597 }
2146 - function getDocumentStyleSheet() {
2147 - var editableSheet = null;
2148 - for (var i = 0; i < document.styleSheets.length; i++) {
2149 - var sheet = document.styleSheets[i];
2150 - if (!sheet.cssRules)
2151 - continue;
2152 - try {
2153 - sheet.cssRules;
2154 - }
2155 - catch (err) {
2156 - continue;
2157 - }
2158 - editableSheet = sheet;
2159 - break;
2160 - }
2161 - return editableSheet != null ? editableSheet : createStyleSheet();
2162 - }
2163 - function createStyleSheet() {
2164 - var style = document.createElement("style");
2165 - document.head.appendChild(style);
2166 - return style.sheet;
2167 - }
2168 1598 function redraw() {
2169 1599 if (self.config.noCalendar || self.isMobile)
2170 1600 return;
2171 - buildMonthSwitch();
1601 + buildWeekdays();
2172 1602 updateNavigationCurrentMonth();
2173 1603 buildDays();
2174 1604 }
2175 - function focusAndClose() {
2176 - self._input.focus();
2177 - if (window.navigator.userAgent.indexOf("MSIE") !== -1 ||
2178 - navigator.msMaxTouchPoints !== undefined) {
2179 - // hack - bugs in the way IE handles focus keeps the calendar open
2180 - setTimeout(self.close, 0);
2181 - }
2182 - else {
2183 - self.close();
2184 - }
2185 - }
2186 1605 function selectDate(e) {
2187 1606 e.preventDefault();
2188 1607 e.stopPropagation();
2189 1608 var isSelectable = function (day) {
@@ -2188,19 +1607,17 @@
2188 1607 e.stopPropagation();
2189 1608 var isSelectable = function (day) {
2190 1609 return day.classList &&
2191 1610 day.classList.contains("flatpickr-day") &&
2192 - !day.classList.contains("flatpickr-disabled") &&
1611 + !day.classList.contains("disabled") &&
2193 1612 !day.classList.contains("notAllowed");
2194 1613 };
2195 - var t = findParent(getEventTarget(e), isSelectable);
1614 + var t = findParent(e.target, isSelectable);
2196 1615 if (t === undefined)
2197 1616 return;
2198 1617 var target = t;
2199 1618 var selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));
2200 - var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||
2201 - selectedDate.getMonth() >
2202 - self.currentMonth + self.config.showMonths - 1) &&
1619 + var shouldChangeMonth = selectedDate.getMonth() !== self.currentMonth &&
2203 1620 self.config.mode !== "range";
2204 1621 self.selectedDateElem = target;
2205 1622 if (self.config.mode === "single")
2206 1623 self.selectedDates = [selectedDate];
@@ -2211,14 +1628,11 @@
2211 1628 else
2212 1629 self.selectedDates.push(selectedDate);
2213 1630 }
2214 1631 else if (self.config.mode === "range") {
2215 - if (self.selectedDates.length === 2) {
2216 - self.clear(false, false);
2217 - }
2218 - self.latestSelectedDateObj = selectedDate;
1632 + if (self.selectedDates.length === 2)
1633 + self.clear();
2219 1634 self.selectedDates.push(selectedDate);
2220 - // unless selecting same date twice, sort ascendingly
2221 1635 if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)
2222 1636 self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });
2223 1637 }
2224 1638 setHoursFromInputs();
@@ -2225,75 +1639,61 @@
2225 1639 if (shouldChangeMonth) {
2226 1640 var isNewYear = self.currentYear !== selectedDate.getFullYear();
2227 1641 self.currentYear = selectedDate.getFullYear();
2228 1642 self.currentMonth = selectedDate.getMonth();
2229 - if (isNewYear) {
1643 + if (isNewYear)
2230 1644 triggerEvent("onYearChange");
2231 - buildMonthSwitch();
2232 - }
2233 1645 triggerEvent("onMonthChange");
2234 1646 }
2235 - updateNavigationCurrentMonth();
2236 1647 buildDays();
1648 + if (self.config.minDate &&
1649 + self.minDateHasTime &&
1650 + self.config.enableTime &&
1651 + compareDates(selectedDate, self.config.minDate) === 0)
1652 + setHoursFromDate(self.config.minDate);
2237 1653 updateValue();
2238 - // maintain focus
2239 - if (!shouldChangeMonth &&
2240 - self.config.mode !== "range" &&
2241 - self.config.showMonths === 1)
2242 - focusOnDayElem(target);
2243 - else if (self.selectedDateElem !== undefined &&
2244 - self.hourElement === undefined) {
2245 - self.selectedDateElem && self.selectedDateElem.focus();
1654 + if (self.config.enableTime)
1655 + setTimeout(function () { return (self.showTimeInput = true); }, 50);
1656 + if (self.config.mode === "range") {
1657 + if (self.selectedDates.length === 1) {
1658 + onMouseOver(target);
1659 + self._hidePrevMonthArrow =
1660 + self._hidePrevMonthArrow ||
1661 + (self.minRangeDate !== undefined &&
1662 + self.minRangeDate >
1663 + self.days.childNodes[0].dateObj);
1664 + self._hideNextMonthArrow =
1665 + self._hideNextMonthArrow ||
1666 + (self.maxRangeDate !== undefined &&
1667 + self.maxRangeDate <
1668 + new Date(self.currentYear, self.currentMonth + 1, 1));
1669 + }
1670 + else
1671 + updateNavigationCurrentMonth();
2246 1672 }
1673 + triggerEvent("onChange");
1674 + if (!shouldChangeMonth)
1675 + focusOnDay(target.$i, 0);
1676 + else
1677 + afterDayAnim(function () { return self.selectedDateElem && self.selectedDateElem.focus(); });
2247 1678 if (self.hourElement !== undefined)
2248 - self.hourElement !== undefined && self.hourElement.focus();
1679 + setTimeout(function () { return self.hourElement !== undefined && self.hourElement.select(); }, 451);
2249 1680 if (self.config.closeOnSelect) {
2250 1681 var single = self.config.mode === "single" && !self.config.enableTime;
2251 1682 var range = self.config.mode === "range" &&
2252 1683 self.selectedDates.length === 2 &&
2253 1684 !self.config.enableTime;
2254 - if (single || range) {
2255 - focusAndClose();
2256 - }
1685 + if (single || range)
1686 + self.close();
2257 1687 }
2258 - triggerChange();
2259 1688 }
2260 - var CALLBACKS = {
2261 - locale: [setupLocale, updateWeekdays],
2262 - showMonths: [buildMonths, setCalendarWidth, buildWeekdays],
2263 - minDate: [jumpToDate],
2264 - maxDate: [jumpToDate],
2265 - positionElement: [updatePositionElement],
2266 - clickOpens: [
2267 - function () {
2268 - if (self.config.clickOpens === true) {
2269 - bind(self._input, "focus", self.open);
2270 - bind(self._input, "click", self.open);
2271 - }
2272 - else {
2273 - self._input.removeEventListener("focus", self.open);
2274 - self._input.removeEventListener("click", self.open);
2275 - }
2276 - },
2277 - ],
2278 - };
2279 1689 function set(option, value) {
2280 - if (option !== null && typeof option === "object") {
1690 + if (option !== null && typeof option === "object")
2281 1691 Object.assign(self.config, option);
2282 - for (var key in option) {
2283 - if (CALLBACKS[key] !== undefined)
2284 - CALLBACKS[key].forEach(function (x) { return x(); });
2285 - }
2286 - }
2287 - else {
1692 + else
2288 1693 self.config[option] = value;
2289 - if (CALLBACKS[option] !== undefined)
2290 - CALLBACKS[option].forEach(function (x) { return x(); });
2291 - else if (HOOKS.indexOf(option) > -1)
2292 - self.config[option] = arrayify(value);
2293 - }
2294 1694 self.redraw();
2295 - updateValue(true);
1695 + jumpToDate();
2296 1696 }
2297 1697 function setSelectedDate(inputDate, format) {
2298 1698 var dates = [];
2299 1699 if (inputDate instanceof Array)
@@ -2302,9 +1702,8 @@
2302 1702 dates = [self.parseDate(inputDate, format)];
2303 1703 else if (typeof inputDate === "string") {
2304 1704 switch (self.config.mode) {
2305 1705 case "single":
2306 - case "time":
2307 1706 dates = [self.parseDate(inputDate, format)];
2308 1707 break;
2309 1708 case "multiple":
2310 1709 dates = inputDate
@@ -2315,32 +1714,27 @@
2315 1714 dates = inputDate
2316 1715 .split(self.l10n.rangeSeparator)
2317 1716 .map(function (date) { return self.parseDate(date, format); });
2318 1717 break;
1718 + default:
1719 + break;
2319 1720 }
2320 1721 }
2321 1722 else
2322 1723 self.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(inputDate)));
2323 - self.selectedDates = (self.config.allowInvalidPreload
2324 - ? dates
2325 - : dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); }));
2326 - if (self.config.mode === "range")
2327 - self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });
1724 + self.selectedDates = dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); });
1725 + self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });
2328 1726 }
2329 1727 function setDate(date, triggerChange, format) {
2330 1728 if (triggerChange === void 0) { triggerChange = false; }
2331 - if (format === void 0) { format = self.config.dateFormat; }
2332 - if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))
1729 + if (date !== 0 && !date)
2333 1730 return self.clear(triggerChange);
2334 1731 setSelectedDate(date, format);
2335 - self.latestSelectedDateObj =
2336 - self.selectedDates[self.selectedDates.length - 1];
1732 + self.showTimeInput = self.selectedDates.length > 0;
1733 + self.latestSelectedDateObj = self.selectedDates[0];
2337 1734 self.redraw();
2338 - jumpToDate(undefined, triggerChange);
1735 + jumpToDate();
2339 1736 setHoursFromDate();
2340 - if (self.selectedDates.length === 0) {
2341 - self.clear(false);
2342 - }
2343 1737 updateValue(triggerChange);
2344 1738 if (triggerChange)
2345 1739 triggerEvent("onChange");
2346 1740 }
@@ -2345,9 +1739,8 @@
2345 1739 triggerEvent("onChange");
2346 1740 }
2347 1741 function parseDateRules(arr) {
2348 1742 return arr
2349 - .slice()
2350 1743 .map(function (rule) {
2351 1744 if (typeof rule === "string" ||
2352 1745 typeof rule === "number" ||
2353 1746 rule instanceof Date) {
@@ -2362,41 +1755,29 @@
2362 1755 to: self.parseDate(rule.to, undefined),
2363 1756 };
2364 1757 return rule;
2365 1758 })
2366 - .filter(function (x) { return x; }); // remove falsy values
1759 + .filter(function (x) { return x; });
2367 1760 }
2368 1761 function setupDates() {
2369 1762 self.selectedDates = [];
2370 - self.now = self.parseDate(self.config.now) || new Date();
2371 - // Workaround IE11 setting placeholder as the input's value
2372 - var preloadedDate = self.config.defaultDate ||
2373 - ((self.input.nodeName === "INPUT" ||
2374 - self.input.nodeName === "TEXTAREA") &&
2375 - self.input.placeholder &&
2376 - self.input.value === self.input.placeholder
2377 - ? null
2378 - : self.input.value);
1763 + self.now = new Date();
1764 + var preloadedDate = self.config.defaultDate || self.input.value;
2379 1765 if (preloadedDate)
2380 1766 setSelectedDate(preloadedDate, self.config.dateFormat);
2381 - self._initialDate =
2382 - self.selectedDates.length > 0
2383 - ? self.selectedDates[0]
2384 - : self.config.minDate &&
2385 - self.config.minDate.getTime() > self.now.getTime()
2386 - ? self.config.minDate
2387 - : self.config.maxDate &&
2388 - self.config.maxDate.getTime() < self.now.getTime()
2389 - ? self.config.maxDate
2390 - : self.now;
2391 - self.currentYear = self._initialDate.getFullYear();
2392 - self.currentMonth = self._initialDate.getMonth();
2393 - if (self.selectedDates.length > 0)
1767 + var initialDate = self.selectedDates.length
1768 + ? self.selectedDates[0]
1769 + : self.config.minDate &&
1770 + self.config.minDate.getTime() > self.now.getTime()
1771 + ? self.config.minDate
1772 + : self.config.maxDate &&
1773 + self.config.maxDate.getTime() < self.now.getTime()
1774 + ? self.config.maxDate
1775 + : self.now;
1776 + self.currentYear = initialDate.getFullYear();
1777 + self.currentMonth = initialDate.getMonth();
1778 + if (self.selectedDates.length)
2394 1779 self.latestSelectedDateObj = self.selectedDates[0];
2395 - if (self.config.minTime !== undefined)
2396 - self.config.minTime = self.parseDate(self.config.minTime, "H:i");
2397 - if (self.config.maxTime !== undefined)
2398 - self.config.maxTime = self.parseDate(self.config.maxTime, "H:i");
2399 1780 self.minDateHasTime =
2400 1781 !!self.config.minDate &&
2401 1782 (self.config.minDate.getHours() > 0 ||
2402 1783 self.config.minDate.getMinutes() > 0 ||
@@ -2405,60 +1786,133 @@
2405 1786 !!self.config.maxDate &&
2406 1787 (self.config.maxDate.getHours() > 0 ||
2407 1788 self.config.maxDate.getMinutes() > 0 ||
2408 1789 self.config.maxDate.getSeconds() > 0);
1790 + Object.defineProperty(self, "showTimeInput", {
1791 + get: function () { return self._showTimeInput; },
1792 + set: function (bool) {
1793 + self._showTimeInput = bool;
1794 + if (self.calendarContainer)
1795 + toggleClass(self.calendarContainer, "showTimeInput", bool);
1796 + positionCalendar();
1797 + },
1798 + });
2409 1799 }
1800 + function formatDate(dateObj, frmt) {
1801 + if (self.config !== undefined && self.config.formatDate !== undefined)
1802 + return self.config.formatDate(dateObj, frmt);
1803 + return frmt
1804 + .split("")
1805 + .map(function (c, i, arr) {
1806 + return formats[c] && arr[i - 1] !== "\\"
1807 + ? formats[c](dateObj, self.l10n, self.config)
1808 + : c !== "\\" ? c : "";
1809 + })
1810 + .join("");
1811 + }
1812 + function parseDate(date, givenFormat, timeless) {
1813 + if (date !== 0 && !date)
1814 + return undefined;
1815 + var parsedDate;
1816 + var date_orig = date;
1817 + if (date instanceof Date)
1818 + parsedDate = new Date(date.getTime());
1819 + else if (typeof date !== "string" &&
1820 + date.toFixed !== undefined)
1821 + parsedDate = new Date(date);
1822 + else if (typeof date === "string") {
1823 + var format = givenFormat || (self.config || flatpickr.defaultConfig).dateFormat;
1824 + var datestr = String(date).trim();
1825 + if (datestr === "today") {
1826 + parsedDate = new Date();
1827 + timeless = true;
1828 + }
1829 + else if (/Z$/.test(datestr) ||
1830 + /GMT$/.test(datestr))
1831 + parsedDate = new Date(date);
1832 + else if (self.config && self.config.parseDate)
1833 + parsedDate = self.config.parseDate(date, format);
1834 + else {
1835 + parsedDate =
1836 + !self.config || !self.config.noCalendar
1837 + ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)
1838 + : new Date(new Date().setHours(0, 0, 0, 0));
1839 + var matched = void 0, ops = [];
1840 + for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) {
1841 + var token = format[i];
1842 + var isBackSlash = token === "\\";
1843 + var escaped = format[i - 1] === "\\" || isBackSlash;
1844 + if (tokenRegex[token] && !escaped) {
1845 + regexStr += tokenRegex[token];
1846 + var match = new RegExp(regexStr).exec(date);
1847 + if (match && (matched = true)) {
1848 + ops[token !== "Y" ? "push" : "unshift"]({
1849 + fn: revFormat[token],
1850 + val: match[++matchIndex],
1851 + });
1852 + }
1853 + }
1854 + else if (!isBackSlash)
1855 + regexStr += ".";
1856 + ops.forEach(function (_a) {
1857 + var fn = _a.fn, val = _a.val;
1858 + return (parsedDate =
1859 + fn(parsedDate, val, self.l10n) || parsedDate);
1860 + });
1861 + }
1862 + parsedDate = matched ? parsedDate : undefined;
1863 + }
1864 + }
1865 + if (!(parsedDate instanceof Date)) {
1866 + self.config.errorHandler(new Error("Invalid date provided: " + date_orig));
1867 + return undefined;
1868 + }
1869 + if (timeless === true)
1870 + parsedDate.setHours(0, 0, 0, 0);
1871 + return parsedDate;
1872 + }
2410 1873 function setupInputs() {
2411 - self.input = getInputElem();
2412 - /* istanbul ignore next */
1874 + self.input = self.config.wrap
1875 + ? element.querySelector("[data-input]")
1876 + : element;
2413 1877 if (!self.input) {
2414 1878 self.config.errorHandler(new Error("Invalid input element specified"));
2415 1879 return;
2416 1880 }
2417 - // hack: store previous type to restore it after destroy()
2418 1881 self.input._type = self.input.type;
2419 1882 self.input.type = "text";
2420 1883 self.input.classList.add("flatpickr-input");
2421 1884 self._input = self.input;
2422 1885 if (self.config.altInput) {
2423 - // replicate self.element
2424 - self.altInput = createElement(self.input.nodeName, self.config.altInputClass);
1886 + self.altInput = createElement(self.input.nodeName, self.input.className + " " + self.config.altInputClass);
2425 1887 self._input = self.altInput;
2426 1888 self.altInput.placeholder = self.input.placeholder;
2427 1889 self.altInput.disabled = self.input.disabled;
2428 1890 self.altInput.required = self.input.required;
2429 - self.altInput.tabIndex = self.input.tabIndex;
2430 1891 self.altInput.type = "text";
2431 - self.input.setAttribute("type", "hidden");
1892 + self.input.type = "hidden";
2432 1893 if (!self.config.static && self.input.parentNode)
2433 1894 self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);
2434 1895 }
2435 1896 if (!self.config.allowInput)
2436 1897 self._input.setAttribute("readonly", "readonly");
2437 - updatePositionElement();
2438 - }
2439 - function updatePositionElement() {
2440 1898 self._positionElement = self.config.positionElement || self._input;
2441 1899 }
2442 1900 function setupMobile() {
2443 1901 var inputType = self.config.enableTime
2444 - ? self.config.noCalendar
2445 - ? "time"
2446 - : "datetime-local"
1902 + ? self.config.noCalendar ? "time" : "datetime-local"
2447 1903 : "date";
2448 1904 self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile");
1905 + self.mobileInput.step = self.input.getAttribute("step") || "any";
2449 1906 self.mobileInput.tabIndex = 1;
2450 1907 self.mobileInput.type = inputType;
2451 1908 self.mobileInput.disabled = self.input.disabled;
2452 - self.mobileInput.required = self.input.required;
2453 1909 self.mobileInput.placeholder = self.input.placeholder;
2454 1910 self.mobileFormatStr =
2455 1911 inputType === "datetime-local"
2456 1912 ? "Y-m-d\\TH:i:S"
2457 - : inputType === "date"
2458 - ? "Y-m-d"
2459 - : "H:i:S";
2460 - if (self.selectedDates.length > 0) {
1913 + : inputType === "date" ? "Y-m-d" : "H:i:S";
1914 + if (self.selectedDates.length) {
2461 1915 self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);
2462 1916 }
2463 1917 if (self.config.minDate)
2464 1918 self.mobileInput.min = self.formatDate(self.config.minDate, "Y-m-d");
@@ -2463,10 +1917,8 @@
2463 1917 if (self.config.minDate)
2464 1918 self.mobileInput.min = self.formatDate(self.config.minDate, "Y-m-d");
2465 1919 if (self.config.maxDate)
2466 1920 self.mobileInput.max = self.formatDate(self.config.maxDate, "Y-m-d");
2467 - if (self.input.getAttribute("step"))
2468 - self.mobileInput.step = String(self.input.getAttribute("step"));
2469 1921 self.input.type = "hidden";
2470 1922 if (self.altInput !== undefined)
2471 1923 self.altInput.type = "hidden";
2472 1924 try {
@@ -2474,22 +1926,19 @@
2474 1926 self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);
2475 1927 }
2476 1928 catch (_a) { }
2477 1929 bind(self.mobileInput, "change", function (e) {
2478 - self.setDate(getEventTarget(e).value, false, self.mobileFormatStr);
1930 + self.setDate(e.target.value, false, self.mobileFormatStr);
2479 1931 triggerEvent("onChange");
2480 1932 triggerEvent("onClose");
2481 1933 });
2482 1934 }
2483 - function toggle(e) {
2484 - if (self.isOpen === true)
1935 + function toggle() {
1936 + if (self.isOpen)
2485 1937 return self.close();
2486 - self.open(e);
1938 + self.open();
2487 1939 }
2488 1940 function triggerEvent(event, data) {
2489 - // If the instance has been destroyed already, all hooks have been removed
2490 - if (self.config === undefined)
2491 - return;
2492 1941 var hooks = self.config[event];
2493 1942 if (hooks !== undefined && hooks.length > 0) {
2494 1943 for (var i = 0; hooks[i] && i < hooks.length; i++)
2495 1944 hooks[i](self.selectedDates, self.input.value, self, data);
@@ -2495,9 +1944,8 @@
2495 1944 hooks[i](self.selectedDates, self.input.value, self, data);
2496 1945 }
2497 1946 if (event === "onChange") {
2498 1947 self.input.dispatchEvent(createEvent("change"));
2499 - // many front-end frameworks bind to the input event
2500 1948 self.input.dispatchEvent(createEvent("input"));
2501 1949 }
2502 1950 }
2503 1951 function createEvent(name) {
@@ -2506,11 +1954,9 @@
2506 1954 return e;
2507 1955 }
2508 1956 function isDateSelected(date) {
2509 1957 for (var i = 0; i < self.selectedDates.length; i++) {
2510 - var selectedDate = self.selectedDates[i];
2511 - if (selectedDate instanceof Date &&
2512 - compareDates(selectedDate, date) === 0)
1958 + if (compareDates(self.selectedDates[i], date) === 0)
2513 1959 return "" + i;
2514 1960 }
2515 1961 return false;
2516 1962 }
@@ -2522,21 +1968,11 @@
2522 1968 }
2523 1969 function updateNavigationCurrentMonth() {
2524 1970 if (self.config.noCalendar || self.isMobile || !self.monthNav)
2525 1971 return;
2526 - self.yearElements.forEach(function (yearElement, i) {
2527 - var d = new Date(self.currentYear, self.currentMonth, 1);
2528 - d.setMonth(self.currentMonth + i);
2529 - if (self.config.showMonths > 1 ||
2530 - self.config.monthSelectorType === "static") {
2531 - self.monthElements[i].textContent =
2532 - monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + " ";
2533 - }
2534 - else {
2535 - self.monthsDropdownContainer.value = d.getMonth().toString();
2536 - }
2537 - yearElement.value = d.getFullYear().toString();
2538 - });
1972 + self.currentMonthElement.textContent =
1973 + monthToStr(self.currentMonth, self.config.shorthandCurrentMonth, self.l10n) + " ";
1974 + self.currentYearElement.value = self.currentYear.toString();
2539 1975 self._hidePrevMonthArrow =
2540 1976 self.config.minDate !== undefined &&
2541 1977 (self.currentYear === self.config.minDate.getFullYear()
2542 1978 ? self.currentMonth <= self.config.minDate.getMonth()
@@ -2546,27 +1982,12 @@
2546 1982 (self.currentYear === self.config.maxDate.getFullYear()
2547 1983 ? self.currentMonth + 1 > self.config.maxDate.getMonth()
2548 1984 : self.currentYear > self.config.maxDate.getFullYear());
2549 1985 }
2550 - function getDateStr(specificFormat) {
2551 - var format = specificFormat ||
2552 - (self.config.altInput ? self.config.altFormat : self.config.dateFormat);
2553 - return self.selectedDates
2554 - .map(function (dObj) { return self.formatDate(dObj, format); })
2555 - .filter(function (d, i, arr) {
2556 - return self.config.mode !== "range" ||
2557 - self.config.enableTime ||
2558 - arr.indexOf(d) === i;
2559 - })
2560 - .join(self.config.mode !== "range"
2561 - ? self.config.conjunction
2562 - : self.l10n.rangeSeparator);
2563 - }
2564 - /**
2565 - * Updates the values of inputs associated with the calendar
2566 - */
2567 1986 function updateValue(triggerChange) {
2568 1987 if (triggerChange === void 0) { triggerChange = true; }
1988 + if (!self.selectedDates.length)
1989 + return self.clear(triggerChange);
2569 1990 if (self.mobileInput !== undefined && self.mobileFormatStr) {
2570 1991 self.mobileInput.value =
2571 1992 self.latestSelectedDateObj !== undefined
2572 1993 ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)
@@ -2571,41 +1992,61 @@
2571 1992 self.latestSelectedDateObj !== undefined
2572 1993 ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)
2573 1994 : "";
2574 1995 }
2575 - self.input.value = getDateStr(self.config.dateFormat);
1996 + var joinChar = self.config.mode !== "range"
1997 + ? self.config.conjunction
1998 + : self.l10n.rangeSeparator;
1999 + self.input.value = self.selectedDates
2000 + .map(function (dObj) { return self.formatDate(dObj, self.config.dateFormat); })
2001 + .join(joinChar);
2576 2002 if (self.altInput !== undefined) {
2577 - self.altInput.value = getDateStr(self.config.altFormat);
2003 + self.altInput.value = self.selectedDates
2004 + .map(function (dObj) { return self.formatDate(dObj, self.config.altFormat); })
2005 + .join(joinChar);
2578 2006 }
2579 2007 if (triggerChange !== false)
2580 2008 triggerEvent("onValueUpdate");
2581 2009 }
2010 + function onMonthNavScroll(e) {
2011 + e.preventDefault();
2012 + var isYear = self.currentYearElement.parentNode &&
2013 + self.currentYearElement.parentNode.contains(e.target);
2014 + if (e.target === self.currentMonthElement || isYear) {
2015 + var delta = mouseDelta(e);
2016 + if (isYear) {
2017 + changeYear(self.currentYear + delta);
2018 + e.target.value = self.currentYear.toString();
2019 + }
2020 + else
2021 + self.changeMonth(delta, true, false);
2022 + }
2023 + }
2582 2024 function onMonthNavClick(e) {
2583 - var eventTarget = getEventTarget(e);
2584 - var isPrevMonth = self.prevMonthNav.contains(eventTarget);
2585 - var isNextMonth = self.nextMonthNav.contains(eventTarget);
2586 - if (isPrevMonth || isNextMonth) {
2025 + var isPrevMonth = self.prevMonthNav.contains(e.target);
2026 + var isNextMonth = self.nextMonthNav.contains(e.target);
2027 + if (isPrevMonth || isNextMonth)
2587 2028 changeMonth(isPrevMonth ? -1 : 1);
2029 + else if (e.target === self.currentYearElement) {
2030 + e.preventDefault();
2031 + self.currentYearElement.select();
2588 2032 }
2589 - else if (self.yearElements.indexOf(eventTarget) >= 0) {
2590 - eventTarget.select();
2591 - }
2592 - else if (eventTarget.classList.contains("arrowUp")) {
2033 + else if (e.target.className === "arrowUp")
2593 2034 self.changeYear(self.currentYear + 1);
2594 - }
2595 - else if (eventTarget.classList.contains("arrowDown")) {
2035 + else if (e.target.className === "arrowDown")
2596 2036 self.changeYear(self.currentYear - 1);
2597 - }
2598 2037 }
2599 2038 function timeWrapper(e) {
2600 2039 e.preventDefault();
2601 - var isKeyDown = e.type === "keydown", eventTarget = getEventTarget(e), input = eventTarget;
2602 - if (self.amPM !== undefined && eventTarget === self.amPM) {
2040 + var isKeyDown = e.type === "keydown", input = e.target;
2041 + if (self.amPM !== undefined && e.target === self.amPM) {
2603 2042 self.amPM.textContent =
2604 2043 self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];
2605 2044 }
2606 - var min = parseFloat(input.getAttribute("min")), max = parseFloat(input.getAttribute("max")), step = parseFloat(input.getAttribute("step")), curValue = parseInt(input.value, 10), delta = e.delta ||
2607 - (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);
2045 + var min = Number(input.min), max = Number(input.max), step = Number(input.step), curValue = parseInt(input.value, 10), delta = e.delta ||
2046 + (isKeyDown
2047 + ? e.which === 38 ? 1 : -1
2048 + : Math.max(-1, Math.min(1, e.wheelDelta || -e.deltaY)) || 0);
2608 2049 var newValue = curValue + step * delta;
2609 2050 if (typeof input.value !== "undefined" && input.value.length === 2) {
2610 2051 var isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;
2611 2052 if (newValue < min) {
@@ -2636,14 +2077,10 @@
2636 2077 }
2637 2078 init();
2638 2079 return self;
2639 2080 }
2640 - /* istanbul ignore next */
2641 2081 function _flatpickr(nodeList, config) {
2642 - // static list
2643 - var nodes = Array.prototype.slice
2644 - .call(nodeList)
2645 - .filter(function (x) { return x instanceof HTMLElement; });
2082 + var nodes = Array.prototype.slice.call(nodeList);
2646 2083 var instances = [];
2647 2084 for (var i = 0; i < nodes.length; i++) {
2648 2085 var node = nodes[i];
2649 2086 try {
@@ -2661,13 +2098,9 @@
2661 2098 }
2662 2099 }
2663 2100 return instances.length === 1 ? instances[0] : instances;
2664 2101 }
2665 - /* istanbul ignore next */
2666 - if (typeof HTMLElement !== "undefined" &&
2667 - typeof HTMLCollection !== "undefined" &&
2668 - typeof NodeList !== "undefined") {
2669 - // browser env
2102 + if (typeof HTMLElement !== "undefined") {
2670 2103 HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {
2671 2104 return _flatpickr(this, config);
2672 2105 };
2673 2106 HTMLElement.prototype.flatpickr = function (config) {
@@ -2673,37 +2106,30 @@
2673 2106 HTMLElement.prototype.flatpickr = function (config) {
2674 2107 return _flatpickr([this], config);
2675 2108 };
2676 2109 }
2677 - /* istanbul ignore next */
2678 - var flatpickr = function (selector, config) {
2679 - if (typeof selector === "string") {
2110 + var flatpickr;
2111 + flatpickr = function (selector, config) {
2112 + if (selector instanceof NodeList)
2113 + return _flatpickr(selector, config);
2114 + else if (typeof selector === "string")
2680 2115 return _flatpickr(window.document.querySelectorAll(selector), config);
2681 - }
2682 - else if (selector instanceof Node) {
2683 - return _flatpickr([selector], config);
2684 - }
2685 - else {
2686 - return _flatpickr(selector, config);
2687 - }
2116 + return _flatpickr([selector], config);
2688 2117 };
2689 - /* istanbul ignore next */
2690 - flatpickr.defaultConfig = {};
2118 + if (typeof window === "object")
2119 + window.flatpickr = flatpickr;
2120 + flatpickr.defaultConfig = defaults;
2691 2121 flatpickr.l10ns = {
2692 2122 en: __assign({}, english),
2693 2123 default: __assign({}, english),
2694 2124 };
2695 2125 flatpickr.localize = function (l10n) {
2696 - flatpickr.l10ns.default = __assign(__assign({}, flatpickr.l10ns.default), l10n);
2126 + flatpickr.l10ns.default = __assign({}, flatpickr.l10ns.default, l10n);
2697 2127 };
2698 2128 flatpickr.setDefaults = function (config) {
2699 - flatpickr.defaultConfig = __assign(__assign({}, flatpickr.defaultConfig), config);
2129 + flatpickr.defaultConfig = __assign({}, flatpickr.defaultConfig, config);
2700 2130 };
2701 - flatpickr.parseDate = createDateParser({});
2702 - flatpickr.formatDate = createDateFormatter({});
2703 - flatpickr.compareDates = compareDates;
2704 - /* istanbul ignore next */
2705 - if (typeof jQuery !== "undefined" && typeof jQuery.fn !== "undefined") {
2131 + if (typeof jQuery !== "undefined") {
2706 2132 jQuery.fn.flatpickr = function (config) {
2707 2133 return _flatpickr(this, config);
2708 2134 };
2709 2135 }
@@ -2709,11 +2135,9 @@
2709 2135 }
2710 2136 Date.prototype.fp_incr = function (days) {
2711 2137 return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === "string" ? parseInt(days, 10) : days));
2712 2138 };
2713 - if (typeof window !== "undefined") {
2714 - window.flatpickr = flatpickr;
2715 - }
2139 + var flatpickr$1 = flatpickr;
2716 2140
2717 - return flatpickr;
2141 + return flatpickr$1;
2718 2142
2719 -})));
2143 +})));