tooltip.js 32.5 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
XhmikosR's avatar
XhmikosR committed
2
  * Bootstrap tooltip.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/manipulator.js'), require('popper.js'), require('../dom/selector-engine.js')) :
  typeof define === 'function' && define.amd ? define(['../dom/data.js', '../dom/event-handler.js', '../dom/manipulator.js', 'popper.js', '../dom/selector-engine.js'], factory) :
XhmikosR's avatar
XhmikosR committed
9
10
11
12
13
14
  (global = global || self, global.Tooltip = factory(global.Data, global.EventHandler, global.Manipulator, global.Popper, global.SelectorEngine));
}(this, function (Data, EventHandler, Manipulator, Popper, SelectorEngine) { 'use strict';

  Data = Data && Data.hasOwnProperty('default') ? Data['default'] : Data;
  EventHandler = EventHandler && EventHandler.hasOwnProperty('default') ? EventHandler['default'] : EventHandler;
  Manipulator = Manipulator && Manipulator.hasOwnProperty('default') ? Manipulator['default'] : Manipulator;
Mark Otto's avatar
dist    
Mark Otto committed
15
  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
XhmikosR's avatar
XhmikosR committed
16
  SelectorEngine = SelectorEngine && SelectorEngine.hasOwnProperty('default') ? SelectorEngine['default'] : SelectorEngine;
Mark Otto's avatar
dist    
Mark Otto committed
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

  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;
  }

  function _defineProperty(obj, key, value) {
    if (key in obj) {
      Object.defineProperty(obj, key, {
        value: value,
        enumerable: true,
        configurable: true,
        writable: true
      });
    } else {
      obj[key] = value;
    }

    return obj;
  }
Mark Otto's avatar
dist    
Mark Otto committed
48

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  function ownKeys(object, enumerableOnly) {
    var keys = Object.keys(object);

    if (Object.getOwnPropertySymbols) {
      var symbols = Object.getOwnPropertySymbols(object);
      if (enumerableOnly) symbols = symbols.filter(function (sym) {
        return Object.getOwnPropertyDescriptor(object, sym).enumerable;
      });
      keys.push.apply(keys, symbols);
    }

    return keys;
  }

  function _objectSpread2(target) {
Mark Otto's avatar
dist    
Mark Otto committed
64
65
66
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};

67
68
69
70
71
72
73
74
75
76
      if (i % 2) {
        ownKeys(source, true).forEach(function (key) {
          _defineProperty(target, key, source[key]);
        });
      } else if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
      } else {
        ownKeys(source).forEach(function (key) {
          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
Mark Otto's avatar
dist    
Mark Otto committed
77
78
      }
    }
Mark Otto's avatar
dist    
Mark Otto committed
79

Mark Otto's avatar
dist    
Mark Otto committed
80
81
    return target;
  }
82

XhmikosR's avatar
XhmikosR committed
83
84
  /**
   * --------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
85
86
87
88
89
90
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
  var MAX_UID = 1000000;
  var MILLISECONDS_MULTIPLIER = 1000;
XhmikosR's avatar
XhmikosR committed
91
  var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

  var toType = function toType(obj) {
    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
  };
  /**
   * --------------------------------------------------------------------------
   * Public Util Api
   * --------------------------------------------------------------------------
   */


  var getUID = function getUID(prefix) {
    do {
      // eslint-disable-next-line no-bitwise
      prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
    } while (document.getElementById(prefix));

    return prefix;
  };

  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
136
137
138
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(TRANSITION_END, true, true);
    element.dispatchEvent(evt);
XhmikosR's avatar
XhmikosR committed
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  };

  var isElement = function isElement(obj) {
    return (obj[0] || obj).nodeType;
  };

  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 typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) {
    Object.keys(configTypes).forEach(function (property) {
      var expectedTypes = configTypes[property];
      var value = config[property];
      var valueType = value && isElement(value) ? 'element' : toType(value);

      if (!new RegExp(expectedTypes).test(valueType)) {
        throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
      }
    });
  };

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

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

  var findShadowRoot = function findShadowRoot(element) {
    if (!document.documentElement.attachShadow) {
      return null;
    } // Can find the shadow root otherwise it'll return the document


    if (typeof element.getRootNode === 'function') {
      var root = element.getRootNode();
      return root instanceof ShadowRoot ? root : null;
    }

    if (element instanceof ShadowRoot) {
      return element;
    } // when we don't find a shadow root


    if (!element.parentNode) {
      return null;
    }

    return findShadowRoot(element.parentNode);
  }; // eslint-disable-next-line no-empty-function


  var noop = function noop() {
    return function () {};
  };

XhmikosR's avatar
XhmikosR committed
211
212
213
214
215
216
217
218
219
220
221
  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
XhmikosR committed
222
223
224
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/sanitizer.js
XhmikosR's avatar
XhmikosR committed
225
226
227
228
229
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];
  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
XhmikosR's avatar
XhmikosR committed
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
  /**
   * A pattern that recognizes a commonly useful subset of URLs that are safe.
   *
   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
   */

  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;
  /**
   * A pattern that matches safe data URLs. Only matches image, video and audio types.
   *
   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
   */

  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;

  var allowedAttribute = function allowedAttribute(attr, allowedAttributeList) {
    var attrName = attr.nodeName.toLowerCase();

    if (allowedAttributeList.indexOf(attrName) !== -1) {
      if (uriAttrs.indexOf(attrName) !== -1) {
        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));
      }

      return true;
    }

    var regExp = allowedAttributeList.filter(function (attrRegex) {
      return attrRegex instanceof RegExp;
    }); // Check if a regular expression validates the attribute.

    for (var i = 0, l = regExp.length; i < l; i++) {
      if (attrName.match(regExp[i])) {
        return true;
      }
    }

    return false;
  };

XhmikosR's avatar
XhmikosR committed
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
  var DefaultWhitelist = {
    // Global attributes allowed on any supplied element below.
    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
    a: ['target', 'href', 'title', 'rel'],
    area: [],
    b: [],
    br: [],
    col: [],
    code: [],
    div: [],
    em: [],
    hr: [],
    h1: [],
    h2: [],
    h3: [],
    h4: [],
    h5: [],
    h6: [],
    i: [],
    img: ['src', 'alt', 'title', 'width', 'height'],
    li: [],
    ol: [],
    p: [],
    pre: [],
    s: [],
    small: [],
    span: [],
    sub: [],
    sup: [],
    strong: [],
    u: [],
    ul: []
  };
  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
XhmikosR's avatar
XhmikosR committed
303
    if (!unsafeHtml.length) {
XhmikosR's avatar
XhmikosR committed
304
305
306
307
308
309
310
311
312
313
      return unsafeHtml;
    }

    if (sanitizeFn && typeof sanitizeFn === 'function') {
      return sanitizeFn(unsafeHtml);
    }

    var domParser = new window.DOMParser();
    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
    var whitelistKeys = Object.keys(whiteList);
XhmikosR's avatar
XhmikosR committed
314
    var elements = makeArray(createdDocument.body.querySelectorAll('*'));
XhmikosR's avatar
XhmikosR committed
315
316
317
318
319

    var _loop = function _loop(i, len) {
      var el = elements[i];
      var elName = el.nodeName.toLowerCase();

XhmikosR's avatar
XhmikosR committed
320
      if (whitelistKeys.indexOf(elName) === -1) {
XhmikosR's avatar
XhmikosR committed
321
322
323
324
        el.parentNode.removeChild(el);
        return "continue";
      }

XhmikosR's avatar
XhmikosR committed
325
      var attributeList = makeArray(el.attributes);
XhmikosR's avatar
XhmikosR committed
326
327
328
329
330
331
332
333
334
      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);
      attributeList.forEach(function (attr) {
        if (!allowedAttribute(attr, whitelistedAttributes)) {
          el.removeAttribute(attr.nodeName);
        }
      });
    };

    for (var i = 0, len = elements.length; i < len; i++) {
335
      var _ret = _loop(i);
XhmikosR's avatar
XhmikosR committed
336
337
338
339
340
341
342

      if (_ret === "continue") continue;
    }

    return createdDocument.body.innerHTML;
  }

XhmikosR's avatar
Dist    
XhmikosR committed
343
344
345
346
347
348
349
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'tooltip';
XhmikosR's avatar
XhmikosR committed
350
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
351
352
353
354
  var DATA_KEY = 'bs.tooltip';
  var EVENT_KEY = "." + DATA_KEY;
  var CLASS_PREFIX = 'bs-tooltip';
  var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
XhmikosR's avatar
XhmikosR committed
355
  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
XhmikosR's avatar
Dist    
XhmikosR committed
356
357
358
359
360
361
362
363
364
  var DefaultType = {
    animation: 'boolean',
    template: 'string',
    title: '(string|element|function)',
    trigger: 'string',
    delay: '(number|object)',
    html: 'boolean',
    selector: '(string|boolean)',
    placement: '(string|function)',
Mark Otto's avatar
Mark Otto committed
365
    offset: '(number|string|function)',
XhmikosR's avatar
Dist    
XhmikosR committed
366
367
    container: '(string|element|boolean)',
    fallbackPlacement: '(string|array)',
XhmikosR's avatar
XhmikosR committed
368
369
370
    boundary: '(string|element)',
    sanitize: 'boolean',
    sanitizeFn: '(null|function)',
XhmikosR's avatar
XhmikosR committed
371
372
    whiteList: 'object',
    popperConfig: '(null|object)'
XhmikosR's avatar
Dist    
XhmikosR committed
373
374
375
376
377
378
379
380
381
382
  };
  var AttachmentMap = {
    AUTO: 'auto',
    TOP: 'top',
    RIGHT: 'right',
    BOTTOM: 'bottom',
    LEFT: 'left'
  };
  var Default = {
    animation: true,
XhmikosR's avatar
XhmikosR committed
383
    template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>',
XhmikosR's avatar
Dist    
XhmikosR committed
384
385
386
387
388
389
390
391
392
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    selector: false,
    placement: 'top',
    offset: 0,
    container: false,
    fallbackPlacement: 'flip',
XhmikosR's avatar
XhmikosR committed
393
394
395
    boundary: 'scrollParent',
    sanitize: true,
    sanitizeFn: null,
XhmikosR's avatar
XhmikosR committed
396
397
    whiteList: DefaultWhitelist,
    popperConfig: null
XhmikosR's avatar
Dist    
XhmikosR committed
398
399
400
401
402
  };
  var HoverState = {
    SHOW: 'show',
    OUT: 'out'
  };
XhmikosR's avatar
XhmikosR committed
403
  var Event = {
XhmikosR's avatar
Dist    
XhmikosR committed
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
    HIDE: "hide" + EVENT_KEY,
    HIDDEN: "hidden" + EVENT_KEY,
    SHOW: "show" + EVENT_KEY,
    SHOWN: "shown" + EVENT_KEY,
    INSERTED: "inserted" + EVENT_KEY,
    CLICK: "click" + EVENT_KEY,
    FOCUSIN: "focusin" + EVENT_KEY,
    FOCUSOUT: "focusout" + EVENT_KEY,
    MOUSEENTER: "mouseenter" + EVENT_KEY,
    MOUSELEAVE: "mouseleave" + EVENT_KEY
  };
  var ClassName = {
    FADE: 'fade',
    SHOW: 'show'
  };
  var Selector = {
Mark Otto's avatar
dist v5    
Mark Otto committed
420
    TOOLTIP_INNER: '.tooltip-inner'
XhmikosR's avatar
Dist    
XhmikosR committed
421
422
423
424
425
426
  };
  var Trigger = {
    HOVER: 'hover',
    FOCUS: 'focus',
    CLICK: 'click',
    MANUAL: 'manual'
Mark Otto's avatar
dist    
Mark Otto committed
427
428
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
429
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
430
431
     * ------------------------------------------------------------------------
     */
XhmikosR's avatar
Dist    
XhmikosR committed
432
433
434
435
436
437
438
439

  };

  var Tooltip =
  /*#__PURE__*/
  function () {
    function Tooltip(element, config) {
      if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
440
        throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
441
      } // private
Mark Otto's avatar
dist    
Mark Otto committed
442
443


XhmikosR's avatar
Dist    
XhmikosR committed
444
445
446
447
448
      this._isEnabled = true;
      this._timeout = 0;
      this._hoverState = '';
      this._activeTrigger = {};
      this._popper = null; // Protected
449

XhmikosR's avatar
Dist    
XhmikosR committed
450
451
452
      this.element = element;
      this.config = this._getConfig(config);
      this.tip = null;
453

XhmikosR's avatar
Dist    
XhmikosR committed
454
      this._setListeners();
XhmikosR's avatar
XhmikosR committed
455
456

      Data.setData(element, this.constructor.DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
457
    } // Getters
458

Jacob Thornton's avatar
Jacob Thornton committed
459

XhmikosR's avatar
Dist    
XhmikosR committed
460
    var _proto = Tooltip.prototype;
461

XhmikosR's avatar
Dist    
XhmikosR committed
462
463
464
465
    // Public
    _proto.enable = function enable() {
      this._isEnabled = true;
    };
466

XhmikosR's avatar
Dist    
XhmikosR committed
467
468
469
    _proto.disable = function disable() {
      this._isEnabled = false;
    };
470

XhmikosR's avatar
Dist    
XhmikosR committed
471
472
473
    _proto.toggleEnabled = function toggleEnabled() {
      this._isEnabled = !this._isEnabled;
    };
Mark Otto's avatar
dist    
Mark Otto committed
474

XhmikosR's avatar
Dist    
XhmikosR committed
475
476
477
478
    _proto.toggle = function toggle(event) {
      if (!this._isEnabled) {
        return;
      }
Mark Otto's avatar
Mark Otto committed
479

XhmikosR's avatar
Dist    
XhmikosR committed
480
481
      if (event) {
        var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
482
        var context = Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
Mark Otto committed
483

XhmikosR's avatar
Dist    
XhmikosR committed
484
        if (!context) {
XhmikosR's avatar
XhmikosR committed
485
486
          context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
          Data.setData(event.delegateTarget, dataKey, context);
Mark Otto's avatar
dist    
Mark Otto committed
487
        }
fat's avatar
fat committed
488

XhmikosR's avatar
Dist    
XhmikosR committed
489
        context._activeTrigger.click = !context._activeTrigger.click;
fat's avatar
fat committed
490

XhmikosR's avatar
Dist    
XhmikosR committed
491
492
        if (context._isWithActiveTrigger()) {
          context._enter(null, context);
Mark Otto's avatar
grunt    
Mark Otto committed
493
        } else {
XhmikosR's avatar
Dist    
XhmikosR committed
494
495
496
          context._leave(null, context);
        }
      } else {
XhmikosR's avatar
XhmikosR committed
497
        if (this.getTipElement().classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
498
          this._leave(null, this);
499

XhmikosR's avatar
Dist    
XhmikosR committed
500
          return;
Mark Otto's avatar
dist    
Mark Otto committed
501
        }
502

XhmikosR's avatar
Dist    
XhmikosR committed
503
504
505
506
507
508
        this._enter(null, this);
      }
    };

    _proto.dispose = function dispose() {
      clearTimeout(this._timeout);
XhmikosR's avatar
XhmikosR committed
509
510
      Data.removeData(this.element, this.constructor.DATA_KEY);
      EventHandler.off(this.element, this.constructor.EVENT_KEY);
Mark Otto's avatar
dist v5    
Mark Otto committed
511
      EventHandler.off(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal', this._hideModalHandler);
512

XhmikosR's avatar
Dist    
XhmikosR committed
513
      if (this.tip) {
XhmikosR's avatar
XhmikosR committed
514
        this.tip.parentNode.removeChild(this.tip);
XhmikosR's avatar
Dist    
XhmikosR committed
515
      }
516

XhmikosR's avatar
Dist    
XhmikosR committed
517
518
519
520
      this._isEnabled = null;
      this._timeout = null;
      this._hoverState = null;
      this._activeTrigger = null;
521

XhmikosR's avatar
XhmikosR committed
522
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
523
524
        this._popper.destroy();
      }
525

XhmikosR's avatar
Dist    
XhmikosR committed
526
527
528
529
530
      this._popper = null;
      this.element = null;
      this.config = null;
      this.tip = null;
    };
531

XhmikosR's avatar
Dist    
XhmikosR committed
532
533
    _proto.show = function show() {
      var _this = this;
534

XhmikosR's avatar
XhmikosR committed
535
      if (this.element.style.display === 'none') {
XhmikosR's avatar
Dist    
XhmikosR committed
536
537
        throw new Error('Please use show on visible elements');
      }
538

XhmikosR's avatar
Dist    
XhmikosR committed
539
      if (this.isWithContent() && this._isEnabled) {
XhmikosR's avatar
XhmikosR committed
540
541
        var showEvent = EventHandler.trigger(this.element, this.constructor.Event.SHOW);
        var shadowRoot = findShadowRoot(this.element);
XhmikosR's avatar
Dist.    
XhmikosR committed
542
        var isInTheDom = shadowRoot === null ? this.element.ownerDocument.documentElement.contains(this.element) : shadowRoot.contains(this.element);
543

XhmikosR's avatar
XhmikosR committed
544
        if (showEvent.defaultPrevented || !isInTheDom) {
XhmikosR's avatar
Dist    
XhmikosR committed
545
546
          return;
        }
547

XhmikosR's avatar
Dist    
XhmikosR committed
548
        var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
549
        var tipId = getUID(this.constructor.NAME);
XhmikosR's avatar
Dist    
XhmikosR committed
550
551
552
        tip.setAttribute('id', tipId);
        this.element.setAttribute('aria-describedby', tipId);
        this.setContent();
553

XhmikosR's avatar
Dist    
XhmikosR committed
554
        if (this.config.animation) {
XhmikosR's avatar
XhmikosR committed
555
          tip.classList.add(ClassName.FADE);
XhmikosR's avatar
Dist    
XhmikosR committed
556
        }
557

XhmikosR's avatar
Dist    
XhmikosR committed
558
        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
Mark Otto's avatar
grunt    
Mark Otto committed
559

XhmikosR's avatar
Dist    
XhmikosR committed
560
        var attachment = this._getAttachment(placement);
Mark Otto's avatar
grunt    
Mark Otto committed
561

562
        this._addAttachmentClass(attachment);
Mark Otto's avatar
dist    
Mark Otto committed
563
564
565

        var container = this._getContainer();

XhmikosR's avatar
XhmikosR committed
566
        Data.setData(tip, this.constructor.DATA_KEY, this);
Mark Otto's avatar
Mark Otto committed
567

XhmikosR's avatar
XhmikosR committed
568
569
        if (!this.element.ownerDocument.documentElement.contains(this.tip)) {
          container.appendChild(tip);
XhmikosR's avatar
Dist    
XhmikosR committed
570
        }
Mark Otto's avatar
grunt    
Mark Otto committed
571

XhmikosR's avatar
XhmikosR committed
572
        EventHandler.trigger(this.element, this.constructor.Event.INSERTED);
XhmikosR's avatar
XhmikosR committed
573
        this._popper = new Popper(this.element, tip, this._getPopperConfig(attachment));
XhmikosR's avatar
XhmikosR committed
574
        tip.classList.add(ClassName.SHOW); // If this is a touch-enabled device we add extra
XhmikosR's avatar
Dist    
XhmikosR committed
575
576
577
        // empty mouseover listeners to the body's immediate children;
        // only needed because of broken event delegation on iOS
        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
Mark Otto's avatar
grunt    
Mark Otto committed
578

XhmikosR's avatar
Dist    
XhmikosR committed
579
        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
580
581
582
          makeArray(document.body.children).forEach(function (element) {
            EventHandler.on(element, 'mouseover', noop());
          });
XhmikosR's avatar
Dist    
XhmikosR committed
583
        }
Mark Otto's avatar
build    
Mark Otto committed
584

XhmikosR's avatar
Dist    
XhmikosR committed
585
586
587
588
        var complete = function complete() {
          if (_this.config.animation) {
            _this._fixTransition();
          }
589

XhmikosR's avatar
Dist    
XhmikosR committed
590
591
          var prevHoverState = _this._hoverState;
          _this._hoverState = null;
XhmikosR's avatar
XhmikosR committed
592
          EventHandler.trigger(_this.element, _this.constructor.Event.SHOWN);
593

XhmikosR's avatar
Dist    
XhmikosR committed
594
595
          if (prevHoverState === HoverState.OUT) {
            _this._leave(null, _this);
596
          }
XhmikosR's avatar
Dist    
XhmikosR committed
597
598
        };

XhmikosR's avatar
XhmikosR committed
599
600
601
602
        if (this.tip.classList.contains(ClassName.FADE)) {
          var transitionDuration = getTransitionDurationFromElement(this.tip);
          EventHandler.one(this.tip, TRANSITION_END, complete);
          emulateTransitionEnd(this.tip, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
603
604
        } else {
          complete();
605
        }
XhmikosR's avatar
Dist    
XhmikosR committed
606
607
      }
    };
608

609
    _proto.hide = function hide() {
XhmikosR's avatar
Dist    
XhmikosR committed
610
      var _this2 = this;
611

XhmikosR's avatar
Dist    
XhmikosR committed
612
      var tip = this.getTipElement();
Mark Otto's avatar
dist    
Mark Otto committed
613

XhmikosR's avatar
Dist    
XhmikosR committed
614
615
616
617
      var complete = function complete() {
        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
          tip.parentNode.removeChild(tip);
        }
618

XhmikosR's avatar
Dist    
XhmikosR committed
619
        _this2._cleanTipClass();
Mark Otto's avatar
grunt    
Mark Otto committed
620

XhmikosR's avatar
Dist    
XhmikosR committed
621
        _this2.element.removeAttribute('aria-describedby');
622

XhmikosR's avatar
XhmikosR committed
623
        EventHandler.trigger(_this2.element, _this2.constructor.Event.HIDDEN);
Mark Otto's avatar
dist    
Mark Otto committed
624

625
        _this2._popper.destroy();
XhmikosR's avatar
Dist    
XhmikosR committed
626
      };
Mark Otto's avatar
grunt    
Mark Otto committed
627

XhmikosR's avatar
XhmikosR committed
628
      var hideEvent = EventHandler.trigger(this.element, this.constructor.Event.HIDE);
Mark Otto's avatar
grunt    
Mark Otto committed
629

XhmikosR's avatar
XhmikosR committed
630
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
631
632
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
633

XhmikosR's avatar
XhmikosR committed
634
      tip.classList.remove(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
XhmikosR's avatar
Dist    
XhmikosR committed
635
      // empty mouseover listeners we added for iOS support
Mark Otto's avatar
dist    
Mark Otto committed
636

XhmikosR's avatar
Dist    
XhmikosR committed
637
      if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
638
639
640
        makeArray(document.body.children).forEach(function (element) {
          return EventHandler.off(element, 'mouseover', noop);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
641
      }
Mark Otto's avatar
dist    
Mark Otto committed
642

XhmikosR's avatar
Dist    
XhmikosR committed
643
644
645
      this._activeTrigger[Trigger.CLICK] = false;
      this._activeTrigger[Trigger.FOCUS] = false;
      this._activeTrigger[Trigger.HOVER] = false;
Mark Otto's avatar
dist    
Mark Otto committed
646

XhmikosR's avatar
XhmikosR committed
647
648
649
650
      if (this.tip.classList.contains(ClassName.FADE)) {
        var transitionDuration = getTransitionDurationFromElement(tip);
        EventHandler.one(tip, TRANSITION_END, complete);
        emulateTransitionEnd(tip, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
651
652
653
      } else {
        complete();
      }
Mark Otto's avatar
dist    
Mark Otto committed
654

XhmikosR's avatar
Dist    
XhmikosR committed
655
656
      this._hoverState = '';
    };
Mark Otto's avatar
dist    
Mark Otto committed
657

XhmikosR's avatar
Dist    
XhmikosR committed
658
659
660
661
    _proto.update = function update() {
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
662
663
    } // Protected
    ;
Mark Otto's avatar
dist    
Mark Otto committed
664

XhmikosR's avatar
Dist    
XhmikosR committed
665
666
667
    _proto.isWithContent = function isWithContent() {
      return Boolean(this.getTitle());
    };
Mark Otto's avatar
dist    
Mark Otto committed
668

XhmikosR's avatar
Dist    
XhmikosR committed
669
    _proto.getTipElement = function getTipElement() {
XhmikosR's avatar
XhmikosR committed
670
671
672
673
674
675
676
      if (this.tip) {
        return this.tip;
      }

      var element = document.createElement('div');
      element.innerHTML = this.config.template;
      this.tip = element.children[0];
XhmikosR's avatar
Dist    
XhmikosR committed
677
678
      return this.tip;
    };
Mark Otto's avatar
dist    
Mark Otto committed
679

XhmikosR's avatar
Dist    
XhmikosR committed
680
681
    _proto.setContent = function setContent() {
      var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
682
683
684
      this.setElementContent(SelectorEngine.findOne(Selector.TOOLTIP_INNER, tip), this.getTitle());
      tip.classList.remove(ClassName.FADE);
      tip.classList.remove(ClassName.SHOW);
XhmikosR's avatar
Dist    
XhmikosR committed
685
    };
Mark Otto's avatar
dist    
Mark Otto committed
686

XhmikosR's avatar
XhmikosR committed
687
688
689
690
691
    _proto.setElementContent = function setElementContent(element, content) {
      if (element === null) {
        return;
      }

692
      if (typeof content === 'object' && isElement(content)) {
XhmikosR's avatar
XhmikosR committed
693
694
695
696
697
        if (content.jquery) {
          content = content[0];
        } // content is a DOM node or a jQuery


XhmikosR's avatar
XhmikosR committed
698
        if (this.config.html) {
XhmikosR's avatar
XhmikosR committed
699
700
701
          if (content.parentNode !== element) {
            element.innerHTML = '';
            element.appendChild(content);
XhmikosR's avatar
XhmikosR committed
702
703
          }
        } else {
XhmikosR's avatar
XhmikosR committed
704
          element.innerText = content.textContent;
XhmikosR's avatar
XhmikosR committed
705
        }
XhmikosR's avatar
XhmikosR committed
706
707
708
709
710
711
712
713
714

        return;
      }

      if (this.config.html) {
        if (this.config.sanitize) {
          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);
        }

XhmikosR's avatar
XhmikosR committed
715
        element.innerHTML = content;
XhmikosR's avatar
Dist    
XhmikosR committed
716
      } else {
XhmikosR's avatar
XhmikosR committed
717
        element.innerText = content;
XhmikosR's avatar
Dist    
XhmikosR committed
718
719
      }
    };
720

XhmikosR's avatar
Dist    
XhmikosR committed
721
722
    _proto.getTitle = function getTitle() {
      var title = this.element.getAttribute('data-original-title');
723

XhmikosR's avatar
Dist    
XhmikosR committed
724
725
726
      if (!title) {
        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
      }
727

XhmikosR's avatar
Dist    
XhmikosR committed
728
      return title;
Mark Otto's avatar
Mark Otto committed
729
730
    } // Private
    ;
Mark Otto's avatar
grunt    
Mark Otto committed
731

XhmikosR's avatar
XhmikosR committed
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
    _proto._getPopperConfig = function _getPopperConfig(attachment) {
      var _this3 = this;

      var defaultBsConfig = {
        placement: attachment,
        modifiers: {
          offset: this._getOffset(),
          flip: {
            behavior: this.config.fallbackPlacement
          },
          arrow: {
            element: "." + this.constructor.NAME + "-arrow"
          },
          preventOverflow: {
            boundariesElement: this.config.boundary
          }
        },
        onCreate: function onCreate(data) {
          if (data.originalPlacement !== data.placement) {
            _this3._handlePopperPlacementChange(data);
          }
        },
        onUpdate: function onUpdate(data) {
          return _this3._handlePopperPlacementChange(data);
        }
      };
      return _objectSpread2({}, defaultBsConfig, {}, this.config.popperConfig);
    };

761
762
763
764
    _proto._addAttachmentClass = function _addAttachmentClass(attachment) {
      this.getTipElement().classList.add(CLASS_PREFIX + "-" + attachment);
    };

Mark Otto's avatar
Mark Otto committed
765
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
XhmikosR committed
766
      var _this4 = this;
Mark Otto's avatar
Mark Otto committed
767
768
769
770
771

      var offset = {};

      if (typeof this.config.offset === 'function') {
        offset.fn = function (data) {
XhmikosR's avatar
XhmikosR committed
772
          data.offsets = _objectSpread2({}, data.offsets, {}, _this4.config.offset(data.offsets, _this4.element) || {});
Mark Otto's avatar
Mark Otto committed
773
774
775
776
777
778
779
780
781
          return data;
        };
      } else {
        offset.offset = this.config.offset;
      }

      return offset;
    };

Mark Otto's avatar
dist    
Mark Otto committed
782
783
784
785
786
    _proto._getContainer = function _getContainer() {
      if (this.config.container === false) {
        return document.body;
      }

XhmikosR's avatar
XhmikosR committed
787
788
      if (isElement(this.config.container)) {
        return this.config.container;
Mark Otto's avatar
dist    
Mark Otto committed
789
790
      }

XhmikosR's avatar
XhmikosR committed
791
      return SelectorEngine.findOne(this.config.container);
Mark Otto's avatar
dist    
Mark Otto committed
792
793
    };

XhmikosR's avatar
Dist    
XhmikosR committed
794
795
796
    _proto._getAttachment = function _getAttachment(placement) {
      return AttachmentMap[placement.toUpperCase()];
    };
Mark Otto's avatar
dist    
Mark Otto committed
797

XhmikosR's avatar
Dist    
XhmikosR committed
798
    _proto._setListeners = function _setListeners() {
XhmikosR's avatar
XhmikosR committed
799
      var _this5 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
800

XhmikosR's avatar
Dist    
XhmikosR committed
801
802
803
      var triggers = this.config.trigger.split(' ');
      triggers.forEach(function (trigger) {
        if (trigger === 'click') {
XhmikosR's avatar
XhmikosR committed
804
805
          EventHandler.on(_this5.element, _this5.constructor.Event.CLICK, _this5.config.selector, function (event) {
            return _this5.toggle(event);
Mark Otto's avatar
dist    
Mark Otto committed
806
          });
XhmikosR's avatar
Dist    
XhmikosR committed
807
        } else if (trigger !== Trigger.MANUAL) {
XhmikosR's avatar
XhmikosR committed
808
809
810
811
          var eventIn = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN;
          var eventOut = trigger === Trigger.HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT;
          EventHandler.on(_this5.element, eventIn, _this5.config.selector, function (event) {
            return _this5._enter(event);
XhmikosR's avatar
XhmikosR committed
812
          });
XhmikosR's avatar
XhmikosR committed
813
814
          EventHandler.on(_this5.element, eventOut, _this5.config.selector, function (event) {
            return _this5._leave(event);
Mark Otto's avatar
dist    
Mark Otto committed
815
816
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
817
      });
Mark Otto's avatar
dist v5    
Mark Otto committed
818
819

      this._hideModalHandler = function () {
XhmikosR's avatar
XhmikosR committed
820
821
        if (_this5.element) {
          _this5.hide();
XhmikosR's avatar
Dist    
XhmikosR committed
822
        }
Mark Otto's avatar
dist v5    
Mark Otto committed
823
824
825
      };

      EventHandler.on(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal', this._hideModalHandler);
Mark Otto's avatar
dist    
Mark Otto committed
826

XhmikosR's avatar
Dist    
XhmikosR committed
827
      if (this.config.selector) {
828
        this.config = _objectSpread2({}, this.config, {
XhmikosR's avatar
Dist    
XhmikosR committed
829
830
831
832
833
834
835
          trigger: 'manual',
          selector: ''
        });
      } else {
        this._fixTitle();
      }
    };
836

XhmikosR's avatar
Dist    
XhmikosR committed
837
838
    _proto._fixTitle = function _fixTitle() {
      var titleType = typeof this.element.getAttribute('data-original-title');
839

XhmikosR's avatar
Dist    
XhmikosR committed
840
841
842
843
844
      if (this.element.getAttribute('title') || titleType !== 'string') {
        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
        this.element.setAttribute('title', '');
      }
    };
845

XhmikosR's avatar
Dist    
XhmikosR committed
846
847
    _proto._enter = function _enter(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
848
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
grunt    
Mark Otto committed
849

XhmikosR's avatar
Dist    
XhmikosR committed
850
      if (!context) {
XhmikosR's avatar
XhmikosR committed
851
852
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
853
      }
Mark Otto's avatar
grunt    
Mark Otto committed
854

XhmikosR's avatar
Dist    
XhmikosR committed
855
856
857
      if (event) {
        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
      }
858

XhmikosR's avatar
XhmikosR committed
859
      if (context.getTipElement().classList.contains(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
Mark Otto's avatar
dist    
Mark Otto committed
860
        context._hoverState = HoverState.SHOW;
XhmikosR's avatar
Dist    
XhmikosR committed
861
862
863
864
865
        return;
      }

      clearTimeout(context._timeout);
      context._hoverState = HoverState.SHOW;
Mark Otto's avatar
grunt    
Mark Otto committed
866

XhmikosR's avatar
Dist    
XhmikosR committed
867
868
869
870
871
872
873
      if (!context.config.delay || !context.config.delay.show) {
        context.show();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.SHOW) {
874
875
          context.show();
        }
XhmikosR's avatar
Dist    
XhmikosR committed
876
877
      }, context.config.delay.show);
    };
878

XhmikosR's avatar
Dist    
XhmikosR committed
879
880
    _proto._leave = function _leave(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
881
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
dist    
Mark Otto committed
882

XhmikosR's avatar
Dist    
XhmikosR committed
883
      if (!context) {
XhmikosR's avatar
XhmikosR committed
884
885
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
886
      }
Mark Otto's avatar
grunt    
Mark Otto committed
887

XhmikosR's avatar
Dist    
XhmikosR committed
888
889
890
      if (event) {
        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
      }
891

XhmikosR's avatar
Dist    
XhmikosR committed
892
893
894
      if (context._isWithActiveTrigger()) {
        return;
      }
895

XhmikosR's avatar
Dist    
XhmikosR committed
896
897
      clearTimeout(context._timeout);
      context._hoverState = HoverState.OUT;
898

XhmikosR's avatar
Dist    
XhmikosR committed
899
900
901
902
      if (!context.config.delay || !context.config.delay.hide) {
        context.hide();
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
903

XhmikosR's avatar
Dist    
XhmikosR committed
904
905
      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.OUT) {
Mark Otto's avatar
dist    
Mark Otto committed
906
          context.hide();
907
        }
XhmikosR's avatar
Dist    
XhmikosR committed
908
909
      }, context.config.delay.hide);
    };
910

XhmikosR's avatar
Dist    
XhmikosR committed
911
912
913
914
    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
      for (var trigger in this._activeTrigger) {
        if (this._activeTrigger[trigger]) {
          return true;
Mark Otto's avatar
dist    
Mark Otto committed
915
        }
XhmikosR's avatar
Dist    
XhmikosR committed
916
      }
Mark Otto's avatar
grunt    
Mark Otto committed
917

XhmikosR's avatar
Dist    
XhmikosR committed
918
919
      return false;
    };
fat's avatar
fat committed
920

XhmikosR's avatar
Dist    
XhmikosR committed
921
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
922
      var dataAttributes = Manipulator.getDataAttributes(this.element);
XhmikosR's avatar
XhmikosR committed
923
924
925
926
927
      Object.keys(dataAttributes).forEach(function (dataAttr) {
        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
          delete dataAttributes[dataAttr];
        }
      });
XhmikosR's avatar
XhmikosR committed
928
929
930
931
932

      if (config && typeof config.container === 'object' && config.container.jquery) {
        config.container = config.container[0];
      }

933
      config = _objectSpread2({}, this.constructor.Default, {}, dataAttributes, {}, typeof config === 'object' && config ? config : {});
Mark Otto's avatar
grunt    
Mark Otto committed
934

XhmikosR's avatar
Dist    
XhmikosR committed
935
936
937
938
939
940
      if (typeof config.delay === 'number') {
        config.delay = {
          show: config.delay,
          hide: config.delay
        };
      }
Mark Otto's avatar
grunt    
Mark Otto committed
941

XhmikosR's avatar
Dist    
XhmikosR committed
942
943
944
      if (typeof config.title === 'number') {
        config.title = config.title.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
945

XhmikosR's avatar
Dist    
XhmikosR committed
946
947
948
      if (typeof config.content === 'number') {
        config.content = config.content.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
949

XhmikosR's avatar
XhmikosR committed
950
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
XhmikosR committed
951
952
953
954
955

      if (config.sanitize) {
        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);
      }

XhmikosR's avatar
Dist    
XhmikosR committed
956
957
      return config;
    };
Mark Otto's avatar
grunt    
Mark Otto committed
958

XhmikosR's avatar
Dist    
XhmikosR committed
959
960
    _proto._getDelegateConfig = function _getDelegateConfig() {
      var config = {};
Mark Otto's avatar
grunt    
Mark Otto committed
961

XhmikosR's avatar
Dist    
XhmikosR committed
962
963
964
965
      if (this.config) {
        for (var key in this.config) {
          if (this.constructor.Default[key] !== this.config[key]) {
            config[key] = this.config[key];
966
967
          }
        }
XhmikosR's avatar
Dist    
XhmikosR committed
968
      }
Mark Otto's avatar
dist    
Mark Otto committed
969

XhmikosR's avatar
Dist    
XhmikosR committed
970
971
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
972

XhmikosR's avatar
Dist    
XhmikosR committed
973
    _proto._cleanTipClass = function _cleanTipClass() {
XhmikosR's avatar
XhmikosR committed
974
975
      var tip = this.getTipElement();
      var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
Mark Otto's avatar
dist    
Mark Otto committed
976

XhmikosR's avatar
Dist    
XhmikosR committed
977
      if (tabClass !== null && tabClass.length) {
XhmikosR's avatar
XhmikosR committed
978
979
980
981
982
        tabClass.map(function (token) {
          return token.trim();
        }).forEach(function (tClass) {
          return tip.classList.remove(tClass);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
983
984
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
985

XhmikosR's avatar
Dist    
XhmikosR committed
986
987
988
    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
      var popperInstance = popperData.instance;
      this.tip = popperInstance.popper;
Mark Otto's avatar
dist    
Mark Otto committed
989

XhmikosR's avatar
Dist    
XhmikosR committed
990
      this._cleanTipClass();
Mark Otto's avatar
dist    
Mark Otto committed
991

992
      this._addAttachmentClass(this._getAttachment(popperData.placement));
XhmikosR's avatar
Dist    
XhmikosR committed
993
    };
Mark Otto's avatar
dist    
Mark Otto committed
994

XhmikosR's avatar
Dist    
XhmikosR committed
995
996
997
    _proto._fixTransition = function _fixTransition() {
      var tip = this.getTipElement();
      var initConfigAnimation = this.config.animation;
Mark Otto's avatar
dist    
Mark Otto committed
998

XhmikosR's avatar
Dist    
XhmikosR committed
999
1000
      if (tip.getAttribute('x-placement') !== null) {
        return;
For faster browsing, not all history is shown. View entire blame