!(function (e, t) {
|
|
"object" == typeof exports && "object" == typeof module
|
|
? (module.exports = t())
|
|
: "function" == typeof define && define.amd
|
|
? define([], t)
|
|
: "object" == typeof exports
|
|
? (exports.AirDatepicker = t())
|
|
: (e.AirDatepicker = t());
|
|
})(this, function () {
|
|
return (function () {
|
|
"use strict";
|
|
var e = {
|
|
d: function (t, i) {
|
|
for (var s in i) e.o(i, s) && !e.o(t, s) && Object.defineProperty(t, s, { enumerable: !0, get: i[s] });
|
|
},
|
|
o: function (e, t) {
|
|
return Object.prototype.hasOwnProperty.call(e, t);
|
|
}
|
|
},
|
|
t = {};
|
|
e.d(t, {
|
|
default: function () {
|
|
return K;
|
|
}
|
|
});
|
|
var i = {
|
|
days: "days",
|
|
months: "months",
|
|
years: "years",
|
|
day: "day",
|
|
month: "month",
|
|
year: "year",
|
|
eventChangeViewDate: "changeViewDate",
|
|
eventChangeCurrentView: "changeCurrentView",
|
|
eventChangeFocusDate: "changeFocusDate",
|
|
eventChangeSelectedDate: "changeSelectedDate",
|
|
eventChangeTime: "changeTime",
|
|
eventChangeLastSelectedDate: "changeLastSelectedDate",
|
|
actionSelectDate: "selectDate",
|
|
actionUnselectDate: "unselectDate",
|
|
cssClassWeekend: "-weekend-"
|
|
},
|
|
s = {
|
|
classes: "",
|
|
inline: !1,
|
|
locale: {
|
|
days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
|
|
daysShort: ["Вос", "Пон", "Вто", "Сре", "Чет", "Пят", "Суб"],
|
|
daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
|
|
months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
|
|
monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
|
|
today: "Сегодня",
|
|
clear: "Очистить",
|
|
dateFormat: "dd.MM.yyyy",
|
|
timeFormat: "HH:mm",
|
|
firstDay: 1
|
|
},
|
|
startDate: new Date(),
|
|
firstDay: "",
|
|
weekends: [6, 0],
|
|
dateFormat: "",
|
|
altField: "",
|
|
altFieldDateFormat: "T",
|
|
toggleSelected: !0,
|
|
keyboardNav: !0,
|
|
selectedDates: !1,
|
|
container: "",
|
|
isMobile: !1,
|
|
visible: !1,
|
|
position: "bottom left",
|
|
offset: 12,
|
|
view: i.days,
|
|
minView: i.days,
|
|
showOtherMonths: !0,
|
|
selectOtherMonths: !0,
|
|
moveToOtherMonthsOnSelect: !0,
|
|
showOtherYears: !0,
|
|
selectOtherYears: !0,
|
|
moveToOtherYearsOnSelect: !0,
|
|
minDate: "",
|
|
maxDate: "",
|
|
disableNavWhenOutOfRange: !0,
|
|
multipleDates: !1,
|
|
multipleDatesSeparator: ", ",
|
|
range: !1,
|
|
dynamicRange: !0,
|
|
buttons: !1,
|
|
monthsField: "monthsShort",
|
|
showEvent: "focus",
|
|
autoClose: !1,
|
|
prevHtml: '<span class="action_prev"></span>',
|
|
nextHtml: '<span class="action_next"></span>',
|
|
navTitles: { days: "MMMM, <i>yyyy</i>", months: "yyyy", years: "yyyy1 - yyyy2" },
|
|
timepicker: !1,
|
|
onlyTimepicker: !1,
|
|
dateTimeSeparator: " ",
|
|
timeFormat: "",
|
|
minHours: 0,
|
|
maxHours: 24,
|
|
minMinutes: 0,
|
|
maxMinutes: 59,
|
|
hoursStep: 1,
|
|
minutesStep: 1,
|
|
onSelect: !1,
|
|
onChangeViewDate: !1,
|
|
onChangeView: !1,
|
|
onRenderCell: !1,
|
|
onShow: !1,
|
|
onHide: !1,
|
|
onClickDayName: !1
|
|
};
|
|
function a(e) {
|
|
let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : document;
|
|
return "string" == typeof e ? t.querySelector(e) : e;
|
|
}
|
|
function n() {
|
|
let { tagName: e = "div", className: t = "", innerHtml: i = "", id: s = "", attrs: a = {} } = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},
|
|
n = document.createElement(e);
|
|
return t && n.classList.add(...t.split(" ")), s && (n.id = s), i && (n.innerHTML = i), a && r(n, a), n;
|
|
}
|
|
function r(e, t) {
|
|
for (let [i, s] of Object.entries(t)) void 0 !== s && e.setAttribute(i, s);
|
|
return e;
|
|
}
|
|
function h(e) {
|
|
return new Date(e.getFullYear(), e.getMonth() + 1, 0).getDate();
|
|
}
|
|
function o(e) {
|
|
let t = e.getHours(),
|
|
{ hours: i, dayPeriod: s } = l(t);
|
|
return {
|
|
year: e.getFullYear(),
|
|
month: e.getMonth(),
|
|
fullMonth: e.getMonth() + 1 < 10 ? "0" + (e.getMonth() + 1) : e.getMonth() + 1,
|
|
date: e.getDate(),
|
|
fullDate: e.getDate() < 10 ? "0" + e.getDate() : e.getDate(),
|
|
day: e.getDay(),
|
|
hours: t,
|
|
fullHours: d(t),
|
|
hours12: i,
|
|
dayPeriod: s,
|
|
fullHours12: d(i),
|
|
minutes: e.getMinutes(),
|
|
fullMinutes: e.getMinutes() < 10 ? "0" + e.getMinutes() : e.getMinutes()
|
|
};
|
|
}
|
|
function l(e) {
|
|
return { dayPeriod: e > 11 ? "pm" : "am", hours: e % 12 == 0 ? 12 : e % 12 };
|
|
}
|
|
function d(e) {
|
|
return e < 10 ? "0" + e : e;
|
|
}
|
|
function c(e) {
|
|
let t = 10 * Math.floor(e.getFullYear() / 10);
|
|
return [t, t + 9];
|
|
}
|
|
function u() {
|
|
let e = [];
|
|
for (var t = arguments.length, i = new Array(t), s = 0; s < t; s++) i[s] = arguments[s];
|
|
return (
|
|
i.forEach((t) => {
|
|
if ("object" == typeof t) for (let i in t) t[i] && e.push(i);
|
|
else t && e.push(t);
|
|
}),
|
|
e.join(" ")
|
|
);
|
|
}
|
|
function p(e, t) {
|
|
let s = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : i.days;
|
|
if (!e || !t) return !1;
|
|
let a = o(e),
|
|
n = o(t),
|
|
r = { [i.days]: a.date === n.date && a.month === n.month && a.year === n.year, [i.months]: a.month === n.month && a.year === n.year, [i.years]: a.year === n.year };
|
|
return r[s];
|
|
}
|
|
function m(e, t, i) {
|
|
let s = g(e, !1).getTime(),
|
|
a = g(t, !1).getTime();
|
|
return i ? s >= a : s > a;
|
|
}
|
|
function v(e, t) {
|
|
return !m(e, t, !0);
|
|
}
|
|
function g(e) {
|
|
let t = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1],
|
|
i = new Date(e.getTime());
|
|
return "boolean" != typeof t || t || D(i), i;
|
|
}
|
|
function D(e) {
|
|
return e.setHours(0, 0, 0, 0), e;
|
|
}
|
|
function y(e, t, i) {
|
|
e.length
|
|
? e.forEach((e) => {
|
|
e.addEventListener(t, i);
|
|
})
|
|
: e.addEventListener(t, i);
|
|
}
|
|
function f(e, t) {
|
|
return !(!e || e === document || e instanceof DocumentFragment) && (e.matches(t) ? e : f(e.parentNode, t));
|
|
}
|
|
function w(e, t, i) {
|
|
return e > i ? i : e < t ? t : e;
|
|
}
|
|
function b(e) {
|
|
for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), s = 1; s < t; s++) i[s - 1] = arguments[s];
|
|
return (
|
|
i
|
|
.filter((e) => e)
|
|
.forEach((t) => {
|
|
for (let [i, s] of Object.entries(t))
|
|
if (void 0 !== s && "[object Object]" === s.toString()) {
|
|
let t = void 0 !== e[i] ? e[i].toString() : void 0,
|
|
a = s.toString(),
|
|
n = Array.isArray(s) ? [] : {};
|
|
(e[i] = e[i] ? (t !== a ? n : e[i]) : n), b(e[i], s);
|
|
} else e[i] = s;
|
|
}),
|
|
e
|
|
);
|
|
}
|
|
function k(e) {
|
|
let t = e;
|
|
return e instanceof Date || (t = new Date(e)), isNaN(t.getTime()) && (console.log(`Unable to convert value "${e}" to Date object`), (t = !1)), t;
|
|
}
|
|
function C(e) {
|
|
let t = "\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";
|
|
return new RegExp("(^|>|" + t + ")(" + e + ")($|<|" + t + ")", "g");
|
|
}
|
|
function $(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
class _ {
|
|
constructor() {
|
|
let { type: e, date: t, dp: i, opts: s, body: a } = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
|
|
$(this, "focus", () => {
|
|
this.$cell.classList.add("-focus-"), (this.focused = !0);
|
|
}),
|
|
$(this, "removeFocus", () => {
|
|
this.$cell.classList.remove("-focus-"), (this.focused = !1);
|
|
}),
|
|
$(this, "select", () => {
|
|
this.$cell.classList.add("-selected-"), (this.selected = !0);
|
|
}),
|
|
$(this, "removeSelect", () => {
|
|
this.$cell.classList.remove("-selected-", "-range-from-", "-range-to-"), (this.selected = !1);
|
|
}),
|
|
$(this, "onChangeSelectedDate", () => {
|
|
this.isDisabled || (this._handleSelectedStatus(), this.opts.range && this._handleRangeStatus());
|
|
}),
|
|
$(this, "onChangeFocusDate", (e) => {
|
|
if (!e) return void (this.focused && this.removeFocus());
|
|
let t = p(e, this.date, this.type);
|
|
t ? this.focus() : !t && this.focused && this.removeFocus(), this.opts.range && this._handleRangeStatus();
|
|
}),
|
|
$(this, "render", () => ((this.$cell.innerHTML = this._getHtml()), (this.$cell.adpCell = this), this.$cell)),
|
|
(this.type = e),
|
|
(this.singleType = this.type.slice(0, -1)),
|
|
(this.date = t),
|
|
(this.dp = i),
|
|
(this.opts = s),
|
|
(this.body = a),
|
|
(this.customData = !1),
|
|
this.init();
|
|
}
|
|
init() {
|
|
let { range: e, onRenderCell: t } = this.opts;
|
|
t && (this.customData = t({ date: this.date, cellType: this.singleType, datepicker: this.dp })),
|
|
this._createElement(),
|
|
this._bindDatepickerEvents(),
|
|
this._handleInitialFocusStatus(),
|
|
this.dp.hasSelectedDates && (this._handleSelectedStatus(), e && this._handleRangeStatus());
|
|
}
|
|
_bindDatepickerEvents() {
|
|
this.dp.on(i.eventChangeSelectedDate, this.onChangeSelectedDate), this.dp.on(i.eventChangeFocusDate, this.onChangeFocusDate);
|
|
}
|
|
unbindDatepickerEvents() {
|
|
this.dp.off(i.eventChangeSelectedDate, this.onChangeSelectedDate), this.dp.off(i.eventChangeFocusDate, this.onChangeFocusDate);
|
|
}
|
|
_createElement() {
|
|
var e;
|
|
let { year: t, month: i, date: s } = o(this.date),
|
|
a = (null === (e = this.customData) || void 0 === e ? void 0 : e.attrs) || {};
|
|
this.$cell = n({ className: this._getClassName(), attrs: { "data-year": t, "data-month": i, "data-date": s, ...a } });
|
|
}
|
|
_getClassName() {
|
|
var e, t;
|
|
let s = new Date(),
|
|
{ selectOtherMonths: a, selectOtherYears: n } = this.opts,
|
|
{ minDate: r, maxDate: h } = this.dp,
|
|
{ day: l } = o(this.date),
|
|
d = this._isOutOfMinMaxRange(),
|
|
c = null === (e = this.customData) || void 0 === e ? void 0 : e.disabled,
|
|
m = u("air-datepicker-cell", `-${this.singleType}-`, {
|
|
"-current-": p(s, this.date, this.type),
|
|
"-min-date-": r && p(r, this.date, this.type),
|
|
"-max-date-": h && p(h, this.date, this.type)
|
|
}),
|
|
v = "";
|
|
switch (this.type) {
|
|
case i.days:
|
|
v = u({ "-weekend-": this.dp.isWeekend(l), "-other-month-": this.isOtherMonth, "-disabled-": (this.isOtherMonth && !a) || d || c });
|
|
break;
|
|
case i.months:
|
|
v = u({ "-disabled-": d || c });
|
|
break;
|
|
case i.years:
|
|
v = u({ "-other-decade-": this.isOtherDecade, "-disabled-": d || (this.isOtherDecade && !n) || c });
|
|
}
|
|
return u(m, v, null === (t = this.customData) || void 0 === t ? void 0 : t.classes);
|
|
}
|
|
_getHtml() {
|
|
var e;
|
|
let { year: t, month: s, date: a } = o(this.date),
|
|
{ showOtherMonths: n, showOtherYears: r } = this.opts;
|
|
if (null !== (e = this.customData) && void 0 !== e && e.html) return this.customData.html;
|
|
switch (this.type) {
|
|
case i.days:
|
|
return !n && this.isOtherMonth ? "" : a;
|
|
case i.months:
|
|
return this.dp.locale[this.opts.monthsField][s];
|
|
case i.years:
|
|
return !r && this.isOtherDecade ? "" : t;
|
|
}
|
|
}
|
|
_isOutOfMinMaxRange() {
|
|
let { minDate: e, maxDate: t } = this.dp,
|
|
{ type: s, date: a } = this,
|
|
{ month: n, year: r, date: h } = o(a),
|
|
l = s === i.days,
|
|
d = s === i.years,
|
|
c = !!e && new Date(r, d ? e.getMonth() : n, l ? h : e.getDate()),
|
|
u = !!t && new Date(r, d ? t.getMonth() : n, l ? h : t.getDate());
|
|
return e && t ? v(c, e) || m(u, t) : e ? v(c, e) : t ? m(u, t) : void 0;
|
|
}
|
|
destroy() {
|
|
this.unbindDatepickerEvents();
|
|
}
|
|
_handleRangeStatus() {
|
|
let { rangeDateFrom: e, rangeDateTo: t } = this.dp,
|
|
i = u({
|
|
"-in-range-": e && t && ((s = this.date), (a = e), (n = t), m(s, a) && v(s, n)),
|
|
"-range-from-": e && p(this.date, e, this.type),
|
|
"-range-to-": t && p(this.date, t, this.type)
|
|
});
|
|
var s, a, n;
|
|
this.$cell.classList.remove("-range-from-", "-range-to-", "-in-range-"), i && this.$cell.classList.add(...i.split(" "));
|
|
}
|
|
_handleSelectedStatus() {
|
|
let e = this.dp._checkIfDateIsSelected(this.date, this.type);
|
|
e ? this.select() : !e && this.selected && this.removeSelect();
|
|
}
|
|
_handleInitialFocusStatus() {
|
|
p(this.dp.focusDate, this.date, this.type) && this.focus();
|
|
}
|
|
get isDisabled() {
|
|
return this.$cell.matches(".-disabled-");
|
|
}
|
|
get isOtherMonth() {
|
|
return this.dp.isOtherMonth(this.date);
|
|
}
|
|
get isOtherDecade() {
|
|
return this.dp.isOtherDecade(this.date);
|
|
}
|
|
}
|
|
function M(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
let S = {
|
|
[i.days]: `<div class="air-datepicker-body--day-names"></div><div class="air-datepicker-body--cells -${i.days}-"></div>`,
|
|
[i.months]: `<div class="air-datepicker-body--cells -${i.months}-"></div>`,
|
|
[i.years]: `<div class="air-datepicker-body--cells -${i.years}-"></div>`
|
|
};
|
|
const T = ".air-datepicker-cell";
|
|
class F {
|
|
constructor(e) {
|
|
let { dp: t, type: s, opts: a } = e;
|
|
M(this, "handleClick", (e) => {
|
|
let t = e.target.closest(T).adpCell;
|
|
if (t.isDisabled) return;
|
|
if (!this.dp.isMinViewReached) return void this.dp.down();
|
|
let i = this.dp._checkIfDateIsSelected(t.date, t.type);
|
|
i ? this.dp._handleAlreadySelectedDates(i, t.date) : this.dp.selectDate(t.date);
|
|
}),
|
|
M(this, "handleDayNameClick", (e) => {
|
|
let t = e.target.getAttribute("data-day-index");
|
|
this.opts.onClickDayName({ dayIndex: Number(t), datepicker: this.dp });
|
|
}),
|
|
M(this, "onChangeCurrentView", (e) => {
|
|
e !== this.type ? this.hide() : (this.show(), this.render());
|
|
}),
|
|
M(this, "onMouseOverCell", (e) => {
|
|
let t = f(e.target, T);
|
|
this.dp.setFocusDate(!!t && t.adpCell.date);
|
|
}),
|
|
M(this, "onMouseOutCell", () => {
|
|
this.dp.setFocusDate(!1);
|
|
}),
|
|
M(this, "onClickBody", (e) => {
|
|
let { onClickDayName: t } = this.opts,
|
|
i = e.target;
|
|
i.closest(T) && this.handleClick(e), t && i.closest(".air-datepicker-body--day-name") && this.handleDayNameClick(e);
|
|
}),
|
|
M(this, "onMouseDown", (e) => {
|
|
this.pressed = !0;
|
|
let t = f(e.target, T),
|
|
i = t && t.adpCell;
|
|
p(i.date, this.dp.rangeDateFrom) && (this.rangeFromFocused = !0), p(i.date, this.dp.rangeDateTo) && (this.rangeToFocused = !0);
|
|
}),
|
|
M(this, "onMouseMove", (e) => {
|
|
if (!this.pressed || !this.dp.isMinViewReached) return;
|
|
e.preventDefault();
|
|
let t = f(e.target, T),
|
|
i = t && t.adpCell,
|
|
{ selectedDates: s, rangeDateTo: a, rangeDateFrom: n } = this.dp;
|
|
if (!i || i.isDisabled) return;
|
|
let { date: r } = i;
|
|
if (2 === s.length) {
|
|
if (this.rangeFromFocused && !m(r, a)) {
|
|
let { hours: e, minutes: t } = o(n);
|
|
r.setHours(e), r.setMinutes(t), (this.dp.rangeDateFrom = r), this.dp.replaceDate(n, r);
|
|
}
|
|
if (this.rangeToFocused && !v(r, n)) {
|
|
let { hours: e, minutes: t } = o(a);
|
|
r.setHours(e), r.setMinutes(t), (this.dp.rangeDateTo = r), this.dp.replaceDate(a, r);
|
|
}
|
|
}
|
|
}),
|
|
M(this, "onMouseUp", () => {
|
|
(this.pressed = !1), (this.rangeFromFocused = !1), (this.rangeToFocused = !1);
|
|
}),
|
|
M(this, "onChangeViewDate", (e, t) => {
|
|
if (!this.isVisible) return;
|
|
let s = c(e),
|
|
a = c(t);
|
|
switch (this.dp.currentView) {
|
|
case i.days:
|
|
if (p(e, t, i.months)) return;
|
|
break;
|
|
case i.months:
|
|
if (p(e, t, i.years)) return;
|
|
break;
|
|
case i.years:
|
|
if (s[0] === a[0] && s[1] === a[1]) return;
|
|
}
|
|
this.render();
|
|
}),
|
|
M(this, "render", () => {
|
|
this.destroyCells(),
|
|
this._generateCells(),
|
|
this.cells.forEach((e) => {
|
|
this.$cells.appendChild(e.render());
|
|
});
|
|
}),
|
|
(this.dp = t),
|
|
(this.type = s),
|
|
(this.opts = a),
|
|
(this.cells = []),
|
|
(this.$el = ""),
|
|
(this.pressed = !1),
|
|
(this.isVisible = !0),
|
|
this.init();
|
|
}
|
|
init() {
|
|
this._buildBaseHtml(), this.type === i.days && this.renderDayNames(), this.render(), this._bindEvents(), this._bindDatepickerEvents();
|
|
}
|
|
_bindEvents() {
|
|
let { range: e, dynamicRange: t } = this.opts;
|
|
y(this.$el, "mouseover", this.onMouseOverCell),
|
|
y(this.$el, "mouseout", this.onMouseOutCell),
|
|
y(this.$el, "click", this.onClickBody),
|
|
e && t && (y(this.$el, "mousedown", this.onMouseDown), y(this.$el, "mousemove", this.onMouseMove), y(window.document, "mouseup", this.onMouseUp));
|
|
}
|
|
_bindDatepickerEvents() {
|
|
this.dp.on(i.eventChangeViewDate, this.onChangeViewDate), this.dp.on(i.eventChangeCurrentView, this.onChangeCurrentView);
|
|
}
|
|
_buildBaseHtml() {
|
|
(this.$el = n({ className: `air-datepicker-body -${this.type}-`, innerHtml: S[this.type] })),
|
|
(this.$names = a(".air-datepicker-body--day-names", this.$el)),
|
|
(this.$cells = a(".air-datepicker-body--cells", this.$el));
|
|
}
|
|
_getDayNamesHtml() {
|
|
let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.dp.locale.firstDay,
|
|
t = "",
|
|
s = this.dp.isWeekend,
|
|
{ onClickDayName: a } = this.opts,
|
|
n = e,
|
|
r = 0;
|
|
for (; r < 7; ) {
|
|
let e = n % 7;
|
|
(t += `<div class="${u("air-datepicker-body--day-name", { [i.cssClassWeekend]: s(e), "-clickable-": !!a })}" data-day-index='${e}'>${this.dp.locale.daysMin[e]}</div>`), r++, n++;
|
|
}
|
|
return t;
|
|
}
|
|
_getDaysCells() {
|
|
let {
|
|
viewDate: e,
|
|
locale: { firstDay: t }
|
|
} = this.dp,
|
|
i = h(e),
|
|
{ year: s, month: a } = o(e),
|
|
n = new Date(s, a, 1),
|
|
r = new Date(s, a, i),
|
|
l = n.getDay() - t,
|
|
d = 6 - r.getDay() + t;
|
|
(l = l < 0 ? l + 7 : l), (d = d > 6 ? d - 7 : d);
|
|
let c = (function (e, t) {
|
|
let { year: i, month: s, date: a } = o(e);
|
|
return new Date(i, s, a - t);
|
|
})(n, l),
|
|
u = i + l + d,
|
|
p = c.getDate(),
|
|
{ year: m, month: v } = o(c),
|
|
g = 0;
|
|
for (; g < u; ) {
|
|
let e = new Date(m, v, p + g);
|
|
this._generateCell(e), g++;
|
|
}
|
|
}
|
|
_generateCell(e) {
|
|
let { type: t, dp: i, opts: s } = this,
|
|
a = new _({ type: t, dp: i, opts: s, date: e, body: this });
|
|
return this.cells.push(a), a;
|
|
}
|
|
_generateDayCells() {
|
|
this._getDaysCells();
|
|
}
|
|
_generateMonthCells() {
|
|
let { year: e } = this.dp.parsedViewDate,
|
|
t = 0;
|
|
for (; t < 12; ) this.cells.push(this._generateCell(new Date(e, t))), t++;
|
|
}
|
|
_generateYearCells() {
|
|
let e = c(this.dp.viewDate),
|
|
t = e[0] - 1,
|
|
i = e[1] + 1,
|
|
s = t;
|
|
for (; s <= i; ) this.cells.push(this._generateCell(new Date(s, 0))), s++;
|
|
}
|
|
renderDayNames() {
|
|
this.$names.innerHTML = this._getDayNamesHtml();
|
|
}
|
|
_generateCells() {
|
|
switch (this.type) {
|
|
case i.days:
|
|
this._generateDayCells();
|
|
break;
|
|
case i.months:
|
|
this._generateMonthCells();
|
|
break;
|
|
case i.years:
|
|
this._generateYearCells();
|
|
}
|
|
}
|
|
show() {
|
|
(this.isVisible = !0), this.$el.classList.remove("-hidden-");
|
|
}
|
|
hide() {
|
|
(this.isVisible = !1), this.$el.classList.add("-hidden-");
|
|
}
|
|
destroyCells() {
|
|
this.cells.forEach((e) => e.destroy()), (this.cells = []), (this.$cells.innerHTML = "");
|
|
}
|
|
destroy() {
|
|
this.destroyCells(), this.dp.off(i.eventChangeViewDate, this.onChangeViewDate), this.dp.off(i.eventChangeCurrentView, this.onChangeCurrentView);
|
|
}
|
|
}
|
|
function V(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
class x {
|
|
constructor(e) {
|
|
let { dp: t, opts: i } = e;
|
|
V(this, "onClickNav", (e) => {
|
|
let t = f(e.target, ".air-datepicker-nav--action");
|
|
if (!t) return;
|
|
let i = t.dataset.action;
|
|
this.dp[i]();
|
|
}),
|
|
V(this, "onChangeViewDate", () => {
|
|
this.render(), this._resetNavStatus(), this.handleNavStatus();
|
|
}),
|
|
V(this, "onChangeCurrentView", () => {
|
|
this.render(), this._resetNavStatus(), this.handleNavStatus();
|
|
}),
|
|
V(this, "onClickNavTitle", () => {
|
|
this.dp.isFinalView || this.dp.up();
|
|
}),
|
|
V(this, "update", () => {
|
|
let { prevHtml: e, nextHtml: t } = this.opts;
|
|
(this.$prev.innerHTML = e), (this.$next.innerHTML = t), this._resetNavStatus(), this.render(), this.handleNavStatus();
|
|
}),
|
|
V(this, "renderDelay", () => {
|
|
setTimeout(this.render);
|
|
}),
|
|
V(this, "render", () => {
|
|
(this.$title.innerHTML = this._getTitle()),
|
|
(function (e, t) {
|
|
for (let i in t) t[i] ? e.classList.add(i) : e.classList.remove(i);
|
|
})(this.$title, { "-disabled-": this.dp.isFinalView });
|
|
}),
|
|
(this.dp = t),
|
|
(this.opts = i),
|
|
this.init();
|
|
}
|
|
init() {
|
|
this._createElement(), this._buildBaseHtml(), this._defineDOM(), this.render(), this.handleNavStatus(), this._bindEvents(), this._bindDatepickerEvents();
|
|
}
|
|
_defineDOM() {
|
|
(this.$title = a(".air-datepicker-nav--title", this.$el)), (this.$prev = a('[data-action="prev"]', this.$el)), (this.$next = a('[data-action="next"]', this.$el));
|
|
}
|
|
_bindEvents() {
|
|
this.$el.addEventListener("click", this.onClickNav), this.$title.addEventListener("click", this.onClickNavTitle);
|
|
}
|
|
_bindDatepickerEvents() {
|
|
this.dp.on(i.eventChangeViewDate, this.onChangeViewDate),
|
|
this.dp.on(i.eventChangeCurrentView, this.onChangeCurrentView),
|
|
this.isNavIsFunction && (this.dp.on(i.eventChangeSelectedDate, this.renderDelay), this.dp.opts.timepicker && this.dp.on(i.eventChangeTime, this.render));
|
|
}
|
|
destroy() {
|
|
this.dp.off(i.eventChangeViewDate, this.onChangeViewDate),
|
|
this.dp.off(i.eventChangeCurrentView, this.onChangeCurrentView),
|
|
this.isNavIsFunction && (this.dp.off(i.eventChangeSelectedDate, this.renderDelay), this.dp.opts.timepicker && this.dp.off(i.eventChangeTime, this.render));
|
|
}
|
|
_createElement() {
|
|
this.$el = n({ tagName: "nav", className: "air-datepicker-nav" });
|
|
}
|
|
_getTitle() {
|
|
let { dp: e, opts: t } = this,
|
|
i = t.navTitles[e.currentView];
|
|
return "function" == typeof i ? i(e) : e.formatDate(e.viewDate, i);
|
|
}
|
|
handleNavStatus() {
|
|
let { disableNavWhenOutOfRange: e } = this.opts,
|
|
{ minDate: t, maxDate: s } = this.dp;
|
|
if ((!t && !s) || !e) return;
|
|
let { year: a, month: n } = this.dp.parsedViewDate,
|
|
r = !!t && o(t),
|
|
h = !!s && o(s);
|
|
switch (this.dp.currentView) {
|
|
case i.days:
|
|
t && r.month >= n && r.year >= a && this._disableNav("prev"), s && h.month <= n && h.year <= a && this._disableNav("next");
|
|
break;
|
|
case i.months:
|
|
t && r.year >= a && this._disableNav("prev"), s && h.year <= a && this._disableNav("next");
|
|
break;
|
|
case i.years: {
|
|
let e = c(this.dp.viewDate);
|
|
t && r.year >= e[0] && this._disableNav("prev"), s && h.year <= e[1] && this._disableNav("next");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
_disableNav(e) {
|
|
a('[data-action="' + e + '"]', this.$el).classList.add("-disabled-");
|
|
}
|
|
_resetNavStatus() {
|
|
!(function (e) {
|
|
for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), s = 1; s < t; s++) i[s - 1] = arguments[s];
|
|
e.length
|
|
? e.forEach((e) => {
|
|
e.classList.remove(...i);
|
|
})
|
|
: e.classList.remove(...i);
|
|
})(this.$el.querySelectorAll(".air-datepicker-nav--action"), "-disabled-");
|
|
}
|
|
_buildBaseHtml() {
|
|
let { prevHtml: e, nextHtml: t } = this.opts;
|
|
this.$el.innerHTML = `<div class="air-datepicker-nav--action" data-action="prev">${e}</div><div class="air-datepicker-nav--title"></div><div class="air-datepicker-nav--action" data-action="next">${t}</div>`;
|
|
}
|
|
get isNavIsFunction() {
|
|
let { navTitles: e } = this.opts;
|
|
return Object.keys(e).find((t) => "function" == typeof e[t]);
|
|
}
|
|
}
|
|
var H = { today: { content: (e) => e.locale.today, onClick: (e) => e.setViewDate(new Date()) }, clear: { content: (e) => e.locale.clear, onClick: (e) => e.clear() } };
|
|
class E {
|
|
constructor(e) {
|
|
let { dp: t, opts: i } = e;
|
|
(this.dp = t), (this.opts = i), this.init();
|
|
}
|
|
init() {
|
|
this.createElement(), this.render();
|
|
}
|
|
createElement() {
|
|
this.$el = n({ className: "air-datepicker-buttons" });
|
|
}
|
|
destroy() {
|
|
this.$el.parentNode.removeChild(this.$el);
|
|
}
|
|
clearHtml() {
|
|
return (this.$el.innerHTML = ""), this;
|
|
}
|
|
generateButtons() {
|
|
let { buttons: e } = this.opts;
|
|
Array.isArray(e) || (e = [e]),
|
|
e.forEach((e) => {
|
|
let t = e;
|
|
"string" == typeof e && H[e] && (t = H[e]);
|
|
let i = this.createButton(t);
|
|
t.onClick && this.attachEventToButton(i, t.onClick), this.$el.appendChild(i);
|
|
});
|
|
}
|
|
attachEventToButton(e, t) {
|
|
e.addEventListener("click", () => {
|
|
t(this.dp);
|
|
});
|
|
}
|
|
createButton(e) {
|
|
let { content: t, className: i, tagName: s = "button", attrs: a = {} } = e;
|
|
return n({ tagName: s, innerHtml: `<span tabindex='-1'>${"function" == typeof t ? t(this.dp) : t}</span>`, className: u("air-datepicker-button", i), attrs: a });
|
|
}
|
|
render() {
|
|
this.generateButtons();
|
|
}
|
|
}
|
|
function L(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
class O {
|
|
constructor() {
|
|
let { opts: e, dp: t } = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
|
|
L(this, "toggleTimepickerIsActive", (e) => {
|
|
this.dp.timepickerIsActive = e;
|
|
}),
|
|
L(this, "onChangeSelectedDate", (e) => {
|
|
let { date: t, updateTime: i = !1 } = e;
|
|
t && (this.setMinMaxTime(t), this.setCurrentTime(!!i && t), this.addTimeToDate(t));
|
|
}),
|
|
L(this, "onChangeLastSelectedDate", (e) => {
|
|
e && (this.setTime(e), this.render());
|
|
}),
|
|
L(this, "onChangeInputRange", (e) => {
|
|
let t = e.target;
|
|
(this[t.getAttribute("name")] = t.value), this.updateText(), this.dp.trigger(i.eventChangeTime, { hours: this.hours, minutes: this.minutes });
|
|
}),
|
|
L(this, "onMouseEnterLeave", (e) => {
|
|
let t = e.target.getAttribute("name"),
|
|
i = this.$minutesText;
|
|
"hours" === t && (i = this.$hoursText), i.classList.toggle("-focus-");
|
|
}),
|
|
L(this, "onFocus", () => {
|
|
this.toggleTimepickerIsActive(!0);
|
|
}),
|
|
L(this, "onBlur", () => {
|
|
this.toggleTimepickerIsActive(!1);
|
|
}),
|
|
(this.opts = e),
|
|
(this.dp = t);
|
|
let { timeFormat: s } = this.dp.locale;
|
|
s && (s.match(C("h")) || s.match(C("hh"))) && (this.ampm = !0), this.init();
|
|
}
|
|
init() {
|
|
this.setTime(this.dp.lastSelectedDate || this.dp.viewDate), this.createElement(), this.buildHtml(), this.defineDOM(), this.render(), this.bindDatepickerEvents(), this.bindDOMEvents();
|
|
}
|
|
bindDatepickerEvents() {
|
|
this.dp.on(i.eventChangeSelectedDate, this.onChangeSelectedDate), this.dp.on(i.eventChangeLastSelectedDate, this.onChangeLastSelectedDate);
|
|
}
|
|
bindDOMEvents() {
|
|
let e = "input";
|
|
navigator.userAgent.match(/trident/gi) && (e = "change"),
|
|
y(this.$ranges, e, this.onChangeInputRange),
|
|
y(this.$ranges, "mouseenter", this.onMouseEnterLeave),
|
|
y(this.$ranges, "mouseleave", this.onMouseEnterLeave),
|
|
y(this.$ranges, "focus", this.onFocus),
|
|
y(this.$ranges, "mousedown", this.onFocus),
|
|
y(this.$ranges, "blur", this.onBlur);
|
|
}
|
|
createElement() {
|
|
this.$el = n({ className: u("air-datepicker-time", { "-am-pm-": this.dp.ampm }) });
|
|
}
|
|
destroy() {
|
|
this.dp.off(i.eventChangeSelectedDate, this.onChangeSelectedDate), this.dp.off(i.eventChangeLastSelectedDate, this.onChangeLastSelectedDate), this.$el.parentNode.removeChild(this.$el);
|
|
}
|
|
buildHtml() {
|
|
let {
|
|
ampm: e,
|
|
hours: t,
|
|
displayHours: i,
|
|
minutes: s,
|
|
minHours: a,
|
|
minMinutes: n,
|
|
maxHours: r,
|
|
maxMinutes: h,
|
|
dayPeriod: o,
|
|
opts: { hoursStep: l, minutesStep: c }
|
|
} = this;
|
|
this.$el.innerHTML =
|
|
`<div class="air-datepicker-time--current"> <span class="air-datepicker-time--current-hours">${d(
|
|
i
|
|
)}</span> <span class="air-datepicker-time--current-colon">:</span> <span class="air-datepicker-time--current-minutes">${d(s)}</span> ` +
|
|
(e ? `<span class='air-datepicker-time--current-ampm'>${o}</span>` : "") +
|
|
'</div><div class="air-datepicker-time--sliders"> <div class="air-datepicker-time--row">' +
|
|
` <input type="range" name="hours" value="${t}" min="${a}" max="${r}" step="${l}"/> </div> <div class="air-datepicker-time--row">` +
|
|
` <input type="range" name="minutes" value="${s}" min="${n}" max="${h}" step="${c}"/> </div></div>`;
|
|
}
|
|
defineDOM() {
|
|
let e = (e) => a(e, this.$el);
|
|
(this.$ranges = this.$el.querySelectorAll('[type="range"]')),
|
|
(this.$hours = e('[name="hours"]')),
|
|
(this.$minutes = e('[name="minutes"]')),
|
|
(this.$hoursText = e(".air-datepicker-time--current-hours")),
|
|
(this.$minutesText = e(".air-datepicker-time--current-minutes")),
|
|
(this.$ampm = e(".air-datepicker-time--current-ampm"));
|
|
}
|
|
setTime(e) {
|
|
this.setMinMaxTime(e), this.setCurrentTime(e);
|
|
}
|
|
addTimeToDate(e) {
|
|
e && (e.setHours(this.hours), e.setMinutes(this.minutes));
|
|
}
|
|
setMinMaxTime(e) {
|
|
if ((this.setMinMaxTimeFromOptions(), e)) {
|
|
let { minDate: t, maxDate: i } = this.dp;
|
|
t && p(e, t) && this.setMinTimeFromMinDate(t), i && p(e, i) && this.setMaxTimeFromMaxDate(i);
|
|
}
|
|
}
|
|
setCurrentTime(e) {
|
|
let { hours: t, minutes: i } = e ? o(e) : this;
|
|
(this.hours = w(t, this.minHours, this.maxHours)), (this.minutes = w(i, this.minMinutes, this.maxMinutes));
|
|
}
|
|
setMinMaxTimeFromOptions() {
|
|
let { minHours: e, minMinutes: t, maxHours: i, maxMinutes: s } = this.opts;
|
|
(this.minHours = w(e, 0, 23)), (this.minMinutes = w(t, 0, 59)), (this.maxHours = w(i, 0, 23)), (this.maxMinutes = w(s, 0, 59));
|
|
}
|
|
setMinTimeFromMinDate(e) {
|
|
let { lastSelectedDate: t } = this.dp;
|
|
(this.minHours = e.getHours()), t && t.getHours() > e.getHours() ? (this.minMinutes = this.opts.minMinutes) : (this.minMinutes = e.getMinutes());
|
|
}
|
|
setMaxTimeFromMaxDate(e) {
|
|
let { lastSelectedDate: t } = this.dp;
|
|
(this.maxHours = e.getHours()), t && t.getHours() < e.getHours() ? (this.maxMinutes = this.opts.maxMinutes) : (this.maxMinutes = e.getMinutes());
|
|
}
|
|
updateSliders() {
|
|
(r(this.$hours, { min: this.minHours, max: this.maxHours }).value = this.hours), (r(this.$minutes, { min: this.minMinutes, max: this.maxMinutes }).value = this.minutes);
|
|
}
|
|
updateText() {
|
|
(this.$hoursText.innerHTML = d(this.displayHours)), (this.$minutesText.innerHTML = d(this.minutes)), this.ampm && (this.$ampm.innerHTML = this.dayPeriod);
|
|
}
|
|
set hours(e) {
|
|
this._hours = e;
|
|
let { hours: t, dayPeriod: i } = l(e);
|
|
(this.displayHours = this.ampm ? t : e), (this.dayPeriod = i);
|
|
}
|
|
get hours() {
|
|
return this._hours;
|
|
}
|
|
render() {
|
|
this.updateSliders(), this.updateText();
|
|
}
|
|
}
|
|
function A(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
class N {
|
|
constructor(e) {
|
|
let { dp: t, opts: i } = e;
|
|
A(this, "pressedKeys", new Set()),
|
|
A(
|
|
this,
|
|
"hotKeys",
|
|
new Map([
|
|
[
|
|
[
|
|
["Control", "ArrowRight"],
|
|
["Control", "ArrowUp"]
|
|
],
|
|
(e) => e.month++
|
|
],
|
|
[
|
|
[
|
|
["Control", "ArrowLeft"],
|
|
["Control", "ArrowDown"]
|
|
],
|
|
(e) => e.month--
|
|
],
|
|
[
|
|
[
|
|
["Shift", "ArrowRight"],
|
|
["Shift", "ArrowUp"]
|
|
],
|
|
(e) => e.year++
|
|
],
|
|
[
|
|
[
|
|
["Shift", "ArrowLeft"],
|
|
["Shift", "ArrowDown"]
|
|
],
|
|
(e) => e.year--
|
|
],
|
|
[
|
|
[
|
|
["Alt", "ArrowRight"],
|
|
["Alt", "ArrowUp"]
|
|
],
|
|
(e) => (e.year += 10)
|
|
],
|
|
[
|
|
[
|
|
["Alt", "ArrowLeft"],
|
|
["Alt", "ArrowDown"]
|
|
],
|
|
(e) => (e.year -= 10)
|
|
],
|
|
[["Control", "Shift", "ArrowUp"], (e, t) => t.up()]
|
|
])
|
|
),
|
|
A(this, "handleHotKey", (e) => {
|
|
let t = this.hotKeys.get(e),
|
|
i = o(this.getInitialFocusDate());
|
|
t(i, this.dp);
|
|
let { year: s, month: a, date: n } = i,
|
|
r = h(new Date(s, a));
|
|
r < n && (n = r);
|
|
let l = this.dp.getClampedDate(new Date(s, a, n));
|
|
this.dp.setFocusDate(l, { viewDateTransition: !0 });
|
|
}),
|
|
A(this, "isHotKeyPressed", () => {
|
|
let e = !1,
|
|
t = this.pressedKeys.size,
|
|
i = (e) => this.pressedKeys.has(e);
|
|
for (let [s] of this.hotKeys) {
|
|
if (e) break;
|
|
if (Array.isArray(s[0]))
|
|
s.forEach((a) => {
|
|
e || t !== a.length || (e = a.every(i) && s);
|
|
});
|
|
else {
|
|
if (t !== s.length) continue;
|
|
e = s.every(i) && s;
|
|
}
|
|
}
|
|
return e;
|
|
}),
|
|
A(this, "isArrow", (e) => e >= 37 && e <= 40),
|
|
A(this, "onKeyDown", (e) => {
|
|
let { key: t, which: i } = e,
|
|
{
|
|
dp: s,
|
|
dp: { focusDate: a },
|
|
opts: n
|
|
} = this;
|
|
this.registerKey(t);
|
|
let r = this.isHotKeyPressed();
|
|
if (r) return e.preventDefault(), void this.handleHotKey(r);
|
|
if (this.isArrow(i)) return e.preventDefault(), void this.focusNextCell(t);
|
|
if ("Enter" === t) {
|
|
if (s.currentView !== n.minView) return void s.down();
|
|
if (a) {
|
|
let e = s._checkIfDateIsSelected(a);
|
|
return void (e ? s._handleAlreadySelectedDates(e, a) : s.selectDate(a));
|
|
}
|
|
}
|
|
"Escape" === t && this.dp.hide();
|
|
}),
|
|
A(this, "onKeyUp", (e) => {
|
|
this.removeKey(e.key);
|
|
}),
|
|
(this.dp = t),
|
|
(this.opts = i),
|
|
this.init();
|
|
}
|
|
init() {
|
|
this.bindKeyboardEvents();
|
|
}
|
|
bindKeyboardEvents() {
|
|
let { $el: e } = this.dp;
|
|
e.addEventListener("keydown", this.onKeyDown), e.addEventListener("keyup", this.onKeyUp);
|
|
}
|
|
destroy() {
|
|
let { $el: e } = this.dp;
|
|
e.removeEventListener("keydown", this.onKeyDown), e.removeEventListener("keyup", this.onKeyUp), (this.hotKeys = null), (this.pressedKeys = null);
|
|
}
|
|
getInitialFocusDate() {
|
|
let {
|
|
focusDate: e,
|
|
currentView: t,
|
|
selectedDates: s,
|
|
parsedViewDate: { year: a, month: n }
|
|
} = this.dp,
|
|
r = e || s[s.length - 1];
|
|
if (!r)
|
|
switch (t) {
|
|
case i.days:
|
|
r = new Date(a, n, new Date().getDate());
|
|
break;
|
|
case i.months:
|
|
r = new Date(a, n, 1);
|
|
break;
|
|
case i.years:
|
|
r = new Date(a, 0, 1);
|
|
}
|
|
return r;
|
|
}
|
|
focusNextCell(e) {
|
|
let t = this.getInitialFocusDate(),
|
|
{ currentView: s } = this.dp,
|
|
{ days: a, months: n, years: r } = i,
|
|
h = o(t),
|
|
l = h.year,
|
|
d = h.month,
|
|
c = h.date;
|
|
switch (e) {
|
|
case "ArrowLeft":
|
|
s === a && (c -= 1), s === n && (d -= 1), s === r && (l -= 1);
|
|
break;
|
|
case "ArrowUp":
|
|
s === a && (c -= 7), s === n && (d -= 3), s === r && (l -= 4);
|
|
break;
|
|
case "ArrowRight":
|
|
s === a && (c += 1), s === n && (d += 1), s === r && (l += 1);
|
|
break;
|
|
case "ArrowDown":
|
|
s === a && (c += 7), s === n && (d += 3), s === r && (l += 4);
|
|
}
|
|
let u = this.dp.getClampedDate(new Date(l, d, c));
|
|
this.dp.setFocusDate(u, { viewDateTransition: !0 });
|
|
}
|
|
registerKey(e) {
|
|
this.pressedKeys.add(e);
|
|
}
|
|
removeKey(e) {
|
|
this.pressedKeys.delete(e);
|
|
}
|
|
}
|
|
let I = {
|
|
on(e, t) {
|
|
this.__events || (this.__events = {}), this.__events[e] ? this.__events[e].push(t) : (this.__events[e] = [t]);
|
|
},
|
|
off(e, t) {
|
|
this.__events && this.__events[e] && (this.__events[e] = this.__events[e].filter((e) => e !== t));
|
|
},
|
|
removeAllEvents() {
|
|
this.__events = {};
|
|
},
|
|
trigger(e) {
|
|
for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), s = 1; s < t; s++) i[s - 1] = arguments[s];
|
|
this.__events &&
|
|
this.__events[e] &&
|
|
this.__events[e].forEach((e) => {
|
|
e(...i);
|
|
});
|
|
}
|
|
};
|
|
function P(e, t, i) {
|
|
return (
|
|
(t = (function (e) {
|
|
var t = (function (e, t) {
|
|
if ("object" != typeof e || null === e) return e;
|
|
var i = e[Symbol.toPrimitive];
|
|
if (void 0 !== i) {
|
|
var s = i.call(e, t);
|
|
if ("object" != typeof s) return s;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return String(e);
|
|
})(e, "string");
|
|
return "symbol" == typeof t ? t : String(t);
|
|
})(t)) in e
|
|
? Object.defineProperty(e, t, { value: i, enumerable: !0, configurable: !0, writable: !0 })
|
|
: (e[t] = i),
|
|
e
|
|
);
|
|
}
|
|
let j = "",
|
|
R = "",
|
|
B = !1;
|
|
class K {
|
|
static buildGlobalContainer(e) {
|
|
(B = !0), (j = n({ className: e, id: e })), a("body").appendChild(j);
|
|
}
|
|
constructor(e, t) {
|
|
var r = this;
|
|
if (
|
|
(P(this, "viewIndexes", [i.days, i.months, i.years]),
|
|
P(this, "next", () => {
|
|
let { year: e, month: t } = this.parsedViewDate;
|
|
switch (this.currentView) {
|
|
case i.days:
|
|
this.setViewDate(new Date(e, t + 1, 1));
|
|
break;
|
|
case i.months:
|
|
this.setViewDate(new Date(e + 1, t, 1));
|
|
break;
|
|
case i.years:
|
|
this.setViewDate(new Date(e + 10, 0, 1));
|
|
}
|
|
}),
|
|
P(this, "prev", () => {
|
|
let { year: e, month: t } = this.parsedViewDate;
|
|
switch (this.currentView) {
|
|
case i.days:
|
|
this.setViewDate(new Date(e, t - 1, 1));
|
|
break;
|
|
case i.months:
|
|
this.setViewDate(new Date(e - 1, t, 1));
|
|
break;
|
|
case i.years:
|
|
this.setViewDate(new Date(e - 10, 0, 1));
|
|
}
|
|
}),
|
|
P(this, "_finishHide", () => {
|
|
(this.hideAnimation = !1), this._destroyComponents(), this.$container.removeChild(this.$datepicker);
|
|
}),
|
|
P(this, "setPosition", function (e) {
|
|
let t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];
|
|
if ("function" == typeof (e = e || r.opts.position))
|
|
return void (r.customHide = e({ $datepicker: r.$datepicker, $target: r.$el, $pointer: r.$pointer, isViewChange: t, done: r._finishHide }));
|
|
let i,
|
|
s,
|
|
{ isMobile: a } = r.opts,
|
|
n = r.$el.getBoundingClientRect(),
|
|
h = r.$el.getBoundingClientRect(),
|
|
o = r.$datepicker.offsetParent,
|
|
l = r.$el.offsetParent,
|
|
d = r.$datepicker.getBoundingClientRect(),
|
|
c = e.split(" "),
|
|
u = window.scrollY,
|
|
p = window.scrollX,
|
|
m = r.opts.offset,
|
|
v = c[0],
|
|
g = c[1];
|
|
if (a) r.$datepicker.style.cssText = "left: 50%; top: 50%";
|
|
else {
|
|
if (
|
|
(o === l && o !== document.body && ((h = { top: r.$el.offsetTop, left: r.$el.offsetLeft, width: n.width, height: r.$el.offsetHeight }), (u = 0), (p = 0)),
|
|
o !== l && o !== document.body)
|
|
) {
|
|
let e = o.getBoundingClientRect();
|
|
(h = { top: n.top - e.top, left: n.left - e.left, width: n.width, height: n.height }), (u = 0), (p = 0);
|
|
}
|
|
switch (v) {
|
|
case "top":
|
|
i = h.top - d.height - m;
|
|
break;
|
|
case "right":
|
|
s = h.left + h.width + m;
|
|
break;
|
|
case "bottom":
|
|
i = h.top + h.height + m;
|
|
break;
|
|
case "left":
|
|
s = h.left - d.width - m;
|
|
}
|
|
switch (g) {
|
|
case "top":
|
|
i = h.top;
|
|
break;
|
|
case "right":
|
|
s = h.left + h.width - d.width;
|
|
break;
|
|
case "bottom":
|
|
i = h.top + h.height - d.height;
|
|
break;
|
|
case "left":
|
|
s = h.left;
|
|
break;
|
|
case "center":
|
|
/left|right/.test(v) ? (i = h.top + h.height / 2 - d.height / 2) : (s = h.left + h.width / 2 - d.width / 2);
|
|
}
|
|
r.$datepicker.style.cssText = `left: ${s + p}px; top: ${i + u}px`;
|
|
}
|
|
}),
|
|
P(this, "_setInputValue", () => {
|
|
let {
|
|
opts: e,
|
|
$altField: t,
|
|
locale: { dateFormat: i }
|
|
} = this,
|
|
{ altFieldDateFormat: s, altField: a } = e;
|
|
a && t && (t.value = this._getInputValue(s)), (this.$el.value = this._getInputValue(i));
|
|
}),
|
|
P(this, "_getInputValue", (e) => {
|
|
let { selectedDates: t, opts: i } = this,
|
|
{ multipleDates: s, multipleDatesSeparator: a } = i;
|
|
if (!t.length) return "";
|
|
let n = "function" == typeof e,
|
|
r = n ? e(s ? t : t[0]) : t.map((t) => this.formatDate(t, e));
|
|
return (r = n ? r : r.join(a)), r;
|
|
}),
|
|
P(this, "_checkIfDateIsSelected", function (e) {
|
|
let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : i.days,
|
|
s = !1;
|
|
return (
|
|
r.selectedDates.some((i) => {
|
|
let a = p(e, i, t);
|
|
return (s = a && i), a;
|
|
}),
|
|
s
|
|
);
|
|
}),
|
|
P(this, "_scheduleCallAfterTransition", (e) => {
|
|
this._cancelScheduledCall(),
|
|
e && e(!1),
|
|
(this._onTransitionEnd = () => {
|
|
e && e(!0);
|
|
}),
|
|
this.$datepicker.addEventListener("transitionend", this._onTransitionEnd, { once: !0 });
|
|
}),
|
|
P(this, "_cancelScheduledCall", () => {
|
|
this.$datepicker.removeEventListener("transitionend", this._onTransitionEnd);
|
|
}),
|
|
P(this, "setViewDate", (e) => {
|
|
if (!((e = k(e)) instanceof Date)) return;
|
|
if (p(e, this.viewDate)) return;
|
|
let t = this.viewDate;
|
|
this.viewDate = e;
|
|
let { onChangeViewDate: s } = this.opts;
|
|
if (s) {
|
|
let { month: e, year: t } = this.parsedViewDate;
|
|
s({ month: e, year: t, decade: this.curDecade });
|
|
}
|
|
this.trigger(i.eventChangeViewDate, e, t);
|
|
}),
|
|
P(this, "setFocusDate", function (e) {
|
|
let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
|
|
(!e || (e = k(e)) instanceof Date) && ((r.focusDate = e), r.opts.range && e && r._handleRangeOnFocus(), r.trigger(i.eventChangeFocusDate, e, t));
|
|
}),
|
|
P(this, "setCurrentView", (e) => {
|
|
if (this.viewIndexes.includes(e)) {
|
|
if (((this.currentView = e), this.elIsInput && this.visible && this.setPosition(void 0, !0), this.trigger(i.eventChangeCurrentView, e), !this.views[e])) {
|
|
let t = (this.views[e] = new F({ dp: this, opts: this.opts, type: e }));
|
|
this.shouldUpdateDOM && this.$content.appendChild(t.$el);
|
|
}
|
|
this.opts.onChangeView && this.opts.onChangeView(e);
|
|
}
|
|
}),
|
|
P(this, "_updateLastSelectedDate", (e) => {
|
|
(this.lastSelectedDate = e), this.trigger(i.eventChangeLastSelectedDate, e);
|
|
}),
|
|
P(this, "destroy", () => {
|
|
let { showEvent: e, isMobile: t } = this.opts,
|
|
i = this.$datepicker.parentNode;
|
|
i && i.removeChild(this.$datepicker),
|
|
this.$el.removeEventListener(e, this._onFocus),
|
|
this.$el.removeEventListener("blur", this._onBlur),
|
|
window.removeEventListener("resize", this._onResize),
|
|
t && this._removeMobileAttributes(),
|
|
this.keyboardNav && this.keyboardNav.destroy(),
|
|
(this.views = null),
|
|
(this.nav = null),
|
|
(this.$datepicker = null),
|
|
(this.opts = null),
|
|
(this.$customContainer = null),
|
|
(this.viewDate = null),
|
|
(this.focusDate = null),
|
|
(this.selectedDates = null),
|
|
(this.rangeDateFrom = null),
|
|
(this.rangeDateTo = null);
|
|
}),
|
|
P(this, "update", (e) => {
|
|
let t = b({}, this.opts);
|
|
b(this.opts, e);
|
|
let { timepicker: s, buttons: a, range: n, selectedDates: r, isMobile: h } = this.opts,
|
|
o = this.visible || this.treatAsInline;
|
|
this._createMinMaxDates(),
|
|
this._limitViewDateByMaxMinDates(),
|
|
this._handleLocale(),
|
|
!t.selectedDates && r && this.selectDate(r),
|
|
e.view && this.setCurrentView(e.view),
|
|
this._setInputValue(),
|
|
t.range && !n
|
|
? ((this.rangeDateTo = !1), (this.rangeDateFrom = !1))
|
|
: !t.range && n && this.selectedDates.length && ((this.rangeDateFrom = this.selectedDates[0]), (this.rangeDateTo = this.selectedDates[1])),
|
|
t.timepicker && !s
|
|
? (o && this.timepicker.destroy(), (this.timepicker = !1), this.$timepicker.parentNode.removeChild(this.$timepicker))
|
|
: !t.timepicker && s && this._addTimepicker(),
|
|
!t.buttons && a
|
|
? this._addButtons()
|
|
: t.buttons && !a
|
|
? (this.buttons.destroy(), this.$buttons.parentNode.removeChild(this.$buttons))
|
|
: o && t.buttons && a && this.buttons.clearHtml().render(),
|
|
!t.isMobile && h
|
|
? (this.treatAsInline || R || this._createMobileOverlay(), this._addMobileAttributes(), this.visible && this._showMobileOverlay())
|
|
: t.isMobile && !h && (this._removeMobileAttributes(), this.visible && (R.classList.remove("-active-"), "function" != typeof this.opts.position && this.setPosition())),
|
|
o && (this.nav.update(), this.views[this.currentView].render(), this.currentView === i.days && this.views[this.currentView].renderDayNames());
|
|
}),
|
|
P(this, "isOtherMonth", (e) => {
|
|
let { month: t } = o(e);
|
|
return t !== this.parsedViewDate.month;
|
|
}),
|
|
P(this, "isOtherYear", (e) => {
|
|
let { year: t } = o(e);
|
|
return t !== this.parsedViewDate.year;
|
|
}),
|
|
P(this, "isOtherDecade", (e) => {
|
|
let { year: t } = o(e),
|
|
[i, s] = c(this.viewDate);
|
|
return t < i || t > s;
|
|
}),
|
|
P(this, "_onChangeSelectedDate", (e) => {
|
|
let { silent: t } = e;
|
|
setTimeout(() => {
|
|
this._setInputValue(), this.opts.onSelect && !t && this._triggerOnSelect();
|
|
});
|
|
}),
|
|
P(this, "_onChangeFocusedDate", function (e) {
|
|
let { viewDateTransition: t } = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
|
|
if (!e) return;
|
|
let i = !1;
|
|
t && (i = r.isOtherMonth(e) || r.isOtherYear(e) || r.isOtherDecade(e)), i && r.setViewDate(e);
|
|
}),
|
|
P(this, "_onChangeTime", (e) => {
|
|
let { hours: t, minutes: i } = e,
|
|
s = new Date(),
|
|
{
|
|
lastSelectedDate: a,
|
|
opts: { onSelect: n }
|
|
} = this,
|
|
r = a;
|
|
a || (r = s);
|
|
let h = this.getCell(r, this.currentViewSingular),
|
|
o = h && h.adpCell;
|
|
(o && o.isDisabled) || (r.setHours(t), r.setMinutes(i), a ? (this._setInputValue(), n && this._triggerOnSelect()) : this.selectDate(r));
|
|
}),
|
|
P(this, "_onFocus", (e) => {
|
|
this.visible || this.show();
|
|
}),
|
|
P(this, "_onBlur", (e) => {
|
|
this.inFocus || !this.visible || this.opts.isMobile || this.hide();
|
|
}),
|
|
P(this, "_onMouseDown", (e) => {
|
|
this.inFocus = !0;
|
|
}),
|
|
P(this, "_onMouseUp", (e) => {
|
|
(this.inFocus = !1), this.$el.focus();
|
|
}),
|
|
P(this, "_onResize", () => {
|
|
this.visible && "function" != typeof this.opts.position && this.setPosition();
|
|
}),
|
|
P(this, "_onClickOverlay", () => {
|
|
this.visible && this.hide();
|
|
}),
|
|
P(this, "isWeekend", (e) => this.opts.weekends.includes(e)),
|
|
P(this, "getClampedDate", (e) => {
|
|
let { minDate: t, maxDate: i } = this,
|
|
s = e;
|
|
return i && m(e, i) ? (s = i) : t && v(e, t) && (s = t), s;
|
|
}),
|
|
(this.$el = a(e)),
|
|
!this.$el)
|
|
)
|
|
return;
|
|
(this.$datepicker = n({ className: "air-datepicker" })),
|
|
(this.opts = b({}, s, t)),
|
|
(this.$customContainer = !!this.opts.container && a(this.opts.container)),
|
|
(this.$altField = a(this.opts.altField || !1));
|
|
let { view: h, startDate: l } = this.opts;
|
|
l || (this.opts.startDate = new Date()),
|
|
"INPUT" === this.$el.nodeName && (this.elIsInput = !0),
|
|
(this.inited = !1),
|
|
(this.visible = !1),
|
|
(this.viewDate = k(this.opts.startDate)),
|
|
(this.focusDate = !1),
|
|
(this.initialReadonly = this.$el.getAttribute("readonly")),
|
|
(this.customHide = !1),
|
|
(this.currentView = h),
|
|
(this.selectedDates = []),
|
|
(this.views = {}),
|
|
(this.keys = []),
|
|
(this.rangeDateFrom = ""),
|
|
(this.rangeDateTo = ""),
|
|
(this.timepickerIsActive = !1),
|
|
(this.treatAsInline = this.opts.inline || !this.elIsInput),
|
|
this.init();
|
|
}
|
|
init() {
|
|
let {
|
|
opts: e,
|
|
treatAsInline: t,
|
|
opts: { inline: i, isMobile: s, selectedDates: n, keyboardNav: r, onlyTimepicker: h }
|
|
} = this,
|
|
o = a("body");
|
|
(!B || (B && j && !o.contains(j))) && !i && this.elIsInput && !this.$customContainer && K.buildGlobalContainer(K.defaultGlobalContainerId),
|
|
!s || R || t || this._createMobileOverlay(),
|
|
this._handleLocale(),
|
|
this._bindSubEvents(),
|
|
this._createMinMaxDates(),
|
|
this._limitViewDateByMaxMinDates(),
|
|
this.elIsInput && (i || this._bindEvents(), r && !h && (this.keyboardNav = new N({ dp: this, opts: e }))),
|
|
n && this.selectDate(n, { silent: !0 }),
|
|
this.opts.visible && !t && this.show(),
|
|
s && !t && this.$el.setAttribute("readonly", !0),
|
|
t && this._createComponents();
|
|
}
|
|
_createMobileOverlay() {
|
|
(R = n({ className: "air-datepicker-overlay" })), j.appendChild(R);
|
|
}
|
|
_createComponents() {
|
|
let {
|
|
opts: e,
|
|
treatAsInline: t,
|
|
opts: { inline: i, buttons: s, timepicker: a, position: n, classes: r, onlyTimepicker: h, isMobile: o }
|
|
} = this;
|
|
this._buildBaseHtml(),
|
|
this.elIsInput && (i || this._setPositionClasses(n)),
|
|
(!i && this.elIsInput) || this.$datepicker.classList.add("-inline-"),
|
|
r && this.$datepicker.classList.add(...r.split(" ")),
|
|
h && this.$datepicker.classList.add("-only-timepicker-"),
|
|
o && !t && this._addMobileAttributes(),
|
|
(this.views[this.currentView] = new F({ dp: this, type: this.currentView, opts: e })),
|
|
(this.nav = new x({ dp: this, opts: e })),
|
|
a && this._addTimepicker(),
|
|
s && this._addButtons(),
|
|
this.$content.appendChild(this.views[this.currentView].$el),
|
|
this.$nav.appendChild(this.nav.$el);
|
|
}
|
|
_destroyComponents() {
|
|
for (let e in this.views) this.views[e].destroy();
|
|
(this.views = {}), this.nav.destroy(), this.timepicker && this.timepicker.destroy();
|
|
}
|
|
_addMobileAttributes() {
|
|
R.addEventListener("click", this._onClickOverlay), this.$datepicker.classList.add("-is-mobile-"), this.$el.setAttribute("readonly", !0);
|
|
}
|
|
_removeMobileAttributes() {
|
|
R.removeEventListener("click", this._onClickOverlay),
|
|
this.$datepicker.classList.remove("-is-mobile-"),
|
|
this.initialReadonly || "" === this.initialReadonly || this.$el.removeAttribute("readonly");
|
|
}
|
|
_createMinMaxDates() {
|
|
let { minDate: e, maxDate: t } = this.opts;
|
|
(this.minDate = !!e && k(e)), (this.maxDate = !!t && k(t));
|
|
}
|
|
_addTimepicker() {
|
|
(this.$timepicker = n({ className: "air-datepicker--time" })),
|
|
this.$datepicker.appendChild(this.$timepicker),
|
|
(this.timepicker = new O({ dp: this, opts: this.opts })),
|
|
this.$timepicker.appendChild(this.timepicker.$el);
|
|
}
|
|
_addButtons() {
|
|
(this.$buttons = n({ className: "air-datepicker--buttons" })),
|
|
this.$datepicker.appendChild(this.$buttons),
|
|
(this.buttons = new E({ dp: this, opts: this.opts })),
|
|
this.$buttons.appendChild(this.buttons.$el);
|
|
}
|
|
_bindSubEvents() {
|
|
this.on(i.eventChangeSelectedDate, this._onChangeSelectedDate), this.on(i.eventChangeFocusDate, this._onChangeFocusedDate), this.on(i.eventChangeTime, this._onChangeTime);
|
|
}
|
|
_buildBaseHtml() {
|
|
let { inline: e } = this.opts;
|
|
var t, i;
|
|
this.elIsInput
|
|
? e
|
|
? ((t = this.$datepicker), (i = this.$el).parentNode.insertBefore(t, i.nextSibling))
|
|
: this.$container.appendChild(this.$datepicker)
|
|
: this.$el.appendChild(this.$datepicker),
|
|
(this.$datepicker.innerHTML = '<i class="air-datepicker--pointer"></i><div class="air-datepicker--navigation"></div><div class="air-datepicker--content"></div>'),
|
|
(this.$content = a(".air-datepicker--content", this.$datepicker)),
|
|
(this.$pointer = a(".air-datepicker--pointer", this.$datepicker)),
|
|
(this.$nav = a(".air-datepicker--navigation", this.$datepicker));
|
|
}
|
|
_handleLocale() {
|
|
let { locale: e, dateFormat: t, firstDay: i, timepicker: s, onlyTimepicker: a, timeFormat: n, dateTimeSeparator: r } = this.opts;
|
|
var h;
|
|
(this.locale = ((h = e), JSON.parse(JSON.stringify(h)))), t && (this.locale.dateFormat = t), void 0 !== n && "" !== n && (this.locale.timeFormat = n);
|
|
let { timeFormat: o } = this.locale;
|
|
if (("" !== i && (this.locale.firstDay = i), s && "function" != typeof t)) {
|
|
let e = o ? r : "";
|
|
this.locale.dateFormat = [this.locale.dateFormat, o || ""].join(e);
|
|
}
|
|
a && "function" != typeof t && (this.locale.dateFormat = this.locale.timeFormat);
|
|
}
|
|
_setPositionClasses(e) {
|
|
if ("function" == typeof e) return void this.$datepicker.classList.add("-custom-position-");
|
|
let t = (e = e.split(" "))[0],
|
|
i = `air-datepicker -${t}-${e[1]}- -from-${t}-`;
|
|
this.$datepicker.classList.add(...i.split(" "));
|
|
}
|
|
_bindEvents() {
|
|
this.$el.addEventListener(this.opts.showEvent, this._onFocus),
|
|
this.$el.addEventListener("blur", this._onBlur),
|
|
this.$datepicker.addEventListener("mousedown", this._onMouseDown),
|
|
this.$datepicker.addEventListener("mouseup", this._onMouseUp),
|
|
window.addEventListener("resize", this._onResize);
|
|
}
|
|
_limitViewDateByMaxMinDates() {
|
|
let { viewDate: e, minDate: t, maxDate: i } = this;
|
|
i && m(e, i) && this.setViewDate(i), t && v(e, t) && this.setViewDate(t);
|
|
}
|
|
formatDate() {
|
|
let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.viewDate,
|
|
t = arguments.length > 1 ? arguments[1] : void 0;
|
|
if (((e = k(e)), !(e instanceof Date))) return;
|
|
let i = t,
|
|
s = this.locale,
|
|
a = o(e),
|
|
n = a.dayPeriod,
|
|
r = c(e),
|
|
h = K.replacer,
|
|
l = {
|
|
T: e.getTime(),
|
|
m: a.minutes,
|
|
mm: a.fullMinutes,
|
|
h: a.hours12,
|
|
hh: a.fullHours12,
|
|
H: a.hours,
|
|
HH: a.fullHours,
|
|
aa: n,
|
|
AA: n.toUpperCase(),
|
|
E: s.daysShort[a.day],
|
|
EEEE: s.days[a.day],
|
|
d: a.date,
|
|
dd: a.fullDate,
|
|
M: a.month + 1,
|
|
MM: a.fullMonth,
|
|
MMM: s.monthsShort[a.month],
|
|
MMMM: s.months[a.month],
|
|
yy: a.year.toString().slice(-2),
|
|
yyyy: a.year,
|
|
yyyy1: r[0],
|
|
yyyy2: r[1]
|
|
};
|
|
for (let [e, t] of Object.entries(l)) i = h(i, C(e), t);
|
|
return i;
|
|
}
|
|
down(e) {
|
|
this._handleUpDownActions(e, "down");
|
|
}
|
|
up(e) {
|
|
this._handleUpDownActions(e, "up");
|
|
}
|
|
selectDate(e) {
|
|
let t,
|
|
s = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},
|
|
{ currentView: a, parsedViewDate: n, selectedDates: r } = this,
|
|
{ updateTime: h } = s,
|
|
{ moveToOtherMonthsOnSelect: o, moveToOtherYearsOnSelect: l, multipleDates: d, range: c, autoClose: u } = this.opts,
|
|
p = r.length;
|
|
if (Array.isArray(e))
|
|
return (
|
|
e.forEach((e) => {
|
|
this.selectDate(e, s);
|
|
}),
|
|
new Promise((e) => {
|
|
setTimeout(e);
|
|
})
|
|
);
|
|
if ((e = k(e)) instanceof Date) {
|
|
if (
|
|
(a === i.days && e.getMonth() !== n.month && o && (t = new Date(e.getFullYear(), e.getMonth(), 1)),
|
|
a === i.years && e.getFullYear() !== n.year && l && (t = new Date(e.getFullYear(), 0, 1)),
|
|
t && this.setViewDate(t),
|
|
d && !c)
|
|
) {
|
|
if (p === d) return;
|
|
this._checkIfDateIsSelected(e) || r.push(e);
|
|
} else if (c)
|
|
switch (p) {
|
|
case 1:
|
|
r.push(e),
|
|
this.rangeDateTo || (this.rangeDateTo = e),
|
|
m(this.rangeDateFrom, this.rangeDateTo) && ((this.rangeDateTo = this.rangeDateFrom), (this.rangeDateFrom = e)),
|
|
(this.selectedDates = [this.rangeDateFrom, this.rangeDateTo]);
|
|
break;
|
|
case 2:
|
|
(this.selectedDates = [e]), (this.rangeDateFrom = e), (this.rangeDateTo = "");
|
|
break;
|
|
default:
|
|
(this.selectedDates = [e]), (this.rangeDateFrom = e);
|
|
}
|
|
else this.selectedDates = [e];
|
|
return (
|
|
this.trigger(i.eventChangeSelectedDate, { action: i.actionSelectDate, silent: null == s ? void 0 : s.silent, date: e, updateTime: h }),
|
|
this._updateLastSelectedDate(e),
|
|
u && !this.timepickerIsActive && this.visible && (d || c ? c && 1 === p && this.hide() : this.hide()),
|
|
new Promise((e) => {
|
|
setTimeout(e);
|
|
})
|
|
);
|
|
}
|
|
}
|
|
unselectDate(e) {
|
|
let t = this.selectedDates,
|
|
s = this;
|
|
if ((e = k(e)) instanceof Date)
|
|
return t.some((a, n) => {
|
|
if (p(a, e))
|
|
return (
|
|
t.splice(n, 1),
|
|
s.selectedDates.length
|
|
? s._updateLastSelectedDate(s.selectedDates[s.selectedDates.length - 1])
|
|
: ((s.rangeDateFrom = ""), (s.rangeDateTo = ""), s._updateLastSelectedDate(!1)),
|
|
this.trigger(i.eventChangeSelectedDate, { action: i.actionUnselectDate, date: e }),
|
|
!0
|
|
);
|
|
});
|
|
}
|
|
replaceDate(e, t) {
|
|
let s = this.selectedDates.find((t) => p(t, e, this.currentView)),
|
|
a = this.selectedDates.indexOf(s);
|
|
a < 0 ||
|
|
p(this.selectedDates[a], t, this.currentView) ||
|
|
((this.selectedDates[a] = t), this.trigger(i.eventChangeSelectedDate, { action: i.actionSelectDate, date: t, updateTime: !0 }), this._updateLastSelectedDate(t));
|
|
}
|
|
clear() {
|
|
let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};
|
|
return (
|
|
(this.selectedDates = []),
|
|
(this.rangeDateFrom = !1),
|
|
(this.rangeDateTo = !1),
|
|
this.trigger(i.eventChangeSelectedDate, { action: i.actionUnselectDate, silent: e.silent }),
|
|
new Promise((e) => {
|
|
setTimeout(e);
|
|
})
|
|
);
|
|
}
|
|
show() {
|
|
let { onShow: e, isMobile: t } = this.opts;
|
|
this._cancelScheduledCall(),
|
|
this.visible || this.hideAnimation || this._createComponents(),
|
|
this.setPosition(this.opts.position),
|
|
this.$datepicker.classList.add("-active-"),
|
|
(this.visible = !0),
|
|
e && this._scheduleCallAfterTransition(e),
|
|
t && this._showMobileOverlay();
|
|
}
|
|
hide() {
|
|
let { onHide: e, isMobile: t } = this.opts,
|
|
i = this._hasTransition();
|
|
(this.visible = !1),
|
|
(this.hideAnimation = !0),
|
|
this.$datepicker.classList.remove("-active-"),
|
|
this.customHide && this.customHide(),
|
|
this.elIsInput && this.$el.blur(),
|
|
this._scheduleCallAfterTransition((t) => {
|
|
!this.customHide && ((t && i) || (!t && !i)) && this._finishHide(), e && e(t);
|
|
}),
|
|
t && R.classList.remove("-active-");
|
|
}
|
|
_triggerOnSelect() {
|
|
let e = [],
|
|
t = [],
|
|
{
|
|
selectedDates: i,
|
|
locale: s,
|
|
opts: { onSelect: a, multipleDates: n, range: r }
|
|
} = this,
|
|
h = n || r,
|
|
o = "function" == typeof s.dateFormat;
|
|
i.length && ((e = i.map(g)), (t = o ? (n ? s.dateFormat(e) : e.map((e) => s.dateFormat(e))) : e.map((e) => this.formatDate(e, s.dateFormat)))),
|
|
a({ date: h ? e : e[0], formattedDate: h ? t : t[0], datepicker: this });
|
|
}
|
|
_handleAlreadySelectedDates(e, t) {
|
|
let { range: i, toggleSelected: s } = this.opts;
|
|
i ? (s ? this.unselectDate(t) : 2 !== this.selectedDates.length && this.selectDate(t)) : s && this.unselectDate(t), s || this._updateLastSelectedDate(e);
|
|
}
|
|
_handleUpDownActions(e, t) {
|
|
if (!((e = k(e || this.focusDate || this.viewDate)) instanceof Date)) return;
|
|
let i = "up" === t ? this.viewIndex + 1 : this.viewIndex - 1;
|
|
i > 2 && (i = 2), i < 0 && (i = 0), this.setViewDate(new Date(e.getFullYear(), e.getMonth(), 1)), this.setCurrentView(this.viewIndexes[i]);
|
|
}
|
|
_handleRangeOnFocus() {
|
|
1 === this.selectedDates.length &&
|
|
(m(this.selectedDates[0], this.focusDate)
|
|
? ((this.rangeDateTo = this.selectedDates[0]), (this.rangeDateFrom = this.focusDate))
|
|
: ((this.rangeDateTo = this.focusDate), (this.rangeDateFrom = this.selectedDates[0])));
|
|
}
|
|
getCell(e) {
|
|
let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : i.day;
|
|
if (!((e = k(e)) instanceof Date)) return;
|
|
let { year: s, month: a, date: n } = o(e),
|
|
r = `[data-year="${s}"]`,
|
|
h = `[data-month="${a}"]`,
|
|
l = { [i.day]: `${r}${h}[data-date="${n}"]`, [i.month]: `${r}${h}`, [i.year]: `${r}` };
|
|
return this.views[this.currentView].$el.querySelector(l[t]);
|
|
}
|
|
_showMobileOverlay() {
|
|
R.classList.add("-active-");
|
|
}
|
|
_hasTransition() {
|
|
return (
|
|
window
|
|
.getComputedStyle(this.$datepicker)
|
|
.getPropertyValue("transition-duration")
|
|
.split(", ")
|
|
.reduce((e, t) => parseFloat(t) + e, 0) > 0
|
|
);
|
|
}
|
|
get shouldUpdateDOM() {
|
|
return this.visible || this.treatAsInline;
|
|
}
|
|
get parsedViewDate() {
|
|
return o(this.viewDate);
|
|
}
|
|
get currentViewSingular() {
|
|
return this.currentView.slice(0, -1);
|
|
}
|
|
get curDecade() {
|
|
return c(this.viewDate);
|
|
}
|
|
get viewIndex() {
|
|
return this.viewIndexes.indexOf(this.currentView);
|
|
}
|
|
get isFinalView() {
|
|
return this.currentView === i.years;
|
|
}
|
|
get hasSelectedDates() {
|
|
return this.selectedDates.length > 0;
|
|
}
|
|
get isMinViewReached() {
|
|
return this.currentView === this.opts.minView || this.currentView === i.days;
|
|
}
|
|
get $container() {
|
|
return this.$customContainer || j;
|
|
}
|
|
static replacer(e, t, i) {
|
|
return e.replace(t, function (e, t, s, a) {
|
|
return t + i + a;
|
|
});
|
|
}
|
|
}
|
|
var U;
|
|
return P(K, "defaults", s), P(K, "version", "3.3.5"), P(K, "defaultGlobalContainerId", "air-datepicker-global-container"), (U = K.prototype), Object.assign(U, I), t.default;
|
|
})();
|
|
});
|