mirror of
				https://github.com/twbs/bootstrap.git
				synced 2025-11-03 00:09:53 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			371 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			371 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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; }
 | 
						|
 | 
						|
/**
 | 
						|
 * --------------------------------------------------------------------------
 | 
						|
 * Bootstrap (v4.0.0-beta.2): collapse.js
 | 
						|
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 | 
						|
 * --------------------------------------------------------------------------
 | 
						|
 */
 | 
						|
var Collapse = function () {
 | 
						|
  /**
 | 
						|
   * ------------------------------------------------------------------------
 | 
						|
   * Constants
 | 
						|
   * ------------------------------------------------------------------------
 | 
						|
   */
 | 
						|
  var NAME = 'collapse';
 | 
						|
  var VERSION = '4.0.0-beta.2';
 | 
						|
  var DATA_KEY = 'bs.collapse';
 | 
						|
  var EVENT_KEY = "." + DATA_KEY;
 | 
						|
  var DATA_API_KEY = '.data-api';
 | 
						|
  var JQUERY_NO_CONFLICT = $.fn[NAME];
 | 
						|
  var TRANSITION_DURATION = 600;
 | 
						|
  var Default = {
 | 
						|
    toggle: true,
 | 
						|
    parent: ''
 | 
						|
  };
 | 
						|
  var DefaultType = {
 | 
						|
    toggle: 'boolean',
 | 
						|
    parent: '(string|element)'
 | 
						|
  };
 | 
						|
  var Event = {
 | 
						|
    SHOW: "show" + EVENT_KEY,
 | 
						|
    SHOWN: "shown" + EVENT_KEY,
 | 
						|
    HIDE: "hide" + EVENT_KEY,
 | 
						|
    HIDDEN: "hidden" + EVENT_KEY,
 | 
						|
    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
 | 
						|
  };
 | 
						|
  var ClassName = {
 | 
						|
    SHOW: 'show',
 | 
						|
    COLLAPSE: 'collapse',
 | 
						|
    COLLAPSING: 'collapsing',
 | 
						|
    COLLAPSED: 'collapsed'
 | 
						|
  };
 | 
						|
  var Dimension = {
 | 
						|
    WIDTH: 'width',
 | 
						|
    HEIGHT: 'height'
 | 
						|
  };
 | 
						|
  var Selector = {
 | 
						|
    ACTIVES: '.show, .collapsing',
 | 
						|
    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 = $.makeArray($("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
 | 
						|
      var tabToggles = $(Selector.DATA_TOGGLE);
 | 
						|
 | 
						|
      for (var i = 0; i < tabToggles.length; i++) {
 | 
						|
        var elem = tabToggles[i];
 | 
						|
        var selector = Util.getSelectorFromElement(elem);
 | 
						|
 | 
						|
        if (selector !== null && $(selector).filter(element).length > 0) {
 | 
						|
          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 ($(this._element).hasClass(ClassName.SHOW)) {
 | 
						|
        this.hide();
 | 
						|
      } else {
 | 
						|
        this.show();
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    _proto.show = function show() {
 | 
						|
      var _this = this;
 | 
						|
 | 
						|
      if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      var actives;
 | 
						|
      var activesData;
 | 
						|
 | 
						|
      if (this._parent) {
 | 
						|
        actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES));
 | 
						|
 | 
						|
        if (!actives.length) {
 | 
						|
          actives = null;
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if (actives) {
 | 
						|
        activesData = $(actives).data(DATA_KEY);
 | 
						|
 | 
						|
        if (activesData && activesData._isTransitioning) {
 | 
						|
          return;
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      var startEvent = $.Event(Event.SHOW);
 | 
						|
      $(this._element).trigger(startEvent);
 | 
						|
 | 
						|
      if (startEvent.isDefaultPrevented()) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      if (actives) {
 | 
						|
        Collapse._jQueryInterface.call($(actives), 'hide');
 | 
						|
 | 
						|
        if (!activesData) {
 | 
						|
          $(actives).data(DATA_KEY, null);
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      var dimension = this._getDimension();
 | 
						|
 | 
						|
      $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
 | 
						|
      this._element.style[dimension] = 0;
 | 
						|
 | 
						|
      if (this._triggerArray.length) {
 | 
						|
        $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
 | 
						|
      }
 | 
						|
 | 
						|
      this.setTransitioning(true);
 | 
						|
 | 
						|
      var complete = function complete() {
 | 
						|
        $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
 | 
						|
        _this._element.style[dimension] = '';
 | 
						|
 | 
						|
        _this.setTransitioning(false);
 | 
						|
 | 
						|
        $(_this._element).trigger(Event.SHOWN);
 | 
						|
      };
 | 
						|
 | 
						|
      if (!Util.supportsTransitionEnd()) {
 | 
						|
        complete();
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
 | 
						|
      var scrollSize = "scroll" + capitalizedDimension;
 | 
						|
      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
 | 
						|
      this._element.style[dimension] = this._element[scrollSize] + "px";
 | 
						|
    };
 | 
						|
 | 
						|
    _proto.hide = function hide() {
 | 
						|
      var _this2 = this;
 | 
						|
 | 
						|
      if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      var startEvent = $.Event(Event.HIDE);
 | 
						|
      $(this._element).trigger(startEvent);
 | 
						|
 | 
						|
      if (startEvent.isDefaultPrevented()) {
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      var dimension = this._getDimension();
 | 
						|
 | 
						|
      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
 | 
						|
      Util.reflow(this._element);
 | 
						|
      $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
 | 
						|
 | 
						|
      if (this._triggerArray.length) {
 | 
						|
        for (var i = 0; i < this._triggerArray.length; i++) {
 | 
						|
          var trigger = this._triggerArray[i];
 | 
						|
          var selector = Util.getSelectorFromElement(trigger);
 | 
						|
 | 
						|
          if (selector !== null) {
 | 
						|
            var $elem = $(selector);
 | 
						|
 | 
						|
            if (!$elem.hasClass(ClassName.SHOW)) {
 | 
						|
              $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      this.setTransitioning(true);
 | 
						|
 | 
						|
      var complete = function complete() {
 | 
						|
        _this2.setTransitioning(false);
 | 
						|
 | 
						|
        $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
 | 
						|
      };
 | 
						|
 | 
						|
      this._element.style[dimension] = '';
 | 
						|
 | 
						|
      if (!Util.supportsTransitionEnd()) {
 | 
						|
        complete();
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
 | 
						|
    };
 | 
						|
 | 
						|
    _proto.setTransitioning = function setTransitioning(isTransitioning) {
 | 
						|
      this._isTransitioning = isTransitioning;
 | 
						|
    };
 | 
						|
 | 
						|
    _proto.dispose = function dispose() {
 | 
						|
      $.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 = $.extend({}, Default, config);
 | 
						|
      config.toggle = Boolean(config.toggle); // coerce string values
 | 
						|
 | 
						|
      Util.typeCheckConfig(NAME, config, DefaultType);
 | 
						|
      return config;
 | 
						|
    };
 | 
						|
 | 
						|
    _proto._getDimension = function _getDimension() {
 | 
						|
      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
 | 
						|
      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
 | 
						|
    };
 | 
						|
 | 
						|
    _proto._getParent = function _getParent() {
 | 
						|
      var _this3 = this;
 | 
						|
 | 
						|
      var parent = null;
 | 
						|
 | 
						|
      if (Util.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 = $(this._config.parent)[0];
 | 
						|
      }
 | 
						|
 | 
						|
      var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
 | 
						|
      $(parent).find(selector).each(function (i, element) {
 | 
						|
        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
 | 
						|
      });
 | 
						|
      return parent;
 | 
						|
    };
 | 
						|
 | 
						|
    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
 | 
						|
      if (element) {
 | 
						|
        var isOpen = $(element).hasClass(ClassName.SHOW);
 | 
						|
 | 
						|
        if (triggerArray.length) {
 | 
						|
          $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }; // static
 | 
						|
 | 
						|
 | 
						|
    Collapse._getTargetFromElement = function _getTargetFromElement(element) {
 | 
						|
      var selector = Util.getSelectorFromElement(element);
 | 
						|
      return selector ? $(selector)[0] : null;
 | 
						|
    };
 | 
						|
 | 
						|
    Collapse._jQueryInterface = function _jQueryInterface(config) {
 | 
						|
      return this.each(function () {
 | 
						|
        var $this = $(this);
 | 
						|
        var data = $this.data(DATA_KEY);
 | 
						|
 | 
						|
        var _config = $.extend({}, Default, $this.data(), typeof config === 'object' && config);
 | 
						|
 | 
						|
        if (!data && _config.toggle && /show|hide/.test(config)) {
 | 
						|
          _config.toggle = false;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!data) {
 | 
						|
          data = new Collapse(this, _config);
 | 
						|
          $this.data(DATA_KEY, data);
 | 
						|
        }
 | 
						|
 | 
						|
        if (typeof config === 'string') {
 | 
						|
          if (typeof data[config] === 'undefined') {
 | 
						|
            throw new Error("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
 | 
						|
   * ------------------------------------------------------------------------
 | 
						|
   */
 | 
						|
 | 
						|
 | 
						|
  $(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 = $(this);
 | 
						|
    var selector = Util.getSelectorFromElement(this);
 | 
						|
    $(selector).each(function () {
 | 
						|
      var $target = $(this);
 | 
						|
      var data = $target.data(DATA_KEY);
 | 
						|
      var config = data ? 'toggle' : $trigger.data();
 | 
						|
 | 
						|
      Collapse._jQueryInterface.call($target, config);
 | 
						|
    });
 | 
						|
  });
 | 
						|
  /**
 | 
						|
   * ------------------------------------------------------------------------
 | 
						|
   * jQuery
 | 
						|
   * ------------------------------------------------------------------------
 | 
						|
   */
 | 
						|
 | 
						|
  $.fn[NAME] = Collapse._jQueryInterface;
 | 
						|
  $.fn[NAME].Constructor = Collapse;
 | 
						|
 | 
						|
  $.fn[NAME].noConflict = function () {
 | 
						|
    $.fn[NAME] = JQUERY_NO_CONFLICT;
 | 
						|
    return Collapse._jQueryInterface;
 | 
						|
  };
 | 
						|
 | 
						|
  return Collapse;
 | 
						|
}($);
 | 
						|
//# sourceMappingURL=collapse.js.map
 |