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