tooltip.js 31.7 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) {
XhmikosR's avatar
XhmikosR committed
7
8
9
10
11
12
13
14
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/eventHandler.js'), require('./dom/manipulator.js'), require('popper.js'), require('./dom/selectorEngine.js')) :
  typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/eventHandler.js', './dom/manipulator.js', 'popper.js', './dom/selectorEngine.js'], factory) :
  (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
77
78
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
123
124
125
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
   * 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';
  var jQuery = window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)

  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) {
    element.dispatchEvent(new Event(TRANSITION_END));
  };

  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
198
199
200
201
202
   * 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
203
204
205
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
  /**
   * 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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
  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
276
    if (!unsafeHtml.length) {
XhmikosR's avatar
XhmikosR committed
277
278
279
280
281
282
283
284
285
286
      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
287
    var elements = makeArray(createdDocument.body.querySelectorAll('*'));
XhmikosR's avatar
XhmikosR committed
288
289
290
291
292

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

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

XhmikosR's avatar
XhmikosR committed
298
      var attributeList = makeArray(el.attributes);
XhmikosR's avatar
XhmikosR committed
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
      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
316
317
318
319
320
321
322
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

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

  };

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


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

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

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

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

Jacob Thornton's avatar
Jacob Thornton committed
436

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

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

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

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

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

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

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

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

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

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

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

    _proto.dispose = function dispose() {
      clearTimeout(this._timeout);
XhmikosR's avatar
XhmikosR committed
486
487
488
      Data.removeData(this.element, this.constructor.DATA_KEY);
      EventHandler.off(this.element, this.constructor.EVENT_KEY);
      EventHandler.off(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal');
489

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

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

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

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

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

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

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

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

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

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

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

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

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

        var container = this._getContainer();

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

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

XhmikosR's avatar
XhmikosR committed
549
        EventHandler.trigger(this.element, this.constructor.Event.INSERTED);
XhmikosR's avatar
Dist    
XhmikosR committed
550
551
552
        this._popper = new Popper(this.element, tip, {
          placement: attachment,
          modifiers: {
Mark Otto's avatar
Mark Otto committed
553
            offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
554
555
            flip: {
              behavior: this.config.fallbackPlacement
Mark Otto's avatar
dist    
Mark Otto committed
556
            },
XhmikosR's avatar
Dist    
XhmikosR committed
557
            arrow: {
XhmikosR's avatar
XhmikosR committed
558
              element: Selector.TOOLTIP_ARROW
XhmikosR's avatar
Dist    
XhmikosR committed
559
560
561
562
563
564
565
            },
            preventOverflow: {
              boundariesElement: this.config.boundary
            }
          },
          onCreate: function onCreate(data) {
            if (data.originalPlacement !== data.placement) {
Johann-S's avatar
build    
Johann-S committed
566
567
              _this._handlePopperPlacementChange(data);
            }
XhmikosR's avatar
Dist    
XhmikosR committed
568
569
          },
          onUpdate: function onUpdate(data) {
XhmikosR's avatar
Dist    
XhmikosR committed
570
            return _this._handlePopperPlacementChange(data);
Johann-S's avatar
build    
Johann-S committed
571
          }
XhmikosR's avatar
Dist    
XhmikosR committed
572
        });
XhmikosR's avatar
XhmikosR committed
573
        tip.classList.add(ClassName.SHOW); // If this is a touch-enabled device we add extra
XhmikosR's avatar
Dist    
XhmikosR committed
574
575
576
        // 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
577

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

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

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

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

XhmikosR's avatar
XhmikosR committed
598
599
600
601
        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
602
603
        } else {
          complete();
604
        }
XhmikosR's avatar
Dist    
XhmikosR committed
605
606
      }
    };
607

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

        return;
      }

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

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

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

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

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

Mark Otto's avatar
Mark Otto committed
741
742
743
744
745
746
747
748
749
750
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) {
          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
758
759
760
761
762
    _proto._getContainer = function _getContainer() {
      if (this.config.container === false) {
        return document.body;
      }

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

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
777
778
779
      var triggers = this.config.trigger.split(' ');
      triggers.forEach(function (trigger) {
        if (trigger === 'click') {
XhmikosR's avatar
XhmikosR committed
780
          EventHandler.on(_this4.element, _this4.constructor.Event.CLICK, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
781
            return _this4.toggle(event);
Mark Otto's avatar
dist    
Mark Otto committed
782
          });
XhmikosR's avatar
Dist    
XhmikosR committed
783
        } else if (trigger !== Trigger.MANUAL) {
Mark Otto's avatar
Mark Otto committed
784
785
          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
786
          EventHandler.on(_this4.element, eventIn, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
787
            return _this4._enter(event);
XhmikosR's avatar
XhmikosR committed
788
789
          });
          EventHandler.on(_this4.element, eventOut, _this4.config.selector, function (event) {
Mark Otto's avatar
Mark Otto committed
790
            return _this4._leave(event);
Mark Otto's avatar
dist    
Mark Otto committed
791
792
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
793
      });
XhmikosR's avatar
XhmikosR committed
794
      EventHandler.on(SelectorEngine.closest(this.element, '.modal'), 'hide.bs.modal', function () {
Mark Otto's avatar
Mark Otto committed
795
796
        if (_this4.element) {
          _this4.hide();
XhmikosR's avatar
Dist    
XhmikosR committed
797
798
        }
      });
Mark Otto's avatar
dist    
Mark Otto committed
799

XhmikosR's avatar
Dist    
XhmikosR committed
800
801
802
803
804
805
806
807
808
      if (this.config.selector) {
        this.config = _objectSpread({}, this.config, {
          trigger: 'manual',
          selector: ''
        });
      } else {
        this._fixTitle();
      }
    };
809

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

XhmikosR's avatar
Dist    
XhmikosR committed
813
814
815
816
817
      if (this.element.getAttribute('title') || titleType !== 'string') {
        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
        this.element.setAttribute('title', '');
      }
    };
818

XhmikosR's avatar
Dist    
XhmikosR committed
819
820
    _proto._enter = function _enter(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
821
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
grunt    
Mark Otto committed
822

XhmikosR's avatar
Dist    
XhmikosR committed
823
      if (!context) {
XhmikosR's avatar
XhmikosR committed
824
825
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
826
      }
Mark Otto's avatar
grunt    
Mark Otto committed
827

XhmikosR's avatar
Dist    
XhmikosR committed
828
829
830
      if (event) {
        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
      }
831

XhmikosR's avatar
XhmikosR committed
832
      if (context.getTipElement().classList.contains(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
Mark Otto's avatar
dist    
Mark Otto committed
833
        context._hoverState = HoverState.SHOW;
XhmikosR's avatar
Dist    
XhmikosR committed
834
835
836
837
838
        return;
      }

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

XhmikosR's avatar
Dist    
XhmikosR committed
840
841
842
843
844
845
846
      if (!context.config.delay || !context.config.delay.show) {
        context.show();
        return;
      }

      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.SHOW) {
847
848
          context.show();
        }
XhmikosR's avatar
Dist    
XhmikosR committed
849
850
      }, context.config.delay.show);
    };
851

XhmikosR's avatar
Dist    
XhmikosR committed
852
853
    _proto._leave = function _leave(event, context) {
      var dataKey = this.constructor.DATA_KEY;
XhmikosR's avatar
XhmikosR committed
854
      context = context || Data.getData(event.delegateTarget, dataKey);
Mark Otto's avatar
dist    
Mark Otto committed
855

XhmikosR's avatar
Dist    
XhmikosR committed
856
      if (!context) {
XhmikosR's avatar
XhmikosR committed
857
858
        context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
        Data.setData(event.delegateTarget, dataKey, context);
XhmikosR's avatar
Dist    
XhmikosR committed
859
      }
Mark Otto's avatar
grunt    
Mark Otto committed
860

XhmikosR's avatar
Dist    
XhmikosR committed
861
862
863
      if (event) {
        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
      }
864

XhmikosR's avatar
Dist    
XhmikosR committed
865
866
867
      if (context._isWithActiveTrigger()) {
        return;
      }
868

XhmikosR's avatar
Dist    
XhmikosR committed
869
870
      clearTimeout(context._timeout);
      context._hoverState = HoverState.OUT;
871

XhmikosR's avatar
Dist    
XhmikosR committed
872
873
874
875
      if (!context.config.delay || !context.config.delay.hide) {
        context.hide();
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
876

XhmikosR's avatar
Dist    
XhmikosR committed
877
878
      context._timeout = setTimeout(function () {
        if (context._hoverState === HoverState.OUT) {
Mark Otto's avatar
dist    
Mark Otto committed
879
          context.hide();
880
        }
XhmikosR's avatar
Dist    
XhmikosR committed
881
882
      }, context.config.delay.hide);
    };
883

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

XhmikosR's avatar
Dist    
XhmikosR committed
891
892
      return false;
    };
fat's avatar
fat committed
893

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
908
909
910
911
912
913
      if (typeof config.delay === 'number') {
        config.delay = {
          show: config.delay,
          hide: config.delay
        };
      }
Mark Otto's avatar
grunt    
Mark Otto committed
914

XhmikosR's avatar
Dist    
XhmikosR committed
915
916
917
      if (typeof config.title === 'number') {
        config.title = config.title.toString();
      }
Mark Otto's avatar
grunt    
Mark Otto committed
918

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

XhmikosR's avatar
XhmikosR committed
923
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
XhmikosR committed
924
925
926
927
928

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

XhmikosR's avatar
Dist    
XhmikosR committed
929
930
      return config;
    };
Mark Otto's avatar
grunt    
Mark Otto committed
931

XhmikosR's avatar
Dist    
XhmikosR committed
932
933
    _proto._getDelegateConfig = function _getDelegateConfig() {
      var config = {};
Mark Otto's avatar
grunt    
Mark Otto committed
934

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

XhmikosR's avatar
Dist    
XhmikosR committed
943
944
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
945

XhmikosR's avatar
Dist    
XhmikosR committed
946
    _proto._cleanTipClass = function _cleanTipClass() {
XhmikosR's avatar
XhmikosR committed
947
948
      var tip = this.getTipElement();
      var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
Mark Otto's avatar
dist    
Mark Otto committed
949

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

XhmikosR's avatar
Dist    
XhmikosR committed
959
960
961
    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
      var popperInstance = popperData.instance;
      this.tip = popperInstance.popper;
Mark Otto's avatar
dist    
Mark Otto committed
962

XhmikosR's avatar
Dist    
XhmikosR committed
963
      this._cleanTipClass();
Mark Otto's avatar
dist    
Mark Otto committed
964

XhmikosR's avatar
Dist    
XhmikosR committed
965
966
      this.addAttachmentClass(this._getAttachment(popperData.placement));
    };
Mark Otto's avatar
dist    
Mark Otto committed
967

XhmikosR's avatar
Dist    
XhmikosR committed
968
969
970
    _proto._fixTransition = function _fixTransition() {
      var tip = this.getTipElement();
      var initConfigAnimation = this.config.animation;
Mark Otto's avatar
dist    
Mark Otto committed
971

XhmikosR's avatar
Dist    
XhmikosR committed
972
973
974
      if (tip.getAttribute('x-placement') !== null) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
975

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

XhmikosR's avatar
Dist    
XhmikosR committed
984
985
    Tooltip._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
986
        var data = Data.getData(this, DATA_KEY);
Mark Otto's avatar
dist    
Mark Otto committed
987

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

XhmikosR's avatar
Dist    
XhmikosR committed
990
991
992
        if (!data && /dispose|hide/.test(config)) {
          return;
        }
Mark Otto's avatar
dist    
Mark Otto committed
993

XhmikosR's avatar
Dist    
XhmikosR committed
994
995
996
        if (!data) {
          data = new Tooltip(this, _config);
        }
Mark Otto's avatar
grunt    
Mark Otto committed
997

XhmikosR's avatar
Dist    
XhmikosR committed
998
999
1000
        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
For faster browsing, not all history is shown. View entire blame