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,489 +1,614 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap dropdown.js
|
|
3
|
-
* Copyright 2011-
|
|
4
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/
|
|
2
|
+
* Bootstrap dropdown.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.Dropdown = factory(global.
|
|
10
|
-
}(this, function (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Popper, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
})(this, (function (Popper, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
|
+
|
|
12
|
+
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
13
|
+
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
const n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
for (const k in e) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: () => e[k]
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
23
27
|
}
|
|
28
|
+
n.default = e;
|
|
29
|
+
return Object.freeze(n);
|
|
24
30
|
}
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
32
|
+
const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
|
|
33
|
+
const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
34
|
+
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
35
|
+
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
36
|
+
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
31
37
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
obj
|
|
38
|
+
/**
|
|
39
|
+
* --------------------------------------------------------------------------
|
|
40
|
+
* Bootstrap (v5.1.3): util/index.js
|
|
41
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
42
|
+
* --------------------------------------------------------------------------
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
const toType = obj => {
|
|
46
|
+
if (obj === null || obj === undefined) {
|
|
47
|
+
return `${obj}`;
|
|
42
48
|
}
|
|
43
49
|
|
|
44
|
-
return obj;
|
|
45
|
-
}
|
|
50
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const getSelector = element => {
|
|
54
|
+
let selector = element.getAttribute('data-bs-target');
|
|
55
|
+
|
|
56
|
+
if (!selector || selector === '#') {
|
|
57
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
58
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
59
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
|
60
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
|
61
|
+
|
|
62
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
63
|
+
return null;
|
|
64
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
46
65
|
|
|
47
|
-
function _objectSpread(target) {
|
|
48
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
49
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
50
|
-
var ownKeys = Object.keys(source);
|
|
51
66
|
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
55
|
-
}));
|
|
67
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
68
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
56
69
|
}
|
|
57
70
|
|
|
58
|
-
|
|
59
|
-
_defineProperty(target, key, source[key]);
|
|
60
|
-
});
|
|
71
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
61
72
|
}
|
|
62
73
|
|
|
63
|
-
return
|
|
64
|
-
}
|
|
74
|
+
return selector;
|
|
75
|
+
};
|
|
65
76
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
77
|
+
const getElementFromSelector = element => {
|
|
78
|
+
const selector = getSelector(element);
|
|
79
|
+
return selector ? document.querySelector(selector) : null;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const isElement = obj => {
|
|
83
|
+
if (!obj || typeof obj !== 'object') {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof obj.jquery !== 'undefined') {
|
|
88
|
+
obj = obj[0];
|
|
89
|
+
}
|
|
71
90
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var DATA_KEY = 'bs.dropdown';
|
|
75
|
-
var EVENT_KEY = "." + DATA_KEY;
|
|
76
|
-
var DATA_API_KEY = '.data-api';
|
|
77
|
-
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
78
|
-
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
|
|
91
|
+
return typeof obj.nodeType !== 'undefined';
|
|
92
|
+
};
|
|
79
93
|
|
|
80
|
-
|
|
94
|
+
const getElement = obj => {
|
|
95
|
+
if (isElement(obj)) {
|
|
96
|
+
// it's a jQuery object or a node element
|
|
97
|
+
return obj.jquery ? obj[0] : obj;
|
|
98
|
+
}
|
|
81
99
|
|
|
82
|
-
|
|
100
|
+
if (typeof obj === 'string' && obj.length > 0) {
|
|
101
|
+
return document.querySelector(obj);
|
|
102
|
+
}
|
|
83
103
|
|
|
84
|
-
|
|
104
|
+
return null;
|
|
105
|
+
};
|
|
85
106
|
|
|
86
|
-
|
|
107
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
108
|
+
Object.keys(configTypes).forEach(property => {
|
|
109
|
+
const expectedTypes = configTypes[property];
|
|
110
|
+
const value = config[property];
|
|
111
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
87
112
|
|
|
88
|
-
|
|
113
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
114
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
};
|
|
89
118
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
CLICK: "click" + EVENT_KEY,
|
|
97
|
-
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
|
|
98
|
-
KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
|
|
99
|
-
KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
|
|
119
|
+
const isVisible = element => {
|
|
120
|
+
if (!isElement(element) || element.getClientRects().length === 0) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
|
100
125
|
};
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
126
|
+
|
|
127
|
+
const isDisabled = element => {
|
|
128
|
+
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (element.classList.contains('disabled')) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (typeof element.disabled !== 'undefined') {
|
|
137
|
+
return element.disabled;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const noop = () => {};
|
|
144
|
+
|
|
145
|
+
const getjQuery = () => {
|
|
146
|
+
const {
|
|
147
|
+
jQuery
|
|
148
|
+
} = window;
|
|
149
|
+
|
|
150
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
151
|
+
return jQuery;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return null;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const DOMContentLoadedCallbacks = [];
|
|
158
|
+
|
|
159
|
+
const onDOMContentLoaded = callback => {
|
|
160
|
+
if (document.readyState === 'loading') {
|
|
161
|
+
// add listener on the first call when the document is in loading state
|
|
162
|
+
if (!DOMContentLoadedCallbacks.length) {
|
|
163
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
164
|
+
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
DOMContentLoadedCallbacks.push(callback);
|
|
169
|
+
} else {
|
|
170
|
+
callback();
|
|
171
|
+
}
|
|
110
172
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
173
|
+
|
|
174
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
175
|
+
|
|
176
|
+
const defineJQueryPlugin = plugin => {
|
|
177
|
+
onDOMContentLoaded(() => {
|
|
178
|
+
const $ = getjQuery();
|
|
179
|
+
/* istanbul ignore if */
|
|
180
|
+
|
|
181
|
+
if ($) {
|
|
182
|
+
const name = plugin.NAME;
|
|
183
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
184
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
185
|
+
$.fn[name].Constructor = plugin;
|
|
186
|
+
|
|
187
|
+
$.fn[name].noConflict = () => {
|
|
188
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
189
|
+
return plugin.jQueryInterface;
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
});
|
|
117
193
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
194
|
+
/**
|
|
195
|
+
* Return the previous/next element of a list.
|
|
196
|
+
*
|
|
197
|
+
* @param {array} list The list of elements
|
|
198
|
+
* @param activeElement The active element
|
|
199
|
+
* @param shouldGetNext Choose to get next or previous element
|
|
200
|
+
* @param isCycleAllowed
|
|
201
|
+
* @return {Element|elem} The proper element
|
|
202
|
+
*/
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
|
|
206
|
+
let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
|
|
207
|
+
|
|
208
|
+
if (index === -1) {
|
|
209
|
+
return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const listLength = list.length;
|
|
213
|
+
index += shouldGetNext ? 1 : -1;
|
|
214
|
+
|
|
215
|
+
if (isCycleAllowed) {
|
|
216
|
+
index = (index + listLength) % listLength;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return list[Math.max(0, Math.min(index, listLength - 1))];
|
|
127
220
|
};
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* --------------------------------------------------------------------------
|
|
224
|
+
* Bootstrap (v5.1.3): dropdown.js
|
|
225
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
226
|
+
* --------------------------------------------------------------------------
|
|
227
|
+
*/
|
|
228
|
+
/**
|
|
229
|
+
* ------------------------------------------------------------------------
|
|
230
|
+
* Constants
|
|
231
|
+
* ------------------------------------------------------------------------
|
|
232
|
+
*/
|
|
233
|
+
|
|
234
|
+
const NAME = 'dropdown';
|
|
235
|
+
const DATA_KEY = 'bs.dropdown';
|
|
236
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
237
|
+
const DATA_API_KEY = '.data-api';
|
|
238
|
+
const ESCAPE_KEY = 'Escape';
|
|
239
|
+
const SPACE_KEY = 'Space';
|
|
240
|
+
const TAB_KEY = 'Tab';
|
|
241
|
+
const ARROW_UP_KEY = 'ArrowUp';
|
|
242
|
+
const ARROW_DOWN_KEY = 'ArrowDown';
|
|
243
|
+
const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
|
|
244
|
+
|
|
245
|
+
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`);
|
|
246
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
247
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
248
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
249
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
250
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
251
|
+
const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
|
|
252
|
+
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
|
|
253
|
+
const CLASS_NAME_SHOW = 'show';
|
|
254
|
+
const CLASS_NAME_DROPUP = 'dropup';
|
|
255
|
+
const CLASS_NAME_DROPEND = 'dropend';
|
|
256
|
+
const CLASS_NAME_DROPSTART = 'dropstart';
|
|
257
|
+
const CLASS_NAME_NAVBAR = 'navbar';
|
|
258
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
|
|
259
|
+
const SELECTOR_MENU = '.dropdown-menu';
|
|
260
|
+
const SELECTOR_NAVBAR_NAV = '.navbar-nav';
|
|
261
|
+
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
|
|
262
|
+
const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
|
|
263
|
+
const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
|
|
264
|
+
const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
|
|
265
|
+
const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
|
|
266
|
+
const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
|
|
267
|
+
const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
|
|
268
|
+
const Default = {
|
|
269
|
+
offset: [0, 2],
|
|
270
|
+
boundary: 'clippingParents',
|
|
132
271
|
reference: 'toggle',
|
|
133
|
-
display: 'dynamic'
|
|
272
|
+
display: 'dynamic',
|
|
273
|
+
popperConfig: null,
|
|
274
|
+
autoClose: true
|
|
134
275
|
};
|
|
135
|
-
|
|
136
|
-
offset: '(
|
|
137
|
-
flip: 'boolean',
|
|
276
|
+
const DefaultType = {
|
|
277
|
+
offset: '(array|string|function)',
|
|
138
278
|
boundary: '(string|element)',
|
|
139
|
-
reference: '(string|element)',
|
|
140
|
-
display: 'string'
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
* Class Definition
|
|
144
|
-
* ------------------------------------------------------------------------
|
|
145
|
-
*/
|
|
146
|
-
|
|
279
|
+
reference: '(string|element|object)',
|
|
280
|
+
display: 'string',
|
|
281
|
+
popperConfig: '(null|object|function)',
|
|
282
|
+
autoClose: '(boolean|string)'
|
|
147
283
|
};
|
|
284
|
+
/**
|
|
285
|
+
* ------------------------------------------------------------------------
|
|
286
|
+
* Class Definition
|
|
287
|
+
* ------------------------------------------------------------------------
|
|
288
|
+
*/
|
|
148
289
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
function Dropdown(element, config) {
|
|
153
|
-
this._element = element;
|
|
290
|
+
class Dropdown extends BaseComponent__default.default {
|
|
291
|
+
constructor(element, config) {
|
|
292
|
+
super(element);
|
|
154
293
|
this._popper = null;
|
|
155
294
|
this._config = this._getConfig(config);
|
|
156
295
|
this._menu = this._getMenuElement();
|
|
157
296
|
this._inNavbar = this._detectNavbar();
|
|
158
|
-
|
|
159
|
-
this._addEventListeners();
|
|
160
297
|
} // Getters
|
|
161
298
|
|
|
162
299
|
|
|
163
|
-
|
|
300
|
+
static get Default() {
|
|
301
|
+
return Default;
|
|
302
|
+
}
|
|
164
303
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
304
|
+
static get DefaultType() {
|
|
305
|
+
return DefaultType;
|
|
306
|
+
}
|
|
170
307
|
|
|
171
|
-
|
|
308
|
+
static get NAME() {
|
|
309
|
+
return NAME;
|
|
310
|
+
} // Public
|
|
172
311
|
|
|
173
|
-
var isActive = $(this._menu).hasClass(ClassName.SHOW);
|
|
174
312
|
|
|
175
|
-
|
|
313
|
+
toggle() {
|
|
314
|
+
return this._isShown() ? this.hide() : this.show();
|
|
315
|
+
}
|
|
176
316
|
|
|
177
|
-
|
|
317
|
+
show() {
|
|
318
|
+
if (isDisabled(this._element) || this._isShown(this._menu)) {
|
|
178
319
|
return;
|
|
179
320
|
}
|
|
180
321
|
|
|
181
|
-
|
|
322
|
+
const relatedTarget = {
|
|
182
323
|
relatedTarget: this._element
|
|
183
324
|
};
|
|
184
|
-
|
|
185
|
-
$(parent).trigger(showEvent);
|
|
325
|
+
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, relatedTarget);
|
|
186
326
|
|
|
187
|
-
if (showEvent.
|
|
327
|
+
if (showEvent.defaultPrevented) {
|
|
188
328
|
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (!this._inNavbar) {
|
|
193
|
-
/**
|
|
194
|
-
* Check for Popper dependency
|
|
195
|
-
* Popper - https://popper.js.org
|
|
196
|
-
*/
|
|
197
|
-
if (typeof Popper === 'undefined') {
|
|
198
|
-
throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
var referenceElement = this._element;
|
|
202
|
-
|
|
203
|
-
if (this._config.reference === 'parent') {
|
|
204
|
-
referenceElement = parent;
|
|
205
|
-
} else if (Util.isElement(this._config.reference)) {
|
|
206
|
-
referenceElement = this._config.reference; // Check if it's jQuery element
|
|
207
|
-
|
|
208
|
-
if (typeof this._config.reference.jquery !== 'undefined') {
|
|
209
|
-
referenceElement = this._config.reference[0];
|
|
210
|
-
}
|
|
211
|
-
} // If boundary is not `scrollParent`, then set position to `static`
|
|
212
|
-
// to allow the menu to "escape" the scroll parent's boundaries
|
|
213
|
-
// https://github.com/twbs/bootstrap/issues/24251
|
|
214
|
-
|
|
329
|
+
}
|
|
215
330
|
|
|
216
|
-
|
|
217
|
-
$(parent).addClass(ClassName.POSITION_STATIC);
|
|
218
|
-
}
|
|
331
|
+
const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
|
|
219
332
|
|
|
220
|
-
|
|
333
|
+
if (this._inNavbar) {
|
|
334
|
+
Manipulator__default.default.setDataAttribute(this._menu, 'popper', 'none');
|
|
335
|
+
} else {
|
|
336
|
+
this._createPopper(parent);
|
|
221
337
|
} // If this is a touch-enabled device we add extra
|
|
222
338
|
// empty mouseover listeners to the body's immediate children;
|
|
223
339
|
// only needed because of broken event delegation on iOS
|
|
224
340
|
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
|
225
341
|
|
|
226
342
|
|
|
227
|
-
if ('ontouchstart' in document.documentElement &&
|
|
228
|
-
|
|
343
|
+
if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
|
|
344
|
+
[].concat(...document.body.children).forEach(elem => EventHandler__default.default.on(elem, 'mouseover', noop));
|
|
229
345
|
}
|
|
230
346
|
|
|
231
347
|
this._element.focus();
|
|
232
348
|
|
|
233
349
|
this._element.setAttribute('aria-expanded', true);
|
|
234
350
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
351
|
+
this._menu.classList.add(CLASS_NAME_SHOW);
|
|
352
|
+
|
|
353
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
354
|
+
|
|
355
|
+
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, relatedTarget);
|
|
356
|
+
}
|
|
238
357
|
|
|
239
|
-
|
|
240
|
-
if (this._element
|
|
358
|
+
hide() {
|
|
359
|
+
if (isDisabled(this._element) || !this._isShown(this._menu)) {
|
|
241
360
|
return;
|
|
242
361
|
}
|
|
243
362
|
|
|
244
|
-
|
|
363
|
+
const relatedTarget = {
|
|
245
364
|
relatedTarget: this._element
|
|
246
365
|
};
|
|
247
|
-
var showEvent = $.Event(Event.SHOW, relatedTarget);
|
|
248
366
|
|
|
249
|
-
|
|
367
|
+
this._completeHide(relatedTarget);
|
|
368
|
+
}
|
|
250
369
|
|
|
251
|
-
|
|
370
|
+
dispose() {
|
|
371
|
+
if (this._popper) {
|
|
372
|
+
this._popper.destroy();
|
|
373
|
+
}
|
|
252
374
|
|
|
253
|
-
|
|
254
|
-
|
|
375
|
+
super.dispose();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
update() {
|
|
379
|
+
this._inNavbar = this._detectNavbar();
|
|
380
|
+
|
|
381
|
+
if (this._popper) {
|
|
382
|
+
this._popper.update();
|
|
255
383
|
}
|
|
384
|
+
} // Private
|
|
256
385
|
|
|
257
|
-
$(this._menu).toggleClass(ClassName.SHOW);
|
|
258
|
-
$(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
|
|
259
|
-
};
|
|
260
386
|
|
|
261
|
-
|
|
262
|
-
|
|
387
|
+
_completeHide(relatedTarget) {
|
|
388
|
+
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE, relatedTarget);
|
|
389
|
+
|
|
390
|
+
if (hideEvent.defaultPrevented) {
|
|
263
391
|
return;
|
|
392
|
+
} // If this is a touch-enabled device we remove the extra
|
|
393
|
+
// empty mouseover listeners we added for iOS support
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
if ('ontouchstart' in document.documentElement) {
|
|
397
|
+
[].concat(...document.body.children).forEach(elem => EventHandler__default.default.off(elem, 'mouseover', noop));
|
|
264
398
|
}
|
|
265
399
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
var hideEvent = $.Event(Event.HIDE, relatedTarget);
|
|
400
|
+
if (this._popper) {
|
|
401
|
+
this._popper.destroy();
|
|
402
|
+
}
|
|
270
403
|
|
|
271
|
-
|
|
404
|
+
this._menu.classList.remove(CLASS_NAME_SHOW);
|
|
272
405
|
|
|
273
|
-
|
|
406
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
274
407
|
|
|
275
|
-
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
408
|
+
this._element.setAttribute('aria-expanded', 'false');
|
|
278
409
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
410
|
+
Manipulator__default.default.removeDataAttribute(this._menu, 'popper');
|
|
411
|
+
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN, relatedTarget);
|
|
412
|
+
}
|
|
282
413
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
414
|
+
_getConfig(config) {
|
|
415
|
+
config = { ...this.constructor.Default,
|
|
416
|
+
...Manipulator__default.default.getDataAttributes(this._element),
|
|
417
|
+
...config
|
|
418
|
+
};
|
|
419
|
+
typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
288
420
|
|
|
289
|
-
if (
|
|
290
|
-
|
|
421
|
+
if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
|
|
422
|
+
// Popper virtual elements require a getBoundingClientRect method
|
|
423
|
+
throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
return config;
|
|
427
|
+
}
|
|
291
428
|
|
|
292
|
-
|
|
429
|
+
_createPopper(parent) {
|
|
430
|
+
if (typeof Popper__namespace === 'undefined') {
|
|
431
|
+
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
|
|
293
432
|
}
|
|
294
|
-
};
|
|
295
433
|
|
|
296
|
-
|
|
297
|
-
this._inNavbar = this._detectNavbar();
|
|
434
|
+
let referenceElement = this._element;
|
|
298
435
|
|
|
299
|
-
if (this.
|
|
300
|
-
|
|
436
|
+
if (this._config.reference === 'parent') {
|
|
437
|
+
referenceElement = parent;
|
|
438
|
+
} else if (isElement(this._config.reference)) {
|
|
439
|
+
referenceElement = getElement(this._config.reference);
|
|
440
|
+
} else if (typeof this._config.reference === 'object') {
|
|
441
|
+
referenceElement = this._config.reference;
|
|
301
442
|
}
|
|
302
|
-
} // Private
|
|
303
|
-
;
|
|
304
443
|
|
|
305
|
-
|
|
306
|
-
var _this = this;
|
|
444
|
+
const popperConfig = this._getPopperConfig();
|
|
307
445
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
event.stopPropagation();
|
|
446
|
+
const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
|
|
447
|
+
this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
|
|
311
448
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
449
|
+
if (isDisplayStatic) {
|
|
450
|
+
Manipulator__default.default.setDataAttribute(this._menu, 'popper', 'static');
|
|
451
|
+
}
|
|
452
|
+
}
|
|
315
453
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
return config;
|
|
320
|
-
};
|
|
454
|
+
_isShown(element = this._element) {
|
|
455
|
+
return element.classList.contains(CLASS_NAME_SHOW);
|
|
456
|
+
}
|
|
321
457
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
458
|
+
_getMenuElement() {
|
|
459
|
+
return SelectorEngine__default.default.next(this._element, SELECTOR_MENU)[0];
|
|
460
|
+
}
|
|
325
461
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
462
|
+
_getPlacement() {
|
|
463
|
+
const parentDropdown = this._element.parentNode;
|
|
464
|
+
|
|
465
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
|
|
466
|
+
return PLACEMENT_RIGHT;
|
|
329
467
|
}
|
|
330
468
|
|
|
331
|
-
|
|
332
|
-
|
|
469
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
|
|
470
|
+
return PLACEMENT_LEFT;
|
|
471
|
+
} // We need to trim the value because custom properties can also include spaces
|
|
333
472
|
|
|
334
|
-
_proto._getPlacement = function _getPlacement() {
|
|
335
|
-
var $parentDropdown = $(this._element.parentNode);
|
|
336
|
-
var placement = AttachmentMap.BOTTOM; // Handle dropup
|
|
337
473
|
|
|
338
|
-
|
|
339
|
-
placement = AttachmentMap.TOP;
|
|
474
|
+
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
|
|
340
475
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
}
|
|
344
|
-
} else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
|
|
345
|
-
placement = AttachmentMap.RIGHT;
|
|
346
|
-
} else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
|
|
347
|
-
placement = AttachmentMap.LEFT;
|
|
348
|
-
} else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
|
|
349
|
-
placement = AttachmentMap.BOTTOMEND;
|
|
476
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
|
|
477
|
+
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
|
|
350
478
|
}
|
|
351
479
|
|
|
352
|
-
return
|
|
353
|
-
}
|
|
480
|
+
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
|
|
481
|
+
}
|
|
354
482
|
|
|
355
|
-
|
|
356
|
-
return
|
|
357
|
-
}
|
|
483
|
+
_detectNavbar() {
|
|
484
|
+
return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
|
|
485
|
+
}
|
|
358
486
|
|
|
359
|
-
|
|
360
|
-
|
|
487
|
+
_getOffset() {
|
|
488
|
+
const {
|
|
489
|
+
offset
|
|
490
|
+
} = this._config;
|
|
361
491
|
|
|
362
|
-
|
|
492
|
+
if (typeof offset === 'string') {
|
|
493
|
+
return offset.split(',').map(val => Number.parseInt(val, 10));
|
|
494
|
+
}
|
|
363
495
|
|
|
364
|
-
if (typeof
|
|
365
|
-
|
|
366
|
-
data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
|
|
367
|
-
return data;
|
|
368
|
-
};
|
|
369
|
-
} else {
|
|
370
|
-
offset.offset = this._config.offset;
|
|
496
|
+
if (typeof offset === 'function') {
|
|
497
|
+
return popperData => offset(popperData, this._element);
|
|
371
498
|
}
|
|
372
499
|
|
|
373
500
|
return offset;
|
|
374
|
-
}
|
|
501
|
+
}
|
|
375
502
|
|
|
376
|
-
|
|
377
|
-
|
|
503
|
+
_getPopperConfig() {
|
|
504
|
+
const defaultBsPopperConfig = {
|
|
378
505
|
placement: this._getPlacement(),
|
|
379
|
-
modifiers: {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
},
|
|
384
|
-
preventOverflow: {
|
|
385
|
-
boundariesElement: this._config.boundary
|
|
506
|
+
modifiers: [{
|
|
507
|
+
name: 'preventOverflow',
|
|
508
|
+
options: {
|
|
509
|
+
boundary: this._config.boundary
|
|
386
510
|
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
|
|
511
|
+
}, {
|
|
512
|
+
name: 'offset',
|
|
513
|
+
options: {
|
|
514
|
+
offset: this._getOffset()
|
|
515
|
+
}
|
|
516
|
+
}]
|
|
517
|
+
}; // Disable Popper if we have a static display
|
|
390
518
|
|
|
391
519
|
if (this._config.display === 'static') {
|
|
392
|
-
|
|
520
|
+
defaultBsPopperConfig.modifiers = [{
|
|
521
|
+
name: 'applyStyles',
|
|
393
522
|
enabled: false
|
|
394
|
-
};
|
|
523
|
+
}];
|
|
395
524
|
}
|
|
396
525
|
|
|
397
|
-
return
|
|
526
|
+
return { ...defaultBsPopperConfig,
|
|
527
|
+
...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
_selectMenuItem({
|
|
532
|
+
key,
|
|
533
|
+
target
|
|
534
|
+
}) {
|
|
535
|
+
const items = SelectorEngine__default.default.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
|
|
536
|
+
|
|
537
|
+
if (!items.length) {
|
|
538
|
+
return;
|
|
539
|
+
} // if target isn't included in items (e.g. when expanding the dropdown)
|
|
540
|
+
// allow cycling to get the last item in case key equals ARROW_UP_KEY
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
|
|
398
544
|
} // Static
|
|
399
|
-
;
|
|
400
545
|
|
|
401
|
-
Dropdown._jQueryInterface = function _jQueryInterface(config) {
|
|
402
|
-
return this.each(function () {
|
|
403
|
-
var data = $(this).data(DATA_KEY);
|
|
404
546
|
|
|
405
|
-
|
|
547
|
+
static jQueryInterface(config) {
|
|
548
|
+
return this.each(function () {
|
|
549
|
+
const data = Dropdown.getOrCreateInstance(this, config);
|
|
406
550
|
|
|
407
|
-
if (
|
|
408
|
-
|
|
409
|
-
$(this).data(DATA_KEY, data);
|
|
551
|
+
if (typeof config !== 'string') {
|
|
552
|
+
return;
|
|
410
553
|
}
|
|
411
554
|
|
|
412
|
-
if (typeof config === '
|
|
413
|
-
|
|
414
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
data[config]();
|
|
555
|
+
if (typeof data[config] === 'undefined') {
|
|
556
|
+
throw new TypeError(`No method named "${config}"`);
|
|
418
557
|
}
|
|
558
|
+
|
|
559
|
+
data[config]();
|
|
419
560
|
});
|
|
420
|
-
}
|
|
561
|
+
}
|
|
421
562
|
|
|
422
|
-
|
|
423
|
-
if (event && (event.
|
|
563
|
+
static clearMenus(event) {
|
|
564
|
+
if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
|
|
424
565
|
return;
|
|
425
566
|
}
|
|
426
567
|
|
|
427
|
-
|
|
568
|
+
const toggles = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE);
|
|
428
569
|
|
|
429
|
-
for (
|
|
430
|
-
|
|
570
|
+
for (let i = 0, len = toggles.length; i < len; i++) {
|
|
571
|
+
const context = Dropdown.getInstance(toggles[i]);
|
|
431
572
|
|
|
432
|
-
|
|
433
|
-
var relatedTarget = {
|
|
434
|
-
relatedTarget: toggles[i]
|
|
435
|
-
};
|
|
436
|
-
|
|
437
|
-
if (event && event.type === 'click') {
|
|
438
|
-
relatedTarget.clickEvent = event;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
if (!context) {
|
|
442
|
-
continue;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
var dropdownMenu = context._menu;
|
|
446
|
-
|
|
447
|
-
if (!$(parent).hasClass(ClassName.SHOW)) {
|
|
573
|
+
if (!context || context._config.autoClose === false) {
|
|
448
574
|
continue;
|
|
449
575
|
}
|
|
450
576
|
|
|
451
|
-
if (
|
|
577
|
+
if (!context._isShown()) {
|
|
452
578
|
continue;
|
|
453
579
|
}
|
|
454
580
|
|
|
455
|
-
|
|
456
|
-
|
|
581
|
+
const relatedTarget = {
|
|
582
|
+
relatedTarget: context._element
|
|
583
|
+
};
|
|
457
584
|
|
|
458
|
-
if (
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
// empty mouseover listeners we added for iOS support
|
|
585
|
+
if (event) {
|
|
586
|
+
const composedPath = event.composedPath();
|
|
587
|
+
const isMenuTarget = composedPath.includes(context._menu);
|
|
462
588
|
|
|
589
|
+
if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
|
|
590
|
+
continue;
|
|
591
|
+
} // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
|
|
463
592
|
|
|
464
|
-
if ('ontouchstart' in document.documentElement) {
|
|
465
|
-
$(document.body).children().off('mouseover', null, $.noop);
|
|
466
|
-
}
|
|
467
593
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
}
|
|
472
|
-
};
|
|
594
|
+
if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
|
|
595
|
+
continue;
|
|
596
|
+
}
|
|
473
597
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
598
|
+
if (event.type === 'click') {
|
|
599
|
+
relatedTarget.clickEvent = event;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
477
602
|
|
|
478
|
-
|
|
479
|
-
parent = document.querySelector(selector);
|
|
603
|
+
context._completeHide(relatedTarget);
|
|
480
604
|
}
|
|
605
|
+
}
|
|
481
606
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
607
|
+
static getParentFromElement(element) {
|
|
608
|
+
return getElementFromSelector(element) || element.parentNode;
|
|
609
|
+
}
|
|
485
610
|
|
|
486
|
-
|
|
611
|
+
static dataApiKeydownHandler(event) {
|
|
487
612
|
// If not input/textarea:
|
|
488
613
|
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
|
|
489
614
|
// If input/textarea:
|
|
@@ -491,75 +616,47 @@
|
|
|
491
616
|
// - If key is other than escape
|
|
492
617
|
// - If key is not up or down => not a dropdown command
|
|
493
618
|
// - If trigger inside the menu => not a dropdown command
|
|
494
|
-
if (/input|textarea/i.test(event.target.tagName) ? event.
|
|
619
|
+
if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
|
|
495
620
|
return;
|
|
496
621
|
}
|
|
497
622
|
|
|
498
|
-
|
|
499
|
-
event.stopPropagation();
|
|
623
|
+
const isActive = this.classList.contains(CLASS_NAME_SHOW);
|
|
500
624
|
|
|
501
|
-
if (
|
|
625
|
+
if (!isActive && event.key === ESCAPE_KEY) {
|
|
502
626
|
return;
|
|
503
627
|
}
|
|
504
628
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
var isActive = $(parent).hasClass(ClassName.SHOW);
|
|
508
|
-
|
|
509
|
-
if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
|
|
510
|
-
if (event.which === ESCAPE_KEYCODE) {
|
|
511
|
-
var toggle = parent.querySelector(Selector.DATA_TOGGLE);
|
|
512
|
-
$(toggle).trigger('focus');
|
|
513
|
-
}
|
|
629
|
+
event.preventDefault();
|
|
630
|
+
event.stopPropagation();
|
|
514
631
|
|
|
515
|
-
|
|
632
|
+
if (isDisabled(this)) {
|
|
516
633
|
return;
|
|
517
634
|
}
|
|
518
635
|
|
|
519
|
-
|
|
636
|
+
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default.default.prev(this, SELECTOR_DATA_TOGGLE)[0];
|
|
637
|
+
const instance = Dropdown.getOrCreateInstance(getToggleButton);
|
|
520
638
|
|
|
521
|
-
if (
|
|
639
|
+
if (event.key === ESCAPE_KEY) {
|
|
640
|
+
instance.hide();
|
|
522
641
|
return;
|
|
523
642
|
}
|
|
524
643
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
index--;
|
|
530
|
-
}
|
|
644
|
+
if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
|
|
645
|
+
if (!isActive) {
|
|
646
|
+
instance.show();
|
|
647
|
+
}
|
|
531
648
|
|
|
532
|
-
|
|
533
|
-
// Down
|
|
534
|
-
index++;
|
|
535
|
-
}
|
|
649
|
+
instance._selectMenuItem(event);
|
|
536
650
|
|
|
537
|
-
|
|
538
|
-
index = 0;
|
|
651
|
+
return;
|
|
539
652
|
}
|
|
540
653
|
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
_createClass(Dropdown, null, [{
|
|
545
|
-
key: "VERSION",
|
|
546
|
-
get: function get() {
|
|
547
|
-
return VERSION;
|
|
548
|
-
}
|
|
549
|
-
}, {
|
|
550
|
-
key: "Default",
|
|
551
|
-
get: function get() {
|
|
552
|
-
return Default;
|
|
654
|
+
if (!isActive || event.key === SPACE_KEY) {
|
|
655
|
+
Dropdown.clearMenus();
|
|
553
656
|
}
|
|
554
|
-
}
|
|
555
|
-
key: "DefaultType",
|
|
556
|
-
get: function get() {
|
|
557
|
-
return DefaultType;
|
|
558
|
-
}
|
|
559
|
-
}]);
|
|
657
|
+
}
|
|
560
658
|
|
|
561
|
-
|
|
562
|
-
}();
|
|
659
|
+
}
|
|
563
660
|
/**
|
|
564
661
|
* ------------------------------------------------------------------------
|
|
565
662
|
* Data Api implementation
|
|
@@ -567,27 +664,22 @@
|
|
|
567
664
|
*/
|
|
568
665
|
|
|
569
666
|
|
|
570
|
-
|
|
667
|
+
EventHandler__default.default.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
|
|
668
|
+
EventHandler__default.default.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
|
|
669
|
+
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
|
|
670
|
+
EventHandler__default.default.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
|
|
671
|
+
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
571
672
|
event.preventDefault();
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
Dropdown._jQueryInterface.call($(this), 'toggle');
|
|
575
|
-
}).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
|
|
576
|
-
e.stopPropagation();
|
|
673
|
+
Dropdown.getOrCreateInstance(this).toggle();
|
|
577
674
|
});
|
|
578
675
|
/**
|
|
579
676
|
* ------------------------------------------------------------------------
|
|
580
677
|
* jQuery
|
|
581
678
|
* ------------------------------------------------------------------------
|
|
679
|
+
* add .Dropdown to jQuery only if jQuery is present
|
|
582
680
|
*/
|
|
583
681
|
|
|
584
|
-
|
|
585
|
-
$.fn[NAME].Constructor = Dropdown;
|
|
586
|
-
|
|
587
|
-
$.fn[NAME].noConflict = function () {
|
|
588
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
589
|
-
return Dropdown._jQueryInterface;
|
|
590
|
-
};
|
|
682
|
+
defineJQueryPlugin(Dropdown);
|
|
591
683
|
|
|
592
684
|
return Dropdown;
|
|
593
685
|
|