302 lines
13 KiB
JavaScript
302 lines
13 KiB
JavaScript
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
typeof define === 'function' && define.amd ? define(factory) :
|
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.monthSelectPlugin = factory());
|
|
}(this, (function () { 'use strict';
|
|
|
|
/*! *****************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
var __assign = function() {
|
|
__assign = Object.assign || function __assign(t) {
|
|
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
s = arguments[i];
|
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
}
|
|
return t;
|
|
};
|
|
return __assign.apply(this, arguments);
|
|
};
|
|
|
|
var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? "shorthand" : "longhand"][monthNumber]; };
|
|
|
|
function clearNode(node) {
|
|
while (node.firstChild)
|
|
node.removeChild(node.firstChild);
|
|
}
|
|
function getEventTarget(event) {
|
|
try {
|
|
if (typeof event.composedPath === "function") {
|
|
var path = event.composedPath();
|
|
return path[0];
|
|
}
|
|
return event.target;
|
|
}
|
|
catch (error) {
|
|
return event.target;
|
|
}
|
|
}
|
|
|
|
var defaultConfig = {
|
|
shorthand: false,
|
|
dateFormat: "F Y",
|
|
altFormat: "F Y",
|
|
theme: "light",
|
|
};
|
|
function monthSelectPlugin(pluginConfig) {
|
|
var config = __assign(__assign({}, defaultConfig), pluginConfig);
|
|
return function (fp) {
|
|
fp.config.dateFormat = config.dateFormat;
|
|
fp.config.altFormat = config.altFormat;
|
|
var self = { monthsContainer: null };
|
|
function clearUnnecessaryDOMElements() {
|
|
if (!fp.rContainer)
|
|
return;
|
|
clearNode(fp.rContainer);
|
|
for (var index = 0; index < fp.monthElements.length; index++) {
|
|
var element = fp.monthElements[index];
|
|
if (!element.parentNode)
|
|
continue;
|
|
element.parentNode.removeChild(element);
|
|
}
|
|
}
|
|
function build() {
|
|
if (!fp.rContainer)
|
|
return;
|
|
self.monthsContainer = fp._createElement("div", "flatpickr-monthSelect-months");
|
|
self.monthsContainer.tabIndex = -1;
|
|
buildMonths();
|
|
fp.rContainer.appendChild(self.monthsContainer);
|
|
fp.calendarContainer.classList.add("flatpickr-monthSelect-theme-" + config.theme);
|
|
}
|
|
function buildMonths() {
|
|
if (!self.monthsContainer)
|
|
return;
|
|
clearNode(self.monthsContainer);
|
|
var frag = document.createDocumentFragment();
|
|
for (var i = 0; i < 12; i++) {
|
|
var month = fp.createDay("flatpickr-monthSelect-month", new Date(fp.currentYear, i), 0, i);
|
|
if (month.dateObj.getMonth() === new Date().getMonth() &&
|
|
month.dateObj.getFullYear() === new Date().getFullYear())
|
|
month.classList.add("today");
|
|
month.textContent = monthToStr(i, config.shorthand, fp.l10n);
|
|
month.addEventListener("click", selectMonth);
|
|
frag.appendChild(month);
|
|
}
|
|
self.monthsContainer.appendChild(frag);
|
|
if (fp.config.minDate &&
|
|
fp.currentYear === fp.config.minDate.getFullYear())
|
|
fp.prevMonthNav.classList.add("flatpickr-disabled");
|
|
else
|
|
fp.prevMonthNav.classList.remove("flatpickr-disabled");
|
|
if (fp.config.maxDate &&
|
|
fp.currentYear === fp.config.maxDate.getFullYear())
|
|
fp.nextMonthNav.classList.add("flatpickr-disabled");
|
|
else
|
|
fp.nextMonthNav.classList.remove("flatpickr-disabled");
|
|
}
|
|
function bindEvents() {
|
|
fp._bind(fp.prevMonthNav, "click", function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
fp.changeYear(fp.currentYear - 1);
|
|
selectYear();
|
|
buildMonths();
|
|
});
|
|
fp._bind(fp.nextMonthNav, "click", function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
fp.changeYear(fp.currentYear + 1);
|
|
selectYear();
|
|
buildMonths();
|
|
});
|
|
fp._bind(self.monthsContainer, "mouseover", function (e) {
|
|
if (fp.config.mode === "range")
|
|
fp.onMouseOver(getEventTarget(e), "flatpickr-monthSelect-month");
|
|
});
|
|
}
|
|
function setCurrentlySelected() {
|
|
if (!fp.rContainer)
|
|
return;
|
|
if (!fp.selectedDates.length)
|
|
return;
|
|
var currentlySelected = fp.rContainer.querySelectorAll(".flatpickr-monthSelect-month.selected");
|
|
for (var index = 0; index < currentlySelected.length; index++) {
|
|
currentlySelected[index].classList.remove("selected");
|
|
}
|
|
var targetMonth = fp.selectedDates[0].getMonth();
|
|
var month = fp.rContainer.querySelector(".flatpickr-monthSelect-month:nth-child(" + (targetMonth + 1) + ")");
|
|
if (month) {
|
|
month.classList.add("selected");
|
|
}
|
|
}
|
|
function selectYear() {
|
|
var selectedDate = fp.selectedDates[0];
|
|
if (selectedDate) {
|
|
selectedDate = new Date(selectedDate);
|
|
selectedDate.setFullYear(fp.currentYear);
|
|
if (fp.config.minDate && selectedDate < fp.config.minDate) {
|
|
selectedDate = fp.config.minDate;
|
|
}
|
|
if (fp.config.maxDate && selectedDate > fp.config.maxDate) {
|
|
selectedDate = fp.config.maxDate;
|
|
}
|
|
fp.currentYear = selectedDate.getFullYear();
|
|
}
|
|
fp.currentYearElement.value = String(fp.currentYear);
|
|
if (fp.rContainer) {
|
|
var months = fp.rContainer.querySelectorAll(".flatpickr-monthSelect-month");
|
|
months.forEach(function (month) {
|
|
month.dateObj.setFullYear(fp.currentYear);
|
|
if ((fp.config.minDate && month.dateObj < fp.config.minDate) ||
|
|
(fp.config.maxDate && month.dateObj > fp.config.maxDate)) {
|
|
month.classList.add("flatpickr-disabled");
|
|
}
|
|
else {
|
|
month.classList.remove("flatpickr-disabled");
|
|
}
|
|
});
|
|
}
|
|
setCurrentlySelected();
|
|
}
|
|
function selectMonth(e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
var eventTarget = getEventTarget(e);
|
|
if (!(eventTarget instanceof Element))
|
|
return;
|
|
if (eventTarget.classList.contains("flatpickr-disabled"))
|
|
return;
|
|
if (eventTarget.classList.contains("notAllowed"))
|
|
return; // necessary??
|
|
setMonth(eventTarget.dateObj);
|
|
if (fp.config.closeOnSelect) {
|
|
var single = fp.config.mode === "single";
|
|
var range = fp.config.mode === "range" && fp.selectedDates.length === 2;
|
|
if (single || range)
|
|
fp.close();
|
|
}
|
|
}
|
|
function setMonth(date) {
|
|
var selectedDate = new Date(fp.currentYear, date.getMonth(), date.getDate());
|
|
var selectedDates = [];
|
|
switch (fp.config.mode) {
|
|
case "single":
|
|
selectedDates = [selectedDate];
|
|
break;
|
|
case "multiple":
|
|
selectedDates.push(selectedDate);
|
|
break;
|
|
case "range":
|
|
if (fp.selectedDates.length === 2) {
|
|
selectedDates = [selectedDate];
|
|
}
|
|
else {
|
|
selectedDates = fp.selectedDates.concat([selectedDate]);
|
|
selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });
|
|
}
|
|
break;
|
|
}
|
|
fp.setDate(selectedDates, true);
|
|
setCurrentlySelected();
|
|
}
|
|
var shifts = {
|
|
37: -1,
|
|
39: 1,
|
|
40: 3,
|
|
38: -3,
|
|
};
|
|
function onKeyDown(_, __, ___, e) {
|
|
var shouldMove = shifts[e.keyCode] !== undefined;
|
|
if (!shouldMove && e.keyCode !== 13) {
|
|
return;
|
|
}
|
|
if (!fp.rContainer || !self.monthsContainer)
|
|
return;
|
|
var currentlySelected = fp.rContainer.querySelector(".flatpickr-monthSelect-month.selected");
|
|
var index = Array.prototype.indexOf.call(self.monthsContainer.children, document.activeElement);
|
|
if (index === -1) {
|
|
var target = currentlySelected || self.monthsContainer.firstElementChild;
|
|
target.focus();
|
|
index = target.$i;
|
|
}
|
|
if (shouldMove) {
|
|
self.monthsContainer.children[(12 + index + shifts[e.keyCode]) % 12].focus();
|
|
}
|
|
else if (e.keyCode === 13 &&
|
|
self.monthsContainer.contains(document.activeElement)) {
|
|
setMonth(document.activeElement.dateObj);
|
|
}
|
|
}
|
|
function closeHook() {
|
|
var _a;
|
|
if (((_a = fp.config) === null || _a === void 0 ? void 0 : _a.mode) === "range" && fp.selectedDates.length === 1)
|
|
fp.clear(false);
|
|
if (!fp.selectedDates.length)
|
|
buildMonths();
|
|
}
|
|
// Help the prev/next year nav honor config.minDate (see 3fa5a69)
|
|
function stubCurrentMonth() {
|
|
config._stubbedCurrentMonth = fp._initialDate.getMonth();
|
|
fp._initialDate.setMonth(config._stubbedCurrentMonth);
|
|
fp.currentMonth = config._stubbedCurrentMonth;
|
|
}
|
|
function unstubCurrentMonth() {
|
|
if (!config._stubbedCurrentMonth)
|
|
return;
|
|
fp._initialDate.setMonth(config._stubbedCurrentMonth);
|
|
fp.currentMonth = config._stubbedCurrentMonth;
|
|
delete config._stubbedCurrentMonth;
|
|
}
|
|
function destroyPluginInstance() {
|
|
if (self.monthsContainer !== null) {
|
|
var months = self.monthsContainer.querySelectorAll(".flatpickr-monthSelect-month");
|
|
for (var index = 0; index < months.length; index++) {
|
|
months[index].removeEventListener("click", selectMonth);
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
onParseConfig: function () {
|
|
fp.config.enableTime = false;
|
|
},
|
|
onValueUpdate: setCurrentlySelected,
|
|
onKeyDown: onKeyDown,
|
|
onReady: [
|
|
stubCurrentMonth,
|
|
clearUnnecessaryDOMElements,
|
|
build,
|
|
bindEvents,
|
|
setCurrentlySelected,
|
|
function () {
|
|
fp.config.onClose.push(closeHook);
|
|
fp.loadedPlugins.push("monthSelect");
|
|
},
|
|
],
|
|
onDestroy: [
|
|
unstubCurrentMonth,
|
|
destroyPluginInstance,
|
|
function () {
|
|
fp.config.onClose = fp.config.onClose.filter(function (hook) { return hook !== closeHook; });
|
|
},
|
|
],
|
|
};
|
|
};
|
|
}
|
|
|
|
return monthSelectPlugin;
|
|
|
|
})));
|