402 lines
14 KiB
JavaScript
402 lines
14 KiB
JavaScript
/*!
|
|
* Bootstrap collapse.js v4.6.0 (https://getbootstrap.com/)
|
|
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
*/
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
|
|
typeof define === 'function' && define.amd ? define(['jquery', './util'], factory) :
|
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.jQuery, global.Util));
|
|
}(this, (function ($, Util) { 'use strict';
|
|
|
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
|
|
var $__default = /*#__PURE__*/_interopDefaultLegacy($);
|
|
var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
|
|
|
|
function _defineProperties(target, props) {
|
|
for (var i = 0; i < props.length; i++) {
|
|
var descriptor = props[i];
|
|
descriptor.enumerable = descriptor.enumerable || false;
|
|
descriptor.configurable = true;
|
|
if ("value" in descriptor) descriptor.writable = true;
|
|
Object.defineProperty(target, descriptor.key, descriptor);
|
|
}
|
|
}
|
|
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
return Constructor;
|
|
}
|
|
|
|
function _extends() {
|
|
_extends = Object.assign || function (target) {
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
var source = arguments[i];
|
|
|
|
for (var key in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
target[key] = source[key];
|
|
}
|
|
}
|
|
}
|
|
|
|
return target;
|
|
};
|
|
|
|
return _extends.apply(this, arguments);
|
|
}
|
|
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Constants
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
var NAME = 'collapse';
|
|
var VERSION = '4.6.0';
|
|
var DATA_KEY = 'bs.collapse';
|
|
var EVENT_KEY = "." + DATA_KEY;
|
|
var DATA_API_KEY = '.data-api';
|
|
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
|
|
var Default = {
|
|
toggle: true,
|
|
parent: ''
|
|
};
|
|
var DefaultType = {
|
|
toggle: 'boolean',
|
|
parent: '(string|element)'
|
|
};
|
|
var EVENT_SHOW = "show" + EVENT_KEY;
|
|
var EVENT_SHOWN = "shown" + EVENT_KEY;
|
|
var EVENT_HIDE = "hide" + EVENT_KEY;
|
|
var EVENT_HIDDEN = "hidden" + EVENT_KEY;
|
|
var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
|
|
var CLASS_NAME_SHOW = 'show';
|
|
var CLASS_NAME_COLLAPSE = 'collapse';
|
|
var CLASS_NAME_COLLAPSING = 'collapsing';
|
|
var CLASS_NAME_COLLAPSED = 'collapsed';
|
|
var DIMENSION_WIDTH = 'width';
|
|
var DIMENSION_HEIGHT = 'height';
|
|
var SELECTOR_ACTIVES = '.show, .collapsing';
|
|
var SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]';
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Class Definition
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
var Collapse = /*#__PURE__*/function () {
|
|
function Collapse(element, config) {
|
|
this._isTransitioning = false;
|
|
this._element = element;
|
|
this._config = this._getConfig(config);
|
|
this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
|
|
var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
|
|
|
|
for (var i = 0, len = toggleList.length; i < len; i++) {
|
|
var elem = toggleList[i];
|
|
var selector = Util__default['default'].getSelectorFromElement(elem);
|
|
var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
|
|
return foundElem === element;
|
|
});
|
|
|
|
if (selector !== null && filterElement.length > 0) {
|
|
this._selector = selector;
|
|
|
|
this._triggerArray.push(elem);
|
|
}
|
|
}
|
|
|
|
this._parent = this._config.parent ? this._getParent() : null;
|
|
|
|
if (!this._config.parent) {
|
|
this._addAriaAndCollapsedClass(this._element, this._triggerArray);
|
|
}
|
|
|
|
if (this._config.toggle) {
|
|
this.toggle();
|
|
}
|
|
} // Getters
|
|
|
|
|
|
var _proto = Collapse.prototype;
|
|
|
|
// Public
|
|
_proto.toggle = function toggle() {
|
|
if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
|
|
this.hide();
|
|
} else {
|
|
this.show();
|
|
}
|
|
};
|
|
|
|
_proto.show = function show() {
|
|
var _this = this;
|
|
|
|
if (this._isTransitioning || $__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
|
|
return;
|
|
}
|
|
|
|
var actives;
|
|
var activesData;
|
|
|
|
if (this._parent) {
|
|
actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) {
|
|
if (typeof _this._config.parent === 'string') {
|
|
return elem.getAttribute('data-parent') === _this._config.parent;
|
|
}
|
|
|
|
return elem.classList.contains(CLASS_NAME_COLLAPSE);
|
|
});
|
|
|
|
if (actives.length === 0) {
|
|
actives = null;
|
|
}
|
|
}
|
|
|
|
if (actives) {
|
|
activesData = $__default['default'](actives).not(this._selector).data(DATA_KEY);
|
|
|
|
if (activesData && activesData._isTransitioning) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
var startEvent = $__default['default'].Event(EVENT_SHOW);
|
|
$__default['default'](this._element).trigger(startEvent);
|
|
|
|
if (startEvent.isDefaultPrevented()) {
|
|
return;
|
|
}
|
|
|
|
if (actives) {
|
|
Collapse._jQueryInterface.call($__default['default'](actives).not(this._selector), 'hide');
|
|
|
|
if (!activesData) {
|
|
$__default['default'](actives).data(DATA_KEY, null);
|
|
}
|
|
}
|
|
|
|
var dimension = this._getDimension();
|
|
|
|
$__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);
|
|
this._element.style[dimension] = 0;
|
|
|
|
if (this._triggerArray.length) {
|
|
$__default['default'](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true);
|
|
}
|
|
|
|
this.setTransitioning(true);
|
|
|
|
var complete = function complete() {
|
|
$__default['default'](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW);
|
|
_this._element.style[dimension] = '';
|
|
|
|
_this.setTransitioning(false);
|
|
|
|
$__default['default'](_this._element).trigger(EVENT_SHOWN);
|
|
};
|
|
|
|
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
var scrollSize = "scroll" + capitalizedDimension;
|
|
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
|
|
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
|
this._element.style[dimension] = this._element[scrollSize] + "px";
|
|
};
|
|
|
|
_proto.hide = function hide() {
|
|
var _this2 = this;
|
|
|
|
if (this._isTransitioning || !$__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
|
|
return;
|
|
}
|
|
|
|
var startEvent = $__default['default'].Event(EVENT_HIDE);
|
|
$__default['default'](this._element).trigger(startEvent);
|
|
|
|
if (startEvent.isDefaultPrevented()) {
|
|
return;
|
|
}
|
|
|
|
var dimension = this._getDimension();
|
|
|
|
this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
|
|
Util__default['default'].reflow(this._element);
|
|
$__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW);
|
|
var triggerArrayLength = this._triggerArray.length;
|
|
|
|
if (triggerArrayLength > 0) {
|
|
for (var i = 0; i < triggerArrayLength; i++) {
|
|
var trigger = this._triggerArray[i];
|
|
var selector = Util__default['default'].getSelectorFromElement(trigger);
|
|
|
|
if (selector !== null) {
|
|
var $elem = $__default['default']([].slice.call(document.querySelectorAll(selector)));
|
|
|
|
if (!$elem.hasClass(CLASS_NAME_SHOW)) {
|
|
$__default['default'](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
this.setTransitioning(true);
|
|
|
|
var complete = function complete() {
|
|
_this2.setTransitioning(false);
|
|
|
|
$__default['default'](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN);
|
|
};
|
|
|
|
this._element.style[dimension] = '';
|
|
var transitionDuration = Util__default['default'].getTransitionDurationFromElement(this._element);
|
|
$__default['default'](this._element).one(Util__default['default'].TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
|
};
|
|
|
|
_proto.setTransitioning = function setTransitioning(isTransitioning) {
|
|
this._isTransitioning = isTransitioning;
|
|
};
|
|
|
|
_proto.dispose = function dispose() {
|
|
$__default['default'].removeData(this._element, DATA_KEY);
|
|
this._config = null;
|
|
this._parent = null;
|
|
this._element = null;
|
|
this._triggerArray = null;
|
|
this._isTransitioning = null;
|
|
} // Private
|
|
;
|
|
|
|
_proto._getConfig = function _getConfig(config) {
|
|
config = _extends({}, Default, config);
|
|
config.toggle = Boolean(config.toggle); // Coerce string values
|
|
|
|
Util__default['default'].typeCheckConfig(NAME, config, DefaultType);
|
|
return config;
|
|
};
|
|
|
|
_proto._getDimension = function _getDimension() {
|
|
var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH);
|
|
return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;
|
|
};
|
|
|
|
_proto._getParent = function _getParent() {
|
|
var _this3 = this;
|
|
|
|
var parent;
|
|
|
|
if (Util__default['default'].isElement(this._config.parent)) {
|
|
parent = this._config.parent; // It's a jQuery object
|
|
|
|
if (typeof this._config.parent.jquery !== 'undefined') {
|
|
parent = this._config.parent[0];
|
|
}
|
|
} else {
|
|
parent = document.querySelector(this._config.parent);
|
|
}
|
|
|
|
var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
|
|
var children = [].slice.call(parent.querySelectorAll(selector));
|
|
$__default['default'](children).each(function (i, element) {
|
|
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
|
|
});
|
|
return parent;
|
|
};
|
|
|
|
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW);
|
|
|
|
if (triggerArray.length) {
|
|
$__default['default'](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
|
|
}
|
|
} // Static
|
|
;
|
|
|
|
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
|
|
var selector = Util__default['default'].getSelectorFromElement(element);
|
|
return selector ? document.querySelector(selector) : null;
|
|
};
|
|
|
|
Collapse._jQueryInterface = function _jQueryInterface(config) {
|
|
return this.each(function () {
|
|
var $element = $__default['default'](this);
|
|
var data = $element.data(DATA_KEY);
|
|
|
|
var _config = _extends({}, Default, $element.data(), typeof config === 'object' && config ? config : {});
|
|
|
|
if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
|
|
_config.toggle = false;
|
|
}
|
|
|
|
if (!data) {
|
|
data = new Collapse(this, _config);
|
|
$element.data(DATA_KEY, data);
|
|
}
|
|
|
|
if (typeof config === 'string') {
|
|
if (typeof data[config] === 'undefined') {
|
|
throw new TypeError("No method named \"" + config + "\"");
|
|
}
|
|
|
|
data[config]();
|
|
}
|
|
});
|
|
};
|
|
|
|
_createClass(Collapse, null, [{
|
|
key: "VERSION",
|
|
get: function get() {
|
|
return VERSION;
|
|
}
|
|
}, {
|
|
key: "Default",
|
|
get: function get() {
|
|
return Default;
|
|
}
|
|
}]);
|
|
|
|
return Collapse;
|
|
}();
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* Data Api implementation
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
$__default['default'](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
|
if (event.currentTarget.tagName === 'A') {
|
|
event.preventDefault();
|
|
}
|
|
|
|
var $trigger = $__default['default'](this);
|
|
var selector = Util__default['default'].getSelectorFromElement(this);
|
|
var selectors = [].slice.call(document.querySelectorAll(selector));
|
|
$__default['default'](selectors).each(function () {
|
|
var $target = $__default['default'](this);
|
|
var data = $target.data(DATA_KEY);
|
|
var config = data ? 'toggle' : $trigger.data();
|
|
|
|
Collapse._jQueryInterface.call($target, config);
|
|
});
|
|
});
|
|
/**
|
|
* ------------------------------------------------------------------------
|
|
* jQuery
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
$__default['default'].fn[NAME] = Collapse._jQueryInterface;
|
|
$__default['default'].fn[NAME].Constructor = Collapse;
|
|
|
|
$__default['default'].fn[NAME].noConflict = function () {
|
|
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
|
|
return Collapse._jQueryInterface;
|
|
};
|
|
|
|
return Collapse;
|
|
|
|
})));
|