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