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