bootstrap 4.3.1 → 5.1.3
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 +172 -136
- data/assets/javascripts/bootstrap/base-component.js +182 -0
- data/assets/javascripts/bootstrap/button.js +101 -142
- data/assets/javascripts/bootstrap/carousel.js +483 -408
- data/assets/javascripts/bootstrap/collapse.js +340 -273
- data/assets/javascripts/bootstrap/dom/data.js +68 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +321 -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 +491 -399
- data/assets/javascripts/bootstrap/modal.js +841 -449
- data/assets/javascripts/bootstrap/offcanvas.js +866 -0
- data/assets/javascripts/bootstrap/popover.js +121 -198
- data/assets/javascripts/bootstrap/scrollspy.js +256 -240
- data/assets/javascripts/bootstrap/tab.js +218 -154
- data/assets/javascripts/bootstrap/toast.js +329 -189
- data/assets/javascripts/bootstrap/tooltip.js +651 -552
- 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 +3503 -2892
- data/assets/javascripts/bootstrap.min.js +4 -4
- data/assets/stylesheets/_bootstrap-grid.scss +56 -18
- data/assets/stylesheets/_bootstrap-reboot.scss +5 -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 +243 -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 +43 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
- data/assets/stylesheets/bootstrap/_tables.scss +84 -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 +1007 -489
- 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 +72 -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 +132 -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 +278 -128
- 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,713 @@
|
|
|
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.3 (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
|
+
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
13
|
+
|
|
14
|
+
const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
15
|
+
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
16
|
+
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
17
|
+
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* --------------------------------------------------------------------------
|
|
21
|
+
* Bootstrap (v5.1.3): 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.3): 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.3): util/backdrop.js
|
|
360
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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}`;
|
|
50
383
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
+
}
|
|
449
|
+
|
|
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);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* --------------------------------------------------------------------------
|
|
483
|
+
* Bootstrap (v5.1.3): util/focustrap.js
|
|
484
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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;
|
|
60
580
|
}
|
|
61
581
|
|
|
62
|
-
return target;
|
|
63
582
|
}
|
|
64
583
|
|
|
584
|
+
/**
|
|
585
|
+
* --------------------------------------------------------------------------
|
|
586
|
+
* Bootstrap (v5.1.3): 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.3): 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 OPEN_SELECTOR = '.modal.show';
|
|
653
|
+
const SELECTOR_DIALOG = '.modal-dialog';
|
|
654
|
+
const SELECTOR_MODAL_BODY = '.modal-body';
|
|
655
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
|
|
656
|
+
/**
|
|
657
|
+
* ------------------------------------------------------------------------
|
|
658
|
+
* Class Definition
|
|
659
|
+
* ------------------------------------------------------------------------
|
|
660
|
+
*/
|
|
126
661
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
function Modal(element, config) {
|
|
662
|
+
class Modal extends BaseComponent__default.default {
|
|
663
|
+
constructor(element, config) {
|
|
664
|
+
super(element);
|
|
131
665
|
this._config = this._getConfig(config);
|
|
132
|
-
this.
|
|
133
|
-
this.
|
|
134
|
-
this.
|
|
666
|
+
this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element);
|
|
667
|
+
this._backdrop = this._initializeBackDrop();
|
|
668
|
+
this._focustrap = this._initializeFocusTrap();
|
|
135
669
|
this._isShown = false;
|
|
136
|
-
this._isBodyOverflowing = false;
|
|
137
670
|
this._ignoreBackdropClick = false;
|
|
138
671
|
this._isTransitioning = false;
|
|
139
|
-
this.
|
|
672
|
+
this._scrollBar = new ScrollBarHelper();
|
|
140
673
|
} // Getters
|
|
141
674
|
|
|
142
675
|
|
|
143
|
-
|
|
676
|
+
static get Default() {
|
|
677
|
+
return Default;
|
|
678
|
+
}
|
|
144
679
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
};
|
|
680
|
+
static get NAME() {
|
|
681
|
+
return NAME;
|
|
682
|
+
} // Public
|
|
149
683
|
|
|
150
|
-
_proto.show = function show(relatedTarget) {
|
|
151
|
-
var _this = this;
|
|
152
684
|
|
|
685
|
+
toggle(relatedTarget) {
|
|
686
|
+
return this._isShown ? this.hide() : this.show(relatedTarget);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
show(relatedTarget) {
|
|
153
690
|
if (this._isShown || this._isTransitioning) {
|
|
154
691
|
return;
|
|
155
692
|
}
|
|
156
693
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
var showEvent = $.Event(Event.SHOW, {
|
|
162
|
-
relatedTarget: relatedTarget
|
|
694
|
+
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
|
|
695
|
+
relatedTarget
|
|
163
696
|
});
|
|
164
|
-
$(this._element).trigger(showEvent);
|
|
165
697
|
|
|
166
|
-
if (
|
|
698
|
+
if (showEvent.defaultPrevented) {
|
|
167
699
|
return;
|
|
168
700
|
}
|
|
169
701
|
|
|
170
702
|
this._isShown = true;
|
|
171
703
|
|
|
172
|
-
this.
|
|
704
|
+
if (this._isAnimated()) {
|
|
705
|
+
this._isTransitioning = true;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
this._scrollBar.hide();
|
|
173
709
|
|
|
174
|
-
|
|
710
|
+
document.body.classList.add(CLASS_NAME_OPEN);
|
|
175
711
|
|
|
176
712
|
this._adjustDialog();
|
|
177
713
|
|
|
@@ -179,44 +715,33 @@
|
|
|
179
715
|
|
|
180
716
|
this._setResizeEvent();
|
|
181
717
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
$(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
|
|
187
|
-
if ($(event.target).is(_this._element)) {
|
|
188
|
-
_this._ignoreBackdropClick = true;
|
|
718
|
+
EventHandler__default.default.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
|
|
719
|
+
EventHandler__default.default.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
|
|
720
|
+
if (event.target === this._element) {
|
|
721
|
+
this._ignoreBackdropClick = true;
|
|
189
722
|
}
|
|
190
723
|
});
|
|
191
724
|
});
|
|
192
725
|
|
|
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
|
-
}
|
|
726
|
+
this._showBackdrop(() => this._showElement(relatedTarget));
|
|
727
|
+
}
|
|
204
728
|
|
|
729
|
+
hide() {
|
|
205
730
|
if (!this._isShown || this._isTransitioning) {
|
|
206
731
|
return;
|
|
207
732
|
}
|
|
208
733
|
|
|
209
|
-
|
|
210
|
-
$(this._element).trigger(hideEvent);
|
|
734
|
+
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
|
|
211
735
|
|
|
212
|
-
if (
|
|
736
|
+
if (hideEvent.defaultPrevented) {
|
|
213
737
|
return;
|
|
214
738
|
}
|
|
215
739
|
|
|
216
740
|
this._isShown = false;
|
|
217
|
-
var transition = $(this._element).hasClass(ClassName.FADE);
|
|
218
741
|
|
|
219
|
-
|
|
742
|
+
const isAnimated = this._isAnimated();
|
|
743
|
+
|
|
744
|
+
if (isAnimated) {
|
|
220
745
|
this._isTransitioning = true;
|
|
221
746
|
}
|
|
222
747
|
|
|
@@ -224,63 +749,62 @@
|
|
|
224
749
|
|
|
225
750
|
this._setResizeEvent();
|
|
226
751
|
|
|
227
|
-
|
|
228
|
-
$(this._element).removeClass(ClassName.SHOW);
|
|
229
|
-
$(this._element).off(Event.CLICK_DISMISS);
|
|
230
|
-
$(this._dialog).off(Event.MOUSEDOWN_DISMISS);
|
|
752
|
+
this._focustrap.deactivate();
|
|
231
753
|
|
|
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
|
-
};
|
|
754
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
241
755
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
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
|
-
};
|
|
756
|
+
EventHandler__default.default.off(this._element, EVENT_CLICK_DISMISS);
|
|
757
|
+
EventHandler__default.default.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
|
|
758
|
+
|
|
759
|
+
this._queueCallback(() => this._hideModal(), this._element, isAnimated);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
dispose() {
|
|
763
|
+
[window, this._dialog].forEach(htmlElement => EventHandler__default.default.off(htmlElement, EVENT_KEY));
|
|
764
|
+
|
|
765
|
+
this._backdrop.dispose();
|
|
264
766
|
|
|
265
|
-
|
|
767
|
+
this._focustrap.deactivate();
|
|
768
|
+
|
|
769
|
+
super.dispose();
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
handleUpdate() {
|
|
266
773
|
this._adjustDialog();
|
|
267
774
|
} // Private
|
|
268
|
-
;
|
|
269
775
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
776
|
+
|
|
777
|
+
_initializeBackDrop() {
|
|
778
|
+
return new Backdrop({
|
|
779
|
+
isVisible: Boolean(this._config.backdrop),
|
|
780
|
+
// 'static' option will be translated to true, and booleans will keep their value
|
|
781
|
+
isAnimated: this._isAnimated()
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
_initializeFocusTrap() {
|
|
786
|
+
return new FocusTrap({
|
|
787
|
+
trapElement: this._element
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
_getConfig(config) {
|
|
792
|
+
config = { ...Default,
|
|
793
|
+
...Manipulator__default.default.getDataAttributes(this._element),
|
|
794
|
+
...(typeof config === 'object' ? config : {})
|
|
795
|
+
};
|
|
796
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
273
797
|
return config;
|
|
274
|
-
}
|
|
798
|
+
}
|
|
275
799
|
|
|
276
|
-
|
|
277
|
-
|
|
800
|
+
_showElement(relatedTarget) {
|
|
801
|
+
const isAnimated = this._isAnimated();
|
|
278
802
|
|
|
279
|
-
|
|
803
|
+
const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
|
|
280
804
|
|
|
281
805
|
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
|
282
806
|
// Don't move modal's DOM position
|
|
283
|
-
document.body.
|
|
807
|
+
document.body.append(this._element);
|
|
284
808
|
}
|
|
285
809
|
|
|
286
810
|
this._element.style.display = 'block';
|
|
@@ -289,309 +813,183 @@
|
|
|
289
813
|
|
|
290
814
|
this._element.setAttribute('aria-modal', true);
|
|
291
815
|
|
|
292
|
-
|
|
293
|
-
this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
|
|
294
|
-
} else {
|
|
295
|
-
this._element.scrollTop = 0;
|
|
296
|
-
}
|
|
816
|
+
this._element.setAttribute('role', 'dialog');
|
|
297
817
|
|
|
298
|
-
|
|
299
|
-
Util.reflow(this._element);
|
|
300
|
-
}
|
|
818
|
+
this._element.scrollTop = 0;
|
|
301
819
|
|
|
302
|
-
|
|
820
|
+
if (modalBody) {
|
|
821
|
+
modalBody.scrollTop = 0;
|
|
822
|
+
}
|
|
303
823
|
|
|
304
|
-
if (
|
|
305
|
-
this.
|
|
824
|
+
if (isAnimated) {
|
|
825
|
+
reflow(this._element);
|
|
306
826
|
}
|
|
307
827
|
|
|
308
|
-
|
|
309
|
-
relatedTarget: relatedTarget
|
|
310
|
-
});
|
|
828
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
311
829
|
|
|
312
|
-
|
|
313
|
-
if (
|
|
314
|
-
|
|
830
|
+
const transitionComplete = () => {
|
|
831
|
+
if (this._config.focus) {
|
|
832
|
+
this._focustrap.activate();
|
|
315
833
|
}
|
|
316
834
|
|
|
317
|
-
|
|
318
|
-
|
|
835
|
+
this._isTransitioning = false;
|
|
836
|
+
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
|
|
837
|
+
relatedTarget
|
|
838
|
+
});
|
|
319
839
|
};
|
|
320
840
|
|
|
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;
|
|
841
|
+
this._queueCallback(transitionComplete, this._dialog, isAnimated);
|
|
842
|
+
}
|
|
342
843
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
844
|
+
_setEscapeEvent() {
|
|
845
|
+
if (this._isShown) {
|
|
846
|
+
EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
847
|
+
if (this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
346
848
|
event.preventDefault();
|
|
347
|
-
|
|
348
|
-
|
|
849
|
+
this.hide();
|
|
850
|
+
} else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
851
|
+
this._triggerBackdropTransition();
|
|
349
852
|
}
|
|
350
853
|
});
|
|
351
|
-
} else
|
|
352
|
-
|
|
854
|
+
} else {
|
|
855
|
+
EventHandler__default.default.off(this._element, EVENT_KEYDOWN_DISMISS);
|
|
353
856
|
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
_proto._setResizeEvent = function _setResizeEvent() {
|
|
357
|
-
var _this6 = this;
|
|
857
|
+
}
|
|
358
858
|
|
|
859
|
+
_setResizeEvent() {
|
|
359
860
|
if (this._isShown) {
|
|
360
|
-
|
|
361
|
-
return _this6.handleUpdate(event);
|
|
362
|
-
});
|
|
861
|
+
EventHandler__default.default.on(window, EVENT_RESIZE, () => this._adjustDialog());
|
|
363
862
|
} else {
|
|
364
|
-
|
|
863
|
+
EventHandler__default.default.off(window, EVENT_RESIZE);
|
|
365
864
|
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
_proto._hideModal = function _hideModal() {
|
|
369
|
-
var _this7 = this;
|
|
865
|
+
}
|
|
370
866
|
|
|
867
|
+
_hideModal() {
|
|
371
868
|
this._element.style.display = 'none';
|
|
372
869
|
|
|
373
870
|
this._element.setAttribute('aria-hidden', true);
|
|
374
871
|
|
|
375
872
|
this._element.removeAttribute('aria-modal');
|
|
376
873
|
|
|
874
|
+
this._element.removeAttribute('role');
|
|
875
|
+
|
|
377
876
|
this._isTransitioning = false;
|
|
378
877
|
|
|
379
|
-
this.
|
|
380
|
-
|
|
878
|
+
this._backdrop.hide(() => {
|
|
879
|
+
document.body.classList.remove(CLASS_NAME_OPEN);
|
|
381
880
|
|
|
382
|
-
|
|
881
|
+
this._resetAdjustments();
|
|
383
882
|
|
|
384
|
-
|
|
883
|
+
this._scrollBar.reset();
|
|
385
884
|
|
|
386
|
-
|
|
885
|
+
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
|
|
387
886
|
});
|
|
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);
|
|
887
|
+
}
|
|
433
888
|
|
|
434
|
-
|
|
889
|
+
_showBackdrop(callback) {
|
|
890
|
+
EventHandler__default.default.on(this._element, EVENT_CLICK_DISMISS, event => {
|
|
891
|
+
if (this._ignoreBackdropClick) {
|
|
892
|
+
this._ignoreBackdropClick = false;
|
|
435
893
|
return;
|
|
436
894
|
}
|
|
437
895
|
|
|
438
|
-
if (
|
|
439
|
-
callback();
|
|
896
|
+
if (event.target !== event.currentTarget) {
|
|
440
897
|
return;
|
|
441
898
|
}
|
|
442
899
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
900
|
+
if (this._config.backdrop === true) {
|
|
901
|
+
this.hide();
|
|
902
|
+
} else if (this._config.backdrop === 'static') {
|
|
903
|
+
this._triggerBackdropTransition();
|
|
904
|
+
}
|
|
905
|
+
});
|
|
447
906
|
|
|
448
|
-
|
|
449
|
-
|
|
907
|
+
this._backdrop.show(callback);
|
|
908
|
+
}
|
|
450
909
|
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
};
|
|
910
|
+
_isAnimated() {
|
|
911
|
+
return this._element.classList.contains(CLASS_NAME_FADE);
|
|
912
|
+
}
|
|
455
913
|
|
|
456
|
-
|
|
457
|
-
|
|
914
|
+
_triggerBackdropTransition() {
|
|
915
|
+
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
|
|
458
916
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
callbackRemove();
|
|
462
|
-
}
|
|
463
|
-
} else if (callback) {
|
|
464
|
-
callback();
|
|
917
|
+
if (hideEvent.defaultPrevented) {
|
|
918
|
+
return;
|
|
465
919
|
}
|
|
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
920
|
|
|
472
|
-
|
|
473
|
-
|
|
921
|
+
const {
|
|
922
|
+
classList,
|
|
923
|
+
scrollHeight,
|
|
924
|
+
style
|
|
925
|
+
} = this._element;
|
|
926
|
+
const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
|
|
474
927
|
|
|
475
|
-
if (!
|
|
476
|
-
|
|
928
|
+
if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
|
|
929
|
+
return;
|
|
477
930
|
}
|
|
478
931
|
|
|
479
|
-
if (
|
|
480
|
-
|
|
932
|
+
if (!isModalOverflowing) {
|
|
933
|
+
style.overflowY = 'hidden';
|
|
481
934
|
}
|
|
482
|
-
};
|
|
483
935
|
|
|
484
|
-
|
|
485
|
-
this._element.style.paddingLeft = '';
|
|
486
|
-
this._element.style.paddingRight = '';
|
|
487
|
-
};
|
|
936
|
+
classList.add(CLASS_NAME_STATIC);
|
|
488
937
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
|
|
492
|
-
this._scrollbarWidth = this._getScrollbarWidth();
|
|
493
|
-
};
|
|
938
|
+
this._queueCallback(() => {
|
|
939
|
+
classList.remove(CLASS_NAME_STATIC);
|
|
494
940
|
|
|
495
|
-
|
|
496
|
-
|
|
941
|
+
if (!isModalOverflowing) {
|
|
942
|
+
this._queueCallback(() => {
|
|
943
|
+
style.overflowY = '';
|
|
944
|
+
}, this._dialog);
|
|
945
|
+
}
|
|
946
|
+
}, this._dialog);
|
|
497
947
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
|
|
948
|
+
this._element.focus();
|
|
949
|
+
} // ----------------------------------------------------------------------
|
|
950
|
+
// the following methods are used to handle overflowing modals
|
|
951
|
+
// ----------------------------------------------------------------------
|
|
503
952
|
|
|
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
953
|
|
|
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
|
|
954
|
+
_adjustDialog() {
|
|
955
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
515
956
|
|
|
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
|
-
}
|
|
957
|
+
const scrollbarWidth = this._scrollBar.getWidth();
|
|
520
958
|
|
|
521
|
-
|
|
522
|
-
};
|
|
959
|
+
const isBodyOverflowing = scrollbarWidth > 0;
|
|
523
960
|
|
|
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
|
|
961
|
+
if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
|
|
962
|
+
this._element.style.paddingLeft = `${scrollbarWidth}px`;
|
|
963
|
+
}
|
|
541
964
|
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
}
|
|
965
|
+
if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
|
|
966
|
+
this._element.style.paddingRight = `${scrollbarWidth}px`;
|
|
967
|
+
}
|
|
968
|
+
}
|
|
546
969
|
|
|
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;
|
|
970
|
+
_resetAdjustments() {
|
|
971
|
+
this._element.style.paddingLeft = '';
|
|
972
|
+
this._element.style.paddingRight = '';
|
|
555
973
|
} // Static
|
|
556
|
-
;
|
|
557
974
|
|
|
558
|
-
Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
|
|
559
|
-
return this.each(function () {
|
|
560
|
-
var data = $(this).data(DATA_KEY);
|
|
561
975
|
|
|
562
|
-
|
|
976
|
+
static jQueryInterface(config, relatedTarget) {
|
|
977
|
+
return this.each(function () {
|
|
978
|
+
const data = Modal.getOrCreateInstance(this, config);
|
|
563
979
|
|
|
564
|
-
if (
|
|
565
|
-
|
|
566
|
-
$(this).data(DATA_KEY, data);
|
|
980
|
+
if (typeof config !== 'string') {
|
|
981
|
+
return;
|
|
567
982
|
}
|
|
568
983
|
|
|
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);
|
|
984
|
+
if (typeof data[config] === 'undefined') {
|
|
985
|
+
throw new TypeError(`No method named "${config}"`);
|
|
577
986
|
}
|
|
578
|
-
});
|
|
579
|
-
};
|
|
580
987
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
return VERSION;
|
|
585
|
-
}
|
|
586
|
-
}, {
|
|
587
|
-
key: "Default",
|
|
588
|
-
get: function get() {
|
|
589
|
-
return Default;
|
|
590
|
-
}
|
|
591
|
-
}]);
|
|
988
|
+
data[config](relatedTarget);
|
|
989
|
+
});
|
|
990
|
+
}
|
|
592
991
|
|
|
593
|
-
|
|
594
|
-
}();
|
|
992
|
+
}
|
|
595
993
|
/**
|
|
596
994
|
* ------------------------------------------------------------------------
|
|
597
995
|
* Data Api implementation
|
|
@@ -599,50 +997,44 @@
|
|
|
599
997
|
*/
|
|
600
998
|
|
|
601
999
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
var target;
|
|
606
|
-
var selector = Util.getSelectorFromElement(this);
|
|
607
|
-
|
|
608
|
-
if (selector) {
|
|
609
|
-
target = document.querySelector(selector);
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
|
|
1000
|
+
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
1001
|
+
const target = getElementFromSelector(this);
|
|
613
1002
|
|
|
614
|
-
if (
|
|
1003
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
|
615
1004
|
event.preventDefault();
|
|
616
1005
|
}
|
|
617
1006
|
|
|
618
|
-
|
|
619
|
-
if (showEvent.
|
|
620
|
-
//
|
|
1007
|
+
EventHandler__default.default.one(target, EVENT_SHOW, showEvent => {
|
|
1008
|
+
if (showEvent.defaultPrevented) {
|
|
1009
|
+
// only register focus restorer if modal will actually get shown
|
|
621
1010
|
return;
|
|
622
1011
|
}
|
|
623
1012
|
|
|
624
|
-
|
|
625
|
-
if (
|
|
626
|
-
|
|
1013
|
+
EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
|
|
1014
|
+
if (isVisible(this)) {
|
|
1015
|
+
this.focus();
|
|
627
1016
|
}
|
|
628
1017
|
});
|
|
629
|
-
});
|
|
1018
|
+
}); // avoid conflict when clicking moddal toggler while another one is open
|
|
1019
|
+
|
|
1020
|
+
const allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
|
|
1021
|
+
|
|
1022
|
+
if (allReadyOpen) {
|
|
1023
|
+
Modal.getInstance(allReadyOpen).hide();
|
|
1024
|
+
}
|
|
630
1025
|
|
|
631
|
-
Modal.
|
|
1026
|
+
const data = Modal.getOrCreateInstance(target);
|
|
1027
|
+
data.toggle(this);
|
|
632
1028
|
});
|
|
1029
|
+
enableDismissTrigger(Modal);
|
|
633
1030
|
/**
|
|
634
1031
|
* ------------------------------------------------------------------------
|
|
635
1032
|
* jQuery
|
|
636
1033
|
* ------------------------------------------------------------------------
|
|
1034
|
+
* add .Modal to jQuery only if jQuery is present
|
|
637
1035
|
*/
|
|
638
1036
|
|
|
639
|
-
|
|
640
|
-
$.fn[NAME].Constructor = Modal;
|
|
641
|
-
|
|
642
|
-
$.fn[NAME].noConflict = function () {
|
|
643
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
644
|
-
return Modal._jQueryInterface;
|
|
645
|
-
};
|
|
1037
|
+
defineJQueryPlugin(Modal);
|
|
646
1038
|
|
|
647
1039
|
return Modal;
|
|
648
1040
|
|