collapse.js 10.8 KB
Newer Older
Mark Otto's avatar
dist    
Mark Otto committed
1
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); } }
Mark Otto's avatar
dist    
Mark Otto committed
2

Mark Otto's avatar
dist    
Mark Otto committed
3
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
fat's avatar
fat committed
4
5
6

/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
7
 * Bootstrap (v4.0.0-beta): collapse.js
fat's avatar
fat committed
8
9
10
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */
Mark Otto's avatar
dist    
Mark Otto committed
11
var Collapse = function () {
fat's avatar
fat committed
12
13
14
15
16
17
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */
  var NAME = 'collapse';
Mark Otto's avatar
Mark Otto committed
18
  var VERSION = '4.0.0-beta';
fat's avatar
fat committed
19
  var DATA_KEY = 'bs.collapse';
Mark Otto's avatar
dist    
Mark Otto committed
20
  var EVENT_KEY = "." + DATA_KEY;
fat's avatar
fat committed
21
  var DATA_API_KEY = '.data-api';
fat's avatar
fat committed
22
23
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  var TRANSITION_DURATION = 600;
24
  var Default = {
fat's avatar
fat committed
25
    toggle: true,
26
    parent: ''
fat's avatar
fat committed
27
  };
fat's avatar
fat committed
28
29
  var DefaultType = {
    toggle: 'boolean',
Mark Otto's avatar
dist    
Mark Otto committed
30
    parent: '(string|element)'
fat's avatar
fat committed
31
  };
fat's avatar
fat committed
32
  var Event = {
Mark Otto's avatar
dist    
Mark Otto committed
33
34
35
36
37
    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
fat's avatar
fat committed
38
39
  };
  var ClassName = {
Mark Otto's avatar
grunt    
Mark Otto committed
40
    SHOW: 'show',
fat's avatar
fat committed
41
42
43
44
45
46
47
48
49
    COLLAPSE: 'collapse',
    COLLAPSING: 'collapsing',
    COLLAPSED: 'collapsed'
  };
  var Dimension = {
    WIDTH: 'width',
    HEIGHT: 'height'
  };
  var Selector = {
Johann-S's avatar
build    
Johann-S committed
50
51
    ACTIVES: '.show, .collapsing',
    DATA_TOGGLE: '[data-toggle="collapse"]'
Mark Otto's avatar
dist    
Mark Otto committed
52
53
54
55
56
    /**
     * ------------------------------------------------------------------------
     * Class Definition
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
57

Mark Otto's avatar
dist    
Mark Otto committed
58
  };
fat's avatar
fat committed
59

Mark Otto's avatar
dist    
Mark Otto committed
60
61
62
63
  var Collapse =
  /*#__PURE__*/
  function () {
    function Collapse(element, config) {
fat's avatar
fat committed
64
65
      this._isTransitioning = false;
      this._element = element;
fat's avatar
fat committed
66
      this._config = this._getConfig(config);
Mark Otto's avatar
dist    
Mark Otto committed
67
      this._triggerArray = $.makeArray($("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
Mark Otto's avatar
build    
Mark Otto committed
68
      var tabToggles = $(Selector.DATA_TOGGLE);
Mark Otto's avatar
dist    
Mark Otto committed
69

Mark Otto's avatar
build    
Mark Otto committed
70
71
72
      for (var i = 0; i < tabToggles.length; i++) {
        var elem = tabToggles[i];
        var selector = Util.getSelectorFromElement(elem);
Mark Otto's avatar
dist    
Mark Otto committed
73

Mark Otto's avatar
build    
Mark Otto committed
74
75
76
77
        if (selector !== null && $(selector).filter(element).length > 0) {
          this._triggerArray.push(elem);
        }
      }
Johann-S's avatar
build    
Johann-S committed
78

fat's avatar
fat committed
79
80
81
82
83
84
85
86
87
      this._parent = this._config.parent ? this._getParent() : null;

      if (!this._config.parent) {
        this._addAriaAndCollapsedClass(this._element, this._triggerArray);
      }

      if (this._config.toggle) {
        this.toggle();
      }
Mark Otto's avatar
dist    
Mark Otto committed
88
    } // getters
fat's avatar
fat committed
89

Jacob Thornton's avatar
Jacob Thornton committed
90

Mark Otto's avatar
dist    
Mark Otto committed
91
    var _proto = Collapse.prototype;
fat's avatar
fat committed
92

Mark Otto's avatar
dist    
Mark Otto committed
93
94
95
96
97
98
99
100
    // public
    _proto.toggle = function toggle() {
      if ($(this._element).hasClass(ClassName.SHOW)) {
        this.hide();
      } else {
        this.show();
      }
    };
fat's avatar
fat committed
101

Mark Otto's avatar
dist    
Mark Otto committed
102
103
    _proto.show = function show() {
      var _this = this;
Mark Otto's avatar
grunt    
Mark Otto committed
104

Mark Otto's avatar
dist    
Mark Otto committed
105
106
      if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
        return;
fat's avatar
fat committed
107
108
      }

Mark Otto's avatar
dist    
Mark Otto committed
109
110
      var actives;
      var activesData;
fat's avatar
fat committed
111

Mark Otto's avatar
dist    
Mark Otto committed
112
113
      if (this._parent) {
        actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES));
fat's avatar
fat committed
114

Mark Otto's avatar
dist    
Mark Otto committed
115
116
        if (!actives.length) {
          actives = null;
fat's avatar
fat committed
117
        }
Mark Otto's avatar
dist    
Mark Otto committed
118
      }
fat's avatar
fat committed
119

Mark Otto's avatar
dist    
Mark Otto committed
120
121
      if (actives) {
        activesData = $(actives).data(DATA_KEY);
fat's avatar
fat committed
122

Mark Otto's avatar
dist    
Mark Otto committed
123
        if (activesData && activesData._isTransitioning) {
Mark Otto's avatar
dist    
Mark Otto committed
124
125
          return;
        }
Mark Otto's avatar
dist    
Mark Otto committed
126
      }
fat's avatar
fat committed
127

Mark Otto's avatar
dist    
Mark Otto committed
128
129
      var startEvent = $.Event(Event.SHOW);
      $(this._element).trigger(startEvent);
fat's avatar
fat committed
130

Mark Otto's avatar
dist    
Mark Otto committed
131
132
133
      if (startEvent.isDefaultPrevented()) {
        return;
      }
fat's avatar
fat committed
134

Mark Otto's avatar
dist    
Mark Otto committed
135
136
      if (actives) {
        Collapse._jQueryInterface.call($(actives), 'hide');
fat's avatar
fat committed
137

Mark Otto's avatar
dist    
Mark Otto committed
138
139
        if (!activesData) {
          $(actives).data(DATA_KEY, null);
Mark Otto's avatar
dist    
Mark Otto committed
140
        }
Mark Otto's avatar
dist    
Mark Otto committed
141
142
143
      }

      var dimension = this._getDimension();
fat's avatar
fat committed
144

Mark Otto's avatar
dist    
Mark Otto committed
145
146
      $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
      this._element.style[dimension] = 0;
fat's avatar
fat committed
147

Mark Otto's avatar
dist    
Mark Otto committed
148
149
150
      if (this._triggerArray.length) {
        $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
      }
fat's avatar
fat committed
151

Mark Otto's avatar
dist    
Mark Otto committed
152
      this.setTransitioning(true);
fat's avatar
fat committed
153

Mark Otto's avatar
dist    
Mark Otto committed
154
155
156
      var complete = function complete() {
        $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
        _this._element.style[dimension] = '';
fat's avatar
fat committed
157

Mark Otto's avatar
dist    
Mark Otto committed
158
        _this.setTransitioning(false);
fat's avatar
fat committed
159

Mark Otto's avatar
dist    
Mark Otto committed
160
161
        $(_this._element).trigger(Event.SHOWN);
      };
fat's avatar
fat committed
162

Mark Otto's avatar
dist    
Mark Otto committed
163
164
165
166
167
168
169
170
171
172
      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";
    };
fat's avatar
fat committed
173

Mark Otto's avatar
dist    
Mark Otto committed
174
175
    _proto.hide = function hide() {
      var _this2 = this;
fat's avatar
fat committed
176

Mark Otto's avatar
dist    
Mark Otto committed
177
178
      if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
        return;
fat's avatar
fat committed
179
180
      }

Mark Otto's avatar
dist    
Mark Otto committed
181
182
      var startEvent = $.Event(Event.HIDE);
      $(this._element).trigger(startEvent);
fat's avatar
fat committed
183

Mark Otto's avatar
dist    
Mark Otto committed
184
185
186
      if (startEvent.isDefaultPrevented()) {
        return;
      }
fat's avatar
fat committed
187

Mark Otto's avatar
dist    
Mark Otto committed
188
      var dimension = this._getDimension();
fat's avatar
fat committed
189

Mark Otto's avatar
dist    
Mark Otto committed
190
191
192
      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
      Util.reflow(this._element);
      $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
fat's avatar
fat committed
193

Mark Otto's avatar
dist    
Mark Otto committed
194
195
196
197
      if (this._triggerArray.length) {
        for (var i = 0; i < this._triggerArray.length; i++) {
          var trigger = this._triggerArray[i];
          var selector = Util.getSelectorFromElement(trigger);
fat's avatar
fat committed
198

Mark Otto's avatar
dist    
Mark Otto committed
199
200
          if (selector !== null) {
            var $elem = $(selector);
fat's avatar
fat committed
201

Mark Otto's avatar
dist    
Mark Otto committed
202
203
            if (!$elem.hasClass(ClassName.SHOW)) {
              $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
Mark Otto's avatar
dist    
Mark Otto committed
204
205
206
            }
          }
        }
Mark Otto's avatar
dist    
Mark Otto committed
207
      }
fat's avatar
fat committed
208

Mark Otto's avatar
dist    
Mark Otto committed
209
      this.setTransitioning(true);
fat's avatar
fat committed
210

Mark Otto's avatar
dist    
Mark Otto committed
211
212
      var complete = function complete() {
        _this2.setTransitioning(false);
fat's avatar
fat committed
213

Mark Otto's avatar
dist    
Mark Otto committed
214
215
        $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
      };
fat's avatar
fat committed
216

Mark Otto's avatar
dist    
Mark Otto committed
217
      this._element.style[dimension] = '';
fat's avatar
fat committed
218

Mark Otto's avatar
dist    
Mark Otto committed
219
220
221
      if (!Util.supportsTransitionEnd()) {
        complete();
        return;
Mark Otto's avatar
dist    
Mark Otto committed
222
      }
fat's avatar
fat committed
223

Mark Otto's avatar
dist    
Mark Otto committed
224
225
      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
    };
Mark Otto's avatar
grunt    
Mark Otto committed
226

Mark Otto's avatar
dist    
Mark Otto committed
227
228
229
    _proto.setTransitioning = function setTransitioning(isTransitioning) {
      this._isTransitioning = isTransitioning;
    };
Mark Otto's avatar
grunt    
Mark Otto committed
230

Mark Otto's avatar
dist    
Mark Otto committed
231
232
233
234
235
236
237
238
    _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
Mark Otto's avatar
grunt    
Mark Otto committed
239
240


Mark Otto's avatar
dist    
Mark Otto committed
241
242
243
    _proto._getConfig = function _getConfig(config) {
      config = $.extend({}, Default, config);
      config.toggle = Boolean(config.toggle); // coerce string values
Mark Otto's avatar
grunt    
Mark Otto committed
244

Mark Otto's avatar
dist    
Mark Otto committed
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
      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];
fat's avatar
fat committed
264
        }
Mark Otto's avatar
dist    
Mark Otto committed
265
266
      } else {
        parent = $(this._config.parent)[0];
fat's avatar
fat committed
267
268
      }

Mark Otto's avatar
dist    
Mark Otto committed
269
270
271
272
273
274
      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;
    };
fat's avatar
fat committed
275

Mark Otto's avatar
dist    
Mark Otto committed
276
277
278
279
280
281
282
    _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);
        }
Mark Otto's avatar
dist    
Mark Otto committed
283
      }
Mark Otto's avatar
dist    
Mark Otto committed
284
    }; // static
Mark Otto's avatar
grunt    
Mark Otto committed
285
286


Mark Otto's avatar
dist    
Mark Otto committed
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
    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 + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
311
          }
Mark Otto's avatar
dist    
Mark Otto committed
312
313
314
315
316
317
318
319

          data[config]();
        }
      });
    };

    _createClass(Collapse, null, [{
      key: "VERSION",
Jacob Thornton's avatar
Jacob Thornton committed
320
321
322
323
      get: function get() {
        return VERSION;
      }
    }, {
Mark Otto's avatar
dist    
Mark Otto committed
324
      key: "Default",
Jacob Thornton's avatar
Jacob Thornton committed
325
326
327
      get: function get() {
        return Default;
      }
fat's avatar
fat committed
328
329
330
    }]);

    return Collapse;
Mark Otto's avatar
grunt    
Mark Otto committed
331
332
333
334
335
336
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
337

Mark Otto's avatar
dist    
Mark Otto committed
338

fat's avatar
fat committed
339
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
Mark Otto's avatar
dist    
Mark Otto committed
340
    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
Mark Otto's avatar
dist    
Mark Otto committed
341
    if (event.currentTarget.tagName === 'A') {
Mark Otto's avatar
grunt    
Mark Otto committed
342
343
      event.preventDefault();
    }
fat's avatar
fat committed
344

Mark Otto's avatar
build    
Mark Otto committed
345
346
347
348
349
350
    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();
Mark Otto's avatar
dist    
Mark Otto committed
351

Mark Otto's avatar
build    
Mark Otto committed
352
353
      Collapse._jQueryInterface.call($target, config);
    });
Mark Otto's avatar
Mark Otto committed
354
  });
fat's avatar
fat committed
355
356
357
358
359
360
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

Mark Otto's avatar
Mark Otto committed
361
  $.fn[NAME] = Collapse._jQueryInterface;
fat's avatar
fat committed
362
  $.fn[NAME].Constructor = Collapse;
Mark Otto's avatar
dist    
Mark Otto committed
363

fat's avatar
fat committed
364
365
366
367
368
369
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Collapse._jQueryInterface;
  };

  return Collapse;
Mark Otto's avatar
grunt    
Mark Otto committed
370
}(jQuery);
Mark Otto's avatar
build    
Mark Otto committed
371
//# sourceMappingURL=collapse.js.map