tab.js 11.4 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) {
XhmikosR's avatar
XhmikosR committed
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
  (global = global || self, global.Tab = factory(global.Data, global.EventHandler, global.SelectorEngine));
XhmikosR's avatar
XhmikosR committed
10
}(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
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
  var MILLISECONDS_MULTIPLIER = 1000;
XhmikosR's avatar
XhmikosR committed
39
  var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
40

XhmikosR's avatar
XhmikosR committed
41
  var getSelector = function getSelector(element) {
XhmikosR's avatar
XhmikosR committed
42
43
44
45
    var selector = element.getAttribute('data-target');

    if (!selector || selector === '#') {
      var hrefAttr = element.getAttribute('href');
XhmikosR's avatar
XhmikosR committed
46
      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
XhmikosR's avatar
XhmikosR committed
47
48
    }

XhmikosR's avatar
XhmikosR committed
49
50
51
52
53
54
    return selector;
  };

  var getElementFromSelector = function getElementFromSelector(element) {
    var selector = getSelector(element);
    return selector ? document.querySelector(selector) : null;
XhmikosR's avatar
XhmikosR committed
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
  };

  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
81
82
83
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(TRANSITION_END, true, true);
    element.dispatchEvent(evt);
XhmikosR's avatar
XhmikosR committed
84
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
  };

  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
XhmikosR committed
116
117
118
119
120
121
122
123
124
125
126
  var getjQuery = function getjQuery() {
    var _window = window,
        jQuery = _window.jQuery;

    if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
      return jQuery;
    }

    return null;
  };

XhmikosR's avatar
Dist    
XhmikosR committed
127
128
129
130
131
132
133
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'tab';
XhmikosR's avatar
XhmikosR committed
134
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
135
136
137
  var DATA_KEY = 'bs.tab';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
138
  var Event = {
XhmikosR's avatar
Dist    
XhmikosR committed
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
    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
156
    ACTIVE_UL: ':scope > li > .active',
XhmikosR's avatar
Dist    
XhmikosR committed
157
158
    DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
    DROPDOWN_TOGGLE: '.dropdown-toggle',
XhmikosR's avatar
XhmikosR committed
159
    DROPDOWN_ACTIVE_CHILD: ':scope > .dropdown-menu .active'
XhmikosR's avatar
Dist    
XhmikosR committed
160
  };
XhmikosR's avatar
XhmikosR committed
161
162
163
164
165
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
tab es6  
fat committed
166

XhmikosR's avatar
Dist    
XhmikosR committed
167
168
169
170
171
  var Tab =
  /*#__PURE__*/
  function () {
    function Tab(element) {
      this._element = element;
XhmikosR's avatar
XhmikosR committed
172
      Data.setData(this._element, DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
173
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
174

fat's avatar
tab es6  
fat committed
175

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

XhmikosR's avatar
Dist    
XhmikosR committed
178
179
180
    // Public
    _proto.show = function show() {
      var _this = this;
fat's avatar
tab es6  
fat committed
181

XhmikosR's avatar
XhmikosR committed
182
      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
183
184
        return;
      }
fat's avatar
tab es6  
fat committed
185

XhmikosR's avatar
Dist    
XhmikosR committed
186
      var previous;
XhmikosR's avatar
XhmikosR committed
187
      var target = getElementFromSelector(this._element);
XhmikosR's avatar
XhmikosR committed
188
      var listElement = SelectorEngine.closest(this._element, Selector.NAV_LIST_GROUP);
fat's avatar
tab es6  
fat committed
189

XhmikosR's avatar
Dist    
XhmikosR committed
190
      if (listElement) {
XhmikosR's avatar
Dist    
XhmikosR committed
191
        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
XhmikosR's avatar
XhmikosR committed
192
        previous = makeArray(SelectorEngine.find(itemSelector, listElement));
XhmikosR's avatar
Dist    
XhmikosR committed
193
194
        previous = previous[previous.length - 1];
      }
fat's avatar
tab es6  
fat committed
195

XhmikosR's avatar
XhmikosR committed
196
      var hideEvent = null;
fat's avatar
tab es6  
fat committed
197

XhmikosR's avatar
Dist    
XhmikosR committed
198
      if (previous) {
XhmikosR's avatar
XhmikosR committed
199
        hideEvent = EventHandler.trigger(previous, Event.HIDE, {
XhmikosR's avatar
XhmikosR committed
200
201
          relatedTarget: this._element
        });
XhmikosR's avatar
Dist    
XhmikosR committed
202
      }
fat's avatar
tab es6  
fat committed
203

XhmikosR's avatar
XhmikosR committed
204
      var showEvent = EventHandler.trigger(this._element, Event.SHOW, {
XhmikosR's avatar
XhmikosR committed
205
206
        relatedTarget: previous
      });
fat's avatar
tab es6  
fat committed
207

XhmikosR's avatar
XhmikosR committed
208
      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
209
210
        return;
      }
fat's avatar
tab es6  
fat committed
211

XhmikosR's avatar
Dist    
XhmikosR committed
212
213
214
      this._activate(this._element, listElement);

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

XhmikosR's avatar
Dist    
XhmikosR committed
223
224
225
226
227
228
      if (target) {
        this._activate(target, target.parentNode, complete);
      } else {
        complete();
      }
    };
fat's avatar
tab es6  
fat committed
229

XhmikosR's avatar
Dist    
XhmikosR committed
230
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
231
      Data.removeData(this._element, DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
232
      this._element = null;
Mark Otto's avatar
Mark Otto committed
233
234
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
235

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

XhmikosR's avatar
XhmikosR committed
239
      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
240
      var active = activeElements[0];
XhmikosR's avatar
XhmikosR committed
241
      var isTransitioning = callback && active && active.classList.contains(ClassName.FADE);
Mark Otto's avatar
grunt    
Mark Otto committed
242

XhmikosR's avatar
Dist    
XhmikosR committed
243
244
      var complete = function complete() {
        return _this2._transitionComplete(element, active, callback);
Mark Otto's avatar
dist    
Mark Otto committed
245
      };
fat's avatar
tab es6  
fat committed
246

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
262
        if (dropdownChild) {
XhmikosR's avatar
XhmikosR committed
263
          dropdownChild.classList.remove(ClassName.ACTIVE);
Mark Otto's avatar
dist    
Mark Otto committed
264
        }
fat's avatar
tab es6  
fat committed
265

XhmikosR's avatar
Dist    
XhmikosR committed
266
267
        if (active.getAttribute('role') === 'tab') {
          active.setAttribute('aria-selected', false);
Mark Otto's avatar
dist    
Mark Otto committed
268
        }
XhmikosR's avatar
Dist    
XhmikosR committed
269
      }
fat's avatar
tab es6  
fat committed
270

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

XhmikosR's avatar
Dist    
XhmikosR committed
273
274
275
      if (element.getAttribute('role') === 'tab') {
        element.setAttribute('aria-selected', true);
      }
fat's avatar
tab es6  
fat committed
276

XhmikosR's avatar
XhmikosR committed
277
      reflow(element);
Mark Otto's avatar
Mark Otto committed
278
279
280
281

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
292
293
        element.setAttribute('aria-expanded', true);
      }
Mark Otto's avatar
dist    
Mark Otto committed
294

XhmikosR's avatar
Dist    
XhmikosR committed
295
296
297
      if (callback) {
        callback();
      }
Mark Otto's avatar
Mark Otto committed
298
299
    } // Static
    ;
Mark Otto's avatar
dist    
Mark Otto committed
300

XhmikosR's avatar
XhmikosR committed
301
    Tab.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
Dist    
XhmikosR committed
302
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
303
        var data = Data.getData(this, DATA_KEY) || new Tab(this);
Mark Otto's avatar
dist    
Mark Otto committed
304

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

XhmikosR's avatar
Dist    
XhmikosR committed
310
          data[config]();
Mark Otto's avatar
dist    
Mark Otto committed
311
        }
XhmikosR's avatar
Dist    
XhmikosR committed
312
313
      });
    };
Mark Otto's avatar
dist    
Mark Otto committed
314

XhmikosR's avatar
XhmikosR committed
315
    Tab.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
316
317
318
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
319
320
321
322
323
324
    _createClass(Tab, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION;
      }
    }]);
fat's avatar
tab es6  
fat committed
325

XhmikosR's avatar
Dist    
XhmikosR committed
326
327
328
329
330
331
332
    return Tab;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
tab es6  
fat committed
333

Mark Otto's avatar
dist    
Mark Otto committed
334

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

348
349
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
350
351
352
353
  if ($) {
    var JQUERY_NO_CONFLICT = $.fn[NAME];
    $.fn[NAME] = Tab.jQueryInterface;
    $.fn[NAME].Constructor = Tab;
Mark Otto's avatar
dist    
Mark Otto committed
354

XhmikosR's avatar
XhmikosR committed
355
356
357
    $.fn[NAME].noConflict = function () {
      $.fn[NAME] = JQUERY_NO_CONFLICT;
      return Tab.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
358
359
    };
  }
fat's avatar
tab es6  
fat committed
360
361

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

XhmikosR's avatar
XhmikosR committed
363
})));
Mark Otto's avatar
dist    
Mark Otto committed
364
//# sourceMappingURL=tab.js.map