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