bootstrap 4.3.1 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +55 -0
- data/CHANGELOG.md +2 -14
- data/README.md +28 -5
- data/assets/javascripts/bootstrap/alert.js +54 -163
- data/assets/javascripts/bootstrap/base-component.js +83 -0
- data/assets/javascripts/bootstrap/button.js +44 -152
- data/assets/javascripts/bootstrap/carousel.js +289 -569
- data/assets/javascripts/bootstrap/collapse.js +170 -349
- data/assets/javascripts/bootstrap/dom/data.js +62 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
- data/assets/javascripts/bootstrap/dropdown.js +303 -496
- data/assets/javascripts/bootstrap/modal.js +229 -559
- data/assets/javascripts/bootstrap/offcanvas.js +245 -0
- data/assets/javascripts/bootstrap/popover.js +61 -226
- data/assets/javascripts/bootstrap/scrollspy.js +217 -317
- data/assets/javascripts/bootstrap/tab.js +220 -212
- data/assets/javascripts/bootstrap/toast.js +145 -229
- data/assets/javascripts/bootstrap/tooltip.js +421 -782
- data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
- data/assets/javascripts/bootstrap/util/config.js +67 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
- data/assets/javascripts/bootstrap/util/index.js +281 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
- data/assets/javascripts/bootstrap/util/swipe.js +134 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
- 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 +23 -7
- data/assets/javascripts/bootstrap.js +3690 -3639
- data/assets/javascripts/bootstrap.min.js +4 -4
- data/assets/stylesheets/_bootstrap-grid.scss +53 -20
- data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
- data/assets/stylesheets/_bootstrap.scss +21 -13
- data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
- data/assets/stylesheets/bootstrap/_alert.scss +32 -15
- data/assets/stylesheets/bootstrap/_badge.scss +15 -31
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -24
- data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
- data/assets/stylesheets/bootstrap/_buttons.scss +139 -69
- data/assets/stylesheets/bootstrap/_card.scss +91 -141
- data/assets/stylesheets/bootstrap/_carousel.scss +86 -39
- data/assets/stylesheets/bootstrap/_close.scss +51 -29
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +131 -72
- data/assets/stylesheets/bootstrap/_forms.scss +9 -330
- data/assets/stylesheets/bootstrap/_functions.scss +244 -28
- data/assets/stylesheets/bootstrap/_grid.scss +18 -31
- data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
- data/assets/stylesheets/bootstrap/_images.scss +3 -3
- data/assets/stylesheets/bootstrap/_list-group.scss +101 -53
- data/assets/stylesheets/bootstrap/_maps.scss +174 -0
- data/assets/stylesheets/bootstrap/_mixins.scss +13 -18
- data/assets/stylesheets/bootstrap/_modal.scss +120 -112
- data/assets/stylesheets/bootstrap/_nav.scss +113 -24
- data/assets/stylesheets/bootstrap/_navbar.scss +145 -150
- data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +74 -38
- data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
- data/assets/stylesheets/bootstrap/_popover.scss +99 -74
- data/assets/stylesheets/bootstrap/_progress.scss +40 -15
- data/assets/stylesheets/bootstrap/_reboot.scss +342 -215
- data/assets/stylesheets/bootstrap/_root.scss +174 -9
- data/assets/stylesheets/bootstrap/_spinners.scss +52 -22
- data/assets/stylesheets/bootstrap/_tables.scss +101 -115
- data/assets/stylesheets/bootstrap/_toasts.scss +54 -25
- data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
- data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
- data/assets/stylesheets/bootstrap/_type.scss +42 -61
- data/assets/stylesheets/bootstrap/_utilities.scss +806 -17
- data/assets/stylesheets/bootstrap/_variables-dark.scss +85 -0
- data/assets/stylesheets/bootstrap/_variables.scss +1235 -615
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +19 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +94 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +188 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +8 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
- data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -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 +11 -6
- data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -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 +20 -16
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -97
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +77 -116
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +133 -33
- data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +276 -132
- data/bootstrap.gemspec +4 -6
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +31 -7
- data/tasks/updater/network.rb +10 -4
- data/tasks/updater/scss.rb +1 -1
- data/tasks/updater.rb +2 -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_5_2.gemfile +8 -0
- data/test/gemfiles/rails_6_0.gemfile +7 -0
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- data/test/gemfiles/rails_7_0.gemfile +7 -0
- data/test/support/dummy_rails_integration.rb +3 -1
- data/test/test_helper.rb +18 -12
- metadata +86 -84
- data/.travis.yml +0 -17
- 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
- /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
|
@@ -1,593 +1,400 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap dropdown.js
|
|
3
|
-
* Copyright 2011-
|
|
4
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/
|
|
2
|
+
* Bootstrap dropdown.js v5.3.0 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2023 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
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
27
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
28
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
29
|
-
return Constructor;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function _defineProperty(obj, key, value) {
|
|
33
|
-
if (key in obj) {
|
|
34
|
-
Object.defineProperty(obj, key, {
|
|
35
|
-
value: value,
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true
|
|
39
|
-
});
|
|
40
|
-
} else {
|
|
41
|
-
obj[key] = value;
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global["@popperjs/core"], global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index));
|
|
10
|
+
})(this, (function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict';
|
|
11
|
+
|
|
12
|
+
function _interopNamespaceDefault(e) {
|
|
13
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
14
|
+
if (e) {
|
|
15
|
+
for (const k in e) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: () => e[k]
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
42
24
|
}
|
|
43
|
-
|
|
44
|
-
return
|
|
25
|
+
n.default = e;
|
|
26
|
+
return Object.freeze(n);
|
|
45
27
|
}
|
|
46
28
|
|
|
47
|
-
|
|
48
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
49
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
50
|
-
var ownKeys = Object.keys(source);
|
|
51
|
-
|
|
52
|
-
if (typeof Object.getOwnPropertySymbols === 'function') {
|
|
53
|
-
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
|
|
54
|
-
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
55
|
-
}));
|
|
56
|
-
}
|
|
29
|
+
const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
|
|
57
30
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
31
|
+
/**
|
|
32
|
+
* --------------------------------------------------------------------------
|
|
33
|
+
* Bootstrap dropdown.js
|
|
34
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
35
|
+
* --------------------------------------------------------------------------
|
|
36
|
+
*/
|
|
62
37
|
|
|
63
|
-
return target;
|
|
64
|
-
}
|
|
65
38
|
|
|
66
39
|
/**
|
|
67
|
-
* ------------------------------------------------------------------------
|
|
68
40
|
* Constants
|
|
69
|
-
* ------------------------------------------------------------------------
|
|
70
41
|
*/
|
|
71
42
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
43
|
+
const NAME = 'dropdown';
|
|
44
|
+
const DATA_KEY = 'bs.dropdown';
|
|
45
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
46
|
+
const DATA_API_KEY = '.data-api';
|
|
47
|
+
const ESCAPE_KEY = 'Escape';
|
|
48
|
+
const TAB_KEY = 'Tab';
|
|
49
|
+
const ARROW_UP_KEY = 'ArrowUp';
|
|
50
|
+
const ARROW_DOWN_KEY = 'ArrowDown';
|
|
51
|
+
const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
|
|
52
|
+
|
|
53
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
54
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
55
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
56
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
57
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
58
|
+
const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
|
|
59
|
+
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
|
|
60
|
+
const CLASS_NAME_SHOW = 'show';
|
|
61
|
+
const CLASS_NAME_DROPUP = 'dropup';
|
|
62
|
+
const CLASS_NAME_DROPEND = 'dropend';
|
|
63
|
+
const CLASS_NAME_DROPSTART = 'dropstart';
|
|
64
|
+
const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
|
|
65
|
+
const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
|
|
66
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
|
|
67
|
+
const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`;
|
|
68
|
+
const SELECTOR_MENU = '.dropdown-menu';
|
|
69
|
+
const SELECTOR_NAVBAR = '.navbar';
|
|
70
|
+
const SELECTOR_NAVBAR_NAV = '.navbar-nav';
|
|
71
|
+
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
|
|
72
|
+
const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start';
|
|
73
|
+
const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end';
|
|
74
|
+
const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start';
|
|
75
|
+
const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end';
|
|
76
|
+
const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start';
|
|
77
|
+
const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start';
|
|
78
|
+
const PLACEMENT_TOPCENTER = 'top';
|
|
79
|
+
const PLACEMENT_BOTTOMCENTER = 'bottom';
|
|
80
|
+
const Default = {
|
|
81
|
+
autoClose: true,
|
|
82
|
+
boundary: 'clippingParents',
|
|
83
|
+
display: 'dynamic',
|
|
84
|
+
offset: [0, 2],
|
|
85
|
+
popperConfig: null,
|
|
86
|
+
reference: 'toggle'
|
|
110
87
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
FORM_CHILD: '.dropdown form',
|
|
114
|
-
MENU: '.dropdown-menu',
|
|
115
|
-
NAVBAR_NAV: '.navbar-nav',
|
|
116
|
-
VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
|
|
117
|
-
};
|
|
118
|
-
var AttachmentMap = {
|
|
119
|
-
TOP: 'top-start',
|
|
120
|
-
TOPEND: 'top-end',
|
|
121
|
-
BOTTOM: 'bottom-start',
|
|
122
|
-
BOTTOMEND: 'bottom-end',
|
|
123
|
-
RIGHT: 'right-start',
|
|
124
|
-
RIGHTEND: 'right-end',
|
|
125
|
-
LEFT: 'left-start',
|
|
126
|
-
LEFTEND: 'left-end'
|
|
127
|
-
};
|
|
128
|
-
var Default = {
|
|
129
|
-
offset: 0,
|
|
130
|
-
flip: true,
|
|
131
|
-
boundary: 'scrollParent',
|
|
132
|
-
reference: 'toggle',
|
|
133
|
-
display: 'dynamic'
|
|
134
|
-
};
|
|
135
|
-
var DefaultType = {
|
|
136
|
-
offset: '(number|string|function)',
|
|
137
|
-
flip: 'boolean',
|
|
88
|
+
const DefaultType = {
|
|
89
|
+
autoClose: '(boolean|string)',
|
|
138
90
|
boundary: '(string|element)',
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
* Class Definition
|
|
144
|
-
* ------------------------------------------------------------------------
|
|
145
|
-
*/
|
|
146
|
-
|
|
91
|
+
display: 'string',
|
|
92
|
+
offset: '(array|string|function)',
|
|
93
|
+
popperConfig: '(null|object|function)',
|
|
94
|
+
reference: '(string|element|object)'
|
|
147
95
|
};
|
|
148
96
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Class definition
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
class Dropdown extends BaseComponent {
|
|
102
|
+
constructor(element, config) {
|
|
103
|
+
super(element, config);
|
|
154
104
|
this._popper = null;
|
|
155
|
-
this.
|
|
156
|
-
|
|
105
|
+
this._parent = this._element.parentNode; // dropdown wrapper
|
|
106
|
+
// TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
|
|
107
|
+
this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
|
|
157
108
|
this._inNavbar = this._detectNavbar();
|
|
109
|
+
}
|
|
158
110
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
111
|
+
// Getters
|
|
112
|
+
static get Default() {
|
|
113
|
+
return Default;
|
|
114
|
+
}
|
|
115
|
+
static get DefaultType() {
|
|
116
|
+
return DefaultType;
|
|
117
|
+
}
|
|
118
|
+
static get NAME() {
|
|
119
|
+
return NAME;
|
|
120
|
+
}
|
|
164
121
|
|
|
165
122
|
// Public
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
var parent = Dropdown._getParentFromElement(this._element);
|
|
172
|
-
|
|
173
|
-
var isActive = $(this._menu).hasClass(ClassName.SHOW);
|
|
174
|
-
|
|
175
|
-
Dropdown._clearMenus();
|
|
176
|
-
|
|
177
|
-
if (isActive) {
|
|
123
|
+
toggle() {
|
|
124
|
+
return this._isShown() ? this.hide() : this.show();
|
|
125
|
+
}
|
|
126
|
+
show() {
|
|
127
|
+
if (index_js.isDisabled(this._element) || this._isShown()) {
|
|
178
128
|
return;
|
|
179
129
|
}
|
|
180
|
-
|
|
181
|
-
var relatedTarget = {
|
|
130
|
+
const relatedTarget = {
|
|
182
131
|
relatedTarget: this._element
|
|
183
132
|
};
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (showEvent.isDefaultPrevented()) {
|
|
133
|
+
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
|
|
134
|
+
if (showEvent.defaultPrevented) {
|
|
188
135
|
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
|
-
|
|
215
|
-
|
|
216
|
-
if (this._config.boundary !== 'scrollParent') {
|
|
217
|
-
$(parent).addClass(ClassName.POSITION_STATIC);
|
|
218
|
-
}
|
|
136
|
+
}
|
|
137
|
+
this._createPopper();
|
|
219
138
|
|
|
220
|
-
|
|
221
|
-
} // If this is a touch-enabled device we add extra
|
|
139
|
+
// If this is a touch-enabled device we add extra
|
|
222
140
|
// empty mouseover listeners to the body's immediate children;
|
|
223
141
|
// only needed because of broken event delegation on iOS
|
|
224
142
|
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
143
|
+
if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
|
|
144
|
+
for (const element of [].concat(...document.body.children)) {
|
|
145
|
+
EventHandler.on(element, 'mouseover', index_js.noop);
|
|
146
|
+
}
|
|
229
147
|
}
|
|
230
|
-
|
|
231
148
|
this._element.focus();
|
|
232
|
-
|
|
233
149
|
this._element.setAttribute('aria-expanded', true);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
|
|
150
|
+
this._menu.classList.add(CLASS_NAME_SHOW);
|
|
151
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
152
|
+
EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget);
|
|
153
|
+
}
|
|
154
|
+
hide() {
|
|
155
|
+
if (index_js.isDisabled(this._element) || !this._isShown()) {
|
|
241
156
|
return;
|
|
242
157
|
}
|
|
243
|
-
|
|
244
|
-
var relatedTarget = {
|
|
158
|
+
const relatedTarget = {
|
|
245
159
|
relatedTarget: this._element
|
|
246
160
|
};
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
if (showEvent.isDefaultPrevented()) {
|
|
254
|
-
return;
|
|
161
|
+
this._completeHide(relatedTarget);
|
|
162
|
+
}
|
|
163
|
+
dispose() {
|
|
164
|
+
if (this._popper) {
|
|
165
|
+
this._popper.destroy();
|
|
255
166
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
|
|
263
|
-
return;
|
|
167
|
+
super.dispose();
|
|
168
|
+
}
|
|
169
|
+
update() {
|
|
170
|
+
this._inNavbar = this._detectNavbar();
|
|
171
|
+
if (this._popper) {
|
|
172
|
+
this._popper.update();
|
|
264
173
|
}
|
|
174
|
+
}
|
|
265
175
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
var parent = Dropdown._getParentFromElement(this._element);
|
|
272
|
-
|
|
273
|
-
$(parent).trigger(hideEvent);
|
|
274
|
-
|
|
275
|
-
if (hideEvent.isDefaultPrevented()) {
|
|
176
|
+
// Private
|
|
177
|
+
_completeHide(relatedTarget) {
|
|
178
|
+
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget);
|
|
179
|
+
if (hideEvent.defaultPrevented) {
|
|
276
180
|
return;
|
|
277
181
|
}
|
|
278
182
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
this.
|
|
287
|
-
this._menu = null;
|
|
288
|
-
|
|
289
|
-
if (this._popper !== null) {
|
|
183
|
+
// If this is a touch-enabled device we remove the extra
|
|
184
|
+
// empty mouseover listeners we added for iOS support
|
|
185
|
+
if ('ontouchstart' in document.documentElement) {
|
|
186
|
+
for (const element of [].concat(...document.body.children)) {
|
|
187
|
+
EventHandler.off(element, 'mouseover', index_js.noop);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (this._popper) {
|
|
290
191
|
this._popper.destroy();
|
|
291
|
-
|
|
292
|
-
this._popper = null;
|
|
293
192
|
}
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
this.
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
193
|
+
this._menu.classList.remove(CLASS_NAME_SHOW);
|
|
194
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
195
|
+
this._element.setAttribute('aria-expanded', 'false');
|
|
196
|
+
Manipulator.removeDataAttribute(this._menu, 'popper');
|
|
197
|
+
EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget);
|
|
198
|
+
}
|
|
199
|
+
_getConfig(config) {
|
|
200
|
+
config = super._getConfig(config);
|
|
201
|
+
if (typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
|
|
202
|
+
// Popper virtual elements require a getBoundingClientRect method
|
|
203
|
+
throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
|
|
301
204
|
}
|
|
302
|
-
} // Private
|
|
303
|
-
;
|
|
304
|
-
|
|
305
|
-
_proto._addEventListeners = function _addEventListeners() {
|
|
306
|
-
var _this = this;
|
|
307
|
-
|
|
308
|
-
$(this._element).on(Event.CLICK, function (event) {
|
|
309
|
-
event.preventDefault();
|
|
310
|
-
event.stopPropagation();
|
|
311
|
-
|
|
312
|
-
_this.toggle();
|
|
313
|
-
});
|
|
314
|
-
};
|
|
315
|
-
|
|
316
|
-
_proto._getConfig = function _getConfig(config) {
|
|
317
|
-
config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
|
|
318
|
-
Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
319
205
|
return config;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
var parent = Dropdown._getParentFromElement(this._element);
|
|
325
|
-
|
|
326
|
-
if (parent) {
|
|
327
|
-
this._menu = parent.querySelector(Selector.MENU);
|
|
328
|
-
}
|
|
206
|
+
}
|
|
207
|
+
_createPopper() {
|
|
208
|
+
if (typeof Popper__namespace === 'undefined') {
|
|
209
|
+
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
|
|
329
210
|
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
if ($parentDropdown.hasClass(ClassName.DROPUP)) {
|
|
339
|
-
placement = AttachmentMap.TOP;
|
|
340
|
-
|
|
341
|
-
if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
|
|
342
|
-
placement = AttachmentMap.TOPEND;
|
|
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;
|
|
211
|
+
let referenceElement = this._element;
|
|
212
|
+
if (this._config.reference === 'parent') {
|
|
213
|
+
referenceElement = this._parent;
|
|
214
|
+
} else if (index_js.isElement(this._config.reference)) {
|
|
215
|
+
referenceElement = index_js.getElement(this._config.reference);
|
|
216
|
+
} else if (typeof this._config.reference === 'object') {
|
|
217
|
+
referenceElement = this._config.reference;
|
|
350
218
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
offset.offset = this._config.offset;
|
|
219
|
+
const popperConfig = this._getPopperConfig();
|
|
220
|
+
this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
|
|
221
|
+
}
|
|
222
|
+
_isShown() {
|
|
223
|
+
return this._menu.classList.contains(CLASS_NAME_SHOW);
|
|
224
|
+
}
|
|
225
|
+
_getPlacement() {
|
|
226
|
+
const parentDropdown = this._parent;
|
|
227
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
|
|
228
|
+
return PLACEMENT_RIGHT;
|
|
229
|
+
}
|
|
230
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
|
|
231
|
+
return PLACEMENT_LEFT;
|
|
232
|
+
}
|
|
233
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
|
|
234
|
+
return PLACEMENT_TOPCENTER;
|
|
235
|
+
}
|
|
236
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
|
|
237
|
+
return PLACEMENT_BOTTOMCENTER;
|
|
371
238
|
}
|
|
372
239
|
|
|
240
|
+
// We need to trim the value because custom properties can also include spaces
|
|
241
|
+
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
|
|
242
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
|
|
243
|
+
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
|
|
244
|
+
}
|
|
245
|
+
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
|
|
246
|
+
}
|
|
247
|
+
_detectNavbar() {
|
|
248
|
+
return this._element.closest(SELECTOR_NAVBAR) !== null;
|
|
249
|
+
}
|
|
250
|
+
_getOffset() {
|
|
251
|
+
const {
|
|
252
|
+
offset
|
|
253
|
+
} = this._config;
|
|
254
|
+
if (typeof offset === 'string') {
|
|
255
|
+
return offset.split(',').map(value => Number.parseInt(value, 10));
|
|
256
|
+
}
|
|
257
|
+
if (typeof offset === 'function') {
|
|
258
|
+
return popperData => offset(popperData, this._element);
|
|
259
|
+
}
|
|
373
260
|
return offset;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
var popperConfig = {
|
|
261
|
+
}
|
|
262
|
+
_getPopperConfig() {
|
|
263
|
+
const defaultBsPopperConfig = {
|
|
378
264
|
placement: this._getPlacement(),
|
|
379
|
-
modifiers: {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
},
|
|
384
|
-
preventOverflow: {
|
|
385
|
-
boundariesElement: this._config.boundary
|
|
265
|
+
modifiers: [{
|
|
266
|
+
name: 'preventOverflow',
|
|
267
|
+
options: {
|
|
268
|
+
boundary: this._config.boundary
|
|
386
269
|
}
|
|
387
|
-
}
|
|
388
|
-
|
|
270
|
+
}, {
|
|
271
|
+
name: 'offset',
|
|
272
|
+
options: {
|
|
273
|
+
offset: this._getOffset()
|
|
274
|
+
}
|
|
275
|
+
}]
|
|
389
276
|
};
|
|
390
277
|
|
|
391
|
-
if
|
|
392
|
-
|
|
278
|
+
// Disable Popper if we have a static display or Dropdown is in Navbar
|
|
279
|
+
if (this._inNavbar || this._config.display === 'static') {
|
|
280
|
+
Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
|
|
281
|
+
defaultBsPopperConfig.modifiers = [{
|
|
282
|
+
name: 'applyStyles',
|
|
393
283
|
enabled: false
|
|
394
|
-
};
|
|
284
|
+
}];
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
...defaultBsPopperConfig,
|
|
288
|
+
...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig])
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
_selectMenuItem({
|
|
292
|
+
key,
|
|
293
|
+
target
|
|
294
|
+
}) {
|
|
295
|
+
const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => index_js.isVisible(element));
|
|
296
|
+
if (!items.length) {
|
|
297
|
+
return;
|
|
395
298
|
}
|
|
396
299
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
300
|
+
// if target isn't included in items (e.g. when expanding the dropdown)
|
|
301
|
+
// allow cycling to get the last item in case key equals ARROW_UP_KEY
|
|
302
|
+
index_js.getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
|
|
303
|
+
}
|
|
400
304
|
|
|
401
|
-
|
|
305
|
+
// Static
|
|
306
|
+
static jQueryInterface(config) {
|
|
402
307
|
return this.each(function () {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
if (!data) {
|
|
408
|
-
data = new Dropdown(this, _config);
|
|
409
|
-
$(this).data(DATA_KEY, data);
|
|
308
|
+
const data = Dropdown.getOrCreateInstance(this, config);
|
|
309
|
+
if (typeof config !== 'string') {
|
|
310
|
+
return;
|
|
410
311
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
if (typeof data[config] === 'undefined') {
|
|
414
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
data[config]();
|
|
312
|
+
if (typeof data[config] === 'undefined') {
|
|
313
|
+
throw new TypeError(`No method named "${config}"`);
|
|
418
314
|
}
|
|
315
|
+
data[config]();
|
|
419
316
|
});
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
|
|
317
|
+
}
|
|
318
|
+
static clearMenus(event) {
|
|
319
|
+
if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
|
|
424
320
|
return;
|
|
425
321
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
var parent = Dropdown._getParentFromElement(toggles[i]);
|
|
431
|
-
|
|
432
|
-
var context = $(toggles[i]).data(DATA_KEY);
|
|
433
|
-
var relatedTarget = {
|
|
434
|
-
relatedTarget: toggles[i]
|
|
435
|
-
};
|
|
436
|
-
|
|
437
|
-
if (event && event.type === 'click') {
|
|
438
|
-
relatedTarget.clickEvent = event;
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
if (!context) {
|
|
322
|
+
const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
|
|
323
|
+
for (const toggle of openToggles) {
|
|
324
|
+
const context = Dropdown.getInstance(toggle);
|
|
325
|
+
if (!context || context._config.autoClose === false) {
|
|
442
326
|
continue;
|
|
443
327
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
if (!$(parent).hasClass(ClassName.SHOW)) {
|
|
328
|
+
const composedPath = event.composedPath();
|
|
329
|
+
const isMenuTarget = composedPath.includes(context._menu);
|
|
330
|
+
if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
|
|
448
331
|
continue;
|
|
449
332
|
}
|
|
450
333
|
|
|
451
|
-
|
|
334
|
+
// Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
|
|
335
|
+
if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
|
|
452
336
|
continue;
|
|
453
337
|
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
continue;
|
|
460
|
-
} // If this is a touch-enabled device we remove the extra
|
|
461
|
-
// empty mouseover listeners we added for iOS support
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
if ('ontouchstart' in document.documentElement) {
|
|
465
|
-
$(document.body).children().off('mouseover', null, $.noop);
|
|
338
|
+
const relatedTarget = {
|
|
339
|
+
relatedTarget: context._element
|
|
340
|
+
};
|
|
341
|
+
if (event.type === 'click') {
|
|
342
|
+
relatedTarget.clickEvent = event;
|
|
466
343
|
}
|
|
467
|
-
|
|
468
|
-
toggles[i].setAttribute('aria-expanded', 'false');
|
|
469
|
-
$(dropdownMenu).removeClass(ClassName.SHOW);
|
|
470
|
-
$(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
|
|
344
|
+
context._completeHide(relatedTarget);
|
|
471
345
|
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
return parent || element.parentNode;
|
|
483
|
-
} // eslint-disable-next-line complexity
|
|
484
|
-
;
|
|
485
|
-
|
|
486
|
-
Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
|
|
487
|
-
// If not input/textarea:
|
|
488
|
-
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
|
|
489
|
-
// If input/textarea:
|
|
490
|
-
// - If space key => not a dropdown command
|
|
491
|
-
// - If key is other than escape
|
|
492
|
-
// - If key is not up or down => not a dropdown command
|
|
493
|
-
// - If trigger inside the menu => not a dropdown command
|
|
494
|
-
if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
|
|
346
|
+
}
|
|
347
|
+
static dataApiKeydownHandler(event) {
|
|
348
|
+
// If not an UP | DOWN | ESCAPE key => not a dropdown command
|
|
349
|
+
// If input/textarea && if key is other than ESCAPE => not a dropdown command
|
|
350
|
+
|
|
351
|
+
const isInput = /input|textarea/i.test(event.target.tagName);
|
|
352
|
+
const isEscapeEvent = event.key === ESCAPE_KEY;
|
|
353
|
+
const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key);
|
|
354
|
+
if (!isUpOrDownEvent && !isEscapeEvent) {
|
|
495
355
|
return;
|
|
496
356
|
}
|
|
497
|
-
|
|
498
|
-
event.preventDefault();
|
|
499
|
-
event.stopPropagation();
|
|
500
|
-
|
|
501
|
-
if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
|
|
357
|
+
if (isInput && !isEscapeEvent) {
|
|
502
358
|
return;
|
|
503
359
|
}
|
|
360
|
+
event.preventDefault();
|
|
504
361
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
$(toggle).trigger('focus');
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
$(this).trigger('click');
|
|
516
|
-
return;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
|
|
520
|
-
|
|
521
|
-
if (items.length === 0) {
|
|
362
|
+
// TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
|
|
363
|
+
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);
|
|
364
|
+
const instance = Dropdown.getOrCreateInstance(getToggleButton);
|
|
365
|
+
if (isUpOrDownEvent) {
|
|
366
|
+
event.stopPropagation();
|
|
367
|
+
instance.show();
|
|
368
|
+
instance._selectMenuItem(event);
|
|
522
369
|
return;
|
|
523
370
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
index--;
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
|
|
533
|
-
// Down
|
|
534
|
-
index++;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
if (index < 0) {
|
|
538
|
-
index = 0;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
items[index].focus();
|
|
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;
|
|
553
|
-
}
|
|
554
|
-
}, {
|
|
555
|
-
key: "DefaultType",
|
|
556
|
-
get: function get() {
|
|
557
|
-
return DefaultType;
|
|
371
|
+
if (instance._isShown()) {
|
|
372
|
+
// else is escape and we check if it is shown
|
|
373
|
+
event.stopPropagation();
|
|
374
|
+
instance.hide();
|
|
375
|
+
getToggleButton.focus();
|
|
558
376
|
}
|
|
559
|
-
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
560
379
|
|
|
561
|
-
return Dropdown;
|
|
562
|
-
}();
|
|
563
380
|
/**
|
|
564
|
-
*
|
|
565
|
-
* Data Api implementation
|
|
566
|
-
* ------------------------------------------------------------------------
|
|
381
|
+
* Data API implementation
|
|
567
382
|
*/
|
|
568
383
|
|
|
569
|
-
|
|
570
|
-
|
|
384
|
+
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
|
|
385
|
+
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
|
|
386
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
|
|
387
|
+
EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
|
|
388
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
571
389
|
event.preventDefault();
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
Dropdown._jQueryInterface.call($(this), 'toggle');
|
|
575
|
-
}).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
|
|
576
|
-
e.stopPropagation();
|
|
390
|
+
Dropdown.getOrCreateInstance(this).toggle();
|
|
577
391
|
});
|
|
392
|
+
|
|
578
393
|
/**
|
|
579
|
-
* ------------------------------------------------------------------------
|
|
580
394
|
* jQuery
|
|
581
|
-
* ------------------------------------------------------------------------
|
|
582
395
|
*/
|
|
583
396
|
|
|
584
|
-
|
|
585
|
-
$.fn[NAME].Constructor = Dropdown;
|
|
586
|
-
|
|
587
|
-
$.fn[NAME].noConflict = function () {
|
|
588
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
589
|
-
return Dropdown._jQueryInterface;
|
|
590
|
-
};
|
|
397
|
+
index_js.defineJQueryPlugin(Dropdown);
|
|
591
398
|
|
|
592
399
|
return Dropdown;
|
|
593
400
|
|