tab.js 11.3 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
XhmikosR's avatar
XhmikosR committed
2
  * Bootstrap tab.js v4.3.1 (https://getbootstrap.com/)
Mark Otto's avatar
Mark Otto committed
3
  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
XhmikosR's avatar
Dist    
XhmikosR committed
4
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
Mark Otto's avatar
dist    
Mark Otto committed
6
(function (global, factory) {
7
8
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/data.js'), require('../dom/event-handler.js'), require('../dom/selector-engine.js')) :
  typeof define === 'function' && define.amd ? define(['../dom/data.js', '../dom/event-handler.js', '../dom/selector-engine.js'], factory) :
XhmikosR's avatar
XhmikosR committed
9
10
  (global = global || self, global.Tab = factory(global.Data, global.EventHandler, global.SelectorEngine));
}(this, function (Data, EventHandler, SelectorEngine) { 'use strict';
Mark Otto's avatar
dist    
Mark Otto committed
11

XhmikosR's avatar
XhmikosR committed
12
13
14
  Data = Data && Data.hasOwnProperty('default') ? Data['default'] : Data;
  EventHandler = EventHandler && EventHandler.hasOwnProperty('default') ? EventHandler['default'] : EventHandler;
  SelectorEngine = SelectorEngine && SelectorEngine.hasOwnProperty('default') ? SelectorEngine['default'] : SelectorEngine;
Mark Otto's avatar
dist    
Mark Otto committed
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

  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;
  }
Mark Otto's avatar
dist    
Mark Otto committed
31

XhmikosR's avatar
XhmikosR committed
32
33
34
35
36
37
38
39
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
  var MILLISECONDS_MULTIPLIER = 1000;
  var TRANSITION_END = 'transitionend';
XhmikosR's avatar
Dist.    
XhmikosR committed
40
41
  var _window = window,
      jQuery = _window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
42
43
44
45
46
47
48
49
50
51
52

  var getSelectorFromElement = function getSelectorFromElement(element) {
    var selector = element.getAttribute('data-target');

    if (!selector || selector === '#') {
      var hrefAttr = element.getAttribute('href');
      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
    }

    try {
      return document.querySelector(selector) ? selector : null;
XhmikosR's avatar
Dist.    
XhmikosR committed
53
    } catch (error) {
XhmikosR's avatar
XhmikosR committed
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
      return null;
    }
  };

  var getTransitionDurationFromElement = function getTransitionDurationFromElement(element) {
    if (!element) {
      return 0;
    } // Get transition-duration of the element


    var _window$getComputedSt = window.getComputedStyle(element),
        transitionDuration = _window$getComputedSt.transitionDuration,
        transitionDelay = _window$getComputedSt.transitionDelay;

    var floatTransitionDuration = parseFloat(transitionDuration);
    var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found

    if (!floatTransitionDuration && !floatTransitionDelay) {
      return 0;
    } // If multiple durations are defined, take the first


    transitionDuration = transitionDuration.split(',')[0];
    transitionDelay = transitionDelay.split(',')[0];
    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
  };

  var triggerTransitionEnd = function triggerTransitionEnd(element) {
XhmikosR's avatar
XhmikosR committed
82
83
84
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(TRANSITION_END, true, true);
    element.dispatchEvent(evt);
XhmikosR's avatar
XhmikosR committed
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  };

  var emulateTransitionEnd = function emulateTransitionEnd(element, duration) {
    var called = false;
    var durationPadding = 5;
    var emulatedDuration = duration + durationPadding;

    function listener() {
      called = true;
      element.removeEventListener(TRANSITION_END, listener);
    }

    element.addEventListener(TRANSITION_END, listener);
    setTimeout(function () {
      if (!called) {
        triggerTransitionEnd(element);
      }
    }, emulatedDuration);
  };

  var makeArray = function makeArray(nodeList) {
    if (!nodeList) {
      return [];
    }

    return [].slice.call(nodeList);
  };

  var reflow = function reflow(element) {
    return element.offsetHeight;
  };

XhmikosR's avatar
Dist    
XhmikosR committed
117
118
119
120
121
122
123
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'tab';
XhmikosR's avatar
XhmikosR committed
124
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
125
126
127
  var DATA_KEY = 'bs.tab';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
128
  var Event = {
XhmikosR's avatar
Dist    
XhmikosR committed
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
    HIDE: "hide" + EVENT_KEY,
    HIDDEN: "hidden" + EVENT_KEY,
    SHOW: "show" + EVENT_KEY,
    SHOWN: "shown" + EVENT_KEY,
    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
  };
  var ClassName = {
    DROPDOWN_MENU: 'dropdown-menu',
    ACTIVE: 'active',
    DISABLED: 'disabled',
    FADE: 'fade',
    SHOW: 'show'
  };
  var Selector = {
    DROPDOWN: '.dropdown',
    NAV_LIST_GROUP: '.nav, .list-group',
    ACTIVE: '.active',
XhmikosR's avatar
XhmikosR committed
146
    ACTIVE_UL: ':scope > li > .active',
XhmikosR's avatar
Dist    
XhmikosR committed
147
148
    DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
    DROPDOWN_TOGGLE: '.dropdown-toggle',
XhmikosR's avatar
XhmikosR committed
149
    DROPDOWN_ACTIVE_CHILD: ':scope > .dropdown-menu .active'
Mark Otto's avatar
dist    
Mark Otto committed
150
151
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
152
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
153
154
     * ------------------------------------------------------------------------
     */
fat's avatar
tab es6  
fat committed
155

XhmikosR's avatar
Dist    
XhmikosR committed
156
  };
fat's avatar
tab es6  
fat committed
157

XhmikosR's avatar
Dist    
XhmikosR committed
158
159
160
161
162
  var Tab =
  /*#__PURE__*/
  function () {
    function Tab(element) {
      this._element = element;
XhmikosR's avatar
XhmikosR committed
163
      Data.setData(this._element, DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
164
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
165

fat's avatar
tab es6  
fat committed
166

XhmikosR's avatar
Dist    
XhmikosR committed
167
    var _proto = Tab.prototype;
fat's avatar
tab es6  
fat committed
168

XhmikosR's avatar
Dist    
XhmikosR committed
169
170
171
    // Public
    _proto.show = function show() {
      var _this = this;
fat's avatar
tab es6  
fat committed
172

XhmikosR's avatar
XhmikosR committed
173
      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(ClassName.ACTIVE) || this._element.classList.contains(ClassName.DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
174
175
        return;
      }
fat's avatar
tab es6  
fat committed
176

XhmikosR's avatar
Dist    
XhmikosR committed
177
178
      var target;
      var previous;
XhmikosR's avatar
XhmikosR committed
179
180
      var listElement = SelectorEngine.closest(this._element, Selector.NAV_LIST_GROUP);
      var selector = getSelectorFromElement(this._element);
fat's avatar
tab es6  
fat committed
181

XhmikosR's avatar
Dist    
XhmikosR committed
182
      if (listElement) {
XhmikosR's avatar
Dist    
XhmikosR committed
183
        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
XhmikosR's avatar
XhmikosR committed
184
        previous = makeArray(SelectorEngine.find(itemSelector, listElement));
XhmikosR's avatar
Dist    
XhmikosR committed
185
186
        previous = previous[previous.length - 1];
      }
fat's avatar
tab es6  
fat committed
187

XhmikosR's avatar
XhmikosR committed
188
      var hideEvent = null;
fat's avatar
tab es6  
fat committed
189

XhmikosR's avatar
Dist    
XhmikosR committed
190
      if (previous) {
XhmikosR's avatar
XhmikosR committed
191
        hideEvent = EventHandler.trigger(previous, Event.HIDE, {
XhmikosR's avatar
XhmikosR committed
192
193
          relatedTarget: this._element
        });
XhmikosR's avatar
Dist    
XhmikosR committed
194
      }
fat's avatar
tab es6  
fat committed
195

XhmikosR's avatar
XhmikosR committed
196
      var showEvent = EventHandler.trigger(this._element, Event.SHOW, {
XhmikosR's avatar
XhmikosR committed
197
198
        relatedTarget: previous
      });
fat's avatar
tab es6  
fat committed
199

XhmikosR's avatar
XhmikosR committed
200
      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
201
202
        return;
      }
fat's avatar
tab es6  
fat committed
203

XhmikosR's avatar
Dist    
XhmikosR committed
204
      if (selector) {
XhmikosR's avatar
XhmikosR committed
205
        target = SelectorEngine.findOne(selector);
XhmikosR's avatar
Dist    
XhmikosR committed
206
      }
fat's avatar
tab es6  
fat committed
207

XhmikosR's avatar
Dist    
XhmikosR committed
208
209
210
      this._activate(this._element, listElement);

      var complete = function complete() {
XhmikosR's avatar
XhmikosR committed
211
        EventHandler.trigger(previous, Event.HIDDEN, {
XhmikosR's avatar
Dist    
XhmikosR committed
212
213
          relatedTarget: _this._element
        });
XhmikosR's avatar
XhmikosR committed
214
        EventHandler.trigger(_this._element, Event.SHOWN, {
XhmikosR's avatar
Dist    
XhmikosR committed
215
216
          relatedTarget: previous
        });
Mark Otto's avatar
dist    
Mark Otto committed
217
218
      };

XhmikosR's avatar
Dist    
XhmikosR committed
219
220
221
222
223
224
      if (target) {
        this._activate(target, target.parentNode, complete);
      } else {
        complete();
      }
    };
fat's avatar
tab es6  
fat committed
225

XhmikosR's avatar
Dist    
XhmikosR committed
226
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
227
      Data.removeData(this._element, DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
228
      this._element = null;
Mark Otto's avatar
Mark Otto committed
229
230
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
231

XhmikosR's avatar
Dist    
XhmikosR committed
232
233
    _proto._activate = function _activate(element, container, callback) {
      var _this2 = this;
fat's avatar
tab es6  
fat committed
234

XhmikosR's avatar
XhmikosR committed
235
      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(Selector.ACTIVE_UL, container) : SelectorEngine.children(container, Selector.ACTIVE);
XhmikosR's avatar
Dist    
XhmikosR committed
236
      var active = activeElements[0];
XhmikosR's avatar
XhmikosR committed
237
      var isTransitioning = callback && active && active.classList.contains(ClassName.FADE);
Mark Otto's avatar
grunt    
Mark Otto committed
238

XhmikosR's avatar
Dist    
XhmikosR committed
239
240
      var complete = function complete() {
        return _this2._transitionComplete(element, active, callback);
Mark Otto's avatar
dist    
Mark Otto committed
241
      };
fat's avatar
tab es6  
fat committed
242

XhmikosR's avatar
Dist    
XhmikosR committed
243
      if (active && isTransitioning) {
XhmikosR's avatar
XhmikosR committed
244
245
246
247
        var transitionDuration = getTransitionDurationFromElement(active);
        active.classList.remove(ClassName.SHOW);
        EventHandler.one(active, TRANSITION_END, complete);
        emulateTransitionEnd(active, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
248
249
250
251
      } else {
        complete();
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
252

XhmikosR's avatar
Dist    
XhmikosR committed
253
254
    _proto._transitionComplete = function _transitionComplete(element, active, callback) {
      if (active) {
XhmikosR's avatar
XhmikosR committed
255
256
        active.classList.remove(ClassName.ACTIVE);
        var dropdownChild = SelectorEngine.findOne(Selector.DROPDOWN_ACTIVE_CHILD, active.parentNode);
fat's avatar
tab es6  
fat committed
257

XhmikosR's avatar
Dist    
XhmikosR committed
258
        if (dropdownChild) {
XhmikosR's avatar
XhmikosR committed
259
          dropdownChild.classList.remove(ClassName.ACTIVE);
Mark Otto's avatar
dist    
Mark Otto committed
260
        }
fat's avatar
tab es6  
fat committed
261

XhmikosR's avatar
Dist    
XhmikosR committed
262
263
        if (active.getAttribute('role') === 'tab') {
          active.setAttribute('aria-selected', false);
Mark Otto's avatar
dist    
Mark Otto committed
264
        }
XhmikosR's avatar
Dist    
XhmikosR committed
265
      }
fat's avatar
tab es6  
fat committed
266

XhmikosR's avatar
XhmikosR committed
267
      element.classList.add(ClassName.ACTIVE);
fat's avatar
tab es6  
fat committed
268

XhmikosR's avatar
Dist    
XhmikosR committed
269
270
271
      if (element.getAttribute('role') === 'tab') {
        element.setAttribute('aria-selected', true);
      }
fat's avatar
tab es6  
fat committed
272

XhmikosR's avatar
XhmikosR committed
273
      reflow(element);
Mark Otto's avatar
Mark Otto committed
274
275
276
277

      if (element.classList.contains(ClassName.FADE)) {
        element.classList.add(ClassName.SHOW);
      }
fat's avatar
tab es6  
fat committed
278

XhmikosR's avatar
XhmikosR committed
279
280
      if (element.parentNode && element.parentNode.classList.contains(ClassName.DROPDOWN_MENU)) {
        var dropdownElement = SelectorEngine.closest(element, Selector.DROPDOWN);
fat's avatar
tab es6  
fat committed
281

XhmikosR's avatar
Dist    
XhmikosR committed
282
        if (dropdownElement) {
XhmikosR's avatar
XhmikosR committed
283
284
285
          makeArray(SelectorEngine.find(Selector.DROPDOWN_TOGGLE)).forEach(function (dropdown) {
            return dropdown.classList.add(ClassName.ACTIVE);
          });
Mark Otto's avatar
dist    
Mark Otto committed
286
        }
Mark Otto's avatar
grunt    
Mark Otto committed
287

XhmikosR's avatar
Dist    
XhmikosR committed
288
289
        element.setAttribute('aria-expanded', true);
      }
Mark Otto's avatar
dist    
Mark Otto committed
290

XhmikosR's avatar
Dist    
XhmikosR committed
291
292
293
      if (callback) {
        callback();
      }
Mark Otto's avatar
Mark Otto committed
294
295
    } // Static
    ;
Mark Otto's avatar
dist    
Mark Otto committed
296

XhmikosR's avatar
Dist    
XhmikosR committed
297
298
    Tab._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
299
        var data = Data.getData(this, DATA_KEY) || new Tab(this);
Mark Otto's avatar
dist    
Mark Otto committed
300

XhmikosR's avatar
Dist    
XhmikosR committed
301
302
303
        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
304
          }
Mark Otto's avatar
dist    
Mark Otto committed
305

XhmikosR's avatar
Dist    
XhmikosR committed
306
          data[config]();
Mark Otto's avatar
dist    
Mark Otto committed
307
        }
XhmikosR's avatar
Dist    
XhmikosR committed
308
309
      });
    };
Mark Otto's avatar
dist    
Mark Otto committed
310

XhmikosR's avatar
XhmikosR committed
311
312
313
314
    Tab._getInstance = function _getInstance(element) {
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
315
316
317
318
319
320
    _createClass(Tab, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION;
      }
    }]);
fat's avatar
tab es6  
fat committed
321

XhmikosR's avatar
Dist    
XhmikosR committed
322
323
324
325
326
327
328
    return Tab;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
tab es6  
fat committed
329

Mark Otto's avatar
dist    
Mark Otto committed
330

XhmikosR's avatar
XhmikosR committed
331
  EventHandler.on(document, Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
332
    event.preventDefault();
XhmikosR's avatar
XhmikosR committed
333
334
    var data = Data.getData(this, DATA_KEY) || new Tab(this);
    data.show();
XhmikosR's avatar
Dist    
XhmikosR committed
335
336
337
338
339
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
340
   * add .tab to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
341
   */
fat's avatar
tab es6  
fat committed
342

343
344
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
345
346
347
348
  if (typeof jQuery !== 'undefined') {
    var JQUERY_NO_CONFLICT = jQuery.fn[NAME];
    jQuery.fn[NAME] = Tab._jQueryInterface;
    jQuery.fn[NAME].Constructor = Tab;
Mark Otto's avatar
dist    
Mark Otto committed
349

XhmikosR's avatar
XhmikosR committed
350
351
352
353
354
    jQuery.fn[NAME].noConflict = function () {
      jQuery.fn[NAME] = JQUERY_NO_CONFLICT;
      return Tab._jQueryInterface;
    };
  }
fat's avatar
tab es6  
fat committed
355
356

  return Tab;
Mark Otto's avatar
dist    
Mark Otto committed
357

Mark Otto's avatar
Mark Otto committed
358
}));
Mark Otto's avatar
dist    
Mark Otto committed
359
//# sourceMappingURL=tab.js.map