collapse.js 11.6 KB
Newer Older
Mark Otto's avatar
dist    
Mark Otto committed
1
2
'use strict';

Mark Otto's avatar
grunt    
Mark Otto committed
3
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
fat's avatar
fat committed
4

Mark Otto's avatar
grunt    
Mark Otto committed
5
var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
fat's avatar
fat committed
6

Mark Otto's avatar
grunt    
Mark Otto committed
7
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
fat's avatar
fat committed
8
9
10

/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
11
 * Bootstrap (v4.0.0-beta): collapse.js
fat's avatar
fat committed
12
13
14
15
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

Mark Otto's avatar
dist    
Mark Otto committed
16
var Collapse = function () {
fat's avatar
fat committed
17
18
19
20
21
22
23
24

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'collapse';
Mark Otto's avatar
Mark Otto committed
25
  var VERSION = '4.0.0-beta';
fat's avatar
fat committed
26
  var DATA_KEY = 'bs.collapse';
fat's avatar
fat committed
27
28
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
fat's avatar
fat committed
29
30
31
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  var TRANSITION_DURATION = 600;

32
  var Default = {
fat's avatar
fat committed
33
    toggle: true,
34
    parent: ''
fat's avatar
fat committed
35
36
  };

fat's avatar
fat committed
37
38
  var DefaultType = {
    toggle: 'boolean',
39
    parent: 'string'
fat's avatar
fat committed
40
41
  };

fat's avatar
fat committed
42
  var Event = {
fat's avatar
fat committed
43
44
45
46
    SHOW: 'show' + EVENT_KEY,
    SHOWN: 'shown' + EVENT_KEY,
    HIDE: 'hide' + EVENT_KEY,
    HIDDEN: 'hidden' + EVENT_KEY,
Jacob Thornton's avatar
Jacob Thornton committed
47
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
fat's avatar
fat committed
48
49
50
  };

  var ClassName = {
Mark Otto's avatar
grunt    
Mark Otto committed
51
    SHOW: 'show',
fat's avatar
fat committed
52
53
54
55
56
57
58
59
60
61
62
    COLLAPSE: 'collapse',
    COLLAPSING: 'collapsing',
    COLLAPSED: 'collapsed'
  };

  var Dimension = {
    WIDTH: 'width',
    HEIGHT: 'height'
  };

  var Selector = {
Johann-S's avatar
build    
Johann-S committed
63
64
    ACTIVES: '.show, .collapsing',
    DATA_TOGGLE: '[data-toggle="collapse"]'
Mark Otto's avatar
dist    
Mark Otto committed
65
  };
fat's avatar
fat committed
66

Mark Otto's avatar
dist    
Mark Otto committed
67
68
69
70
71
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
72

Mark Otto's avatar
grunt    
Mark Otto committed
73
  var Collapse = function () {
fat's avatar
fat committed
74
75
76
77
78
    function Collapse(element, config) {
      _classCallCheck(this, Collapse);

      this._isTransitioning = false;
      this._element = element;
fat's avatar
fat committed
79
      this._config = this._getConfig(config);
fat's avatar
fat committed
80
      this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
Mark Otto's avatar
build    
Mark Otto committed
81
82
83
84
85
86
87
88
      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);
        }
      }
Johann-S's avatar
build    
Johann-S committed
89

fat's avatar
fat committed
90
91
92
93
94
95
96
97
98
99
100
      this._parent = this._config.parent ? this._getParent() : null;

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

      if (this._config.toggle) {
        this.toggle();
      }
    }

Jacob Thornton's avatar
Jacob Thornton committed
101
102
    // getters

Mark Otto's avatar
dist    
Mark Otto committed
103
104
    _createClass(Collapse, [{
      key: 'toggle',
fat's avatar
fat committed
105
106


Mark Otto's avatar
dist    
Mark Otto committed
107
      // public
Mark Otto's avatar
grunt    
Mark Otto committed
108

Mark Otto's avatar
dist    
Mark Otto committed
109
110
111
112
113
      value: function toggle() {
        if ($(this._element).hasClass(ClassName.SHOW)) {
          this.hide();
        } else {
          this.show();
fat's avatar
fat committed
114
115
        }
      }
Mark Otto's avatar
dist    
Mark Otto committed
116
117
118
119
    }, {
      key: 'show',
      value: function show() {
        var _this = this;
fat's avatar
fat committed
120

Mark Otto's avatar
dist    
Mark Otto committed
121
        if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
fat's avatar
fat committed
122
123
124
          return;
        }

Mark Otto's avatar
dist    
Mark Otto committed
125
126
        var actives = void 0;
        var activesData = void 0;
fat's avatar
fat committed
127

Mark Otto's avatar
dist    
Mark Otto committed
128
129
130
131
132
        if (this._parent) {
          actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES));
          if (!actives.length) {
            actives = null;
          }
fat's avatar
fat committed
133
134
        }

Mark Otto's avatar
dist    
Mark Otto committed
135
136
137
138
139
140
        if (actives) {
          activesData = $(actives).data(DATA_KEY);
          if (activesData && activesData._isTransitioning) {
            return;
          }
        }
fat's avatar
fat committed
141

Mark Otto's avatar
dist    
Mark Otto committed
142
143
144
145
146
        var startEvent = $.Event(Event.SHOW);
        $(this._element).trigger(startEvent);
        if (startEvent.isDefaultPrevented()) {
          return;
        }
fat's avatar
fat committed
147

Mark Otto's avatar
dist    
Mark Otto committed
148
149
150
151
152
153
        if (actives) {
          Collapse._jQueryInterface.call($(actives), 'hide');
          if (!activesData) {
            $(actives).data(DATA_KEY, null);
          }
        }
fat's avatar
fat committed
154

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

Mark Otto's avatar
dist    
Mark Otto committed
157
        $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
fat's avatar
fat committed
158

Mark Otto's avatar
dist    
Mark Otto committed
159
        this._element.style[dimension] = 0;
fat's avatar
fat committed
160

Mark Otto's avatar
dist    
Mark Otto committed
161
162
163
        if (this._triggerArray.length) {
          $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
        }
fat's avatar
fat committed
164

Mark Otto's avatar
dist    
Mark Otto committed
165
        this.setTransitioning(true);
fat's avatar
fat committed
166

Mark Otto's avatar
dist    
Mark Otto committed
167
168
        var complete = function complete() {
          $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
fat's avatar
fat committed
169

Mark Otto's avatar
dist    
Mark Otto committed
170
          _this._element.style[dimension] = '';
fat's avatar
fat committed
171

Mark Otto's avatar
dist    
Mark Otto committed
172
          _this.setTransitioning(false);
fat's avatar
fat committed
173

Mark Otto's avatar
dist    
Mark Otto committed
174
175
          $(_this._element).trigger(Event.SHOWN);
        };
fat's avatar
fat committed
176

Mark Otto's avatar
dist    
Mark Otto committed
177
178
179
180
        if (!Util.supportsTransitionEnd()) {
          complete();
          return;
        }
fat's avatar
fat committed
181

Mark Otto's avatar
dist    
Mark Otto committed
182
183
        var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
        var scrollSize = 'scroll' + capitalizedDimension;
fat's avatar
fat committed
184

Mark Otto's avatar
dist    
Mark Otto committed
185
        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
fat's avatar
fat committed
186

Mark Otto's avatar
dist    
Mark Otto committed
187
        this._element.style[dimension] = this._element[scrollSize] + 'px';
fat's avatar
fat committed
188
      }
Mark Otto's avatar
dist    
Mark Otto committed
189
190
191
192
    }, {
      key: 'hide',
      value: function hide() {
        var _this2 = this;
fat's avatar
fat committed
193

Mark Otto's avatar
dist    
Mark Otto committed
194
195
196
        if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
          return;
        }
fat's avatar
fat committed
197

Mark Otto's avatar
dist    
Mark Otto committed
198
199
200
201
        var startEvent = $.Event(Event.HIDE);
        $(this._element).trigger(startEvent);
        if (startEvent.isDefaultPrevented()) {
          return;
Mark Otto's avatar
build    
Mark Otto committed
202
        }
fat's avatar
fat committed
203

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

Mark Otto's avatar
dist    
Mark Otto committed
206
        this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + 'px';
fat's avatar
fat committed
207

Mark Otto's avatar
dist    
Mark Otto committed
208
        Util.reflow(this._element);
fat's avatar
fat committed
209

Mark Otto's avatar
dist    
Mark Otto committed
210
        $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
fat's avatar
fat committed
211

Mark Otto's avatar
dist    
Mark Otto committed
212
213
214
215
216
217
218
219
220
221
222
223
        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);
              }
            }
          }
        }
fat's avatar
fat committed
224

Mark Otto's avatar
dist    
Mark Otto committed
225
        this.setTransitioning(true);
fat's avatar
fat committed
226

Mark Otto's avatar
dist    
Mark Otto committed
227
228
229
230
        var complete = function complete() {
          _this2.setTransitioning(false);
          $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
        };
fat's avatar
fat committed
231

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

Mark Otto's avatar
dist    
Mark Otto committed
234
235
236
237
        if (!Util.supportsTransitionEnd()) {
          complete();
          return;
        }
fat's avatar
fat committed
238

Mark Otto's avatar
dist    
Mark Otto committed
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION);
      }
    }, {
      key: 'setTransitioning',
      value: function setTransitioning(isTransitioning) {
        this._isTransitioning = isTransitioning;
      }
    }, {
      key: 'dispose',
      value: function dispose() {
        $.removeData(this._element, DATA_KEY);

        this._config = null;
        this._parent = null;
        this._element = null;
        this._triggerArray = null;
        this._isTransitioning = null;
      }
fat's avatar
fat committed
257

Mark Otto's avatar
dist    
Mark Otto committed
258
      // private
Mark Otto's avatar
grunt    
Mark Otto committed
259

Mark Otto's avatar
dist    
Mark Otto committed
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
    }, {
      key: '_getConfig',
      value: function _getConfig(config) {
        config = $.extend({}, Default, config);
        config.toggle = Boolean(config.toggle); // coerce string values
        Util.typeCheckConfig(NAME, config, DefaultType);
        return config;
      }
    }, {
      key: '_getDimension',
      value: function _getDimension() {
        var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
        return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
      }
    }, {
      key: '_getParent',
      value: function _getParent() {
        var _this3 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
278

Mark Otto's avatar
dist    
Mark Otto committed
279
280
        var parent = $(this._config.parent)[0];
        var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]';
Mark Otto's avatar
grunt    
Mark Otto committed
281

Mark Otto's avatar
dist    
Mark Otto committed
282
283
284
        $(parent).find(selector).each(function (i, element) {
          _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
        });
Mark Otto's avatar
grunt    
Mark Otto committed
285

Mark Otto's avatar
dist    
Mark Otto committed
286
287
288
289
290
291
292
        return parent;
      }
    }, {
      key: '_addAriaAndCollapsedClass',
      value: function _addAriaAndCollapsedClass(element, triggerArray) {
        if (element) {
          var isOpen = $(element).hasClass(ClassName.SHOW);
Mark Otto's avatar
grunt    
Mark Otto committed
293

Mark Otto's avatar
dist    
Mark Otto committed
294
295
296
          if (triggerArray.length) {
            $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
          }
fat's avatar
fat committed
297
298
299
        }
      }

Mark Otto's avatar
dist    
Mark Otto committed
300
      // static
fat's avatar
fat committed
301

Mark Otto's avatar
dist    
Mark Otto committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
    }], [{
      key: '_getTargetFromElement',
      value: function _getTargetFromElement(element) {
        var selector = Util.getSelectorFromElement(element);
        return selector ? $(selector)[0] : null;
      }
    }, {
      key: '_jQueryInterface',
      value: function _jQueryInterface(config) {
        return this.each(function () {
          var $this = $(this);
          var data = $this.data(DATA_KEY);
          var _config = $.extend({}, Default, $this.data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);

          if (!data && _config.toggle && /show|hide/.test(config)) {
            _config.toggle = false;
          }
Mark Otto's avatar
grunt    
Mark Otto committed
319

Mark Otto's avatar
dist    
Mark Otto committed
320
321
322
          if (!data) {
            data = new Collapse(this, _config);
            $this.data(DATA_KEY, data);
fat's avatar
fat committed
323
          }
Mark Otto's avatar
grunt    
Mark Otto committed
324

Mark Otto's avatar
dist    
Mark Otto committed
325
326
327
328
329
330
331
332
333
          if (typeof config === 'string') {
            if (typeof data[config] === 'undefined') {
              throw new Error('No method named "' + config + '"');
            }
            data[config]();
          }
        });
      }
    }, {
Jacob Thornton's avatar
Jacob Thornton committed
334
335
336
337
338
339
340
341
342
      key: 'VERSION',
      get: function get() {
        return VERSION;
      }
    }, {
      key: 'Default',
      get: function get() {
        return Default;
      }
fat's avatar
fat committed
343
344
345
    }]);

    return Collapse;
Mark Otto's avatar
grunt    
Mark Otto committed
346
347
348
349
350
351
352
  }();

  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
353

fat's avatar
fat committed
354
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
Mark Otto's avatar
dist    
Mark Otto committed
355
356
    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
    if (event.target.tagName === 'A' && !$.contains(this, event.target)) {
Mark Otto's avatar
grunt    
Mark Otto committed
357
358
      event.preventDefault();
    }
fat's avatar
fat committed
359

Mark Otto's avatar
build    
Mark Otto committed
360
361
362
363
364
365
366
367
    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);
    });
Mark Otto's avatar
Mark Otto committed
368
  });
fat's avatar
fat committed
369
370
371
372
373
374
375

  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

Mark Otto's avatar
Mark Otto committed
376
  $.fn[NAME] = Collapse._jQueryInterface;
fat's avatar
fat committed
377
378
379
380
381
382
383
  $.fn[NAME].Constructor = Collapse;
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Collapse._jQueryInterface;
  };

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