tooltip.js 32.2 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
91
   * 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
92
93
  var _window = window,
      jQuery = _window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
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
136
137

  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
138
139
140
    var evt = document.createEvent('HTMLEvents');
    evt.initEvent(TRANSITION_END, true, true);
    element.dispatchEvent(evt);
XhmikosR's avatar
XhmikosR committed
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
211
212
213
214
215
  };

  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
216
217
218
219
220
   * 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
221
222
223
224
225
226
227
228
229
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
  /**
   * 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
260
261
262
263
264
265
266
267
268
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
  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
294
    if (!unsafeHtml.length) {
XhmikosR's avatar
XhmikosR committed
295
296
297
298
299
300
301
302
303
304
      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
305
    var elements = makeArray(createdDocument.body.querySelectorAll('*'));
XhmikosR's avatar
XhmikosR committed
306
307
308
309
310

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

XhmikosR's avatar
XhmikosR committed
311
      if (whitelistKeys.indexOf(elName) === -1) {
XhmikosR's avatar
XhmikosR committed
312
313
314
315
        el.parentNode.removeChild(el);
        return "continue";
      }

XhmikosR's avatar
XhmikosR committed
316
      var attributeList = makeArray(el.attributes);
XhmikosR's avatar
XhmikosR committed
317
318
319
320
321
322
323
324
325
      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++) {
326
      var _ret = _loop(i);
XhmikosR's avatar
XhmikosR committed
327
328
329
330
331
332
333

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

    return createdDocument.body.innerHTML;
  }

XhmikosR's avatar
Dist    
XhmikosR committed
334
335
336
337
338
339
340
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

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

  };

  var Tooltip =
  /*#__PURE__*/
  function () {
    function Tooltip(element, config) {
Mark Otto's avatar
dist    
Mark Otto committed
428
      /**
XhmikosR's avatar
Dist    
XhmikosR committed
429
430
       * Check for Popper dependency
       * Popper - https://popper.js.org
Mark Otto's avatar
dist    
Mark Otto committed
431
       */
XhmikosR's avatar
Dist    
XhmikosR committed
432
      if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
433
        throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
434
      } // private
Mark Otto's avatar
dist    
Mark Otto committed
435
436


XhmikosR's avatar
Dist    
XhmikosR committed
437
438
439
440
441
      this._isEnabled = true;
      this._timeout = 0;
      this._hoverState = '';
      this._activeTrigger = {};
      this._popper = null; // Protected
442

XhmikosR's avatar
Dist    
XhmikosR committed
443
444
445
      this.element = element;
      this.config = this._getConfig(config);
      this.tip = null;
446

XhmikosR's avatar
Dist    
XhmikosR committed
447
      this._setListeners();
XhmikosR's avatar
XhmikosR committed
448
449

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

Jacob Thornton's avatar
Jacob Thornton committed
452

XhmikosR's avatar
Dist    
XhmikosR committed
453
    var _proto = Tooltip.prototype;
454

XhmikosR's avatar
Dist    
XhmikosR committed
455
456
457
458
    // Public
    _proto.enable = function enable() {
      this._isEnabled = true;
    };
459

XhmikosR's avatar
Dist    
XhmikosR committed
460
461
462
    _proto.disable = function disable() {
      this._isEnabled = false;
    };
463

XhmikosR's avatar
Dist    
XhmikosR committed
464
465
466
    _proto.toggleEnabled = function toggleEnabled() {
      this._isEnabled = !this._isEnabled;
    };
Mark Otto's avatar
dist    
Mark Otto committed
467

XhmikosR's avatar
Dist    
XhmikosR committed
468
469
470
471
    _proto.toggle = function toggle(event) {
      if (!this._isEnabled) {
        return;
      }
Mark Otto's avatar
Mark Otto committed
472

XhmikosR's avatar
Dist    
XhmikosR committed
473
474
      if (event) {
        var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
475
        var context = Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
Mark Otto committed
476

XhmikosR's avatar
Dist    
XhmikosR committed
477
        if (!context) {
XhmikosR's avatar
XhmikosR committed
478
479
          context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
          Data.setData(event.delegateTarget, dataKey, context);
Mark Otto's avatar
dist    
Mark Otto committed
480
        }
fat's avatar
fat committed
481

XhmikosR's avatar
Dist    
XhmikosR committed
482
        context._activeTrigger.click = !context._activeTrigger.click;
fat's avatar
fat committed
483

XhmikosR's avatar
Dist    
XhmikosR committed
484
485
        if (context._isWithActiveTrigger()) {
          context._enter(null, context);
Mark Otto's avatar
grunt    
Mark Otto committed
486
        } else {
XhmikosR's avatar
Dist    
XhmikosR committed
487
488
489
          context._leave(null, context);
        }
      } else {
XhmikosR's avatar
XhmikosR committed
490
        if (this.getTipElement().classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
491
          this._leave(null, this);
492

XhmikosR's avatar
Dist    
XhmikosR committed
493
          return;
Mark Otto's avatar
dist    
Mark Otto committed
494
        }
495

XhmikosR's avatar
Dist    
XhmikosR committed
496
497
498
499
500
501
        this._enter(null, this);
      }
    };

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

XhmikosR's avatar
Dist    
XhmikosR committed
506
      if (this.tip) {
XhmikosR's avatar
XhmikosR committed
507
        this.tip.parentNode.removeChild(this.tip);
XhmikosR's avatar
Dist    
XhmikosR committed
508
      }
509

XhmikosR's avatar
Dist    
XhmikosR committed
510
511
512
513
      this._isEnabled = null;
      this._timeout = null;
      this._hoverState = null;
      this._activeTrigger = null;
514

XhmikosR's avatar
Dist    
XhmikosR committed
515
516
517
      if (this._popper !== null) {
        this._popper.destroy();
      }
518

XhmikosR's avatar
Dist    
XhmikosR committed
519
520
521
522
523
      this._popper = null;
      this.element = null;
      this.config = null;
      this.tip = null;
    };
524

XhmikosR's avatar
Dist    
XhmikosR committed
525
526
    _proto.show = function show() {
      var _this = this;
527

XhmikosR's avatar
XhmikosR committed
528
      if (this.element.style.display === 'none') {
XhmikosR's avatar
Dist    
XhmikosR committed
529
530
        throw new Error('Please use show on visible elements');
      }
531

XhmikosR's avatar
Dist    
XhmikosR committed
532
      if (this.isWithContent() && this._isEnabled) {
XhmikosR's avatar
XhmikosR committed
533
534
        var showEvent = EventHandler.trigger(this.element, this.constructor.Event.SHOW);
        var shadowRoot = findShadowRoot(this.element);
XhmikosR's avatar
Dist.    
XhmikosR committed
535
        var isInTheDom = shadowRoot === null ? this.element.ownerDocument.documentElement.contains(this.element) : shadowRoot.contains(this.element);
536

XhmikosR's avatar
XhmikosR committed
537
        if (showEvent.defaultPrevented || !isInTheDom) {
XhmikosR's avatar
Dist    
XhmikosR committed
538
539
          return;
        }
540

XhmikosR's avatar
Dist    
XhmikosR committed
541
        var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
542
        var tipId = getUID(this.constructor.NAME);
XhmikosR's avatar
Dist    
XhmikosR committed
543
544
545
        tip.setAttribute('id', tipId);
        this.element.setAttribute('aria-describedby', tipId);
        this.setContent();
546

XhmikosR's avatar
Dist    
XhmikosR committed
547
        if (this.config.animation) {
XhmikosR's avatar
XhmikosR committed
548
          tip.classList.add(ClassName.FADE);
XhmikosR's avatar
Dist    
XhmikosR committed
549
        }
550

XhmikosR's avatar
Dist    
XhmikosR committed
551
        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
552

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

555
        this._addAttachmentClass(attachment);
Mark Otto's avatar
dist    
Mark Otto committed
556
557
558

        var container = this._getContainer();

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

XhmikosR's avatar
XhmikosR committed
561
562
        if (!this.element.ownerDocument.documentElement.contains(this.tip)) {
          container.appendChild(tip);
XhmikosR's avatar
Dist    
XhmikosR committed
563
        }
Mark Otto's avatar
grunt    
Mark Otto committed
564

XhmikosR's avatar
XhmikosR committed
565
        EventHandler.trigger(this.element, this.constructor.Event.INSERTED);
XhmikosR's avatar
Dist    
XhmikosR committed
566
567
568
        this._popper = new Popper(this.element, tip, {
          placement: attachment,
          modifiers: {
Mark Otto's avatar
Mark Otto committed
569
            offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
570
571
            flip: {
              behavior: this.config.fallbackPlacement
Mark Otto's avatar
dist    
Mark Otto committed
572
            },
XhmikosR's avatar
Dist    
XhmikosR committed
573
            arrow: {
Mark Otto's avatar
dist v5    
Mark Otto committed
574
              element: "." + this.constructor.NAME + "-arrow"
XhmikosR's avatar
Dist    
XhmikosR committed
575
576
577
578
579
580
581
            },
            preventOverflow: {
              boundariesElement: this.config.boundary
            }
          },
          onCreate: function onCreate(data) {
            if (data.originalPlacement !== data.placement) {
Johann-S's avatar
build    
Johann-S committed
582
583
              _this._handlePopperPlacementChange(data);
            }
XhmikosR's avatar
Dist    
XhmikosR committed
584
585
          },
          onUpdate: function onUpdate(data) {
XhmikosR's avatar
Dist    
XhmikosR committed
586
            return _this._handlePopperPlacementChange(data);
Johann-S's avatar
build    
Johann-S committed
587
          }
XhmikosR's avatar
Dist    
XhmikosR committed
588
        });
XhmikosR's avatar
XhmikosR committed
589
        tip.classList.add(ClassName.SHOW); // If this is a touch-enabled device we add extra
XhmikosR's avatar
Dist    
XhmikosR committed
590
591
592
        // 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
593

XhmikosR's avatar
Dist    
XhmikosR committed
594
        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
595
596
597
          makeArray(document.body.children).forEach(function (element) {
            EventHandler.on(element, 'mouseover', noop());
          });
XhmikosR's avatar
Dist    
XhmikosR committed
598
        }
Mark Otto's avatar
build    
Mark Otto committed
599

XhmikosR's avatar
Dist    
XhmikosR committed
600
601
602
603
        var complete = function complete() {
          if (_this.config.animation) {
            _this._fixTransition();
          }
604

XhmikosR's avatar
Dist    
XhmikosR committed
605
606
          var prevHoverState = _this._hoverState;
          _this._hoverState = null;
XhmikosR's avatar
XhmikosR committed
607
          EventHandler.trigger(_this.element, _this.constructor.Event.SHOWN);
608

XhmikosR's avatar
Dist    
XhmikosR committed
609
610
          if (prevHoverState === HoverState.OUT) {
            _this._leave(null, _this);
611
          }
XhmikosR's avatar
Dist    
XhmikosR committed
612
613
        };

XhmikosR's avatar
XhmikosR committed
614
615
616
617
        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
618
619
        } else {
          complete();
620
        }
XhmikosR's avatar
Dist    
XhmikosR committed
621
622
      }
    };
623

624
    _proto.hide = function hide() {
XhmikosR's avatar
Dist    
XhmikosR committed
625
      var _this2 = this;
626

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

XhmikosR's avatar
Dist    
XhmikosR committed
629
630
631
632
      var complete = function complete() {
        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
          tip.parentNode.removeChild(tip);
        }
633

XhmikosR's avatar
Dist    
XhmikosR committed
634
        _this2._cleanTipClass();
Mark Otto's avatar
grunt    
Mark Otto committed
635

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

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

640
        _this2._popper.destroy();
XhmikosR's avatar
Dist    
XhmikosR committed
641
      };
Mark Otto's avatar
grunt    
Mark Otto committed
642

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

XhmikosR's avatar
XhmikosR committed
645
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
646
647
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
648

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

XhmikosR's avatar
Dist    
XhmikosR committed
652
      if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
653
654
655
        makeArray(document.body.children).forEach(function (element) {
          return EventHandler.off(element, 'mouseover', noop);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
656
      }
Mark Otto's avatar
dist    
Mark Otto committed
657

XhmikosR's avatar
Dist    
XhmikosR committed
658
659
660
      this._activeTrigger[Trigger.CLICK] = false;
      this._activeTrigger[Trigger.FOCUS] = false;
      this._activeTrigger[Trigger.HOVER] = false;
Mark Otto's avatar
dist    
Mark Otto committed
661

XhmikosR's avatar
XhmikosR committed
662
663
664
665
      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
666
667
668
      } else {
        complete();
      }
Mark Otto's avatar
dist    
Mark Otto committed
669

XhmikosR's avatar
Dist    
XhmikosR committed
670
671
      this._hoverState = '';
    };
Mark Otto's avatar
dist    
Mark Otto committed
672

XhmikosR's avatar
Dist    
XhmikosR committed
673
674
675
676
    _proto.update = function update() {
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
677
678
    } // Protected
    ;
Mark Otto's avatar
dist    
Mark Otto committed
679

XhmikosR's avatar
Dist    
XhmikosR committed
680
681
682
    _proto.isWithContent = function isWithContent() {
      return Boolean(this.getTitle());
    };
Mark Otto's avatar
dist    
Mark Otto committed
683

XhmikosR's avatar
Dist    
XhmikosR committed
684
    _proto.getTipElement = function getTipElement() {
XhmikosR's avatar
XhmikosR committed
685
686
687
688
689
690
691
      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
692
693
      return this.tip;
    };
Mark Otto's avatar
dist    
Mark Otto committed
694

XhmikosR's avatar
Dist    
XhmikosR committed
695
696
    _proto.setContent = function setContent() {
      var tip = this.getTipElement();
XhmikosR's avatar
XhmikosR committed
697
698
699
      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
700
    };
Mark Otto's avatar
dist    
Mark Otto committed
701

XhmikosR's avatar
XhmikosR committed
702
703
704
705
706
    _proto.setElementContent = function setElementContent(element, content) {
      if (element === null) {
        return;
      }

707
      if (typeof content === 'object' && isElement(content)) {
XhmikosR's avatar
XhmikosR committed
708
709
710
711
712
        if (content.jquery) {
          content = content[0];
        } // content is a DOM node or a jQuery


XhmikosR's avatar
XhmikosR committed
713
        if (this.config.html) {
XhmikosR's avatar
XhmikosR committed
714
715
716
          if (content.parentNode !== element) {
            element.innerHTML = '';
            element.appendChild(content);
XhmikosR's avatar
XhmikosR committed
717
718
          }
        } else {
XhmikosR's avatar
XhmikosR committed
719
          element.innerText = content.textContent;
XhmikosR's avatar
XhmikosR committed
720
        }
XhmikosR's avatar
XhmikosR committed
721
722
723
724
725
726
727
728
729

        return;
      }

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

XhmikosR's avatar
XhmikosR committed
730
        element.innerHTML = content;
XhmikosR's avatar
Dist    
XhmikosR committed
731
      } else {
XhmikosR's avatar
XhmikosR committed
732
        element.innerText = content;
XhmikosR's avatar
Dist    
XhmikosR committed
733
734
      }
    };
735

XhmikosR's avatar
Dist    
XhmikosR committed
736
737
    _proto.getTitle = function getTitle() {
      var title = this.element.getAttribute('data-original-title');
738

XhmikosR's avatar
Dist    
XhmikosR committed
739
740
741
      if (!title) {
        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
      }
742

XhmikosR's avatar
Dist    
XhmikosR committed
743
      return title;
Mark Otto's avatar
Mark Otto committed
744
745
    } // Private
    ;
Mark Otto's avatar
grunt    
Mark Otto committed
746

747
748
749
750
    _proto._addAttachmentClass = function _addAttachmentClass(attachment) {
      this.getTipElement().classList.add(CLASS_PREFIX + "-" + attachment);
    };

Mark Otto's avatar
Mark Otto committed
751
752
753
754
755
756
757
    _proto._getOffset = function _getOffset() {
      var _this3 = this;

      var offset = {};

      if (typeof this.config.offset === 'function') {
        offset.fn = function (data) {
758
          data.offsets = _objectSpread2({}, data.offsets, {}, _this3.config.offset(data.offsets, _this3.element) || {});
Mark Otto's avatar
Mark Otto committed
759
760
761
762
763
764
765
766
767
          return data;
        };
      } else {
        offset.offset = this.config.offset;
      }

      return offset;
    };

Mark Otto's avatar
dist    
Mark Otto committed
768
769
770
771
772
    _proto._getContainer = function _getContainer() {
      if (this.config.container === false) {
        return document.body;
      }

XhmikosR's avatar
XhmikosR committed
773
774
      if (isElement(this.config.container)) {
        return this.config.container;
Mark Otto's avatar
dist    
Mark Otto committed
775
776
      }

XhmikosR's avatar
XhmikosR committed
777
      return SelectorEngine.findOne(this.config.container);
Mark Otto's avatar
dist    
Mark Otto committed
778
779
    };

XhmikosR's avatar
Dist    
XhmikosR committed
780
781
782
    _proto._getAttachment = function _getAttachment(placement) {
      return AttachmentMap[placement.toUpperCase()];
    };
Mark Otto's avatar
dist    
Mark Otto committed
783

XhmikosR's avatar
Dist    
XhmikosR committed
784
    _proto._setListeners = function _setListeners() {
Mark Otto's avatar
Mark Otto committed
785
      var _this4 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
786

XhmikosR's avatar
Dist    
XhmikosR committed
787
788
789
      var triggers = this.config.trigger.split(' ');
      triggers.forEach(function (trigger) {
        if (trigger === 'click') {
XhmikosR's avatar
XhmikosR committed
790
          EventHandler.on(_this4.element, _this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
791
            return _this4.toggle(event);
Mark Otto's avatar
dist    
Mark Otto committed
792
          });
XhmikosR's avatar
Dist    
XhmikosR committed
793
        } else if (trigger !== Trigger.MANUAL) {
Mark Otto's avatar
Mark Otto committed
794
795
          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
796
          EventHandler.on(_this4.element, eventIn, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
797
            return _this4._enter(event);
XhmikosR's avatar
XhmikosR committed
798
799
          });
          EventHandler.on(_this4.element, eventOut, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
800
            return _this4._leave(event);
Mark Otto's avatar
dist    
Mark Otto committed
801
802
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
803
      });
Mark Otto's avatar
dist v5    
Mark Otto committed
804
805

      this._hideModalHandler = function () {
Mark Otto's avatar
Mark Otto committed
806
807
        if (_this4.element) {
          _this4.hide();
XhmikosR's avatar
Dist    
XhmikosR committed
808
        }
Mark Otto's avatar
dist v5    
Mark Otto committed
809
810
811
      };

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

XhmikosR's avatar
Dist    
XhmikosR committed
813
      if (this.config.selector) {
814
        this.config = _objectSpread2({}, this.config, {
XhmikosR's avatar
Dist    
XhmikosR committed
815
816
817
818
819
820
821
          trigger: 'manual',
          selector: ''
        });
      } else {
        this._fixTitle();
      }
    };
822

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

XhmikosR's avatar
Dist    
XhmikosR committed
826
827
828
829
830
      if (this.element.getAttribute('title') || titleType !== 'string') {
        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
        this.element.setAttribute('title', '');
      }
    };
831

XhmikosR's avatar
Dist    
XhmikosR committed
832
833
    _proto._enter = function _enter(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
834
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
grunt    
Mark Otto committed
835

XhmikosR's avatar
Dist    
XhmikosR committed
836
      if (!context) {
XhmikosR's avatar
XhmikosR committed
837
838
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
839
      }
Mark Otto's avatar
grunt    
Mark Otto committed
840

XhmikosR's avatar
Dist    
XhmikosR committed
841
842
843
      if (event) {
        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
      }
844

XhmikosR's avatar
XhmikosR committed
845
      if (context.getTipElement().classList.contains(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
Mark Otto's avatar
dist    
Mark Otto committed
846
        context._hoverState = HoverState.SHOW;
XhmikosR's avatar
Dist    
XhmikosR committed
847
848
849
850
851
        return;
      }

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

XhmikosR's avatar
Dist    
XhmikosR committed
853
854
855
856
857
858
859
      if (!context.config.delay || !context.config.delay.show) {
        context.show();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.SHOW) {
860
861
          context.show();
        }
XhmikosR's avatar
Dist    
XhmikosR committed
862
863
      }, context.config.delay.show);
    };
864

XhmikosR's avatar
Dist    
XhmikosR committed
865
866
    _proto._leave = function _leave(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
867
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
dist    
Mark Otto committed
868

XhmikosR's avatar
Dist    
XhmikosR committed
869
      if (!context) {
XhmikosR's avatar
XhmikosR committed
870
871
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
872
      }
Mark Otto's avatar
grunt    
Mark Otto committed
873

XhmikosR's avatar
Dist    
XhmikosR committed
874
875
876
      if (event) {
        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
      }
877

XhmikosR's avatar
Dist    
XhmikosR committed
878
879
880
      if (context._isWithActiveTrigger()) {
        return;
      }
881

XhmikosR's avatar
Dist    
XhmikosR committed
882
883
      clearTimeout(context._timeout);
      context._hoverState = HoverState.OUT;
884

XhmikosR's avatar
Dist    
XhmikosR committed
885
886
887
888
      if (!context.config.delay || !context.config.delay.hide) {
        context.hide();
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
889

XhmikosR's avatar
Dist    
XhmikosR committed
890
891
      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.OUT) {
Mark Otto's avatar
dist    
Mark Otto committed
892
          context.hide();
893
        }
XhmikosR's avatar
Dist    
XhmikosR committed
894
895
      }, context.config.delay.hide);
    };
896

XhmikosR's avatar
Dist    
XhmikosR committed
897
898
899
900
    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
      for (var trigger in this._activeTrigger) {
        if (this._activeTrigger[trigger]) {
          return true;
Mark Otto's avatar
dist    
Mark Otto committed
901
        }
XhmikosR's avatar
Dist    
XhmikosR committed
902
      }
Mark Otto's avatar
grunt    
Mark Otto committed
903

XhmikosR's avatar
Dist    
XhmikosR committed
904
905
      return false;
    };
fat's avatar
fat committed
906

XhmikosR's avatar
Dist    
XhmikosR committed
907
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
908
      var dataAttributes = Manipulator.getDataAttributes(this.element);
XhmikosR's avatar
XhmikosR committed
909
910
911
912
913
      Object.keys(dataAttributes).forEach(function (dataAttr) {
        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
          delete dataAttributes[dataAttr];
        }
      });
XhmikosR's avatar
XhmikosR committed
914
915
916
917
918

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
921
922
923
924
925
926
      if (typeof config.delay === 'number') {
        config.delay = {
          show: config.delay,
          hide: config.delay
        };
      }
Mark Otto's avatar
grunt    
Mark Otto committed
927

XhmikosR's avatar
Dist    
XhmikosR committed
928
929
930
      if (typeof config.title === 'number') {
        config.title = config.title.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
931

XhmikosR's avatar
Dist    
XhmikosR committed
932
933
934
      if (typeof config.content === 'number') {
        config.content = config.content.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
935

XhmikosR's avatar
XhmikosR committed
936
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
XhmikosR committed
937
938
939
940
941

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

XhmikosR's avatar
Dist    
XhmikosR committed
942
943
      return config;
    };
Mark Otto's avatar
grunt    
Mark Otto committed
944

XhmikosR's avatar
Dist    
XhmikosR committed
945
946
    _proto._getDelegateConfig = function _getDelegateConfig() {
      var config = {};
Mark Otto's avatar
grunt    
Mark Otto committed
947

XhmikosR's avatar
Dist    
XhmikosR committed
948
949
950
951
      if (this.config) {
        for (var key in this.config) {
          if (this.constructor.Default[key] !== this.config[key]) {
            config[key] = this.config[key];
952
953
          }
        }
XhmikosR's avatar
Dist    
XhmikosR committed
954
      }
Mark Otto's avatar
dist    
Mark Otto committed
955

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

XhmikosR's avatar
Dist    
XhmikosR committed
959
    _proto._cleanTipClass = function _cleanTipClass() {
XhmikosR's avatar
XhmikosR committed
960
961
      var tip = this.getTipElement();
      var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
Mark Otto's avatar
dist    
Mark Otto committed
962

XhmikosR's avatar
Dist    
XhmikosR committed
963
      if (tabClass !== null && tabClass.length) {
XhmikosR's avatar
XhmikosR committed
964
965
966
967
968
        tabClass.map(function (token) {
          return token.trim();
        }).forEach(function (tClass) {
          return tip.classList.remove(tClass);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
969
970
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
971

XhmikosR's avatar
Dist    
XhmikosR committed
972
973
974
    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
      var popperInstance = popperData.instance;
      this.tip = popperInstance.popper;
Mark Otto's avatar
dist    
Mark Otto committed
975

XhmikosR's avatar
Dist    
XhmikosR committed
976
      this._cleanTipClass();
Mark Otto's avatar
dist    
Mark Otto committed
977

978
      this._addAttachmentClass(this._getAttachment(popperData.placement));
XhmikosR's avatar
Dist    
XhmikosR committed
979
    };
Mark Otto's avatar
dist    
Mark Otto committed
980

XhmikosR's avatar
Dist    
XhmikosR committed
981
982
983
    _proto._fixTransition = function _fixTransition() {
      var tip = this.getTipElement();
      var initConfigAnimation = this.config.animation;
Mark Otto's avatar
dist    
Mark Otto committed
984

XhmikosR's avatar
Dist    
XhmikosR committed
985
986
987
      if (tip.getAttribute('x-placement') !== null) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
988

XhmikosR's avatar
XhmikosR committed
989
      tip.classList.remove(ClassName.FADE);
XhmikosR's avatar
Dist    
XhmikosR committed
990
991
992
993
      this.config.animation = false;
      this.hide();
      this.show();
      this.config.animation = initConfigAnimation;
Mark Otto's avatar
Mark Otto committed
994
995
    } // Static
    ;
Mark Otto's avatar
dist    
Mark Otto committed
996

XhmikosR's avatar
Dist    
XhmikosR committed
997
998
    Tooltip._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
999
        var data = Data.getData(this, DATA_KEY);
Mark Otto's avatar
dist    
Mark Otto committed
1000

For faster browsing, not all history is shown. View entire blame