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