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,177 +1,712 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap modal.js
|
|
3
|
-
* Copyright 2011-
|
|
4
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/
|
|
2
|
+
* Bootstrap modal.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.Modal = factory(global.
|
|
10
|
-
}(this, function (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(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(['./dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
}(this, (function (EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
|
+
|
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
|
+
|
|
14
|
+
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
15
|
+
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
16
|
+
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
17
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* --------------------------------------------------------------------------
|
|
21
|
+
* Bootstrap (v5.1.0): util/index.js
|
|
22
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
23
|
+
* --------------------------------------------------------------------------
|
|
24
|
+
*/
|
|
25
|
+
const MILLISECONDS_MULTIPLIER = 1000;
|
|
26
|
+
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
27
|
+
|
|
28
|
+
const toType = obj => {
|
|
29
|
+
if (obj === null || obj === undefined) {
|
|
30
|
+
return `${obj}`;
|
|
22
31
|
}
|
|
23
|
-
}
|
|
24
32
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
28
|
-
return Constructor;
|
|
29
|
-
}
|
|
33
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
34
|
+
};
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
const getSelector = element => {
|
|
37
|
+
let selector = element.getAttribute('data-bs-target');
|
|
38
|
+
|
|
39
|
+
if (!selector || selector === '#') {
|
|
40
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
41
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
42
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
|
43
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
|
44
|
+
|
|
45
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
46
|
+
return null;
|
|
47
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
51
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return selector;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const getElementFromSelector = element => {
|
|
61
|
+
const selector = getSelector(element);
|
|
62
|
+
return selector ? document.querySelector(selector) : null;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const getTransitionDurationFromElement = element => {
|
|
66
|
+
if (!element) {
|
|
67
|
+
return 0;
|
|
68
|
+
} // Get transition-duration of the element
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
let {
|
|
72
|
+
transitionDuration,
|
|
73
|
+
transitionDelay
|
|
74
|
+
} = window.getComputedStyle(element);
|
|
75
|
+
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
|
76
|
+
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
|
77
|
+
|
|
78
|
+
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
79
|
+
return 0;
|
|
80
|
+
} // If multiple durations are defined, take the first
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
transitionDuration = transitionDuration.split(',')[0];
|
|
84
|
+
transitionDelay = transitionDelay.split(',')[0];
|
|
85
|
+
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
const triggerTransitionEnd = element => {
|
|
89
|
+
element.dispatchEvent(new Event(TRANSITION_END));
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const isElement = obj => {
|
|
93
|
+
if (!obj || typeof obj !== 'object') {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (typeof obj.jquery !== 'undefined') {
|
|
98
|
+
obj = obj[0];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return typeof obj.nodeType !== 'undefined';
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const getElement = obj => {
|
|
105
|
+
if (isElement(obj)) {
|
|
106
|
+
// it's a jQuery object or a node element
|
|
107
|
+
return obj.jquery ? obj[0] : obj;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (typeof obj === 'string' && obj.length > 0) {
|
|
111
|
+
return document.querySelector(obj);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return null;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
118
|
+
Object.keys(configTypes).forEach(property => {
|
|
119
|
+
const expectedTypes = configTypes[property];
|
|
120
|
+
const value = config[property];
|
|
121
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
122
|
+
|
|
123
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
124
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const isVisible = element => {
|
|
130
|
+
if (!isElement(element) || element.getClientRects().length === 0) {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const isDisabled = element => {
|
|
138
|
+
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (element.classList.contains('disabled')) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (typeof element.disabled !== 'undefined') {
|
|
147
|
+
return element.disabled;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Trick to restart an element's animation
|
|
154
|
+
*
|
|
155
|
+
* @param {HTMLElement} element
|
|
156
|
+
* @return void
|
|
157
|
+
*
|
|
158
|
+
* @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
|
|
159
|
+
*/
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
const reflow = element => {
|
|
163
|
+
// eslint-disable-next-line no-unused-expressions
|
|
164
|
+
element.offsetHeight;
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
const getjQuery = () => {
|
|
168
|
+
const {
|
|
169
|
+
jQuery
|
|
170
|
+
} = window;
|
|
171
|
+
|
|
172
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
173
|
+
return jQuery;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return null;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const DOMContentLoadedCallbacks = [];
|
|
180
|
+
|
|
181
|
+
const onDOMContentLoaded = callback => {
|
|
182
|
+
if (document.readyState === 'loading') {
|
|
183
|
+
// add listener on the first call when the document is in loading state
|
|
184
|
+
if (!DOMContentLoadedCallbacks.length) {
|
|
185
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
186
|
+
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
DOMContentLoadedCallbacks.push(callback);
|
|
39
191
|
} else {
|
|
40
|
-
|
|
192
|
+
callback();
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
197
|
+
|
|
198
|
+
const defineJQueryPlugin = plugin => {
|
|
199
|
+
onDOMContentLoaded(() => {
|
|
200
|
+
const $ = getjQuery();
|
|
201
|
+
/* istanbul ignore if */
|
|
202
|
+
|
|
203
|
+
if ($) {
|
|
204
|
+
const name = plugin.NAME;
|
|
205
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
206
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
207
|
+
$.fn[name].Constructor = plugin;
|
|
208
|
+
|
|
209
|
+
$.fn[name].noConflict = () => {
|
|
210
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
211
|
+
return plugin.jQueryInterface;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const execute = callback => {
|
|
218
|
+
if (typeof callback === 'function') {
|
|
219
|
+
callback();
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
|
|
224
|
+
if (!waitForTransition) {
|
|
225
|
+
execute(callback);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const durationPadding = 5;
|
|
230
|
+
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
|
|
231
|
+
let called = false;
|
|
232
|
+
|
|
233
|
+
const handler = ({
|
|
234
|
+
target
|
|
235
|
+
}) => {
|
|
236
|
+
if (target !== transitionElement) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
called = true;
|
|
241
|
+
transitionElement.removeEventListener(TRANSITION_END, handler);
|
|
242
|
+
execute(callback);
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
transitionElement.addEventListener(TRANSITION_END, handler);
|
|
246
|
+
setTimeout(() => {
|
|
247
|
+
if (!called) {
|
|
248
|
+
triggerTransitionEnd(transitionElement);
|
|
249
|
+
}
|
|
250
|
+
}, emulatedDuration);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* --------------------------------------------------------------------------
|
|
255
|
+
* Bootstrap (v5.1.0): util/scrollBar.js
|
|
256
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
257
|
+
* --------------------------------------------------------------------------
|
|
258
|
+
*/
|
|
259
|
+
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
260
|
+
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
261
|
+
|
|
262
|
+
class ScrollBarHelper {
|
|
263
|
+
constructor() {
|
|
264
|
+
this._element = document.body;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
getWidth() {
|
|
268
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
|
269
|
+
const documentWidth = document.documentElement.clientWidth;
|
|
270
|
+
return Math.abs(window.innerWidth - documentWidth);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
hide() {
|
|
274
|
+
const width = this.getWidth();
|
|
275
|
+
|
|
276
|
+
this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
|
283
|
+
|
|
284
|
+
this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
_disableOverFlow() {
|
|
288
|
+
this._saveInitialAttribute(this._element, 'overflow');
|
|
289
|
+
|
|
290
|
+
this._element.style.overflow = 'hidden';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
_setElementAttributes(selector, styleProp, callback) {
|
|
294
|
+
const scrollbarWidth = this.getWidth();
|
|
295
|
+
|
|
296
|
+
const manipulationCallBack = element => {
|
|
297
|
+
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
this._saveInitialAttribute(element, styleProp);
|
|
302
|
+
|
|
303
|
+
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
|
304
|
+
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
reset() {
|
|
311
|
+
this._resetElementAttributes(this._element, 'overflow');
|
|
312
|
+
|
|
313
|
+
this._resetElementAttributes(this._element, 'paddingRight');
|
|
314
|
+
|
|
315
|
+
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
|
316
|
+
|
|
317
|
+
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
_saveInitialAttribute(element, styleProp) {
|
|
321
|
+
const actualValue = element.style[styleProp];
|
|
322
|
+
|
|
323
|
+
if (actualValue) {
|
|
324
|
+
Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
_resetElementAttributes(selector, styleProp) {
|
|
329
|
+
const manipulationCallBack = element => {
|
|
330
|
+
const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
|
|
331
|
+
|
|
332
|
+
if (typeof value === 'undefined') {
|
|
333
|
+
element.style.removeProperty(styleProp);
|
|
334
|
+
} else {
|
|
335
|
+
Manipulator__default['default'].removeDataAttribute(element, styleProp);
|
|
336
|
+
element.style[styleProp] = value;
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
_applyManipulationCallback(selector, callBack) {
|
|
344
|
+
if (isElement(selector)) {
|
|
345
|
+
callBack(selector);
|
|
346
|
+
} else {
|
|
347
|
+
SelectorEngine__default['default'].find(selector, this._element).forEach(callBack);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
isOverflowing() {
|
|
352
|
+
return this.getWidth() > 0;
|
|
41
353
|
}
|
|
42
354
|
|
|
43
|
-
return obj;
|
|
44
355
|
}
|
|
45
356
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
357
|
+
/**
|
|
358
|
+
* --------------------------------------------------------------------------
|
|
359
|
+
* Bootstrap (v5.1.0): util/backdrop.js
|
|
360
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
361
|
+
* --------------------------------------------------------------------------
|
|
362
|
+
*/
|
|
363
|
+
const Default$2 = {
|
|
364
|
+
className: 'modal-backdrop',
|
|
365
|
+
isVisible: true,
|
|
366
|
+
// if false, we use the backdrop helper without adding any element to the dom
|
|
367
|
+
isAnimated: false,
|
|
368
|
+
rootElement: 'body',
|
|
369
|
+
// give the choice to place backdrop under different elements
|
|
370
|
+
clickCallback: null
|
|
371
|
+
};
|
|
372
|
+
const DefaultType$2 = {
|
|
373
|
+
className: 'string',
|
|
374
|
+
isVisible: 'boolean',
|
|
375
|
+
isAnimated: 'boolean',
|
|
376
|
+
rootElement: '(element|string)',
|
|
377
|
+
clickCallback: '(function|null)'
|
|
378
|
+
};
|
|
379
|
+
const NAME$2 = 'backdrop';
|
|
380
|
+
const CLASS_NAME_FADE$1 = 'fade';
|
|
381
|
+
const CLASS_NAME_SHOW$1 = 'show';
|
|
382
|
+
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$2}`;
|
|
383
|
+
|
|
384
|
+
class Backdrop {
|
|
385
|
+
constructor(config) {
|
|
386
|
+
this._config = this._getConfig(config);
|
|
387
|
+
this._isAppended = false;
|
|
388
|
+
this._element = null;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
show(callback) {
|
|
392
|
+
if (!this._config.isVisible) {
|
|
393
|
+
execute(callback);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
this._append();
|
|
398
|
+
|
|
399
|
+
if (this._config.isAnimated) {
|
|
400
|
+
reflow(this._getElement());
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
this._getElement().classList.add(CLASS_NAME_SHOW$1);
|
|
404
|
+
|
|
405
|
+
this._emulateAnimation(() => {
|
|
406
|
+
execute(callback);
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
hide(callback) {
|
|
411
|
+
if (!this._config.isVisible) {
|
|
412
|
+
execute(callback);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
this._getElement().classList.remove(CLASS_NAME_SHOW$1);
|
|
417
|
+
|
|
418
|
+
this._emulateAnimation(() => {
|
|
419
|
+
this.dispose();
|
|
420
|
+
execute(callback);
|
|
421
|
+
});
|
|
422
|
+
} // Private
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
_getElement() {
|
|
426
|
+
if (!this._element) {
|
|
427
|
+
const backdrop = document.createElement('div');
|
|
428
|
+
backdrop.className = this._config.className;
|
|
429
|
+
|
|
430
|
+
if (this._config.isAnimated) {
|
|
431
|
+
backdrop.classList.add(CLASS_NAME_FADE$1);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
this._element = backdrop;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return this._element;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
_getConfig(config) {
|
|
441
|
+
config = { ...Default$2,
|
|
442
|
+
...(typeof config === 'object' ? config : {})
|
|
443
|
+
}; // use getElement() with the default "body" to get a fresh Element on each instantiation
|
|
444
|
+
|
|
445
|
+
config.rootElement = getElement(config.rootElement);
|
|
446
|
+
typeCheckConfig(NAME$2, config, DefaultType$2);
|
|
447
|
+
return config;
|
|
448
|
+
}
|
|
50
449
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}));
|
|
450
|
+
_append() {
|
|
451
|
+
if (this._isAppended) {
|
|
452
|
+
return;
|
|
55
453
|
}
|
|
56
454
|
|
|
57
|
-
|
|
58
|
-
|
|
455
|
+
this._config.rootElement.append(this._getElement());
|
|
456
|
+
|
|
457
|
+
EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
|
|
458
|
+
execute(this._config.clickCallback);
|
|
59
459
|
});
|
|
460
|
+
this._isAppended = true;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
dispose() {
|
|
464
|
+
if (!this._isAppended) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
|
|
469
|
+
|
|
470
|
+
this._element.remove();
|
|
471
|
+
|
|
472
|
+
this._isAppended = false;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
_emulateAnimation(callback) {
|
|
476
|
+
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
|
|
60
477
|
}
|
|
61
478
|
|
|
62
|
-
return target;
|
|
63
479
|
}
|
|
64
480
|
|
|
481
|
+
/**
|
|
482
|
+
* --------------------------------------------------------------------------
|
|
483
|
+
* Bootstrap (v5.1.0): util/focustrap.js
|
|
484
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
485
|
+
* --------------------------------------------------------------------------
|
|
486
|
+
*/
|
|
487
|
+
const Default$1 = {
|
|
488
|
+
trapElement: null,
|
|
489
|
+
// The element to trap focus inside of
|
|
490
|
+
autofocus: true
|
|
491
|
+
};
|
|
492
|
+
const DefaultType$1 = {
|
|
493
|
+
trapElement: 'element',
|
|
494
|
+
autofocus: 'boolean'
|
|
495
|
+
};
|
|
496
|
+
const NAME$1 = 'focustrap';
|
|
497
|
+
const DATA_KEY$1 = 'bs.focustrap';
|
|
498
|
+
const EVENT_KEY$1 = `.${DATA_KEY$1}`;
|
|
499
|
+
const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
|
|
500
|
+
const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
|
|
501
|
+
const TAB_KEY = 'Tab';
|
|
502
|
+
const TAB_NAV_FORWARD = 'forward';
|
|
503
|
+
const TAB_NAV_BACKWARD = 'backward';
|
|
504
|
+
|
|
505
|
+
class FocusTrap {
|
|
506
|
+
constructor(config) {
|
|
507
|
+
this._config = this._getConfig(config);
|
|
508
|
+
this._isActive = false;
|
|
509
|
+
this._lastTabNavDirection = null;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
activate() {
|
|
513
|
+
const {
|
|
514
|
+
trapElement,
|
|
515
|
+
autofocus
|
|
516
|
+
} = this._config;
|
|
517
|
+
|
|
518
|
+
if (this._isActive) {
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (autofocus) {
|
|
523
|
+
trapElement.focus();
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
EventHandler__default['default'].off(document, EVENT_KEY$1); // guard against infinite focus loop
|
|
527
|
+
|
|
528
|
+
EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
|
|
529
|
+
EventHandler__default['default'].on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
|
|
530
|
+
this._isActive = true;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
deactivate() {
|
|
534
|
+
if (!this._isActive) {
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
this._isActive = false;
|
|
539
|
+
EventHandler__default['default'].off(document, EVENT_KEY$1);
|
|
540
|
+
} // Private
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
_handleFocusin(event) {
|
|
544
|
+
const {
|
|
545
|
+
target
|
|
546
|
+
} = event;
|
|
547
|
+
const {
|
|
548
|
+
trapElement
|
|
549
|
+
} = this._config;
|
|
550
|
+
|
|
551
|
+
if (target === document || target === trapElement || trapElement.contains(target)) {
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
const elements = SelectorEngine__default['default'].focusableChildren(trapElement);
|
|
556
|
+
|
|
557
|
+
if (elements.length === 0) {
|
|
558
|
+
trapElement.focus();
|
|
559
|
+
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
|
|
560
|
+
elements[elements.length - 1].focus();
|
|
561
|
+
} else {
|
|
562
|
+
elements[0].focus();
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
_handleKeydown(event) {
|
|
567
|
+
if (event.key !== TAB_KEY) {
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
_getConfig(config) {
|
|
575
|
+
config = { ...Default$1,
|
|
576
|
+
...(typeof config === 'object' ? config : {})
|
|
577
|
+
};
|
|
578
|
+
typeCheckConfig(NAME$1, config, DefaultType$1);
|
|
579
|
+
return config;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* --------------------------------------------------------------------------
|
|
586
|
+
* Bootstrap (v5.1.0): util/component-functions.js
|
|
587
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
588
|
+
* --------------------------------------------------------------------------
|
|
589
|
+
*/
|
|
590
|
+
|
|
591
|
+
const enableDismissTrigger = (component, method = 'hide') => {
|
|
592
|
+
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
|
|
593
|
+
const name = component.NAME;
|
|
594
|
+
EventHandler__default['default'].on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
|
|
595
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
|
596
|
+
event.preventDefault();
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (isDisabled(this)) {
|
|
600
|
+
return;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const target = getElementFromSelector(this) || this.closest(`.${name}`);
|
|
604
|
+
const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
|
|
605
|
+
|
|
606
|
+
instance[method]();
|
|
607
|
+
});
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* --------------------------------------------------------------------------
|
|
612
|
+
* Bootstrap (v5.1.0): modal.js
|
|
613
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
614
|
+
* --------------------------------------------------------------------------
|
|
615
|
+
*/
|
|
65
616
|
/**
|
|
66
617
|
* ------------------------------------------------------------------------
|
|
67
618
|
* Constants
|
|
68
619
|
* ------------------------------------------------------------------------
|
|
69
620
|
*/
|
|
70
621
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
|
|
78
|
-
|
|
79
|
-
var Default = {
|
|
622
|
+
const NAME = 'modal';
|
|
623
|
+
const DATA_KEY = 'bs.modal';
|
|
624
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
625
|
+
const DATA_API_KEY = '.data-api';
|
|
626
|
+
const ESCAPE_KEY = 'Escape';
|
|
627
|
+
const Default = {
|
|
80
628
|
backdrop: true,
|
|
81
629
|
keyboard: true,
|
|
82
|
-
focus: true
|
|
83
|
-
show: true
|
|
630
|
+
focus: true
|
|
84
631
|
};
|
|
85
|
-
|
|
632
|
+
const DefaultType = {
|
|
86
633
|
backdrop: '(boolean|string)',
|
|
87
634
|
keyboard: 'boolean',
|
|
88
|
-
focus: 'boolean'
|
|
89
|
-
show: 'boolean'
|
|
90
|
-
};
|
|
91
|
-
var Event = {
|
|
92
|
-
HIDE: "hide" + EVENT_KEY,
|
|
93
|
-
HIDDEN: "hidden" + EVENT_KEY,
|
|
94
|
-
SHOW: "show" + EVENT_KEY,
|
|
95
|
-
SHOWN: "shown" + EVENT_KEY,
|
|
96
|
-
FOCUSIN: "focusin" + EVENT_KEY,
|
|
97
|
-
RESIZE: "resize" + EVENT_KEY,
|
|
98
|
-
CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
|
|
99
|
-
KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
|
|
100
|
-
MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
|
|
101
|
-
MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
|
|
102
|
-
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
|
|
103
|
-
};
|
|
104
|
-
var ClassName = {
|
|
105
|
-
SCROLLABLE: 'modal-dialog-scrollable',
|
|
106
|
-
SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
|
|
107
|
-
BACKDROP: 'modal-backdrop',
|
|
108
|
-
OPEN: 'modal-open',
|
|
109
|
-
FADE: 'fade',
|
|
110
|
-
SHOW: 'show'
|
|
111
|
-
};
|
|
112
|
-
var Selector = {
|
|
113
|
-
DIALOG: '.modal-dialog',
|
|
114
|
-
MODAL_BODY: '.modal-body',
|
|
115
|
-
DATA_TOGGLE: '[data-toggle="modal"]',
|
|
116
|
-
DATA_DISMISS: '[data-dismiss="modal"]',
|
|
117
|
-
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
|
|
118
|
-
STICKY_CONTENT: '.sticky-top'
|
|
119
|
-
/**
|
|
120
|
-
* ------------------------------------------------------------------------
|
|
121
|
-
* Class Definition
|
|
122
|
-
* ------------------------------------------------------------------------
|
|
123
|
-
*/
|
|
124
|
-
|
|
635
|
+
focus: 'boolean'
|
|
125
636
|
};
|
|
637
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
638
|
+
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
|
639
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
640
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
641
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
642
|
+
const EVENT_RESIZE = `resize${EVENT_KEY}`;
|
|
643
|
+
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
|
|
644
|
+
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
|
645
|
+
const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`;
|
|
646
|
+
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
|
|
647
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
648
|
+
const CLASS_NAME_OPEN = 'modal-open';
|
|
649
|
+
const CLASS_NAME_FADE = 'fade';
|
|
650
|
+
const CLASS_NAME_SHOW = 'show';
|
|
651
|
+
const CLASS_NAME_STATIC = 'modal-static';
|
|
652
|
+
const SELECTOR_DIALOG = '.modal-dialog';
|
|
653
|
+
const SELECTOR_MODAL_BODY = '.modal-body';
|
|
654
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
|
|
655
|
+
/**
|
|
656
|
+
* ------------------------------------------------------------------------
|
|
657
|
+
* Class Definition
|
|
658
|
+
* ------------------------------------------------------------------------
|
|
659
|
+
*/
|
|
126
660
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
function Modal(element, config) {
|
|
661
|
+
class Modal extends BaseComponent__default['default'] {
|
|
662
|
+
constructor(element, config) {
|
|
663
|
+
super(element);
|
|
131
664
|
this._config = this._getConfig(config);
|
|
132
|
-
this.
|
|
133
|
-
this.
|
|
134
|
-
this.
|
|
665
|
+
this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
|
|
666
|
+
this._backdrop = this._initializeBackDrop();
|
|
667
|
+
this._focustrap = this._initializeFocusTrap();
|
|
135
668
|
this._isShown = false;
|
|
136
|
-
this._isBodyOverflowing = false;
|
|
137
669
|
this._ignoreBackdropClick = false;
|
|
138
670
|
this._isTransitioning = false;
|
|
139
|
-
this.
|
|
671
|
+
this._scrollBar = new ScrollBarHelper();
|
|
140
672
|
} // Getters
|
|
141
673
|
|
|
142
674
|
|
|
143
|
-
|
|
675
|
+
static get Default() {
|
|
676
|
+
return Default;
|
|
677
|
+
}
|
|
144
678
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
};
|
|
679
|
+
static get NAME() {
|
|
680
|
+
return NAME;
|
|
681
|
+
} // Public
|
|
149
682
|
|
|
150
|
-
_proto.show = function show(relatedTarget) {
|
|
151
|
-
var _this = this;
|
|
152
683
|
|
|
684
|
+
toggle(relatedTarget) {
|
|
685
|
+
return this._isShown ? this.hide() : this.show(relatedTarget);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
show(relatedTarget) {
|
|
153
689
|
if (this._isShown || this._isTransitioning) {
|
|
154
690
|
return;
|
|
155
691
|
}
|
|
156
692
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
var showEvent = $.Event(Event.SHOW, {
|
|
162
|
-
relatedTarget: relatedTarget
|
|
693
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
|
|
694
|
+
relatedTarget
|
|
163
695
|
});
|
|
164
|
-
$(this._element).trigger(showEvent);
|
|
165
696
|
|
|
166
|
-
if (
|
|
697
|
+
if (showEvent.defaultPrevented) {
|
|
167
698
|
return;
|
|
168
699
|
}
|
|
169
700
|
|
|
170
701
|
this._isShown = true;
|
|
171
702
|
|
|
172
|
-
this.
|
|
703
|
+
if (this._isAnimated()) {
|
|
704
|
+
this._isTransitioning = true;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
this._scrollBar.hide();
|
|
173
708
|
|
|
174
|
-
|
|
709
|
+
document.body.classList.add(CLASS_NAME_OPEN);
|
|
175
710
|
|
|
176
711
|
this._adjustDialog();
|
|
177
712
|
|
|
@@ -179,44 +714,33 @@
|
|
|
179
714
|
|
|
180
715
|
this._setResizeEvent();
|
|
181
716
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
|
|
187
|
-
if ($(event.target).is(_this._element)) {
|
|
188
|
-
_this._ignoreBackdropClick = true;
|
|
717
|
+
EventHandler__default['default'].on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
|
|
718
|
+
EventHandler__default['default'].one(this._element, EVENT_MOUSEUP_DISMISS, event => {
|
|
719
|
+
if (event.target === this._element) {
|
|
720
|
+
this._ignoreBackdropClick = true;
|
|
189
721
|
}
|
|
190
722
|
});
|
|
191
723
|
});
|
|
192
724
|
|
|
193
|
-
this._showBackdrop(
|
|
194
|
-
|
|
195
|
-
});
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
_proto.hide = function hide(event) {
|
|
199
|
-
var _this2 = this;
|
|
200
|
-
|
|
201
|
-
if (event) {
|
|
202
|
-
event.preventDefault();
|
|
203
|
-
}
|
|
725
|
+
this._showBackdrop(() => this._showElement(relatedTarget));
|
|
726
|
+
}
|
|
204
727
|
|
|
728
|
+
hide() {
|
|
205
729
|
if (!this._isShown || this._isTransitioning) {
|
|
206
730
|
return;
|
|
207
731
|
}
|
|
208
732
|
|
|
209
|
-
|
|
210
|
-
$(this._element).trigger(hideEvent);
|
|
733
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
|
|
211
734
|
|
|
212
|
-
if (
|
|
735
|
+
if (hideEvent.defaultPrevented) {
|
|
213
736
|
return;
|
|
214
737
|
}
|
|
215
738
|
|
|
216
739
|
this._isShown = false;
|
|
217
|
-
var transition = $(this._element).hasClass(ClassName.FADE);
|
|
218
740
|
|
|
219
|
-
|
|
741
|
+
const isAnimated = this._isAnimated();
|
|
742
|
+
|
|
743
|
+
if (isAnimated) {
|
|
220
744
|
this._isTransitioning = true;
|
|
221
745
|
}
|
|
222
746
|
|
|
@@ -224,63 +748,62 @@
|
|
|
224
748
|
|
|
225
749
|
this._setResizeEvent();
|
|
226
750
|
|
|
227
|
-
|
|
228
|
-
$(this._element).removeClass(ClassName.SHOW);
|
|
229
|
-
$(this._element).off(Event.CLICK_DISMISS);
|
|
230
|
-
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
|
|
751
|
+
this._focustrap.deactivate();
|
|
231
752
|
|
|
232
|
-
|
|
233
|
-
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
|
|
234
|
-
$(this._element).one(Util.TRANSITION_END, function (event) {
|
|
235
|
-
return _this2._hideModal(event);
|
|
236
|
-
}).emulateTransitionEnd(transitionDuration);
|
|
237
|
-
} else {
|
|
238
|
-
this._hideModal();
|
|
239
|
-
}
|
|
240
|
-
};
|
|
753
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
241
754
|
|
|
242
|
-
|
|
243
|
-
[
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
* `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
|
|
248
|
-
* Do not move `document` in `htmlElements` array
|
|
249
|
-
* It will remove `Event.CLICK_DATA_API` event that should remain
|
|
250
|
-
*/
|
|
251
|
-
|
|
252
|
-
$(document).off(Event.FOCUSIN);
|
|
253
|
-
$.removeData(this._element, DATA_KEY);
|
|
254
|
-
this._config = null;
|
|
255
|
-
this._element = null;
|
|
256
|
-
this._dialog = null;
|
|
257
|
-
this._backdrop = null;
|
|
258
|
-
this._isShown = null;
|
|
259
|
-
this._isBodyOverflowing = null;
|
|
260
|
-
this._ignoreBackdropClick = null;
|
|
261
|
-
this._isTransitioning = null;
|
|
262
|
-
this._scrollbarWidth = null;
|
|
263
|
-
};
|
|
755
|
+
EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
|
|
756
|
+
EventHandler__default['default'].off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
|
|
757
|
+
|
|
758
|
+
this._queueCallback(() => this._hideModal(), this._element, isAnimated);
|
|
759
|
+
}
|
|
264
760
|
|
|
265
|
-
|
|
761
|
+
dispose() {
|
|
762
|
+
[window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
|
|
763
|
+
|
|
764
|
+
this._backdrop.dispose();
|
|
765
|
+
|
|
766
|
+
this._focustrap.deactivate();
|
|
767
|
+
|
|
768
|
+
super.dispose();
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
handleUpdate() {
|
|
266
772
|
this._adjustDialog();
|
|
267
773
|
} // Private
|
|
268
|
-
;
|
|
269
774
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
775
|
+
|
|
776
|
+
_initializeBackDrop() {
|
|
777
|
+
return new Backdrop({
|
|
778
|
+
isVisible: Boolean(this._config.backdrop),
|
|
779
|
+
// 'static' option will be translated to true, and booleans will keep their value
|
|
780
|
+
isAnimated: this._isAnimated()
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
_initializeFocusTrap() {
|
|
785
|
+
return new FocusTrap({
|
|
786
|
+
trapElement: this._element
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
_getConfig(config) {
|
|
791
|
+
config = { ...Default,
|
|
792
|
+
...Manipulator__default['default'].getDataAttributes(this._element),
|
|
793
|
+
...(typeof config === 'object' ? config : {})
|
|
794
|
+
};
|
|
795
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
273
796
|
return config;
|
|
274
|
-
}
|
|
797
|
+
}
|
|
275
798
|
|
|
276
|
-
|
|
277
|
-
|
|
799
|
+
_showElement(relatedTarget) {
|
|
800
|
+
const isAnimated = this._isAnimated();
|
|
278
801
|
|
|
279
|
-
|
|
802
|
+
const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
|
|
280
803
|
|
|
281
804
|
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
|
282
805
|
// Don't move modal's DOM position
|
|
283
|
-
document.body.
|
|
806
|
+
document.body.append(this._element);
|
|
284
807
|
}
|
|
285
808
|
|
|
286
809
|
this._element.style.display = 'block';
|
|
@@ -289,309 +812,183 @@
|
|
|
289
812
|
|
|
290
813
|
this._element.setAttribute('aria-modal', true);
|
|
291
814
|
|
|
292
|
-
|
|
293
|
-
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
|
|
294
|
-
} else {
|
|
295
|
-
this._element.scrollTop = 0;
|
|
296
|
-
}
|
|
815
|
+
this._element.setAttribute('role', 'dialog');
|
|
297
816
|
|
|
298
|
-
|
|
299
|
-
Util.reflow(this._element);
|
|
300
|
-
}
|
|
817
|
+
this._element.scrollTop = 0;
|
|
301
818
|
|
|
302
|
-
|
|
819
|
+
if (modalBody) {
|
|
820
|
+
modalBody.scrollTop = 0;
|
|
821
|
+
}
|
|
303
822
|
|
|
304
|
-
if (
|
|
305
|
-
this.
|
|
823
|
+
if (isAnimated) {
|
|
824
|
+
reflow(this._element);
|
|
306
825
|
}
|
|
307
826
|
|
|
308
|
-
|
|
309
|
-
relatedTarget: relatedTarget
|
|
310
|
-
});
|
|
827
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
311
828
|
|
|
312
|
-
|
|
313
|
-
if (
|
|
314
|
-
|
|
829
|
+
const transitionComplete = () => {
|
|
830
|
+
if (this._config.focus) {
|
|
831
|
+
this._focustrap.activate();
|
|
315
832
|
}
|
|
316
833
|
|
|
317
|
-
|
|
318
|
-
|
|
834
|
+
this._isTransitioning = false;
|
|
835
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
|
|
836
|
+
relatedTarget
|
|
837
|
+
});
|
|
319
838
|
};
|
|
320
839
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
$(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
|
|
324
|
-
} else {
|
|
325
|
-
transitionComplete();
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
|
|
329
|
-
_proto._enforceFocus = function _enforceFocus() {
|
|
330
|
-
var _this4 = this;
|
|
331
|
-
|
|
332
|
-
$(document).off(Event.FOCUSIN) // Guard against infinite focus loop
|
|
333
|
-
.on(Event.FOCUSIN, function (event) {
|
|
334
|
-
if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
|
|
335
|
-
_this4._element.focus();
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
_proto._setEscapeEvent = function _setEscapeEvent() {
|
|
341
|
-
var _this5 = this;
|
|
840
|
+
this._queueCallback(transitionComplete, this._dialog, isAnimated);
|
|
841
|
+
}
|
|
342
842
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
843
|
+
_setEscapeEvent() {
|
|
844
|
+
if (this._isShown) {
|
|
845
|
+
EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
846
|
+
if (this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
346
847
|
event.preventDefault();
|
|
347
|
-
|
|
348
|
-
|
|
848
|
+
this.hide();
|
|
849
|
+
} else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
850
|
+
this._triggerBackdropTransition();
|
|
349
851
|
}
|
|
350
852
|
});
|
|
351
|
-
} else
|
|
352
|
-
|
|
853
|
+
} else {
|
|
854
|
+
EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
|
|
353
855
|
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
_proto._setResizeEvent = function _setResizeEvent() {
|
|
357
|
-
var _this6 = this;
|
|
856
|
+
}
|
|
358
857
|
|
|
858
|
+
_setResizeEvent() {
|
|
359
859
|
if (this._isShown) {
|
|
360
|
-
|
|
361
|
-
return _this6.handleUpdate(event);
|
|
362
|
-
});
|
|
860
|
+
EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
|
|
363
861
|
} else {
|
|
364
|
-
|
|
862
|
+
EventHandler__default['default'].off(window, EVENT_RESIZE);
|
|
365
863
|
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
_proto._hideModal = function _hideModal() {
|
|
369
|
-
var _this7 = this;
|
|
864
|
+
}
|
|
370
865
|
|
|
866
|
+
_hideModal() {
|
|
371
867
|
this._element.style.display = 'none';
|
|
372
868
|
|
|
373
869
|
this._element.setAttribute('aria-hidden', true);
|
|
374
870
|
|
|
375
871
|
this._element.removeAttribute('aria-modal');
|
|
376
872
|
|
|
873
|
+
this._element.removeAttribute('role');
|
|
874
|
+
|
|
377
875
|
this._isTransitioning = false;
|
|
378
876
|
|
|
379
|
-
this.
|
|
380
|
-
|
|
877
|
+
this._backdrop.hide(() => {
|
|
878
|
+
document.body.classList.remove(CLASS_NAME_OPEN);
|
|
381
879
|
|
|
382
|
-
|
|
880
|
+
this._resetAdjustments();
|
|
383
881
|
|
|
384
|
-
|
|
882
|
+
this._scrollBar.reset();
|
|
385
883
|
|
|
386
|
-
|
|
884
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
|
|
387
885
|
});
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
_proto._removeBackdrop = function _removeBackdrop() {
|
|
391
|
-
if (this._backdrop) {
|
|
392
|
-
$(this._backdrop).remove();
|
|
393
|
-
this._backdrop = null;
|
|
394
|
-
}
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
_proto._showBackdrop = function _showBackdrop(callback) {
|
|
398
|
-
var _this8 = this;
|
|
399
|
-
|
|
400
|
-
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
|
|
401
|
-
|
|
402
|
-
if (this._isShown && this._config.backdrop) {
|
|
403
|
-
this._backdrop = document.createElement('div');
|
|
404
|
-
this._backdrop.className = ClassName.BACKDROP;
|
|
405
|
-
|
|
406
|
-
if (animate) {
|
|
407
|
-
this._backdrop.classList.add(animate);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
$(this._backdrop).appendTo(document.body);
|
|
411
|
-
$(this._element).on(Event.CLICK_DISMISS, function (event) {
|
|
412
|
-
if (_this8._ignoreBackdropClick) {
|
|
413
|
-
_this8._ignoreBackdropClick = false;
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
if (event.target !== event.currentTarget) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
if (_this8._config.backdrop === 'static') {
|
|
422
|
-
_this8._element.focus();
|
|
423
|
-
} else {
|
|
424
|
-
_this8.hide();
|
|
425
|
-
}
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
if (animate) {
|
|
429
|
-
Util.reflow(this._backdrop);
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
$(this._backdrop).addClass(ClassName.SHOW);
|
|
886
|
+
}
|
|
433
887
|
|
|
434
|
-
|
|
888
|
+
_showBackdrop(callback) {
|
|
889
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
|
|
890
|
+
if (this._ignoreBackdropClick) {
|
|
891
|
+
this._ignoreBackdropClick = false;
|
|
435
892
|
return;
|
|
436
893
|
}
|
|
437
894
|
|
|
438
|
-
if (
|
|
439
|
-
callback();
|
|
895
|
+
if (event.target !== event.currentTarget) {
|
|
440
896
|
return;
|
|
441
897
|
}
|
|
442
898
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
899
|
+
if (this._config.backdrop === true) {
|
|
900
|
+
this.hide();
|
|
901
|
+
} else if (this._config.backdrop === 'static') {
|
|
902
|
+
this._triggerBackdropTransition();
|
|
903
|
+
}
|
|
904
|
+
});
|
|
447
905
|
|
|
448
|
-
|
|
449
|
-
|
|
906
|
+
this._backdrop.show(callback);
|
|
907
|
+
}
|
|
450
908
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
};
|
|
909
|
+
_isAnimated() {
|
|
910
|
+
return this._element.classList.contains(CLASS_NAME_FADE);
|
|
911
|
+
}
|
|
455
912
|
|
|
456
|
-
|
|
457
|
-
|
|
913
|
+
_triggerBackdropTransition() {
|
|
914
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
|
|
458
915
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
callbackRemove();
|
|
462
|
-
}
|
|
463
|
-
} else if (callback) {
|
|
464
|
-
callback();
|
|
916
|
+
if (hideEvent.defaultPrevented) {
|
|
917
|
+
return;
|
|
465
918
|
}
|
|
466
|
-
} // ----------------------------------------------------------------------
|
|
467
|
-
// the following methods are used to handle overflowing modals
|
|
468
|
-
// todo (fat): these should probably be refactored out of modal.js
|
|
469
|
-
// ----------------------------------------------------------------------
|
|
470
|
-
;
|
|
471
919
|
|
|
472
|
-
|
|
473
|
-
|
|
920
|
+
const {
|
|
921
|
+
classList,
|
|
922
|
+
scrollHeight,
|
|
923
|
+
style
|
|
924
|
+
} = this._element;
|
|
925
|
+
const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
|
|
474
926
|
|
|
475
|
-
if (!
|
|
476
|
-
|
|
927
|
+
if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
|
|
928
|
+
return;
|
|
477
929
|
}
|
|
478
930
|
|
|
479
|
-
if (
|
|
480
|
-
|
|
931
|
+
if (!isModalOverflowing) {
|
|
932
|
+
style.overflowY = 'hidden';
|
|
481
933
|
}
|
|
482
|
-
};
|
|
483
934
|
|
|
484
|
-
|
|
485
|
-
this._element.style.paddingLeft = '';
|
|
486
|
-
this._element.style.paddingRight = '';
|
|
487
|
-
};
|
|
935
|
+
classList.add(CLASS_NAME_STATIC);
|
|
488
936
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
|
|
492
|
-
this._scrollbarWidth = this._getScrollbarWidth();
|
|
493
|
-
};
|
|
937
|
+
this._queueCallback(() => {
|
|
938
|
+
classList.remove(CLASS_NAME_STATIC);
|
|
494
939
|
|
|
495
|
-
|
|
496
|
-
|
|
940
|
+
if (!isModalOverflowing) {
|
|
941
|
+
this._queueCallback(() => {
|
|
942
|
+
style.overflowY = '';
|
|
943
|
+
}, this._dialog);
|
|
944
|
+
}
|
|
945
|
+
}, this._dialog);
|
|
497
946
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
|
|
947
|
+
this._element.focus();
|
|
948
|
+
} // ----------------------------------------------------------------------
|
|
949
|
+
// the following methods are used to handle overflowing modals
|
|
950
|
+
// ----------------------------------------------------------------------
|
|
503
951
|
|
|
504
|
-
$(fixedContent).each(function (index, element) {
|
|
505
|
-
var actualPadding = element.style.paddingRight;
|
|
506
|
-
var calculatedPadding = $(element).css('padding-right');
|
|
507
|
-
$(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
|
|
508
|
-
}); // Adjust sticky content margin
|
|
509
952
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
var calculatedMargin = $(element).css('margin-right');
|
|
513
|
-
$(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
|
|
514
|
-
}); // Adjust body padding
|
|
953
|
+
_adjustDialog() {
|
|
954
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
515
955
|
|
|
516
|
-
|
|
517
|
-
var calculatedPadding = $(document.body).css('padding-right');
|
|
518
|
-
$(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
|
|
519
|
-
}
|
|
956
|
+
const scrollbarWidth = this._scrollBar.getWidth();
|
|
520
957
|
|
|
521
|
-
|
|
522
|
-
};
|
|
958
|
+
const isBodyOverflowing = scrollbarWidth > 0;
|
|
523
959
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
$(fixedContent).each(function (index, element) {
|
|
528
|
-
var padding = $(element).data('padding-right');
|
|
529
|
-
$(element).removeData('padding-right');
|
|
530
|
-
element.style.paddingRight = padding ? padding : '';
|
|
531
|
-
}); // Restore sticky content
|
|
532
|
-
|
|
533
|
-
var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
|
|
534
|
-
$(elements).each(function (index, element) {
|
|
535
|
-
var margin = $(element).data('margin-right');
|
|
536
|
-
|
|
537
|
-
if (typeof margin !== 'undefined') {
|
|
538
|
-
$(element).css('margin-right', margin).removeData('margin-right');
|
|
539
|
-
}
|
|
540
|
-
}); // Restore body padding
|
|
960
|
+
if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
|
|
961
|
+
this._element.style.paddingLeft = `${scrollbarWidth}px`;
|
|
962
|
+
}
|
|
541
963
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
}
|
|
964
|
+
if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
|
|
965
|
+
this._element.style.paddingRight = `${scrollbarWidth}px`;
|
|
966
|
+
}
|
|
967
|
+
}
|
|
546
968
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
|
|
551
|
-
document.body.appendChild(scrollDiv);
|
|
552
|
-
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
|
|
553
|
-
document.body.removeChild(scrollDiv);
|
|
554
|
-
return scrollbarWidth;
|
|
969
|
+
_resetAdjustments() {
|
|
970
|
+
this._element.style.paddingLeft = '';
|
|
971
|
+
this._element.style.paddingRight = '';
|
|
555
972
|
} // Static
|
|
556
|
-
;
|
|
557
973
|
|
|
558
|
-
Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
|
|
559
|
-
return this.each(function () {
|
|
560
|
-
var data = $(this).data(DATA_KEY);
|
|
561
974
|
|
|
562
|
-
|
|
975
|
+
static jQueryInterface(config, relatedTarget) {
|
|
976
|
+
return this.each(function () {
|
|
977
|
+
const data = Modal.getOrCreateInstance(this, config);
|
|
563
978
|
|
|
564
|
-
if (
|
|
565
|
-
|
|
566
|
-
$(this).data(DATA_KEY, data);
|
|
979
|
+
if (typeof config !== 'string') {
|
|
980
|
+
return;
|
|
567
981
|
}
|
|
568
982
|
|
|
569
|
-
if (typeof config === '
|
|
570
|
-
|
|
571
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
data[config](relatedTarget);
|
|
575
|
-
} else if (_config.show) {
|
|
576
|
-
data.show(relatedTarget);
|
|
983
|
+
if (typeof data[config] === 'undefined') {
|
|
984
|
+
throw new TypeError(`No method named "${config}"`);
|
|
577
985
|
}
|
|
578
|
-
});
|
|
579
|
-
};
|
|
580
986
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
return VERSION;
|
|
585
|
-
}
|
|
586
|
-
}, {
|
|
587
|
-
key: "Default",
|
|
588
|
-
get: function get() {
|
|
589
|
-
return Default;
|
|
590
|
-
}
|
|
591
|
-
}]);
|
|
987
|
+
data[config](relatedTarget);
|
|
988
|
+
});
|
|
989
|
+
}
|
|
592
990
|
|
|
593
|
-
|
|
594
|
-
}();
|
|
991
|
+
}
|
|
595
992
|
/**
|
|
596
993
|
* ------------------------------------------------------------------------
|
|
597
994
|
* Data Api implementation
|
|
@@ -599,51 +996,38 @@
|
|
|
599
996
|
*/
|
|
600
997
|
|
|
601
998
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
var target;
|
|
606
|
-
var selector = Util.getSelectorFromElement(this);
|
|
999
|
+
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
1000
|
+
const target = getElementFromSelector(this);
|
|
607
1001
|
|
|
608
|
-
if (
|
|
609
|
-
target = document.querySelector(selector);
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
|
|
613
|
-
|
|
614
|
-
if (this.tagName === 'A' || this.tagName === 'AREA') {
|
|
1002
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
|
615
1003
|
event.preventDefault();
|
|
616
1004
|
}
|
|
617
1005
|
|
|
618
|
-
|
|
619
|
-
if (showEvent.
|
|
620
|
-
//
|
|
1006
|
+
EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
|
|
1007
|
+
if (showEvent.defaultPrevented) {
|
|
1008
|
+
// only register focus restorer if modal will actually get shown
|
|
621
1009
|
return;
|
|
622
1010
|
}
|
|
623
1011
|
|
|
624
|
-
|
|
625
|
-
if (
|
|
626
|
-
|
|
1012
|
+
EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
|
|
1013
|
+
if (isVisible(this)) {
|
|
1014
|
+
this.focus();
|
|
627
1015
|
}
|
|
628
1016
|
});
|
|
629
1017
|
});
|
|
630
|
-
|
|
631
|
-
|
|
1018
|
+
const data = Modal.getOrCreateInstance(target);
|
|
1019
|
+
data.toggle(this);
|
|
632
1020
|
});
|
|
1021
|
+
enableDismissTrigger(Modal);
|
|
633
1022
|
/**
|
|
634
1023
|
* ------------------------------------------------------------------------
|
|
635
1024
|
* jQuery
|
|
636
1025
|
* ------------------------------------------------------------------------
|
|
1026
|
+
* add .Modal to jQuery only if jQuery is present
|
|
637
1027
|
*/
|
|
638
1028
|
|
|
639
|
-
|
|
640
|
-
$.fn[NAME].Constructor = Modal;
|
|
641
|
-
|
|
642
|
-
$.fn[NAME].noConflict = function () {
|
|
643
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
644
|
-
return Modal._jQueryInterface;
|
|
645
|
-
};
|
|
1029
|
+
defineJQueryPlugin(Modal);
|
|
646
1030
|
|
|
647
1031
|
return Modal;
|
|
648
1032
|
|
|
649
|
-
}));
|
|
1033
|
+
})));
|