bootstrap 4.6.2 → 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 +2 -1
- data/README.md +7 -4
- data/assets/javascripts/bootstrap/alert.js +192 -115
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +96 -179
- data/assets/javascripts/bootstrap/carousel.js +472 -359
- data/assets/javascripts/bootstrap/collapse.js +379 -225
- 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 +472 -355
- data/assets/javascripts/bootstrap/modal.js +612 -438
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +138 -167
- data/assets/javascripts/bootstrap/scrollspy.js +250 -192
- data/assets/javascripts/bootstrap/tab.js +241 -144
- data/assets/javascripts/bootstrap/toast.js +223 -157
- data/assets/javascripts/bootstrap/tooltip.js +651 -487
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +8 -1
- data/assets/javascripts/bootstrap.js +3277 -2590
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +53 -18
- data/assets/stylesheets/_bootstrap-reboot.scss +6 -3
- data/assets/stylesheets/_bootstrap.scss +18 -10
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -10
- data/assets/stylesheets/bootstrap/_badge.scss +2 -27
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
- data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
- data/assets/stylesheets/bootstrap/_buttons.scss +29 -60
- data/assets/stylesheets/bootstrap/_card.scss +20 -91
- data/assets/stylesheets/bootstrap/_carousel.scss +64 -35
- data/assets/stylesheets/bootstrap/_close.scss +30 -30
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +84 -36
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +84 -69
- data/assets/stylesheets/bootstrap/_grid.scss +3 -54
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_images.scss +1 -1
- data/assets/stylesheets/bootstrap/_list-group.scss +28 -8
- data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
- data/assets/stylesheets/bootstrap/_modal.scss +45 -57
- data/assets/stylesheets/bootstrap/_nav.scss +20 -6
- data/assets/stylesheets/bootstrap/_navbar.scss +45 -71
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
- data/assets/stylesheets/bootstrap/_popover.scss +24 -36
- data/assets/stylesheets/bootstrap/_progress.scss +5 -4
- data/assets/stylesheets/bootstrap/_reboot.scss +316 -179
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +11 -7
- data/assets/stylesheets/bootstrap/_tables.scss +79 -114
- data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
- data/assets/stylesheets/bootstrap/_tooltip.scss +21 -21
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -7
- data/assets/stylesheets/bootstrap/_type.scss +38 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -18
- data/assets/stylesheets/bootstrap/_variables.scss +800 -485
- 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 +10 -8
- 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 +71 -48
- 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 +39 -97
- 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 +3 -3
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
- 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 +214 -130
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +19 -16
- 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_1.gemfile +7 -0
- metadata +45 -73
- data/assets/javascripts/bootstrap/util.js +0 -189
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
- data/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/assets/stylesheets/bootstrap/_print.scss +0 -132
- data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
- 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 -80
- 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/_interactions.scss +0 -5
- 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,128 +1,245 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap dropdown.js
|
|
3
|
-
* Copyright 2011-
|
|
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
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 = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.
|
|
10
|
-
}
|
|
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
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
+
});
|
|
25
29
|
}
|
|
30
|
+
n['default'] = e;
|
|
31
|
+
return Object.freeze(n);
|
|
26
32
|
}
|
|
27
33
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return Constructor;
|
|
35
|
-
}
|
|
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);
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
/**
|
|
42
|
+
* --------------------------------------------------------------------------
|
|
43
|
+
* Bootstrap (v5.0.0): util/index.js
|
|
44
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
45
|
+
* --------------------------------------------------------------------------
|
|
46
|
+
*/
|
|
41
47
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
const toType = obj => {
|
|
49
|
+
if (obj === null || obj === undefined) {
|
|
50
|
+
return `${obj}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
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');
|
|
58
|
+
|
|
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
|
|
64
|
+
|
|
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]}`;
|
|
47
72
|
}
|
|
48
73
|
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
74
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return selector;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const getElementFromSelector = element => {
|
|
81
|
+
const selector = getSelector(element);
|
|
82
|
+
return selector ? document.querySelector(selector) : null;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
|
86
|
+
|
|
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);
|
|
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
|
+
};
|
|
98
|
+
|
|
99
|
+
const isVisible = element => {
|
|
100
|
+
if (!element) {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
|
|
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
|
+
}
|
|
109
|
+
|
|
110
|
+
return false;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const isDisabled = element => {
|
|
114
|
+
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (element.classList.contains('disabled')) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
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';
|
|
152
|
+
|
|
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;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
53
170
|
|
|
54
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
|
+
* ------------------------------------------------------------------------
|
|
55
179
|
* Constants
|
|
180
|
+
* ------------------------------------------------------------------------
|
|
56
181
|
*/
|
|
57
182
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
|
|
97
|
-
var PLACEMENT_TOP = 'top-start';
|
|
98
|
-
var PLACEMENT_TOPEND = 'top-end';
|
|
99
|
-
var PLACEMENT_BOTTOM = 'bottom-start';
|
|
100
|
-
var PLACEMENT_BOTTOMEND = 'bottom-end';
|
|
101
|
-
var PLACEMENT_RIGHT = 'right-start';
|
|
102
|
-
var PLACEMENT_LEFT = 'left-start';
|
|
103
|
-
var Default = {
|
|
104
|
-
offset: 0,
|
|
105
|
-
flip: true,
|
|
106
|
-
boundary: 'scrollParent',
|
|
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',
|
|
107
221
|
reference: 'toggle',
|
|
108
222
|
display: 'dynamic',
|
|
109
|
-
popperConfig: null
|
|
223
|
+
popperConfig: null,
|
|
224
|
+
autoClose: true
|
|
110
225
|
};
|
|
111
|
-
|
|
112
|
-
offset: '(
|
|
113
|
-
flip: 'boolean',
|
|
226
|
+
const DefaultType = {
|
|
227
|
+
offset: '(array|string|function)',
|
|
114
228
|
boundary: '(string|element)',
|
|
115
|
-
reference: '(string|element)',
|
|
229
|
+
reference: '(string|element|object)',
|
|
116
230
|
display: 'string',
|
|
117
|
-
popperConfig: '(null|object)'
|
|
231
|
+
popperConfig: '(null|object|function)',
|
|
232
|
+
autoClose: '(boolean|string)'
|
|
118
233
|
};
|
|
119
234
|
/**
|
|
120
|
-
*
|
|
235
|
+
* ------------------------------------------------------------------------
|
|
236
|
+
* Class Definition
|
|
237
|
+
* ------------------------------------------------------------------------
|
|
121
238
|
*/
|
|
122
239
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
240
|
+
class Dropdown extends BaseComponent__default['default'] {
|
|
241
|
+
constructor(element, config) {
|
|
242
|
+
super(element);
|
|
126
243
|
this._popper = null;
|
|
127
244
|
this._config = this._getConfig(config);
|
|
128
245
|
this._menu = this._getMenuElement();
|
|
@@ -132,322 +249,358 @@
|
|
|
132
249
|
} // Getters
|
|
133
250
|
|
|
134
251
|
|
|
135
|
-
|
|
252
|
+
static get Default() {
|
|
253
|
+
return Default;
|
|
254
|
+
}
|
|
136
255
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
256
|
+
static get DefaultType() {
|
|
257
|
+
return DefaultType;
|
|
258
|
+
}
|
|
142
259
|
|
|
143
|
-
|
|
260
|
+
static get DATA_KEY() {
|
|
261
|
+
return DATA_KEY;
|
|
262
|
+
} // Public
|
|
144
263
|
|
|
145
|
-
Dropdown._clearMenus();
|
|
146
264
|
|
|
147
|
-
|
|
265
|
+
toggle() {
|
|
266
|
+
if (isDisabled(this._element)) {
|
|
148
267
|
return;
|
|
149
268
|
}
|
|
150
269
|
|
|
151
|
-
this.
|
|
152
|
-
};
|
|
270
|
+
const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
|
|
153
271
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
272
|
+
if (isActive) {
|
|
273
|
+
this.hide();
|
|
274
|
+
return;
|
|
157
275
|
}
|
|
158
276
|
|
|
159
|
-
|
|
277
|
+
this.show();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
show() {
|
|
281
|
+
if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
|
|
160
282
|
return;
|
|
161
283
|
}
|
|
162
284
|
|
|
163
|
-
|
|
285
|
+
const parent = Dropdown.getParentFromElement(this._element);
|
|
286
|
+
const relatedTarget = {
|
|
164
287
|
relatedTarget: this._element
|
|
165
288
|
};
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
var parent = Dropdown._getParentFromElement(this._element);
|
|
289
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
|
|
169
290
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (showEvent.isDefaultPrevented()) {
|
|
291
|
+
if (showEvent.defaultPrevented) {
|
|
173
292
|
return;
|
|
174
293
|
} // Totally disable Popper for Dropdowns in Navbar
|
|
175
294
|
|
|
176
295
|
|
|
177
|
-
if (
|
|
178
|
-
|
|
179
|
-
|
|
296
|
+
if (this._inNavbar) {
|
|
297
|
+
Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'none');
|
|
298
|
+
} else {
|
|
299
|
+
if (typeof Popper__namespace === 'undefined') {
|
|
180
300
|
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
|
|
181
301
|
}
|
|
182
302
|
|
|
183
|
-
|
|
303
|
+
let referenceElement = this._element;
|
|
184
304
|
|
|
185
305
|
if (this._config.reference === 'parent') {
|
|
186
306
|
referenceElement = parent;
|
|
187
|
-
} else if (
|
|
307
|
+
} else if (isElement(this._config.reference)) {
|
|
188
308
|
referenceElement = this._config.reference; // Check if it's jQuery element
|
|
189
309
|
|
|
190
310
|
if (typeof this._config.reference.jquery !== 'undefined') {
|
|
191
311
|
referenceElement = this._config.reference[0];
|
|
192
312
|
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
313
|
+
} else if (typeof this._config.reference === 'object') {
|
|
314
|
+
referenceElement = this._config.reference;
|
|
315
|
+
}
|
|
196
316
|
|
|
317
|
+
const popperConfig = this._getPopperConfig();
|
|
197
318
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
319
|
+
const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
|
|
320
|
+
this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
|
|
201
321
|
|
|
202
|
-
|
|
322
|
+
if (isDisplayStatic) {
|
|
323
|
+
Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
|
|
324
|
+
}
|
|
203
325
|
} // If this is a touch-enabled device we add extra
|
|
204
326
|
// empty mouseover listeners to the body's immediate children;
|
|
205
327
|
// only needed because of broken event delegation on iOS
|
|
206
328
|
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
|
|
207
329
|
|
|
208
330
|
|
|
209
|
-
if ('ontouchstart' in document.documentElement &&
|
|
210
|
-
|
|
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));
|
|
211
333
|
}
|
|
212
334
|
|
|
213
335
|
this._element.focus();
|
|
214
336
|
|
|
215
337
|
this._element.setAttribute('aria-expanded', true);
|
|
216
338
|
|
|
217
|
-
|
|
218
|
-
$__default["default"](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_SHOWN, relatedTarget));
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
_proto.hide = function hide() {
|
|
222
|
-
if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW)) {
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
var relatedTarget = {
|
|
227
|
-
relatedTarget: this._element
|
|
228
|
-
};
|
|
229
|
-
var hideEvent = $__default["default"].Event(EVENT_HIDE, relatedTarget);
|
|
339
|
+
this._menu.classList.toggle(CLASS_NAME_SHOW);
|
|
230
340
|
|
|
231
|
-
|
|
341
|
+
this._element.classList.toggle(CLASS_NAME_SHOW);
|
|
232
342
|
|
|
233
|
-
|
|
343
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
|
|
344
|
+
}
|
|
234
345
|
|
|
235
|
-
|
|
346
|
+
hide() {
|
|
347
|
+
if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
|
|
236
348
|
return;
|
|
237
349
|
}
|
|
238
350
|
|
|
239
|
-
|
|
240
|
-
this.
|
|
241
|
-
}
|
|
351
|
+
const relatedTarget = {
|
|
352
|
+
relatedTarget: this._element
|
|
353
|
+
};
|
|
242
354
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
};
|
|
355
|
+
this._completeHide(relatedTarget);
|
|
356
|
+
}
|
|
246
357
|
|
|
247
|
-
|
|
248
|
-
$__default["default"].removeData(this._element, DATA_KEY);
|
|
249
|
-
$__default["default"](this._element).off(EVENT_KEY);
|
|
250
|
-
this._element = null;
|
|
358
|
+
dispose() {
|
|
251
359
|
this._menu = null;
|
|
252
360
|
|
|
253
|
-
if (this._popper
|
|
361
|
+
if (this._popper) {
|
|
254
362
|
this._popper.destroy();
|
|
255
363
|
|
|
256
364
|
this._popper = null;
|
|
257
365
|
}
|
|
258
|
-
};
|
|
259
366
|
|
|
260
|
-
|
|
367
|
+
super.dispose();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
update() {
|
|
261
371
|
this._inNavbar = this._detectNavbar();
|
|
262
372
|
|
|
263
|
-
if (this._popper
|
|
264
|
-
this._popper.
|
|
373
|
+
if (this._popper) {
|
|
374
|
+
this._popper.update();
|
|
265
375
|
}
|
|
266
376
|
} // Private
|
|
267
|
-
;
|
|
268
377
|
|
|
269
|
-
_proto._addEventListeners = function _addEventListeners() {
|
|
270
|
-
var _this = this;
|
|
271
378
|
|
|
272
|
-
|
|
379
|
+
_addEventListeners() {
|
|
380
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK, event => {
|
|
273
381
|
event.preventDefault();
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
_this.toggle();
|
|
382
|
+
this.toggle();
|
|
277
383
|
});
|
|
278
|
-
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
_completeHide(relatedTarget) {
|
|
387
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
|
|
388
|
+
|
|
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
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
if ('ontouchstart' in document.documentElement) {
|
|
396
|
+
[].concat(...document.body.children).forEach(elem => EventHandler__default['default'].off(elem, 'mouseover', noop));
|
|
397
|
+
}
|
|
398
|
+
|
|
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
|
|
417
|
+
};
|
|
418
|
+
typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
419
|
+
|
|
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
|
+
}
|
|
279
424
|
|
|
280
|
-
_proto._getConfig = function _getConfig(config) {
|
|
281
|
-
config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config);
|
|
282
|
-
Util__default["default"].typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
283
425
|
return config;
|
|
284
|
-
}
|
|
426
|
+
}
|
|
285
427
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
428
|
+
_getMenuElement() {
|
|
429
|
+
return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
|
|
430
|
+
}
|
|
289
431
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
432
|
+
_getPlacement() {
|
|
433
|
+
const parentDropdown = this._element.parentNode;
|
|
434
|
+
|
|
435
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
|
|
436
|
+
return PLACEMENT_RIGHT;
|
|
293
437
|
}
|
|
294
438
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
|
|
305
|
-
placement = PLACEMENT_RIGHT;
|
|
306
|
-
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
|
|
307
|
-
placement = PLACEMENT_LEFT;
|
|
308
|
-
} else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
|
|
309
|
-
placement = PLACEMENT_BOTTOMEND;
|
|
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
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
|
|
445
|
+
|
|
446
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
|
|
447
|
+
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
|
|
310
448
|
}
|
|
311
449
|
|
|
312
|
-
return
|
|
313
|
-
}
|
|
450
|
+
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
|
|
451
|
+
}
|
|
314
452
|
|
|
315
|
-
|
|
316
|
-
return
|
|
317
|
-
}
|
|
453
|
+
_detectNavbar() {
|
|
454
|
+
return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
|
|
455
|
+
}
|
|
318
456
|
|
|
319
|
-
|
|
320
|
-
|
|
457
|
+
_getOffset() {
|
|
458
|
+
const {
|
|
459
|
+
offset
|
|
460
|
+
} = this._config;
|
|
321
461
|
|
|
322
|
-
|
|
462
|
+
if (typeof offset === 'string') {
|
|
463
|
+
return offset.split(',').map(val => Number.parseInt(val, 10));
|
|
464
|
+
}
|
|
323
465
|
|
|
324
|
-
if (typeof
|
|
325
|
-
|
|
326
|
-
data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element));
|
|
327
|
-
return data;
|
|
328
|
-
};
|
|
329
|
-
} else {
|
|
330
|
-
offset.offset = this._config.offset;
|
|
466
|
+
if (typeof offset === 'function') {
|
|
467
|
+
return popperData => offset(popperData, this._element);
|
|
331
468
|
}
|
|
332
469
|
|
|
333
470
|
return offset;
|
|
334
|
-
}
|
|
471
|
+
}
|
|
335
472
|
|
|
336
|
-
|
|
337
|
-
|
|
473
|
+
_getPopperConfig() {
|
|
474
|
+
const defaultBsPopperConfig = {
|
|
338
475
|
placement: this._getPlacement(),
|
|
339
|
-
modifiers: {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
},
|
|
344
|
-
preventOverflow: {
|
|
345
|
-
boundariesElement: this._config.boundary
|
|
476
|
+
modifiers: [{
|
|
477
|
+
name: 'preventOverflow',
|
|
478
|
+
options: {
|
|
479
|
+
boundary: this._config.boundary
|
|
346
480
|
}
|
|
347
|
-
}
|
|
481
|
+
}, {
|
|
482
|
+
name: 'offset',
|
|
483
|
+
options: {
|
|
484
|
+
offset: this._getOffset()
|
|
485
|
+
}
|
|
486
|
+
}]
|
|
348
487
|
}; // Disable Popper if we have a static display
|
|
349
488
|
|
|
350
489
|
if (this._config.display === 'static') {
|
|
351
|
-
|
|
490
|
+
defaultBsPopperConfig.modifiers = [{
|
|
491
|
+
name: 'applyStyles',
|
|
352
492
|
enabled: false
|
|
353
|
-
};
|
|
493
|
+
}];
|
|
354
494
|
}
|
|
355
495
|
|
|
356
|
-
return
|
|
357
|
-
|
|
358
|
-
|
|
496
|
+
return { ...defaultBsPopperConfig,
|
|
497
|
+
...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
|
|
498
|
+
};
|
|
499
|
+
}
|
|
359
500
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
501
|
+
_selectMenuItem(event) {
|
|
502
|
+
const items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
|
|
503
|
+
|
|
504
|
+
if (!items.length) {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
363
507
|
|
|
364
|
-
|
|
508
|
+
let index = items.indexOf(event.target); // Up
|
|
365
509
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
}
|
|
510
|
+
if (event.key === ARROW_UP_KEY && index > 0) {
|
|
511
|
+
index--;
|
|
512
|
+
} // Down
|
|
370
513
|
|
|
371
|
-
if (typeof config === 'string') {
|
|
372
|
-
if (typeof data[config] === 'undefined') {
|
|
373
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
374
|
-
}
|
|
375
514
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
}
|
|
379
|
-
};
|
|
515
|
+
if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
|
|
516
|
+
index++;
|
|
517
|
+
} // index is -1 if the first keydown is an ArrowUp
|
|
380
518
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
519
|
+
|
|
520
|
+
index = index === -1 ? 0 : index;
|
|
521
|
+
items[index].focus();
|
|
522
|
+
} // Static
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
static dropdownInterface(element, config) {
|
|
526
|
+
let data = Data__default['default'].get(element, DATA_KEY);
|
|
527
|
+
|
|
528
|
+
const _config = typeof config === 'object' ? config : null;
|
|
529
|
+
|
|
530
|
+
if (!data) {
|
|
531
|
+
data = new Dropdown(element, _config);
|
|
384
532
|
}
|
|
385
533
|
|
|
386
|
-
|
|
534
|
+
if (typeof config === 'string') {
|
|
535
|
+
if (typeof data[config] === 'undefined') {
|
|
536
|
+
throw new TypeError(`No method named "${config}"`);
|
|
537
|
+
}
|
|
387
538
|
|
|
388
|
-
|
|
389
|
-
|
|
539
|
+
data[config]();
|
|
540
|
+
}
|
|
541
|
+
}
|
|
390
542
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
543
|
+
static jQueryInterface(config) {
|
|
544
|
+
return this.each(function () {
|
|
545
|
+
Dropdown.dropdownInterface(this, config);
|
|
546
|
+
});
|
|
547
|
+
}
|
|
395
548
|
|
|
396
|
-
|
|
397
|
-
|
|
549
|
+
static clearMenus(event) {
|
|
550
|
+
if (event) {
|
|
551
|
+
if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
|
|
552
|
+
return;
|
|
398
553
|
}
|
|
399
554
|
|
|
400
|
-
if (
|
|
401
|
-
|
|
555
|
+
if (/input|select|option|textarea|form/i.test(event.target.tagName)) {
|
|
556
|
+
return;
|
|
402
557
|
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
|
|
403
561
|
|
|
404
|
-
|
|
562
|
+
for (let i = 0, len = toggles.length; i < len; i++) {
|
|
563
|
+
const context = Data__default['default'].get(toggles[i], DATA_KEY);
|
|
405
564
|
|
|
406
|
-
if (
|
|
565
|
+
if (!context || context._config.autoClose === false) {
|
|
407
566
|
continue;
|
|
408
567
|
}
|
|
409
568
|
|
|
410
|
-
if (
|
|
569
|
+
if (!context._element.classList.contains(CLASS_NAME_SHOW)) {
|
|
411
570
|
continue;
|
|
412
571
|
}
|
|
413
572
|
|
|
414
|
-
|
|
415
|
-
|
|
573
|
+
const relatedTarget = {
|
|
574
|
+
relatedTarget: context._element
|
|
575
|
+
};
|
|
416
576
|
|
|
417
|
-
if (
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
// empty mouseover listeners we added for iOS support
|
|
577
|
+
if (event) {
|
|
578
|
+
const composedPath = event.composedPath();
|
|
579
|
+
const isMenuTarget = composedPath.includes(context._menu);
|
|
421
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
|
|
422
584
|
|
|
423
|
-
if ('ontouchstart' in document.documentElement) {
|
|
424
|
-
$__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop);
|
|
425
|
-
}
|
|
426
585
|
|
|
427
|
-
|
|
586
|
+
if (event.type === 'keyup' && event.key === TAB_KEY && context._menu.contains(event.target)) {
|
|
587
|
+
continue;
|
|
588
|
+
}
|
|
428
589
|
|
|
429
|
-
|
|
430
|
-
|
|
590
|
+
if (event.type === 'click') {
|
|
591
|
+
relatedTarget.clickEvent = event;
|
|
592
|
+
}
|
|
431
593
|
}
|
|
432
594
|
|
|
433
|
-
|
|
434
|
-
$__default["default"](parent).removeClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_HIDDEN, relatedTarget));
|
|
435
|
-
}
|
|
436
|
-
};
|
|
437
|
-
|
|
438
|
-
Dropdown._getParentFromElement = function _getParentFromElement(element) {
|
|
439
|
-
var parent;
|
|
440
|
-
var selector = Util__default["default"].getSelectorFromElement(element);
|
|
441
|
-
|
|
442
|
-
if (selector) {
|
|
443
|
-
parent = document.querySelector(selector);
|
|
595
|
+
context._completeHide(relatedTarget);
|
|
444
596
|
}
|
|
597
|
+
}
|
|
445
598
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
599
|
+
static getParentFromElement(element) {
|
|
600
|
+
return getElementFromSelector(element) || element.parentNode;
|
|
601
|
+
}
|
|
449
602
|
|
|
450
|
-
|
|
603
|
+
static dataApiKeydownHandler(event) {
|
|
451
604
|
// If not input/textarea:
|
|
452
605
|
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
|
|
453
606
|
// If input/textarea:
|
|
@@ -455,105 +608,69 @@
|
|
|
455
608
|
// - If key is other than escape
|
|
456
609
|
// - If key is not up or down => not a dropdown command
|
|
457
610
|
// - If trigger inside the menu => not a dropdown command
|
|
458
|
-
if (/input|textarea/i.test(event.target.tagName) ? event.
|
|
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)) {
|
|
459
612
|
return;
|
|
460
613
|
}
|
|
461
614
|
|
|
462
|
-
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
var parent = Dropdown._getParentFromElement(this);
|
|
615
|
+
const isActive = this.classList.contains(CLASS_NAME_SHOW);
|
|
467
616
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
if (!isActive && event.which === ESCAPE_KEYCODE) {
|
|
617
|
+
if (!isActive && event.key === ESCAPE_KEY) {
|
|
471
618
|
return;
|
|
472
619
|
}
|
|
473
620
|
|
|
474
621
|
event.preventDefault();
|
|
475
622
|
event.stopPropagation();
|
|
476
623
|
|
|
477
|
-
if (
|
|
478
|
-
if (event.which === ESCAPE_KEYCODE) {
|
|
479
|
-
$__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus');
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
$__default["default"](this).trigger('click');
|
|
624
|
+
if (isDisabled(this)) {
|
|
483
625
|
return;
|
|
484
626
|
}
|
|
485
627
|
|
|
486
|
-
|
|
487
|
-
return $__default["default"](item).is(':visible');
|
|
488
|
-
});
|
|
628
|
+
const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
|
|
489
629
|
|
|
490
|
-
if (
|
|
630
|
+
if (event.key === ESCAPE_KEY) {
|
|
631
|
+
getToggleButton().focus();
|
|
632
|
+
Dropdown.clearMenus();
|
|
491
633
|
return;
|
|
492
634
|
}
|
|
493
635
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
// Up
|
|
498
|
-
index--;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
|
|
502
|
-
// Down
|
|
503
|
-
index++;
|
|
636
|
+
if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
|
|
637
|
+
getToggleButton().click();
|
|
638
|
+
return;
|
|
504
639
|
}
|
|
505
640
|
|
|
506
|
-
if (
|
|
507
|
-
|
|
641
|
+
if (!isActive || event.key === SPACE_KEY) {
|
|
642
|
+
Dropdown.clearMenus();
|
|
643
|
+
return;
|
|
508
644
|
}
|
|
509
645
|
|
|
510
|
-
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
_createClass(Dropdown, null, [{
|
|
514
|
-
key: "VERSION",
|
|
515
|
-
get: function get() {
|
|
516
|
-
return VERSION;
|
|
517
|
-
}
|
|
518
|
-
}, {
|
|
519
|
-
key: "Default",
|
|
520
|
-
get: function get() {
|
|
521
|
-
return Default;
|
|
522
|
-
}
|
|
523
|
-
}, {
|
|
524
|
-
key: "DefaultType",
|
|
525
|
-
get: function get() {
|
|
526
|
-
return DefaultType;
|
|
527
|
-
}
|
|
528
|
-
}]);
|
|
646
|
+
Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
|
|
647
|
+
}
|
|
529
648
|
|
|
530
|
-
|
|
531
|
-
}();
|
|
649
|
+
}
|
|
532
650
|
/**
|
|
533
|
-
*
|
|
651
|
+
* ------------------------------------------------------------------------
|
|
652
|
+
* Data Api implementation
|
|
653
|
+
* ------------------------------------------------------------------------
|
|
534
654
|
*/
|
|
535
655
|
|
|
536
656
|
|
|
537
|
-
|
|
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) {
|
|
538
662
|
event.preventDefault();
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
Dropdown._jQueryInterface.call($__default["default"](this), 'toggle');
|
|
542
|
-
}).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
|
|
543
|
-
e.stopPropagation();
|
|
663
|
+
Dropdown.dropdownInterface(this);
|
|
544
664
|
});
|
|
545
665
|
/**
|
|
666
|
+
* ------------------------------------------------------------------------
|
|
546
667
|
* jQuery
|
|
668
|
+
* ------------------------------------------------------------------------
|
|
669
|
+
* add .Dropdown to jQuery only if jQuery is present
|
|
547
670
|
*/
|
|
548
671
|
|
|
549
|
-
|
|
550
|
-
$__default["default"].fn[NAME].Constructor = Dropdown;
|
|
551
|
-
|
|
552
|
-
$__default["default"].fn[NAME].noConflict = function () {
|
|
553
|
-
$__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
|
|
554
|
-
return Dropdown._jQueryInterface;
|
|
555
|
-
};
|
|
672
|
+
defineJQueryPlugin(NAME, Dropdown);
|
|
556
673
|
|
|
557
674
|
return Dropdown;
|
|
558
675
|
|
|
559
|
-
}));
|
|
676
|
+
})));
|