180 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			8.3 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.rangePlugin = 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.
 | 
						|
    ***************************************************************************** */
 | 
						|
 | 
						|
    function __spreadArrays() {
 | 
						|
        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
 | 
						|
        for (var r = Array(s), k = 0, i = 0; i < il; i++)
 | 
						|
            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
 | 
						|
                r[k] = a[j];
 | 
						|
        return r;
 | 
						|
    }
 | 
						|
 | 
						|
    function rangePlugin(config) {
 | 
						|
        if (config === void 0) { config = {}; }
 | 
						|
        return function (fp) {
 | 
						|
            var dateFormat = "", secondInput, _secondInputFocused, _prevDates;
 | 
						|
            var createSecondInput = function () {
 | 
						|
                if (config.input) {
 | 
						|
                    secondInput =
 | 
						|
                        config.input instanceof Element
 | 
						|
                            ? config.input
 | 
						|
                            : window.document.querySelector(config.input);
 | 
						|
                    if (!secondInput) {
 | 
						|
                        fp.config.errorHandler(new Error("Invalid input element specified"));
 | 
						|
                        return;
 | 
						|
                    }
 | 
						|
                    if (fp.config.wrap) {
 | 
						|
                        secondInput = secondInput.querySelector("[data-input]");
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else {
 | 
						|
                    secondInput = fp._input.cloneNode();
 | 
						|
                    secondInput.removeAttribute("id");
 | 
						|
                    secondInput._flatpickr = undefined;
 | 
						|
                }
 | 
						|
                if (secondInput.value) {
 | 
						|
                    var parsedDate = fp.parseDate(secondInput.value);
 | 
						|
                    if (parsedDate)
 | 
						|
                        fp.selectedDates.push(parsedDate);
 | 
						|
                }
 | 
						|
                secondInput.setAttribute("data-fp-omit", "");
 | 
						|
                if (fp.config.clickOpens) {
 | 
						|
                    fp._bind(secondInput, ["focus", "click"], function () {
 | 
						|
                        if (fp.selectedDates[1]) {
 | 
						|
                            fp.latestSelectedDateObj = fp.selectedDates[1];
 | 
						|
                            fp._setHoursFromDate(fp.selectedDates[1]);
 | 
						|
                            fp.jumpToDate(fp.selectedDates[1]);
 | 
						|
                        }
 | 
						|
                        _secondInputFocused = true;
 | 
						|
                        fp.isOpen = false;
 | 
						|
                        fp.open(undefined, config.position === "left" ? fp._input : secondInput);
 | 
						|
                    });
 | 
						|
                    fp._bind(fp._input, ["focus", "click"], function (e) {
 | 
						|
                        e.preventDefault();
 | 
						|
                        fp.isOpen = false;
 | 
						|
                        fp.open();
 | 
						|
                    });
 | 
						|
                }
 | 
						|
                if (fp.config.allowInput)
 | 
						|
                    fp._bind(secondInput, "keydown", function (e) {
 | 
						|
                        if (e.key === "Enter") {
 | 
						|
                            fp.setDate([fp.selectedDates[0], secondInput.value], true, dateFormat);
 | 
						|
                            secondInput.click();
 | 
						|
                        }
 | 
						|
                    });
 | 
						|
                if (!config.input)
 | 
						|
                    fp._input.parentNode &&
 | 
						|
                        fp._input.parentNode.insertBefore(secondInput, fp._input.nextSibling);
 | 
						|
            };
 | 
						|
            var plugin = {
 | 
						|
                onParseConfig: function () {
 | 
						|
                    fp.config.mode = "range";
 | 
						|
                    dateFormat = fp.config.altInput
 | 
						|
                        ? fp.config.altFormat
 | 
						|
                        : fp.config.dateFormat;
 | 
						|
                },
 | 
						|
                onReady: function () {
 | 
						|
                    createSecondInput();
 | 
						|
                    fp.config.ignoredFocusElements.push(secondInput);
 | 
						|
                    if (fp.config.allowInput) {
 | 
						|
                        fp._input.removeAttribute("readonly");
 | 
						|
                        secondInput.removeAttribute("readonly");
 | 
						|
                    }
 | 
						|
                    else {
 | 
						|
                        secondInput.setAttribute("readonly", "readonly");
 | 
						|
                    }
 | 
						|
                    fp._bind(fp._input, "focus", function () {
 | 
						|
                        fp.latestSelectedDateObj = fp.selectedDates[0];
 | 
						|
                        fp._setHoursFromDate(fp.selectedDates[0]);
 | 
						|
                        _secondInputFocused = false;
 | 
						|
                        fp.jumpToDate(fp.selectedDates[0]);
 | 
						|
                    });
 | 
						|
                    if (fp.config.allowInput)
 | 
						|
                        fp._bind(fp._input, "keydown", function (e) {
 | 
						|
                            if (e.key === "Enter")
 | 
						|
                                fp.setDate([fp._input.value, fp.selectedDates[1]], true, dateFormat);
 | 
						|
                        });
 | 
						|
                    fp.setDate(fp.selectedDates, false);
 | 
						|
                    plugin.onValueUpdate(fp.selectedDates);
 | 
						|
                    fp.loadedPlugins.push("range");
 | 
						|
                },
 | 
						|
                onPreCalendarPosition: function () {
 | 
						|
                    if (_secondInputFocused) {
 | 
						|
                        fp._positionElement = secondInput;
 | 
						|
                        setTimeout(function () {
 | 
						|
                            fp._positionElement = fp._input;
 | 
						|
                        }, 0);
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                onChange: function () {
 | 
						|
                    if (!fp.selectedDates.length) {
 | 
						|
                        setTimeout(function () {
 | 
						|
                            if (fp.selectedDates.length)
 | 
						|
                                return;
 | 
						|
                            secondInput.value = "";
 | 
						|
                            _prevDates = [];
 | 
						|
                        }, 10);
 | 
						|
                    }
 | 
						|
                    if (_secondInputFocused) {
 | 
						|
                        setTimeout(function () {
 | 
						|
                            secondInput.focus();
 | 
						|
                        }, 0);
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                onDestroy: function () {
 | 
						|
                    if (!config.input)
 | 
						|
                        secondInput.parentNode &&
 | 
						|
                            secondInput.parentNode.removeChild(secondInput);
 | 
						|
                },
 | 
						|
                onValueUpdate: function (selDates) {
 | 
						|
                    var _a, _b, _c;
 | 
						|
                    if (!secondInput)
 | 
						|
                        return;
 | 
						|
                    _prevDates =
 | 
						|
                        !_prevDates || selDates.length >= _prevDates.length
 | 
						|
                            ? __spreadArrays(selDates) : _prevDates;
 | 
						|
                    if (_prevDates.length > selDates.length) {
 | 
						|
                        var newSelectedDate = selDates[0];
 | 
						|
                        var newDates = _secondInputFocused
 | 
						|
                            ? [_prevDates[0], newSelectedDate]
 | 
						|
                            : [newSelectedDate, _prevDates[1]];
 | 
						|
                        if (newDates[0].getTime() > newDates[1].getTime()) {
 | 
						|
                            if (_secondInputFocused) {
 | 
						|
                                newDates[0] = newDates[1];
 | 
						|
                            }
 | 
						|
                            else {
 | 
						|
                                newDates[1] = newDates[0];
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        fp.setDate(newDates, false);
 | 
						|
                        _prevDates = __spreadArrays(newDates);
 | 
						|
                    }
 | 
						|
                    _a = fp.selectedDates.map(function (d) { return fp.formatDate(d, dateFormat); }), _b = _a[0], fp._input.value = _b === void 0 ? "" : _b, _c = _a[1], secondInput.value = _c === void 0 ? "" : _c;
 | 
						|
                },
 | 
						|
            };
 | 
						|
            return plugin;
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    return rangePlugin;
 | 
						|
 | 
						|
})));
 |