bootstrap 4.6.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/README.md +7 -4
- data/assets/javascripts/bootstrap/alert.js +192 -112
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +96 -176
- data/assets/javascripts/bootstrap/carousel.js +470 -355
- data/assets/javascripts/bootstrap/collapse.js +377 -221
- data/assets/javascripts/bootstrap/dom/data.js +68 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
- data/assets/javascripts/bootstrap/dropdown.js +470 -351
- data/assets/javascripts/bootstrap/modal.js +611 -435
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +137 -165
- data/assets/javascripts/bootstrap/scrollspy.js +249 -191
- data/assets/javascripts/bootstrap/tab.js +241 -141
- data/assets/javascripts/bootstrap/toast.js +221 -153
- data/assets/javascripts/bootstrap/tooltip.js +649 -483
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +14 -7
- data/assets/javascripts/bootstrap.js +3272 -2586
- data/assets/javascripts/bootstrap.min.js +2 -2
- data/assets/stylesheets/_bootstrap-grid.scss +51 -16
- data/assets/stylesheets/_bootstrap-reboot.scss +4 -1
- data/assets/stylesheets/_bootstrap.scss +16 -8
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -10
- data/assets/stylesheets/bootstrap/_badge.scss +2 -27
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
- data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
- data/assets/stylesheets/bootstrap/_buttons.scss +29 -60
- data/assets/stylesheets/bootstrap/_card.scss +20 -91
- data/assets/stylesheets/bootstrap/_carousel.scss +64 -35
- data/assets/stylesheets/bootstrap/_close.scss +30 -30
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +84 -36
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +84 -69
- data/assets/stylesheets/bootstrap/_grid.scss +3 -54
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_images.scss +1 -1
- data/assets/stylesheets/bootstrap/_list-group.scss +28 -8
- data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
- data/assets/stylesheets/bootstrap/_modal.scss +45 -57
- data/assets/stylesheets/bootstrap/_nav.scss +23 -4
- data/assets/stylesheets/bootstrap/_navbar.scss +45 -71
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
- data/assets/stylesheets/bootstrap/_popover.scss +24 -36
- data/assets/stylesheets/bootstrap/_progress.scss +5 -4
- data/assets/stylesheets/bootstrap/_reboot.scss +316 -179
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +9 -5
- data/assets/stylesheets/bootstrap/_tables.scss +79 -114
- data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
- data/assets/stylesheets/bootstrap/_tooltip.scss +21 -21
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
- data/assets/stylesheets/bootstrap/_type.scss +38 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -18
- data/assets/stylesheets/bootstrap/_variables.scss +801 -485
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +71 -48
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +39 -97
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +90 -34
- data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +214 -130
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +7 -1
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- metadata +45 -73
- data/assets/javascripts/bootstrap/util.js +0 -189
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
- data/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/assets/stylesheets/bootstrap/_print.scss +0 -132
- data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
- data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
- data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
- data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
- data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
- data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
- data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
- data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
- data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
|
@@ -1,63 +1,245 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap tooltip.js
|
|
2
|
+
* Bootstrap tooltip.js v5.0.0 (https://getbootstrap.com/)
|
|
3
3
|
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
7
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.
|
|
10
|
-
}
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
}(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return e[k];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
25
29
|
}
|
|
30
|
+
n['default'] = e;
|
|
31
|
+
return Object.freeze(n);
|
|
26
32
|
}
|
|
27
33
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
|
|
35
|
+
var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
|
|
36
|
+
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
37
|
+
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
38
|
+
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
39
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
/**
|
|
42
|
+
* --------------------------------------------------------------------------
|
|
43
|
+
* Bootstrap (v5.0.0): util/index.js
|
|
44
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
45
|
+
* --------------------------------------------------------------------------
|
|
46
|
+
*/
|
|
47
|
+
const MAX_UID = 1000000;
|
|
48
|
+
const MILLISECONDS_MULTIPLIER = 1000;
|
|
49
|
+
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
38
50
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
51
|
+
const toType = obj => {
|
|
52
|
+
if (obj === null || obj === undefined) {
|
|
53
|
+
return `${obj}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* --------------------------------------------------------------------------
|
|
60
|
+
* Public Util Api
|
|
61
|
+
* --------------------------------------------------------------------------
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
const getUID = prefix => {
|
|
66
|
+
do {
|
|
67
|
+
prefix += Math.floor(Math.random() * MAX_UID);
|
|
68
|
+
} while (document.getElementById(prefix));
|
|
69
|
+
|
|
70
|
+
return prefix;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const getTransitionDurationFromElement = element => {
|
|
74
|
+
if (!element) {
|
|
75
|
+
return 0;
|
|
76
|
+
} // Get transition-duration of the element
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
let {
|
|
80
|
+
transitionDuration,
|
|
81
|
+
transitionDelay
|
|
82
|
+
} = window.getComputedStyle(element);
|
|
83
|
+
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
|
84
|
+
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
|
85
|
+
|
|
86
|
+
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
87
|
+
return 0;
|
|
88
|
+
} // If multiple durations are defined, take the first
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
transitionDuration = transitionDuration.split(',')[0];
|
|
92
|
+
transitionDelay = transitionDelay.split(',')[0];
|
|
93
|
+
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const triggerTransitionEnd = element => {
|
|
97
|
+
element.dispatchEvent(new Event(TRANSITION_END));
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
|
101
|
+
|
|
102
|
+
const emulateTransitionEnd = (element, duration) => {
|
|
103
|
+
let called = false;
|
|
104
|
+
const durationPadding = 5;
|
|
105
|
+
const emulatedDuration = duration + durationPadding;
|
|
106
|
+
|
|
107
|
+
function listener() {
|
|
108
|
+
called = true;
|
|
109
|
+
element.removeEventListener(TRANSITION_END, listener);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
element.addEventListener(TRANSITION_END, listener);
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
if (!called) {
|
|
115
|
+
triggerTransitionEnd(element);
|
|
44
116
|
}
|
|
117
|
+
}, emulatedDuration);
|
|
118
|
+
};
|
|
45
119
|
|
|
46
|
-
|
|
47
|
-
|
|
120
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
121
|
+
Object.keys(configTypes).forEach(property => {
|
|
122
|
+
const expectedTypes = configTypes[property];
|
|
123
|
+
const value = config[property];
|
|
124
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
48
125
|
|
|
49
|
-
|
|
50
|
-
|
|
126
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
127
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const findShadowRoot = element => {
|
|
133
|
+
if (!document.documentElement.attachShadow) {
|
|
134
|
+
return null;
|
|
135
|
+
} // Can find the shadow root otherwise it'll return the document
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
if (typeof element.getRootNode === 'function') {
|
|
139
|
+
const root = element.getRootNode();
|
|
140
|
+
return root instanceof ShadowRoot ? root : null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (element instanceof ShadowRoot) {
|
|
144
|
+
return element;
|
|
145
|
+
} // when we don't find a shadow root
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
if (!element.parentNode) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return findShadowRoot(element.parentNode);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const noop = () => {};
|
|
156
|
+
|
|
157
|
+
const getjQuery = () => {
|
|
158
|
+
const {
|
|
159
|
+
jQuery
|
|
160
|
+
} = window;
|
|
161
|
+
|
|
162
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
163
|
+
return jQuery;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return null;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const onDOMContentLoaded = callback => {
|
|
170
|
+
if (document.readyState === 'loading') {
|
|
171
|
+
document.addEventListener('DOMContentLoaded', callback);
|
|
172
|
+
} else {
|
|
173
|
+
callback();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
178
|
+
|
|
179
|
+
const defineJQueryPlugin = (name, plugin) => {
|
|
180
|
+
onDOMContentLoaded(() => {
|
|
181
|
+
const $ = getjQuery();
|
|
182
|
+
/* istanbul ignore if */
|
|
183
|
+
|
|
184
|
+
if ($) {
|
|
185
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
186
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
187
|
+
$.fn[name].Constructor = plugin;
|
|
188
|
+
|
|
189
|
+
$.fn[name].noConflict = () => {
|
|
190
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
191
|
+
return plugin.jQueryInterface;
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
};
|
|
51
196
|
|
|
52
197
|
/**
|
|
53
198
|
* --------------------------------------------------------------------------
|
|
54
|
-
* Bootstrap (
|
|
199
|
+
* Bootstrap (v5.0.0): util/sanitizer.js
|
|
55
200
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
56
201
|
* --------------------------------------------------------------------------
|
|
57
202
|
*/
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
203
|
+
const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
|
|
204
|
+
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
|
|
205
|
+
/**
|
|
206
|
+
* A pattern that recognizes a commonly useful subset of URLs that are safe.
|
|
207
|
+
*
|
|
208
|
+
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
|
|
212
|
+
/**
|
|
213
|
+
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
|
214
|
+
*
|
|
215
|
+
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
|
|
216
|
+
*/
|
|
217
|
+
|
|
218
|
+
const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
|
|
219
|
+
|
|
220
|
+
const allowedAttribute = (attr, allowedAttributeList) => {
|
|
221
|
+
const attrName = attr.nodeName.toLowerCase();
|
|
222
|
+
|
|
223
|
+
if (allowedAttributeList.includes(attrName)) {
|
|
224
|
+
if (uriAttrs.has(attrName)) {
|
|
225
|
+
return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.
|
|
232
|
+
|
|
233
|
+
for (let i = 0, len = regExp.length; i < len; i++) {
|
|
234
|
+
if (regExp[i].test(attrName)) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return false;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const DefaultAllowlist = {
|
|
61
243
|
// Global attributes allowed on any supplied element below.
|
|
62
244
|
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
|
|
63
245
|
a: ['target', 'href', 'title', 'rel'],
|
|
@@ -90,47 +272,8 @@
|
|
|
90
272
|
u: [],
|
|
91
273
|
ul: []
|
|
92
274
|
};
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
*
|
|
96
|
-
* Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
|
|
97
|
-
*/
|
|
98
|
-
|
|
99
|
-
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
|
|
100
|
-
/**
|
|
101
|
-
* A pattern that matches safe data URLs. Only matches image, video and audio types.
|
|
102
|
-
*
|
|
103
|
-
* Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
|
|
104
|
-
*/
|
|
105
|
-
|
|
106
|
-
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
|
|
107
|
-
|
|
108
|
-
function allowedAttribute(attr, allowedAttributeList) {
|
|
109
|
-
var attrName = attr.nodeName.toLowerCase();
|
|
110
|
-
|
|
111
|
-
if (allowedAttributeList.indexOf(attrName) !== -1) {
|
|
112
|
-
if (uriAttrs.indexOf(attrName) !== -1) {
|
|
113
|
-
return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return true;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
var regExp = allowedAttributeList.filter(function (attrRegex) {
|
|
120
|
-
return attrRegex instanceof RegExp;
|
|
121
|
-
}); // Check if a regular expression validates the attribute.
|
|
122
|
-
|
|
123
|
-
for (var i = 0, len = regExp.length; i < len; i++) {
|
|
124
|
-
if (regExp[i].test(attrName)) {
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
|
|
133
|
-
if (unsafeHtml.length === 0) {
|
|
275
|
+
function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
|
|
276
|
+
if (!unsafeHtml.length) {
|
|
134
277
|
return unsafeHtml;
|
|
135
278
|
}
|
|
136
279
|
|
|
@@ -138,128 +281,130 @@
|
|
|
138
281
|
return sanitizeFn(unsafeHtml);
|
|
139
282
|
}
|
|
140
283
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
284
|
+
const domParser = new window.DOMParser();
|
|
285
|
+
const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
|
|
286
|
+
const allowlistKeys = Object.keys(allowList);
|
|
287
|
+
const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
|
|
145
288
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
289
|
+
for (let i = 0, len = elements.length; i < len; i++) {
|
|
290
|
+
const el = elements[i];
|
|
291
|
+
const elName = el.nodeName.toLowerCase();
|
|
149
292
|
|
|
150
|
-
if (
|
|
293
|
+
if (!allowlistKeys.includes(elName)) {
|
|
151
294
|
el.parentNode.removeChild(el);
|
|
152
|
-
|
|
295
|
+
continue;
|
|
153
296
|
}
|
|
154
297
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (!allowedAttribute(attr, whitelistedAttributes)) {
|
|
298
|
+
const attributeList = [].concat(...el.attributes);
|
|
299
|
+
const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);
|
|
300
|
+
attributeList.forEach(attr => {
|
|
301
|
+
if (!allowedAttribute(attr, allowedAttributes)) {
|
|
160
302
|
el.removeAttribute(attr.nodeName);
|
|
161
303
|
}
|
|
162
304
|
});
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
for (var i = 0, len = elements.length; i < len; i++) {
|
|
166
|
-
var _ret = _loop(i);
|
|
167
|
-
|
|
168
|
-
if (_ret === "continue") continue;
|
|
169
305
|
}
|
|
170
306
|
|
|
171
307
|
return createdDocument.body.innerHTML;
|
|
172
308
|
}
|
|
173
309
|
|
|
174
310
|
/**
|
|
311
|
+
* --------------------------------------------------------------------------
|
|
312
|
+
* Bootstrap (v5.0.0): tooltip.js
|
|
313
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
314
|
+
* --------------------------------------------------------------------------
|
|
315
|
+
*/
|
|
316
|
+
/**
|
|
317
|
+
* ------------------------------------------------------------------------
|
|
175
318
|
* Constants
|
|
319
|
+
* ------------------------------------------------------------------------
|
|
176
320
|
*/
|
|
177
321
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
322
|
+
const NAME = 'tooltip';
|
|
323
|
+
const DATA_KEY = 'bs.tooltip';
|
|
324
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
325
|
+
const CLASS_PREFIX = 'bs-tooltip';
|
|
326
|
+
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
|
|
327
|
+
const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
|
|
328
|
+
const DefaultType = {
|
|
329
|
+
animation: 'boolean',
|
|
330
|
+
template: 'string',
|
|
331
|
+
title: '(string|element|function)',
|
|
332
|
+
trigger: 'string',
|
|
333
|
+
delay: '(number|object)',
|
|
334
|
+
html: 'boolean',
|
|
335
|
+
selector: '(string|boolean)',
|
|
336
|
+
placement: '(string|function)',
|
|
337
|
+
offset: '(array|string|function)',
|
|
338
|
+
container: '(string|element|boolean)',
|
|
339
|
+
fallbackPlacements: 'array',
|
|
340
|
+
boundary: '(string|element)',
|
|
341
|
+
customClass: '(string|function)',
|
|
342
|
+
sanitize: 'boolean',
|
|
343
|
+
sanitizeFn: '(null|function)',
|
|
344
|
+
allowList: 'object',
|
|
345
|
+
popperConfig: '(null|object|function)'
|
|
346
|
+
};
|
|
347
|
+
const AttachmentMap = {
|
|
197
348
|
AUTO: 'auto',
|
|
198
349
|
TOP: 'top',
|
|
199
|
-
RIGHT: 'right',
|
|
350
|
+
RIGHT: isRTL() ? 'left' : 'right',
|
|
200
351
|
BOTTOM: 'bottom',
|
|
201
|
-
LEFT: 'left'
|
|
352
|
+
LEFT: isRTL() ? 'right' : 'left'
|
|
202
353
|
};
|
|
203
|
-
|
|
354
|
+
const Default = {
|
|
204
355
|
animation: true,
|
|
205
|
-
template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div
|
|
356
|
+
template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
|
|
206
357
|
trigger: 'hover focus',
|
|
207
358
|
title: '',
|
|
208
359
|
delay: 0,
|
|
209
360
|
html: false,
|
|
210
361
|
selector: false,
|
|
211
362
|
placement: 'top',
|
|
212
|
-
offset: 0,
|
|
363
|
+
offset: [0, 0],
|
|
213
364
|
container: false,
|
|
214
|
-
|
|
215
|
-
boundary: '
|
|
365
|
+
fallbackPlacements: ['top', 'right', 'bottom', 'left'],
|
|
366
|
+
boundary: 'clippingParents',
|
|
216
367
|
customClass: '',
|
|
217
368
|
sanitize: true,
|
|
218
369
|
sanitizeFn: null,
|
|
219
|
-
|
|
370
|
+
allowList: DefaultAllowlist,
|
|
220
371
|
popperConfig: null
|
|
221
372
|
};
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
fallbackPlacement: '(string|array)',
|
|
234
|
-
boundary: '(string|element)',
|
|
235
|
-
customClass: '(string|function)',
|
|
236
|
-
sanitize: 'boolean',
|
|
237
|
-
sanitizeFn: '(null|function)',
|
|
238
|
-
whiteList: 'object',
|
|
239
|
-
popperConfig: '(null|object)'
|
|
240
|
-
};
|
|
241
|
-
var Event = {
|
|
242
|
-
HIDE: "hide" + EVENT_KEY,
|
|
243
|
-
HIDDEN: "hidden" + EVENT_KEY,
|
|
244
|
-
SHOW: "show" + EVENT_KEY,
|
|
245
|
-
SHOWN: "shown" + EVENT_KEY,
|
|
246
|
-
INSERTED: "inserted" + EVENT_KEY,
|
|
247
|
-
CLICK: "click" + EVENT_KEY,
|
|
248
|
-
FOCUSIN: "focusin" + EVENT_KEY,
|
|
249
|
-
FOCUSOUT: "focusout" + EVENT_KEY,
|
|
250
|
-
MOUSEENTER: "mouseenter" + EVENT_KEY,
|
|
251
|
-
MOUSELEAVE: "mouseleave" + EVENT_KEY
|
|
373
|
+
const Event$1 = {
|
|
374
|
+
HIDE: `hide${EVENT_KEY}`,
|
|
375
|
+
HIDDEN: `hidden${EVENT_KEY}`,
|
|
376
|
+
SHOW: `show${EVENT_KEY}`,
|
|
377
|
+
SHOWN: `shown${EVENT_KEY}`,
|
|
378
|
+
INSERTED: `inserted${EVENT_KEY}`,
|
|
379
|
+
CLICK: `click${EVENT_KEY}`,
|
|
380
|
+
FOCUSIN: `focusin${EVENT_KEY}`,
|
|
381
|
+
FOCUSOUT: `focusout${EVENT_KEY}`,
|
|
382
|
+
MOUSEENTER: `mouseenter${EVENT_KEY}`,
|
|
383
|
+
MOUSELEAVE: `mouseleave${EVENT_KEY}`
|
|
252
384
|
};
|
|
385
|
+
const CLASS_NAME_FADE = 'fade';
|
|
386
|
+
const CLASS_NAME_MODAL = 'modal';
|
|
387
|
+
const CLASS_NAME_SHOW = 'show';
|
|
388
|
+
const HOVER_STATE_SHOW = 'show';
|
|
389
|
+
const HOVER_STATE_OUT = 'out';
|
|
390
|
+
const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
|
|
391
|
+
const TRIGGER_HOVER = 'hover';
|
|
392
|
+
const TRIGGER_FOCUS = 'focus';
|
|
393
|
+
const TRIGGER_CLICK = 'click';
|
|
394
|
+
const TRIGGER_MANUAL = 'manual';
|
|
253
395
|
/**
|
|
254
|
-
*
|
|
396
|
+
* ------------------------------------------------------------------------
|
|
397
|
+
* Class Definition
|
|
398
|
+
* ------------------------------------------------------------------------
|
|
255
399
|
*/
|
|
256
400
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (typeof
|
|
401
|
+
class Tooltip extends BaseComponent__default['default'] {
|
|
402
|
+
constructor(element, config) {
|
|
403
|
+
if (typeof Popper__namespace === 'undefined') {
|
|
260
404
|
throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
|
|
261
|
-
}
|
|
405
|
+
}
|
|
262
406
|
|
|
407
|
+
super(element); // private
|
|
263
408
|
|
|
264
409
|
this._isEnabled = true;
|
|
265
410
|
this._timeout = 0;
|
|
@@ -267,7 +412,6 @@
|
|
|
267
412
|
this._activeTrigger = {};
|
|
268
413
|
this._popper = null; // Protected
|
|
269
414
|
|
|
270
|
-
this.element = element;
|
|
271
415
|
this.config = this._getConfig(config);
|
|
272
416
|
this.tip = null;
|
|
273
417
|
|
|
@@ -275,34 +419,50 @@
|
|
|
275
419
|
} // Getters
|
|
276
420
|
|
|
277
421
|
|
|
278
|
-
|
|
422
|
+
static get Default() {
|
|
423
|
+
return Default;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
static get NAME() {
|
|
427
|
+
return NAME;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
static get DATA_KEY() {
|
|
431
|
+
return DATA_KEY;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
static get Event() {
|
|
435
|
+
return Event$1;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
static get EVENT_KEY() {
|
|
439
|
+
return EVENT_KEY;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
static get DefaultType() {
|
|
443
|
+
return DefaultType;
|
|
444
|
+
} // Public
|
|
445
|
+
|
|
279
446
|
|
|
280
|
-
|
|
281
|
-
_proto.enable = function enable() {
|
|
447
|
+
enable() {
|
|
282
448
|
this._isEnabled = true;
|
|
283
|
-
}
|
|
449
|
+
}
|
|
284
450
|
|
|
285
|
-
|
|
451
|
+
disable() {
|
|
286
452
|
this._isEnabled = false;
|
|
287
|
-
}
|
|
453
|
+
}
|
|
288
454
|
|
|
289
|
-
|
|
455
|
+
toggleEnabled() {
|
|
290
456
|
this._isEnabled = !this._isEnabled;
|
|
291
|
-
}
|
|
457
|
+
}
|
|
292
458
|
|
|
293
|
-
|
|
459
|
+
toggle(event) {
|
|
294
460
|
if (!this._isEnabled) {
|
|
295
461
|
return;
|
|
296
462
|
}
|
|
297
463
|
|
|
298
464
|
if (event) {
|
|
299
|
-
|
|
300
|
-
var context = $__default["default"](event.currentTarget).data(dataKey);
|
|
301
|
-
|
|
302
|
-
if (!context) {
|
|
303
|
-
context = new this.constructor(event.currentTarget, this._getDelegateConfig());
|
|
304
|
-
$__default["default"](event.currentTarget).data(dataKey, context);
|
|
305
|
-
}
|
|
465
|
+
const context = this._initializeOnDelegatedTarget(event);
|
|
306
466
|
|
|
307
467
|
context._activeTrigger.click = !context._activeTrigger.click;
|
|
308
468
|
|
|
@@ -312,7 +472,7 @@
|
|
|
312
472
|
context._leave(null, context);
|
|
313
473
|
}
|
|
314
474
|
} else {
|
|
315
|
-
if (
|
|
475
|
+
if (this.getTipElement().classList.contains(CLASS_NAME_SHOW)) {
|
|
316
476
|
this._leave(null, this);
|
|
317
477
|
|
|
318
478
|
return;
|
|
@@ -320,16 +480,14 @@
|
|
|
320
480
|
|
|
321
481
|
this._enter(null, this);
|
|
322
482
|
}
|
|
323
|
-
}
|
|
483
|
+
}
|
|
324
484
|
|
|
325
|
-
|
|
485
|
+
dispose() {
|
|
326
486
|
clearTimeout(this._timeout);
|
|
327
|
-
|
|
328
|
-
$__default["default"](this.element).off(this.constructor.EVENT_KEY);
|
|
329
|
-
$__default["default"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler);
|
|
487
|
+
EventHandler__default['default'].off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
|
|
330
488
|
|
|
331
|
-
if (this.tip) {
|
|
332
|
-
|
|
489
|
+
if (this.tip && this.tip.parentNode) {
|
|
490
|
+
this.tip.parentNode.removeChild(this.tip);
|
|
333
491
|
}
|
|
334
492
|
|
|
335
493
|
this._isEnabled = null;
|
|
@@ -342,176 +500,200 @@
|
|
|
342
500
|
}
|
|
343
501
|
|
|
344
502
|
this._popper = null;
|
|
345
|
-
this.element = null;
|
|
346
503
|
this.config = null;
|
|
347
504
|
this.tip = null;
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
_proto.show = function show() {
|
|
351
|
-
var _this = this;
|
|
505
|
+
super.dispose();
|
|
506
|
+
}
|
|
352
507
|
|
|
353
|
-
|
|
508
|
+
show() {
|
|
509
|
+
if (this._element.style.display === 'none') {
|
|
354
510
|
throw new Error('Please use show on visible elements');
|
|
355
511
|
}
|
|
356
512
|
|
|
357
|
-
|
|
513
|
+
if (!(this.isWithContent() && this._isEnabled)) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
358
516
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
var isInTheDom = $__default["default"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);
|
|
517
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOW);
|
|
518
|
+
const shadowRoot = findShadowRoot(this._element);
|
|
519
|
+
const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
|
|
363
520
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
521
|
+
if (showEvent.defaultPrevented || !isInTheDom) {
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
367
524
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
this.element.setAttribute('aria-describedby', tipId);
|
|
372
|
-
this.setContent();
|
|
525
|
+
const tip = this.getTipElement();
|
|
526
|
+
const tipId = getUID(this.constructor.NAME);
|
|
527
|
+
tip.setAttribute('id', tipId);
|
|
373
528
|
|
|
374
|
-
|
|
375
|
-
$__default["default"](tip).addClass(CLASS_NAME_FADE);
|
|
376
|
-
}
|
|
529
|
+
this._element.setAttribute('aria-describedby', tipId);
|
|
377
530
|
|
|
378
|
-
|
|
531
|
+
this.setContent();
|
|
379
532
|
|
|
380
|
-
|
|
533
|
+
if (this.config.animation) {
|
|
534
|
+
tip.classList.add(CLASS_NAME_FADE);
|
|
535
|
+
}
|
|
381
536
|
|
|
382
|
-
|
|
537
|
+
const placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this._element) : this.config.placement;
|
|
383
538
|
|
|
384
|
-
|
|
539
|
+
const attachment = this._getAttachment(placement);
|
|
385
540
|
|
|
386
|
-
|
|
541
|
+
this._addAttachmentClass(attachment);
|
|
387
542
|
|
|
388
|
-
|
|
389
|
-
$__default["default"](tip).appendTo(container);
|
|
390
|
-
}
|
|
543
|
+
const container = this._getContainer();
|
|
391
544
|
|
|
392
|
-
|
|
393
|
-
this._popper = new Popper__default["default"](this.element, tip, this._getPopperConfig(attachment));
|
|
394
|
-
$__default["default"](tip).addClass(CLASS_NAME_SHOW);
|
|
395
|
-
$__default["default"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra
|
|
396
|
-
// empty mouseover listeners to the body's immediate children;
|
|
397
|
-
// only needed because of broken event delegation on iOS
|
|
398
|
-
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
|
545
|
+
Data__default['default'].set(tip, this.constructor.DATA_KEY, this);
|
|
399
546
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
547
|
+
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
|
|
548
|
+
container.appendChild(tip);
|
|
549
|
+
EventHandler__default['default'].trigger(this._element, this.constructor.Event.INSERTED);
|
|
550
|
+
}
|
|
403
551
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
552
|
+
if (this._popper) {
|
|
553
|
+
this._popper.update();
|
|
554
|
+
} else {
|
|
555
|
+
this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
|
|
556
|
+
}
|
|
408
557
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
$__default["default"](_this.element).trigger(_this.constructor.Event.SHOWN);
|
|
558
|
+
tip.classList.add(CLASS_NAME_SHOW);
|
|
559
|
+
const customClass = typeof this.config.customClass === 'function' ? this.config.customClass() : this.config.customClass;
|
|
412
560
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
561
|
+
if (customClass) {
|
|
562
|
+
tip.classList.add(...customClass.split(' '));
|
|
563
|
+
} // If this is a touch-enabled device we add extra
|
|
564
|
+
// empty mouseover listeners to the body's immediate children;
|
|
565
|
+
// only needed because of broken event delegation on iOS
|
|
566
|
+
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
|
417
567
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
568
|
+
|
|
569
|
+
if ('ontouchstart' in document.documentElement) {
|
|
570
|
+
[].concat(...document.body.children).forEach(element => {
|
|
571
|
+
EventHandler__default['default'].on(element, 'mouseover', noop);
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const complete = () => {
|
|
576
|
+
const prevHoverState = this._hoverState;
|
|
577
|
+
this._hoverState = null;
|
|
578
|
+
EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOWN);
|
|
579
|
+
|
|
580
|
+
if (prevHoverState === HOVER_STATE_OUT) {
|
|
581
|
+
this._leave(null, this);
|
|
423
582
|
}
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
if (this.tip.classList.contains(CLASS_NAME_FADE)) {
|
|
586
|
+
const transitionDuration = getTransitionDurationFromElement(this.tip);
|
|
587
|
+
EventHandler__default['default'].one(this.tip, 'transitionend', complete);
|
|
588
|
+
emulateTransitionEnd(this.tip, transitionDuration);
|
|
589
|
+
} else {
|
|
590
|
+
complete();
|
|
424
591
|
}
|
|
425
|
-
}
|
|
592
|
+
}
|
|
426
593
|
|
|
427
|
-
|
|
428
|
-
|
|
594
|
+
hide() {
|
|
595
|
+
if (!this._popper) {
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
429
598
|
|
|
430
|
-
|
|
431
|
-
var hideEvent = $__default["default"].Event(this.constructor.Event.HIDE);
|
|
599
|
+
const tip = this.getTipElement();
|
|
432
600
|
|
|
433
|
-
|
|
434
|
-
if (
|
|
601
|
+
const complete = () => {
|
|
602
|
+
if (this._isWithActiveTrigger()) {
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
|
|
435
607
|
tip.parentNode.removeChild(tip);
|
|
436
608
|
}
|
|
437
609
|
|
|
438
|
-
|
|
610
|
+
this._cleanTipClass();
|
|
439
611
|
|
|
440
|
-
|
|
612
|
+
this._element.removeAttribute('aria-describedby');
|
|
441
613
|
|
|
442
|
-
|
|
614
|
+
EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDDEN);
|
|
443
615
|
|
|
444
|
-
if (
|
|
445
|
-
|
|
446
|
-
}
|
|
616
|
+
if (this._popper) {
|
|
617
|
+
this._popper.destroy();
|
|
447
618
|
|
|
448
|
-
|
|
449
|
-
callback();
|
|
619
|
+
this._popper = null;
|
|
450
620
|
}
|
|
451
621
|
};
|
|
452
622
|
|
|
453
|
-
|
|
623
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDE);
|
|
454
624
|
|
|
455
|
-
if (hideEvent.
|
|
625
|
+
if (hideEvent.defaultPrevented) {
|
|
456
626
|
return;
|
|
457
627
|
}
|
|
458
628
|
|
|
459
|
-
|
|
629
|
+
tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra
|
|
460
630
|
// empty mouseover listeners we added for iOS support
|
|
461
631
|
|
|
462
632
|
if ('ontouchstart' in document.documentElement) {
|
|
463
|
-
|
|
633
|
+
[].concat(...document.body.children).forEach(element => EventHandler__default['default'].off(element, 'mouseover', noop));
|
|
464
634
|
}
|
|
465
635
|
|
|
466
636
|
this._activeTrigger[TRIGGER_CLICK] = false;
|
|
467
637
|
this._activeTrigger[TRIGGER_FOCUS] = false;
|
|
468
638
|
this._activeTrigger[TRIGGER_HOVER] = false;
|
|
469
639
|
|
|
470
|
-
if (
|
|
471
|
-
|
|
472
|
-
|
|
640
|
+
if (this.tip.classList.contains(CLASS_NAME_FADE)) {
|
|
641
|
+
const transitionDuration = getTransitionDurationFromElement(tip);
|
|
642
|
+
EventHandler__default['default'].one(tip, 'transitionend', complete);
|
|
643
|
+
emulateTransitionEnd(tip, transitionDuration);
|
|
473
644
|
} else {
|
|
474
645
|
complete();
|
|
475
646
|
}
|
|
476
647
|
|
|
477
648
|
this._hoverState = '';
|
|
478
|
-
}
|
|
649
|
+
}
|
|
479
650
|
|
|
480
|
-
|
|
651
|
+
update() {
|
|
481
652
|
if (this._popper !== null) {
|
|
482
|
-
this._popper.
|
|
653
|
+
this._popper.update();
|
|
483
654
|
}
|
|
484
655
|
} // Protected
|
|
485
|
-
;
|
|
486
656
|
|
|
487
|
-
|
|
657
|
+
|
|
658
|
+
isWithContent() {
|
|
488
659
|
return Boolean(this.getTitle());
|
|
489
|
-
}
|
|
660
|
+
}
|
|
490
661
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
662
|
+
getTipElement() {
|
|
663
|
+
if (this.tip) {
|
|
664
|
+
return this.tip;
|
|
665
|
+
}
|
|
494
666
|
|
|
495
|
-
|
|
496
|
-
|
|
667
|
+
const element = document.createElement('div');
|
|
668
|
+
element.innerHTML = this.config.template;
|
|
669
|
+
this.tip = element.children[0];
|
|
497
670
|
return this.tip;
|
|
498
|
-
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
setContent() {
|
|
674
|
+
const tip = this.getTipElement();
|
|
675
|
+
this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle());
|
|
676
|
+
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
setElementContent(element, content) {
|
|
680
|
+
if (element === null) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
if (typeof content === 'object' && isElement(content)) {
|
|
685
|
+
if (content.jquery) {
|
|
686
|
+
content = content[0];
|
|
687
|
+
} // content is a DOM node or a jQuery
|
|
499
688
|
|
|
500
|
-
_proto.setContent = function setContent() {
|
|
501
|
-
var tip = this.getTipElement();
|
|
502
|
-
this.setElementContent($__default["default"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle());
|
|
503
|
-
$__default["default"](tip).removeClass(CLASS_NAME_FADE + " " + CLASS_NAME_SHOW);
|
|
504
|
-
};
|
|
505
689
|
|
|
506
|
-
_proto.setElementContent = function setElementContent($element, content) {
|
|
507
|
-
if (typeof content === 'object' && (content.nodeType || content.jquery)) {
|
|
508
|
-
// Content is a DOM node or a jQuery
|
|
509
690
|
if (this.config.html) {
|
|
510
|
-
if (
|
|
511
|
-
|
|
691
|
+
if (content.parentNode !== element) {
|
|
692
|
+
element.innerHTML = '';
|
|
693
|
+
element.appendChild(content);
|
|
512
694
|
}
|
|
513
695
|
} else {
|
|
514
|
-
|
|
696
|
+
element.textContent = content.textContent;
|
|
515
697
|
}
|
|
516
698
|
|
|
517
699
|
return;
|
|
@@ -519,149 +701,181 @@
|
|
|
519
701
|
|
|
520
702
|
if (this.config.html) {
|
|
521
703
|
if (this.config.sanitize) {
|
|
522
|
-
content = sanitizeHtml(content, this.config.
|
|
704
|
+
content = sanitizeHtml(content, this.config.allowList, this.config.sanitizeFn);
|
|
523
705
|
}
|
|
524
706
|
|
|
525
|
-
|
|
707
|
+
element.innerHTML = content;
|
|
526
708
|
} else {
|
|
527
|
-
|
|
709
|
+
element.textContent = content;
|
|
528
710
|
}
|
|
529
|
-
}
|
|
711
|
+
}
|
|
530
712
|
|
|
531
|
-
|
|
532
|
-
|
|
713
|
+
getTitle() {
|
|
714
|
+
let title = this._element.getAttribute('data-bs-original-title');
|
|
533
715
|
|
|
534
716
|
if (!title) {
|
|
535
|
-
title = typeof this.config.title === 'function' ? this.config.title.call(this.
|
|
717
|
+
title = typeof this.config.title === 'function' ? this.config.title.call(this._element) : this.config.title;
|
|
536
718
|
}
|
|
537
719
|
|
|
538
720
|
return title;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
updateAttachment(attachment) {
|
|
724
|
+
if (attachment === 'right') {
|
|
725
|
+
return 'end';
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
if (attachment === 'left') {
|
|
729
|
+
return 'start';
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
return attachment;
|
|
539
733
|
} // Private
|
|
540
|
-
;
|
|
541
734
|
|
|
542
|
-
_proto._getPopperConfig = function _getPopperConfig(attachment) {
|
|
543
|
-
var _this3 = this;
|
|
544
735
|
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
offset: this._getOffset(),
|
|
549
|
-
flip: {
|
|
550
|
-
behavior: this.config.fallbackPlacement
|
|
551
|
-
},
|
|
552
|
-
arrow: {
|
|
553
|
-
element: SELECTOR_ARROW
|
|
554
|
-
},
|
|
555
|
-
preventOverflow: {
|
|
556
|
-
boundariesElement: this.config.boundary
|
|
557
|
-
}
|
|
558
|
-
},
|
|
559
|
-
onCreate: function onCreate(data) {
|
|
560
|
-
if (data.originalPlacement !== data.placement) {
|
|
561
|
-
_this3._handlePopperPlacementChange(data);
|
|
562
|
-
}
|
|
563
|
-
},
|
|
564
|
-
onUpdate: function onUpdate(data) {
|
|
565
|
-
return _this3._handlePopperPlacementChange(data);
|
|
566
|
-
}
|
|
567
|
-
};
|
|
568
|
-
return _extends({}, defaultBsConfig, this.config.popperConfig);
|
|
569
|
-
};
|
|
736
|
+
_initializeOnDelegatedTarget(event, context) {
|
|
737
|
+
const dataKey = this.constructor.DATA_KEY;
|
|
738
|
+
context = context || Data__default['default'].get(event.delegateTarget, dataKey);
|
|
570
739
|
|
|
571
|
-
|
|
572
|
-
|
|
740
|
+
if (!context) {
|
|
741
|
+
context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
|
|
742
|
+
Data__default['default'].set(event.delegateTarget, dataKey, context);
|
|
743
|
+
}
|
|
573
744
|
|
|
574
|
-
|
|
745
|
+
return context;
|
|
746
|
+
}
|
|
575
747
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
offset.
|
|
748
|
+
_getOffset() {
|
|
749
|
+
const {
|
|
750
|
+
offset
|
|
751
|
+
} = this.config;
|
|
752
|
+
|
|
753
|
+
if (typeof offset === 'string') {
|
|
754
|
+
return offset.split(',').map(val => Number.parseInt(val, 10));
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
if (typeof offset === 'function') {
|
|
758
|
+
return popperData => offset(popperData, this._element);
|
|
583
759
|
}
|
|
584
760
|
|
|
585
761
|
return offset;
|
|
586
|
-
}
|
|
762
|
+
}
|
|
587
763
|
|
|
588
|
-
|
|
764
|
+
_getPopperConfig(attachment) {
|
|
765
|
+
const defaultBsPopperConfig = {
|
|
766
|
+
placement: attachment,
|
|
767
|
+
modifiers: [{
|
|
768
|
+
name: 'flip',
|
|
769
|
+
options: {
|
|
770
|
+
fallbackPlacements: this.config.fallbackPlacements
|
|
771
|
+
}
|
|
772
|
+
}, {
|
|
773
|
+
name: 'offset',
|
|
774
|
+
options: {
|
|
775
|
+
offset: this._getOffset()
|
|
776
|
+
}
|
|
777
|
+
}, {
|
|
778
|
+
name: 'preventOverflow',
|
|
779
|
+
options: {
|
|
780
|
+
boundary: this.config.boundary
|
|
781
|
+
}
|
|
782
|
+
}, {
|
|
783
|
+
name: 'arrow',
|
|
784
|
+
options: {
|
|
785
|
+
element: `.${this.constructor.NAME}-arrow`
|
|
786
|
+
}
|
|
787
|
+
}, {
|
|
788
|
+
name: 'onChange',
|
|
789
|
+
enabled: true,
|
|
790
|
+
phase: 'afterWrite',
|
|
791
|
+
fn: data => this._handlePopperPlacementChange(data)
|
|
792
|
+
}],
|
|
793
|
+
onFirstUpdate: data => {
|
|
794
|
+
if (data.options.placement !== data.placement) {
|
|
795
|
+
this._handlePopperPlacementChange(data);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
};
|
|
799
|
+
return { ...defaultBsPopperConfig,
|
|
800
|
+
...(typeof this.config.popperConfig === 'function' ? this.config.popperConfig(defaultBsPopperConfig) : this.config.popperConfig)
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
_addAttachmentClass(attachment) {
|
|
805
|
+
this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
_getContainer() {
|
|
589
809
|
if (this.config.container === false) {
|
|
590
810
|
return document.body;
|
|
591
811
|
}
|
|
592
812
|
|
|
593
|
-
if (
|
|
594
|
-
return
|
|
813
|
+
if (isElement(this.config.container)) {
|
|
814
|
+
return this.config.container;
|
|
595
815
|
}
|
|
596
816
|
|
|
597
|
-
return
|
|
598
|
-
}
|
|
817
|
+
return SelectorEngine__default['default'].findOne(this.config.container);
|
|
818
|
+
}
|
|
599
819
|
|
|
600
|
-
|
|
820
|
+
_getAttachment(placement) {
|
|
601
821
|
return AttachmentMap[placement.toUpperCase()];
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
_proto._setListeners = function _setListeners() {
|
|
605
|
-
var _this5 = this;
|
|
822
|
+
}
|
|
606
823
|
|
|
607
|
-
|
|
608
|
-
triggers.
|
|
824
|
+
_setListeners() {
|
|
825
|
+
const triggers = this.config.trigger.split(' ');
|
|
826
|
+
triggers.forEach(trigger => {
|
|
609
827
|
if (trigger === 'click') {
|
|
610
|
-
|
|
611
|
-
return _this5.toggle(event);
|
|
612
|
-
});
|
|
828
|
+
EventHandler__default['default'].on(this._element, this.constructor.Event.CLICK, this.config.selector, event => this.toggle(event));
|
|
613
829
|
} else if (trigger !== TRIGGER_MANUAL) {
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
}).on(eventOut, _this5.config.selector, function (event) {
|
|
619
|
-
return _this5._leave(event);
|
|
620
|
-
});
|
|
830
|
+
const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
|
|
831
|
+
const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
|
|
832
|
+
EventHandler__default['default'].on(this._element, eventIn, this.config.selector, event => this._enter(event));
|
|
833
|
+
EventHandler__default['default'].on(this._element, eventOut, this.config.selector, event => this._leave(event));
|
|
621
834
|
}
|
|
622
835
|
});
|
|
623
836
|
|
|
624
|
-
this._hideModalHandler =
|
|
625
|
-
if (
|
|
626
|
-
|
|
837
|
+
this._hideModalHandler = () => {
|
|
838
|
+
if (this._element) {
|
|
839
|
+
this.hide();
|
|
627
840
|
}
|
|
628
841
|
};
|
|
629
842
|
|
|
630
|
-
|
|
843
|
+
EventHandler__default['default'].on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
|
|
631
844
|
|
|
632
845
|
if (this.config.selector) {
|
|
633
|
-
this.config =
|
|
846
|
+
this.config = { ...this.config,
|
|
634
847
|
trigger: 'manual',
|
|
635
848
|
selector: ''
|
|
636
|
-
}
|
|
849
|
+
};
|
|
637
850
|
} else {
|
|
638
851
|
this._fixTitle();
|
|
639
852
|
}
|
|
640
|
-
}
|
|
853
|
+
}
|
|
641
854
|
|
|
642
|
-
|
|
643
|
-
|
|
855
|
+
_fixTitle() {
|
|
856
|
+
const title = this._element.getAttribute('title');
|
|
644
857
|
|
|
645
|
-
|
|
646
|
-
this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
|
|
647
|
-
this.element.setAttribute('title', '');
|
|
648
|
-
}
|
|
649
|
-
};
|
|
858
|
+
const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');
|
|
650
859
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
context = context || $__default["default"](event.currentTarget).data(dataKey);
|
|
860
|
+
if (title || originalTitleType !== 'string') {
|
|
861
|
+
this._element.setAttribute('data-bs-original-title', title || '');
|
|
654
862
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
863
|
+
if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
|
|
864
|
+
this._element.setAttribute('aria-label', title);
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
this._element.setAttribute('title', '');
|
|
658
868
|
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
_enter(event, context) {
|
|
872
|
+
context = this._initializeOnDelegatedTarget(event, context);
|
|
659
873
|
|
|
660
874
|
if (event) {
|
|
661
875
|
context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
|
|
662
876
|
}
|
|
663
877
|
|
|
664
|
-
if (
|
|
878
|
+
if (context.getTipElement().classList.contains(CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) {
|
|
665
879
|
context._hoverState = HOVER_STATE_SHOW;
|
|
666
880
|
return;
|
|
667
881
|
}
|
|
@@ -674,24 +888,18 @@
|
|
|
674
888
|
return;
|
|
675
889
|
}
|
|
676
890
|
|
|
677
|
-
context._timeout = setTimeout(
|
|
891
|
+
context._timeout = setTimeout(() => {
|
|
678
892
|
if (context._hoverState === HOVER_STATE_SHOW) {
|
|
679
893
|
context.show();
|
|
680
894
|
}
|
|
681
895
|
}, context.config.delay.show);
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
_proto._leave = function _leave(event, context) {
|
|
685
|
-
var dataKey = this.constructor.DATA_KEY;
|
|
686
|
-
context = context || $__default["default"](event.currentTarget).data(dataKey);
|
|
896
|
+
}
|
|
687
897
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
$__default["default"](event.currentTarget).data(dataKey, context);
|
|
691
|
-
}
|
|
898
|
+
_leave(event, context) {
|
|
899
|
+
context = this._initializeOnDelegatedTarget(event, context);
|
|
692
900
|
|
|
693
901
|
if (event) {
|
|
694
|
-
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =
|
|
902
|
+
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
|
|
695
903
|
}
|
|
696
904
|
|
|
697
905
|
if (context._isWithActiveTrigger()) {
|
|
@@ -706,31 +914,39 @@
|
|
|
706
914
|
return;
|
|
707
915
|
}
|
|
708
916
|
|
|
709
|
-
context._timeout = setTimeout(
|
|
917
|
+
context._timeout = setTimeout(() => {
|
|
710
918
|
if (context._hoverState === HOVER_STATE_OUT) {
|
|
711
919
|
context.hide();
|
|
712
920
|
}
|
|
713
921
|
}, context.config.delay.hide);
|
|
714
|
-
}
|
|
922
|
+
}
|
|
715
923
|
|
|
716
|
-
|
|
717
|
-
for (
|
|
924
|
+
_isWithActiveTrigger() {
|
|
925
|
+
for (const trigger in this._activeTrigger) {
|
|
718
926
|
if (this._activeTrigger[trigger]) {
|
|
719
927
|
return true;
|
|
720
928
|
}
|
|
721
929
|
}
|
|
722
930
|
|
|
723
931
|
return false;
|
|
724
|
-
}
|
|
932
|
+
}
|
|
725
933
|
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
Object.keys(dataAttributes).forEach(
|
|
729
|
-
if (DISALLOWED_ATTRIBUTES.
|
|
934
|
+
_getConfig(config) {
|
|
935
|
+
const dataAttributes = Manipulator__default['default'].getDataAttributes(this._element);
|
|
936
|
+
Object.keys(dataAttributes).forEach(dataAttr => {
|
|
937
|
+
if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
|
|
730
938
|
delete dataAttributes[dataAttr];
|
|
731
939
|
}
|
|
732
940
|
});
|
|
733
|
-
|
|
941
|
+
|
|
942
|
+
if (config && typeof config.container === 'object' && config.container.jquery) {
|
|
943
|
+
config.container = config.container[0];
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
config = { ...this.constructor.Default,
|
|
947
|
+
...dataAttributes,
|
|
948
|
+
...(typeof config === 'object' && config ? config : {})
|
|
949
|
+
};
|
|
734
950
|
|
|
735
951
|
if (typeof config.delay === 'number') {
|
|
736
952
|
config.delay = {
|
|
@@ -747,20 +963,20 @@
|
|
|
747
963
|
config.content = config.content.toString();
|
|
748
964
|
}
|
|
749
965
|
|
|
750
|
-
|
|
966
|
+
typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
751
967
|
|
|
752
968
|
if (config.sanitize) {
|
|
753
|
-
config.template = sanitizeHtml(config.template, config.
|
|
969
|
+
config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
|
|
754
970
|
}
|
|
755
971
|
|
|
756
972
|
return config;
|
|
757
|
-
}
|
|
973
|
+
}
|
|
758
974
|
|
|
759
|
-
|
|
760
|
-
|
|
975
|
+
_getDelegateConfig() {
|
|
976
|
+
const config = {};
|
|
761
977
|
|
|
762
978
|
if (this.config) {
|
|
763
|
-
for (
|
|
979
|
+
for (const key in this.config) {
|
|
764
980
|
if (this.constructor.Default[key] !== this.config[key]) {
|
|
765
981
|
config[key] = this.config[key];
|
|
766
982
|
}
|
|
@@ -768,47 +984,39 @@
|
|
|
768
984
|
}
|
|
769
985
|
|
|
770
986
|
return config;
|
|
771
|
-
}
|
|
987
|
+
}
|
|
772
988
|
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
989
|
+
_cleanTipClass() {
|
|
990
|
+
const tip = this.getTipElement();
|
|
991
|
+
const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
|
|
776
992
|
|
|
777
|
-
if (tabClass !== null && tabClass.length) {
|
|
778
|
-
|
|
993
|
+
if (tabClass !== null && tabClass.length > 0) {
|
|
994
|
+
tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
|
|
779
995
|
}
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
_proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
|
|
783
|
-
this.tip = popperData.instance.popper;
|
|
784
|
-
|
|
785
|
-
this._cleanTipClass();
|
|
786
|
-
|
|
787
|
-
this.addAttachmentClass(this._getAttachment(popperData.placement));
|
|
788
|
-
};
|
|
996
|
+
}
|
|
789
997
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
998
|
+
_handlePopperPlacementChange(popperData) {
|
|
999
|
+
const {
|
|
1000
|
+
state
|
|
1001
|
+
} = popperData;
|
|
793
1002
|
|
|
794
|
-
if (
|
|
1003
|
+
if (!state) {
|
|
795
1004
|
return;
|
|
796
1005
|
}
|
|
797
1006
|
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
this.
|
|
801
|
-
|
|
802
|
-
this.
|
|
1007
|
+
this.tip = state.elements.popper;
|
|
1008
|
+
|
|
1009
|
+
this._cleanTipClass();
|
|
1010
|
+
|
|
1011
|
+
this._addAttachmentClass(this._getAttachment(state.placement));
|
|
803
1012
|
} // Static
|
|
804
|
-
;
|
|
805
1013
|
|
|
806
|
-
|
|
1014
|
+
|
|
1015
|
+
static jQueryInterface(config) {
|
|
807
1016
|
return this.each(function () {
|
|
808
|
-
|
|
809
|
-
var data = $element.data(DATA_KEY);
|
|
1017
|
+
let data = Data__default['default'].get(this, DATA_KEY);
|
|
810
1018
|
|
|
811
|
-
|
|
1019
|
+
const _config = typeof config === 'object' && config;
|
|
812
1020
|
|
|
813
1021
|
if (!data && /dispose|hide/.test(config)) {
|
|
814
1022
|
return;
|
|
@@ -816,71 +1024,29 @@
|
|
|
816
1024
|
|
|
817
1025
|
if (!data) {
|
|
818
1026
|
data = new Tooltip(this, _config);
|
|
819
|
-
$element.data(DATA_KEY, data);
|
|
820
1027
|
}
|
|
821
1028
|
|
|
822
1029
|
if (typeof config === 'string') {
|
|
823
1030
|
if (typeof data[config] === 'undefined') {
|
|
824
|
-
throw new TypeError(
|
|
1031
|
+
throw new TypeError(`No method named "${config}"`);
|
|
825
1032
|
}
|
|
826
1033
|
|
|
827
1034
|
data[config]();
|
|
828
1035
|
}
|
|
829
1036
|
});
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
key: "VERSION",
|
|
834
|
-
get: function get() {
|
|
835
|
-
return VERSION;
|
|
836
|
-
}
|
|
837
|
-
}, {
|
|
838
|
-
key: "Default",
|
|
839
|
-
get: function get() {
|
|
840
|
-
return Default;
|
|
841
|
-
}
|
|
842
|
-
}, {
|
|
843
|
-
key: "NAME",
|
|
844
|
-
get: function get() {
|
|
845
|
-
return NAME;
|
|
846
|
-
}
|
|
847
|
-
}, {
|
|
848
|
-
key: "DATA_KEY",
|
|
849
|
-
get: function get() {
|
|
850
|
-
return DATA_KEY;
|
|
851
|
-
}
|
|
852
|
-
}, {
|
|
853
|
-
key: "Event",
|
|
854
|
-
get: function get() {
|
|
855
|
-
return Event;
|
|
856
|
-
}
|
|
857
|
-
}, {
|
|
858
|
-
key: "EVENT_KEY",
|
|
859
|
-
get: function get() {
|
|
860
|
-
return EVENT_KEY;
|
|
861
|
-
}
|
|
862
|
-
}, {
|
|
863
|
-
key: "DefaultType",
|
|
864
|
-
get: function get() {
|
|
865
|
-
return DefaultType;
|
|
866
|
-
}
|
|
867
|
-
}]);
|
|
868
|
-
|
|
869
|
-
return Tooltip;
|
|
870
|
-
}();
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
}
|
|
871
1040
|
/**
|
|
1041
|
+
* ------------------------------------------------------------------------
|
|
872
1042
|
* jQuery
|
|
1043
|
+
* ------------------------------------------------------------------------
|
|
1044
|
+
* add .Tooltip to jQuery only if jQuery is present
|
|
873
1045
|
*/
|
|
874
1046
|
|
|
875
1047
|
|
|
876
|
-
|
|
877
|
-
$__default["default"].fn[NAME].Constructor = Tooltip;
|
|
878
|
-
|
|
879
|
-
$__default["default"].fn[NAME].noConflict = function () {
|
|
880
|
-
$__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
|
|
881
|
-
return Tooltip._jQueryInterface;
|
|
882
|
-
};
|
|
1048
|
+
defineJQueryPlugin(NAME, Tooltip);
|
|
883
1049
|
|
|
884
1050
|
return Tooltip;
|
|
885
1051
|
|
|
886
|
-
}));
|
|
1052
|
+
})));
|