tooltip.js 31.8 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

Mark Otto's avatar
dist    
Mark Otto committed
49
50
51
52
53
54
55
56
57
58
  function _objectSpread(target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};
      var ownKeys = Object.keys(source);

      if (typeof Object.getOwnPropertySymbols === 'function') {
        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
          return Object.getOwnPropertyDescriptor(source, sym).enumerable;
        }));
      }
Mark Otto's avatar
dist    
Mark Otto committed
59

Mark Otto's avatar
dist    
Mark Otto committed
60
61
62
63
      ownKeys.forEach(function (key) {
        _defineProperty(target, key, source[key]);
      });
    }
Mark Otto's avatar
dist    
Mark Otto committed
64

Mark Otto's avatar
dist    
Mark Otto committed
65
66
    return target;
  }
67

XhmikosR's avatar
XhmikosR committed
68
69
  /**
   * --------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
70
71
72
73
74
75
76
   * 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;
  var TRANSITION_END = 'transitionend';
XhmikosR's avatar
Dist.    
XhmikosR committed
77
78
  var _window = window,
      jQuery = _window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
79
80
81
82
83
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
116
117
118
119
120
121
122

  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
123
124
125
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(TRANSITION_END, true, true);
    element.dispatchEvent(evt);
XhmikosR's avatar
XhmikosR committed
126
127
128
129
130
131
132
133
134
135
136
137
138
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
  };

  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 () {};
  };

  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/sanitizer.js
XhmikosR's avatar
XhmikosR committed
201
202
203
204
205
   * 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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
  /**
   * 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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  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
279
    if (!unsafeHtml.length) {
XhmikosR's avatar
XhmikosR committed
280
281
282
283
284
285
286
287
288
289
      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
290
    var elements = makeArray(createdDocument.body.querySelectorAll('*'));
XhmikosR's avatar
XhmikosR committed
291
292
293
294
295

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

XhmikosR's avatar
XhmikosR committed
296
      if (whitelistKeys.indexOf(elName) === -1) {
XhmikosR's avatar
XhmikosR committed
297
298
299
300
        el.parentNode.removeChild(el);
        return "continue";
      }

XhmikosR's avatar
XhmikosR committed
301
      var attributeList = makeArray(el.attributes);
XhmikosR's avatar
XhmikosR committed
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
      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++) {
      var _ret = _loop(i, len);

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

    return createdDocument.body.innerHTML;
  }

XhmikosR's avatar
Dist    
XhmikosR committed
319
320
321
322
323
324
325
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'tooltip';
XhmikosR's avatar
XhmikosR committed
326
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
327
328
329
330
  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
331
  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];
XhmikosR's avatar
Dist    
XhmikosR committed
332
333
334
335
336
337
338
339
340
  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
341
    offset: '(number|string|function)',
XhmikosR's avatar
Dist    
XhmikosR committed
342
343
    container: '(string|element|boolean)',
    fallbackPlacement: '(string|array)',
XhmikosR's avatar
XhmikosR committed
344
345
346
347
    boundary: '(string|element)',
    sanitize: 'boolean',
    sanitizeFn: '(null|function)',
    whiteList: 'object'
XhmikosR's avatar
Dist    
XhmikosR committed
348
349
350
351
352
353
354
355
356
357
  };
  var AttachmentMap = {
    AUTO: 'auto',
    TOP: 'top',
    RIGHT: 'right',
    BOTTOM: 'bottom',
    LEFT: 'left'
  };
  var Default = {
    animation: true,
XhmikosR's avatar
XhmikosR committed
358
    template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div></div>',
XhmikosR's avatar
Dist    
XhmikosR committed
359
360
361
362
363
364
365
366
367
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    selector: false,
    placement: 'top',
    offset: 0,
    container: false,
    fallbackPlacement: 'flip',
XhmikosR's avatar
XhmikosR committed
368
369
370
371
    boundary: 'scrollParent',
    sanitize: true,
    sanitizeFn: null,
    whiteList: DefaultWhitelist
XhmikosR's avatar
Dist    
XhmikosR committed
372
373
374
375
376
  };
  var HoverState = {
    SHOW: 'show',
    OUT: 'out'
  };
XhmikosR's avatar
XhmikosR committed
377
  var Event = {
XhmikosR's avatar
Dist    
XhmikosR committed
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
    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
394
    TOOLTIP_INNER: '.tooltip-inner'
XhmikosR's avatar
Dist    
XhmikosR committed
395
396
397
398
399
400
  };
  var Trigger = {
    HOVER: 'hover',
    FOCUS: 'focus',
    CLICK: 'click',
    MANUAL: 'manual'
Mark Otto's avatar
dist    
Mark Otto committed
401
402
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
403
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
404
405
     * ------------------------------------------------------------------------
     */
XhmikosR's avatar
Dist    
XhmikosR committed
406
407
408
409
410
411
412

  };

  var Tooltip =
  /*#__PURE__*/
  function () {
    function Tooltip(element, config) {
Mark Otto's avatar
dist    
Mark Otto committed
413
      /**
XhmikosR's avatar
Dist    
XhmikosR committed
414
415
       * Check for Popper dependency
       * Popper - https://popper.js.org
Mark Otto's avatar
dist    
Mark Otto committed
416
       */
XhmikosR's avatar
Dist    
XhmikosR committed
417
      if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
418
        throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
419
      } // private
Mark Otto's avatar
dist    
Mark Otto committed
420
421


XhmikosR's avatar
Dist    
XhmikosR committed
422
423
424
425
426
      this._isEnabled = true;
      this._timeout = 0;
      this._hoverState = '';
      this._activeTrigger = {};
      this._popper = null; // Protected
427

XhmikosR's avatar
Dist    
XhmikosR committed
428
429
430
      this.element = element;
      this.config = this._getConfig(config);
      this.tip = null;
431

XhmikosR's avatar
Dist    
XhmikosR committed
432
      this._setListeners();
XhmikosR's avatar
XhmikosR committed
433
434

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

Jacob Thornton's avatar
Jacob Thornton committed
437

XhmikosR's avatar
Dist    
XhmikosR committed
438
    var _proto = Tooltip.prototype;
439

XhmikosR's avatar
Dist    
XhmikosR committed
440
441
442
443
    // Public
    _proto.enable = function enable() {
      this._isEnabled = true;
    };
444

XhmikosR's avatar
Dist    
XhmikosR committed
445
446
447
    _proto.disable = function disable() {
      this._isEnabled = false;
    };
448

XhmikosR's avatar
Dist    
XhmikosR committed
449
450
451
    _proto.toggleEnabled = function toggleEnabled() {
      this._isEnabled = !this._isEnabled;
    };
Mark Otto's avatar
dist    
Mark Otto committed
452

XhmikosR's avatar
Dist    
XhmikosR committed
453
454
455
456
    _proto.toggle = function toggle(event) {
      if (!this._isEnabled) {
        return;
      }
Mark Otto's avatar
Mark Otto committed
457

XhmikosR's avatar
Dist    
XhmikosR committed
458
459
      if (event) {
        var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
460
        var context = Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
Mark Otto committed
461

XhmikosR's avatar
Dist    
XhmikosR committed
462
        if (!context) {
XhmikosR's avatar
XhmikosR committed
463
464
          context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
          Data.setData(event.delegateTarget, dataKey, context);
Mark Otto's avatar
dist    
Mark Otto committed
465
        }
fat's avatar
fat committed
466

XhmikosR's avatar
Dist    
XhmikosR committed
467
        context._activeTrigger.click = !context._activeTrigger.click;
fat's avatar
fat committed
468

XhmikosR's avatar
Dist    
XhmikosR committed
469
470
        if (context._isWithActiveTrigger()) {
          context._enter(null, context);
Mark Otto's avatar
grunt    
Mark Otto committed
471
        } else {
XhmikosR's avatar
Dist    
XhmikosR committed
472
473
474
          context._leave(null, context);
        }
      } else {
XhmikosR's avatar
XhmikosR committed
475
        if (this.getTipElement().classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
476
          this._leave(null, this);
477

XhmikosR's avatar
Dist    
XhmikosR committed
478
          return;
Mark Otto's avatar
dist    
Mark Otto committed
479
        }
480

XhmikosR's avatar
Dist    
XhmikosR committed
481
482
483
484
485
486
        this._enter(null, this);
      }
    };

    _proto.dispose = function dispose() {
      clearTimeout(this._timeout);
XhmikosR's avatar
XhmikosR committed
487
488
      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
489
      EventHandler.off(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal', this._hideModalHandler);
490

XhmikosR's avatar
Dist    
XhmikosR committed
491
      if (this.tip) {
XhmikosR's avatar
XhmikosR committed
492
        this.tip.parentNode.removeChild(this.tip);
XhmikosR's avatar
Dist    
XhmikosR committed
493
      }
494

XhmikosR's avatar
Dist    
XhmikosR committed
495
496
497
498
      this._isEnabled = null;
      this._timeout = null;
      this._hoverState = null;
      this._activeTrigger = null;
499

XhmikosR's avatar
Dist    
XhmikosR committed
500
501
502
      if (this._popper !== null) {
        this._popper.destroy();
      }
503

XhmikosR's avatar
Dist    
XhmikosR committed
504
505
506
507
508
      this._popper = null;
      this.element = null;
      this.config = null;
      this.tip = null;
    };
509

XhmikosR's avatar
Dist    
XhmikosR committed
510
511
    _proto.show = function show() {
      var _this = this;
512

XhmikosR's avatar
XhmikosR committed
513
      if (this.element.style.display === 'none') {
XhmikosR's avatar
Dist    
XhmikosR committed
514
515
        throw new Error('Please use show on visible elements');
      }
516

XhmikosR's avatar
Dist    
XhmikosR committed
517
      if (this.isWithContent() && this._isEnabled) {
XhmikosR's avatar
XhmikosR committed
518
519
        var showEvent = EventHandler.trigger(this.element, this.constructor.Event.SHOW);
        var shadowRoot = findShadowRoot(this.element);
XhmikosR's avatar
Dist.    
XhmikosR committed
520
        var isInTheDom = shadowRoot === null ? this.element.ownerDocument.documentElement.contains(this.element) : shadowRoot.contains(this.element);
521

XhmikosR's avatar
XhmikosR committed
522
        if (showEvent.defaultPrevented || !isInTheDom) {
XhmikosR's avatar
Dist    
XhmikosR committed
523
524
          return;
        }
525

XhmikosR's avatar
Dist    
XhmikosR committed
526
        var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
527
        var tipId = getUID(this.constructor.NAME);
XhmikosR's avatar
Dist    
XhmikosR committed
528
529
530
        tip.setAttribute('id', tipId);
        this.element.setAttribute('aria-describedby', tipId);
        this.setContent();
531

XhmikosR's avatar
Dist    
XhmikosR committed
532
        if (this.config.animation) {
XhmikosR's avatar
XhmikosR committed
533
          tip.classList.add(ClassName.FADE);
XhmikosR's avatar
Dist    
XhmikosR committed
534
        }
535

XhmikosR's avatar
Dist    
XhmikosR committed
536
        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
537

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

XhmikosR's avatar
Dist    
XhmikosR committed
540
        this.addAttachmentClass(attachment);
Mark Otto's avatar
dist    
Mark Otto committed
541
542
543

        var container = this._getContainer();

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

XhmikosR's avatar
XhmikosR committed
546
547
        if (!this.element.ownerDocument.documentElement.contains(this.tip)) {
          container.appendChild(tip);
XhmikosR's avatar
Dist    
XhmikosR committed
548
        }
Mark Otto's avatar
grunt    
Mark Otto committed
549

XhmikosR's avatar
XhmikosR committed
550
        EventHandler.trigger(this.element, this.constructor.Event.INSERTED);
XhmikosR's avatar
Dist    
XhmikosR committed
551
552
553
        this._popper = new Popper(this.element, tip, {
          placement: attachment,
          modifiers: {
Mark Otto's avatar
Mark Otto committed
554
            offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
555
556
            flip: {
              behavior: this.config.fallbackPlacement
Mark Otto's avatar
dist    
Mark Otto committed
557
            },
XhmikosR's avatar
Dist    
XhmikosR committed
558
            arrow: {
Mark Otto's avatar
dist v5    
Mark Otto committed
559
              element: "." + this.constructor.NAME + "-arrow"
XhmikosR's avatar
Dist    
XhmikosR committed
560
561
562
563
564
565
566
            },
            preventOverflow: {
              boundariesElement: this.config.boundary
            }
          },
          onCreate: function onCreate(data) {
            if (data.originalPlacement !== data.placement) {
Johann-S's avatar
build    
Johann-S committed
567
568
              _this._handlePopperPlacementChange(data);
            }
XhmikosR's avatar
Dist    
XhmikosR committed
569
570
          },
          onUpdate: function onUpdate(data) {
XhmikosR's avatar
Dist    
XhmikosR committed
571
            return _this._handlePopperPlacementChange(data);
Johann-S's avatar
build    
Johann-S committed
572
          }
XhmikosR's avatar
Dist    
XhmikosR committed
573
        });
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

XhmikosR's avatar
Dist    
XhmikosR committed
609
610
    _proto.hide = function hide(callback) {
      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

XhmikosR's avatar
Dist    
XhmikosR committed
625
626
627
        if (_this2._popper !== null) {
          _this2._popper.destroy();
        }
628

XhmikosR's avatar
Dist    
XhmikosR committed
629
630
631
632
        if (callback) {
          callback();
        }
      };
Mark Otto's avatar
grunt    
Mark Otto committed
633

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

XhmikosR's avatar
XhmikosR committed
636
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
637
638
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
639

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

XhmikosR's avatar
Dist    
XhmikosR committed
643
      if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
644
645
646
        makeArray(document.body.children).forEach(function (element) {
          return EventHandler.off(element, 'mouseover', noop);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
647
      }
Mark Otto's avatar
dist    
Mark Otto committed
648

XhmikosR's avatar
Dist    
XhmikosR committed
649
650
651
      this._activeTrigger[Trigger.CLICK] = false;
      this._activeTrigger[Trigger.FOCUS] = false;
      this._activeTrigger[Trigger.HOVER] = false;
Mark Otto's avatar
dist    
Mark Otto committed
652

XhmikosR's avatar
XhmikosR committed
653
654
655
656
      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
657
658
659
      } else {
        complete();
      }
Mark Otto's avatar
dist    
Mark Otto committed
660

XhmikosR's avatar
Dist    
XhmikosR committed
661
662
      this._hoverState = '';
    };
Mark Otto's avatar
dist    
Mark Otto committed
663

XhmikosR's avatar
Dist    
XhmikosR committed
664
665
666
667
    _proto.update = function update() {
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
668
669
    } // Protected
    ;
Mark Otto's avatar
dist    
Mark Otto committed
670

XhmikosR's avatar
Dist    
XhmikosR committed
671
672
673
    _proto.isWithContent = function isWithContent() {
      return Boolean(this.getTitle());
    };
Mark Otto's avatar
dist    
Mark Otto committed
674

XhmikosR's avatar
Dist    
XhmikosR committed
675
    _proto.addAttachmentClass = function addAttachmentClass(attachment) {
XhmikosR's avatar
XhmikosR committed
676
      this.getTipElement().classList.add(CLASS_PREFIX + "-" + attachment);
XhmikosR's avatar
Dist    
XhmikosR committed
677
    };
Mark Otto's avatar
dist    
Mark Otto committed
678

XhmikosR's avatar
Dist    
XhmikosR committed
679
    _proto.getTipElement = function getTipElement() {
XhmikosR's avatar
XhmikosR committed
680
681
682
683
684
685
686
      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
687
688
      return this.tip;
    };
Mark Otto's avatar
dist    
Mark Otto committed
689

XhmikosR's avatar
Dist    
XhmikosR committed
690
691
    _proto.setContent = function setContent() {
      var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
692
693
694
      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
695
    };
Mark Otto's avatar
dist    
Mark Otto committed
696

XhmikosR's avatar
XhmikosR committed
697
698
699
700
701
    _proto.setElementContent = function setElementContent(element, content) {
      if (element === null) {
        return;
      }

XhmikosR's avatar
Dist    
XhmikosR committed
702
      if (typeof content === 'object' && (content.nodeType || content.jquery)) {
XhmikosR's avatar
XhmikosR committed
703
704
705
706
707
        if (content.jquery) {
          content = content[0];
        } // content is a DOM node or a jQuery


XhmikosR's avatar
XhmikosR committed
708
        if (this.config.html) {
XhmikosR's avatar
XhmikosR committed
709
710
711
          if (content.parentNode !== element) {
            element.innerHTML = '';
            element.appendChild(content);
XhmikosR's avatar
XhmikosR committed
712
713
          }
        } else {
XhmikosR's avatar
XhmikosR committed
714
          element.innerText = content.textContent;
XhmikosR's avatar
XhmikosR committed
715
        }
XhmikosR's avatar
XhmikosR committed
716
717
718
719
720
721
722
723
724

        return;
      }

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

XhmikosR's avatar
XhmikosR committed
725
        element.innerHTML = content;
XhmikosR's avatar
Dist    
XhmikosR committed
726
      } else {
XhmikosR's avatar
XhmikosR committed
727
        element.innerText = content;
XhmikosR's avatar
Dist    
XhmikosR committed
728
729
      }
    };
730

XhmikosR's avatar
Dist    
XhmikosR committed
731
732
    _proto.getTitle = function getTitle() {
      var title = this.element.getAttribute('data-original-title');
733

XhmikosR's avatar
Dist    
XhmikosR committed
734
735
736
      if (!title) {
        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
      }
737

XhmikosR's avatar
Dist    
XhmikosR committed
738
      return title;
Mark Otto's avatar
Mark Otto committed
739
740
    } // Private
    ;
Mark Otto's avatar
grunt    
Mark Otto committed
741

Mark Otto's avatar
Mark Otto committed
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
    _proto._getOffset = function _getOffset() {
      var _this3 = this;

      var offset = {};

      if (typeof this.config.offset === 'function') {
        offset.fn = function (data) {
          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});
          return data;
        };
      } else {
        offset.offset = this.config.offset;
      }

      return offset;
    };

Mark Otto's avatar
dist    
Mark Otto committed
759
760
761
762
763
    _proto._getContainer = function _getContainer() {
      if (this.config.container === false) {
        return document.body;
      }

XhmikosR's avatar
XhmikosR committed
764
765
      if (isElement(this.config.container)) {
        return this.config.container;
Mark Otto's avatar
dist    
Mark Otto committed
766
767
      }

XhmikosR's avatar
XhmikosR committed
768
      return SelectorEngine.findOne(this.config.container);
Mark Otto's avatar
dist    
Mark Otto committed
769
770
    };

XhmikosR's avatar
Dist    
XhmikosR committed
771
772
773
    _proto._getAttachment = function _getAttachment(placement) {
      return AttachmentMap[placement.toUpperCase()];
    };
Mark Otto's avatar
dist    
Mark Otto committed
774

XhmikosR's avatar
Dist    
XhmikosR committed
775
    _proto._setListeners = function _setListeners() {
Mark Otto's avatar
Mark Otto committed
776
      var _this4 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
777

XhmikosR's avatar
Dist    
XhmikosR committed
778
779
780
      var triggers = this.config.trigger.split(' ');
      triggers.forEach(function (trigger) {
        if (trigger === 'click') {
XhmikosR's avatar
XhmikosR committed
781
          EventHandler.on(_this4.element, _this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
782
            return _this4.toggle(event);
Mark Otto's avatar
dist    
Mark Otto committed
783
          });
XhmikosR's avatar
Dist    
XhmikosR committed
784
        } else if (trigger !== Trigger.MANUAL) {
Mark Otto's avatar
Mark Otto committed
785
786
          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;
          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;
XhmikosR's avatar
XhmikosR committed
787
          EventHandler.on(_this4.element, eventIn, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
788
            return _this4._enter(event);
XhmikosR's avatar
XhmikosR committed
789
790
          });
          EventHandler.on(_this4.element, eventOut, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
791
            return _this4._leave(event);
Mark Otto's avatar
dist    
Mark Otto committed
792
793
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
794
      });
Mark Otto's avatar
dist v5    
Mark Otto committed
795
796

      this._hideModalHandler = function () {
Mark Otto's avatar
Mark Otto committed
797
798
        if (_this4.element) {
          _this4.hide();
XhmikosR's avatar
Dist    
XhmikosR committed
799
        }
Mark Otto's avatar
dist v5    
Mark Otto committed
800
801
802
      };

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

XhmikosR's avatar
Dist    
XhmikosR committed
804
805
806
807
808
809
810
811
812
      if (this.config.selector) {
        this.config = _objectSpread({}, this.config, {
          trigger: 'manual',
          selector: ''
        });
      } else {
        this._fixTitle();
      }
    };
813

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

XhmikosR's avatar
Dist    
XhmikosR committed
817
818
819
820
821
      if (this.element.getAttribute('title') || titleType !== 'string') {
        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
        this.element.setAttribute('title', '');
      }
    };
822

XhmikosR's avatar
Dist    
XhmikosR committed
823
824
    _proto._enter = function _enter(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
825
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
grunt    
Mark Otto committed
826

XhmikosR's avatar
Dist    
XhmikosR committed
827
      if (!context) {
XhmikosR's avatar
XhmikosR committed
828
829
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
830
      }
Mark Otto's avatar
grunt    
Mark Otto committed
831

XhmikosR's avatar
Dist    
XhmikosR committed
832
833
834
      if (event) {
        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
      }
835

XhmikosR's avatar
XhmikosR committed
836
      if (context.getTipElement().classList.contains(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
Mark Otto's avatar
dist    
Mark Otto committed
837
        context._hoverState = HoverState.SHOW;
XhmikosR's avatar
Dist    
XhmikosR committed
838
839
840
841
842
        return;
      }

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

XhmikosR's avatar
Dist    
XhmikosR committed
844
845
846
847
848
849
850
      if (!context.config.delay || !context.config.delay.show) {
        context.show();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.SHOW) {
851
852
          context.show();
        }
XhmikosR's avatar
Dist    
XhmikosR committed
853
854
      }, context.config.delay.show);
    };
855

XhmikosR's avatar
Dist    
XhmikosR committed
856
857
    _proto._leave = function _leave(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
858
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
dist    
Mark Otto committed
859

XhmikosR's avatar
Dist    
XhmikosR committed
860
      if (!context) {
XhmikosR's avatar
XhmikosR committed
861
862
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
863
      }
Mark Otto's avatar
grunt    
Mark Otto committed
864

XhmikosR's avatar
Dist    
XhmikosR committed
865
866
867
      if (event) {
        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
      }
868

XhmikosR's avatar
Dist    
XhmikosR committed
869
870
871
      if (context._isWithActiveTrigger()) {
        return;
      }
872

XhmikosR's avatar
Dist    
XhmikosR committed
873
874
      clearTimeout(context._timeout);
      context._hoverState = HoverState.OUT;
875

XhmikosR's avatar
Dist    
XhmikosR committed
876
877
878
879
      if (!context.config.delay || !context.config.delay.hide) {
        context.hide();
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
880

XhmikosR's avatar
Dist    
XhmikosR committed
881
882
      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.OUT) {
Mark Otto's avatar
dist    
Mark Otto committed
883
          context.hide();
884
        }
XhmikosR's avatar
Dist    
XhmikosR committed
885
886
      }, context.config.delay.hide);
    };
887

XhmikosR's avatar
Dist    
XhmikosR committed
888
889
890
891
    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
      for (var trigger in this._activeTrigger) {
        if (this._activeTrigger[trigger]) {
          return true;
Mark Otto's avatar
dist    
Mark Otto committed
892
        }
XhmikosR's avatar
Dist    
XhmikosR committed
893
      }
Mark Otto's avatar
grunt    
Mark Otto committed
894

XhmikosR's avatar
Dist    
XhmikosR committed
895
896
      return false;
    };
fat's avatar
fat committed
897

XhmikosR's avatar
Dist    
XhmikosR committed
898
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
899
      var dataAttributes = Manipulator.getDataAttributes(this.element);
XhmikosR's avatar
XhmikosR committed
900
901
902
903
904
      Object.keys(dataAttributes).forEach(function (dataAttr) {
        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
          delete dataAttributes[dataAttr];
        }
      });
XhmikosR's avatar
XhmikosR committed
905
906
907
908
909

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

XhmikosR's avatar
XhmikosR committed
910
      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});
Mark Otto's avatar
grunt    
Mark Otto committed
911

XhmikosR's avatar
Dist    
XhmikosR committed
912
913
914
915
916
917
      if (typeof config.delay === 'number') {
        config.delay = {
          show: config.delay,
          hide: config.delay
        };
      }
Mark Otto's avatar
grunt    
Mark Otto committed
918

XhmikosR's avatar
Dist    
XhmikosR committed
919
920
921
      if (typeof config.title === 'number') {
        config.title = config.title.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
922

XhmikosR's avatar
Dist    
XhmikosR committed
923
924
925
      if (typeof config.content === 'number') {
        config.content = config.content.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
926

XhmikosR's avatar
XhmikosR committed
927
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
XhmikosR committed
928
929
930
931
932

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

XhmikosR's avatar
Dist    
XhmikosR committed
933
934
      return config;
    };
Mark Otto's avatar
grunt    
Mark Otto committed
935

XhmikosR's avatar
Dist    
XhmikosR committed
936
937
    _proto._getDelegateConfig = function _getDelegateConfig() {
      var config = {};
Mark Otto's avatar
grunt    
Mark Otto committed
938

XhmikosR's avatar
Dist    
XhmikosR committed
939
940
941
942
      if (this.config) {
        for (var key in this.config) {
          if (this.constructor.Default[key] !== this.config[key]) {
            config[key] = this.config[key];
943
944
          }
        }
XhmikosR's avatar
Dist    
XhmikosR committed
945
      }
Mark Otto's avatar
dist    
Mark Otto committed
946

XhmikosR's avatar
Dist    
XhmikosR committed
947
948
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
949

XhmikosR's avatar
Dist    
XhmikosR committed
950
    _proto._cleanTipClass = function _cleanTipClass() {
XhmikosR's avatar
XhmikosR committed
951
952
      var tip = this.getTipElement();
      var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
Mark Otto's avatar
dist    
Mark Otto committed
953

XhmikosR's avatar
Dist    
XhmikosR committed
954
      if (tabClass !== null && tabClass.length) {
XhmikosR's avatar
XhmikosR committed
955
956
957
958
959
        tabClass.map(function (token) {
          return token.trim();
        }).forEach(function (tClass) {
          return tip.classList.remove(tClass);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
960
961
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
962

XhmikosR's avatar
Dist    
XhmikosR committed
963
964
965
    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
      var popperInstance = popperData.instance;
      this.tip = popperInstance.popper;
Mark Otto's avatar
dist    
Mark Otto committed
966

XhmikosR's avatar
Dist    
XhmikosR committed
967
      this._cleanTipClass();
Mark Otto's avatar
dist    
Mark Otto committed
968

XhmikosR's avatar
Dist    
XhmikosR committed
969
970
      this.addAttachmentClass(this._getAttachment(popperData.placement));
    };
Mark Otto's avatar
dist    
Mark Otto committed
971

XhmikosR's avatar
Dist    
XhmikosR committed
972
973
974
    _proto._fixTransition = function _fixTransition() {
      var tip = this.getTipElement();
      var initConfigAnimation = this.config.animation;
Mark Otto's avatar
dist    
Mark Otto committed
975

XhmikosR's avatar
Dist    
XhmikosR committed
976
977
978
      if (tip.getAttribute('x-placement') !== null) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
979

XhmikosR's avatar
XhmikosR committed
980
      tip.classList.remove(ClassName.FADE);
XhmikosR's avatar
Dist    
XhmikosR committed
981
982
983
984
      this.config.animation = false;
      this.hide();
      this.show();
      this.config.animation = initConfigAnimation;
Mark Otto's avatar
Mark Otto committed
985
986
    } // Static
    ;
Mark Otto's avatar
dist    
Mark Otto committed
987

XhmikosR's avatar
Dist    
XhmikosR committed
988
989
    Tooltip._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
990
        var data = Data.getData(this, DATA_KEY);
Mark Otto's avatar
dist    
Mark Otto committed
991

XhmikosR's avatar
Dist    
XhmikosR committed
992
        var _config = typeof config === 'object' && config;
Mark Otto's avatar
dist    
Mark Otto committed
993

XhmikosR's avatar
Dist    
XhmikosR committed
994
995
996
        if (!data && /dispose|hide/.test(config)) {
          return;
        }
Mark Otto's avatar
dist    
Mark Otto committed
997

XhmikosR's avatar
Dist    
XhmikosR committed
998
999
1000
        if (!data) {
          data = new Tooltip(this, _config);
        }
For faster browsing, not all history is shown. View entire blame