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