kisa 퍼블리싱 스타일가이드 - 다크, 라이트모드 (html, scss)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1800 lines
88 KiB

!(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;
})();
});