dropdown.js 21 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
XhmikosR's avatar
XhmikosR committed
2
  * Bootstrap dropdown.js v5.0.0-alpha3 (https://getbootstrap.com/)
XhmikosR's avatar
XhmikosR committed
3
  * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
XhmikosR's avatar
XhmikosR committed
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
XhmikosR's avatar
Dist    
XhmikosR committed
5
  */
Mark Otto's avatar
dist    
Mark Otto committed
6
(function (global, factory) {
XhmikosR's avatar
XhmikosR committed
7
8
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('popper.js'), require('./dom/selector-engine.js')) :
  typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/event-handler.js', './dom/manipulator.js', 'popper.js', './dom/selector-engine.js'], factory) :
XhmikosR's avatar
XhmikosR committed
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Data, global.EventHandler, global.Manipulator, global.Popper, global.SelectorEngine));
XhmikosR's avatar
XhmikosR committed
10
}(this, (function (Data, EventHandler, Manipulator, Popper, SelectorEngine) { 'use strict';
XhmikosR's avatar
XhmikosR committed
11

XhmikosR's avatar
XhmikosR committed
12
13
14
15
16
17
18
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }

  var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
  var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
  var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
Mark Otto's avatar
dist    
Mark Otto committed
19

XhmikosR's avatar
XhmikosR committed
20
21
  /**
   * --------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
22
   * Bootstrap (v5.0.0-alpha3): util/index.js
XhmikosR's avatar
XhmikosR committed
23
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
XhmikosR's avatar
XhmikosR committed
24
25
26
27
   * --------------------------------------------------------------------------
   */

  var toType = function toType(obj) {
XhmikosR's avatar
XhmikosR committed
28
29
30
31
    if (obj === null || obj === undefined) {
      return "" + obj;
    }

XhmikosR's avatar
XhmikosR committed
32
33
34
    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
  };

XhmikosR's avatar
XhmikosR committed
35
  var getSelector = function getSelector(element) {
XhmikosR's avatar
XhmikosR committed
36
    var selector = element.getAttribute('data-bs-target');
XhmikosR's avatar
XhmikosR committed
37
38
39

    if (!selector || selector === '#') {
      var hrefAttr = element.getAttribute('href');
XhmikosR's avatar
XhmikosR committed
40
      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
XhmikosR's avatar
XhmikosR committed
41
42
    }

XhmikosR's avatar
XhmikosR committed
43
44
45
46
47
48
    return selector;
  };

  var getElementFromSelector = function getElementFromSelector(element) {
    var selector = getSelector(element);
    return selector ? document.querySelector(selector) : null;
XhmikosR's avatar
XhmikosR committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  };

  var isElement = function isElement(obj) {
    return (obj[0] || obj).nodeType;
  };

  var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) {
    Object.keys(configTypes).forEach(function (property) {
      var expectedTypes = configTypes[property];
      var value = config[property];
      var valueType = value && isElement(value) ? 'element' : toType(value);

      if (!new RegExp(expectedTypes).test(valueType)) {
        throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
      }
    });
  };

XhmikosR's avatar
XhmikosR committed
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  var isVisible = function isVisible(element) {
    if (!element) {
      return false;
    }

    if (element.style && element.parentNode && element.parentNode.style) {
      var elementStyle = getComputedStyle(element);
      var parentNodeStyle = getComputedStyle(element.parentNode);
      return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
    }

    return false;
  };

XhmikosR's avatar
XhmikosR committed
81
82
83
84
  var noop = function noop() {
    return function () {};
  };

XhmikosR's avatar
XhmikosR committed
85
86
87
88
  var getjQuery = function getjQuery() {
    var _window = window,
        jQuery = _window.jQuery;

XhmikosR's avatar
XhmikosR committed
89
    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
XhmikosR's avatar
XhmikosR committed
90
91
92
93
94
95
      return jQuery;
    }

    return null;
  };

XhmikosR's avatar
XhmikosR committed
96
97
98
99
100
101
102
103
  var onDOMContentLoaded = function onDOMContentLoaded(callback) {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', callback);
    } else {
      callback();
    }
  };

XhmikosR's avatar
XhmikosR committed
104
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
Mark Otto's avatar
Mark Otto committed
105
106
107
108

  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
XhmikosR's avatar
Dist    
XhmikosR committed
109
110
111
112
113
114
115
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
XhmikosR's avatar
XhmikosR committed
116
  var VERSION = '5.0.0-alpha3';
XhmikosR's avatar
Dist    
XhmikosR committed
117
118
119
  var DATA_KEY = 'bs.dropdown';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
120
121
122
123
124
125
126
127
  var ESCAPE_KEY = 'Escape';
  var SPACE_KEY = 'Space';
  var TAB_KEY = 'Tab';
  var ARROW_UP_KEY = 'ArrowUp';
  var ARROW_DOWN_KEY = 'ArrowDown';
  var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button

  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEY + "|" + ARROW_DOWN_KEY + "|" + ESCAPE_KEY);
XhmikosR's avatar
XhmikosR committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  var EVENT_HIDE = "hide" + EVENT_KEY;
  var EVENT_HIDDEN = "hidden" + EVENT_KEY;
  var EVENT_SHOW = "show" + EVENT_KEY;
  var EVENT_SHOWN = "shown" + EVENT_KEY;
  var EVENT_CLICK = "click" + EVENT_KEY;
  var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
  var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
  var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
  var CLASS_NAME_DISABLED = 'disabled';
  var CLASS_NAME_SHOW = 'show';
  var CLASS_NAME_DROPUP = 'dropup';
  var CLASS_NAME_DROPRIGHT = 'dropright';
  var CLASS_NAME_DROPLEFT = 'dropleft';
  var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
  var CLASS_NAME_NAVBAR = 'navbar';
  var CLASS_NAME_POSITION_STATIC = 'position-static';
XhmikosR's avatar
XhmikosR committed
144
  var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
XhmikosR's avatar
XhmikosR committed
145
146
147
148
149
150
151
152
153
154
  var SELECTOR_FORM_CHILD = '.dropdown form';
  var SELECTOR_MENU = '.dropdown-menu';
  var SELECTOR_NAVBAR_NAV = '.navbar-nav';
  var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
  var PLACEMENT_TOP = 'top-start';
  var PLACEMENT_TOPEND = 'top-end';
  var PLACEMENT_BOTTOM = 'bottom-start';
  var PLACEMENT_BOTTOMEND = 'bottom-end';
  var PLACEMENT_RIGHT = 'right-start';
  var PLACEMENT_LEFT = 'left-start';
XhmikosR's avatar
Dist    
XhmikosR committed
155
156
157
158
159
  var Default = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
XhmikosR's avatar
XhmikosR committed
160
161
    display: 'dynamic',
    popperConfig: null
XhmikosR's avatar
Dist    
XhmikosR committed
162
163
164
165
166
167
  };
  var DefaultType = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
XhmikosR's avatar
XhmikosR committed
168
169
    display: 'string',
    popperConfig: '(null|object)'
XhmikosR's avatar
Dist    
XhmikosR committed
170
  };
XhmikosR's avatar
XhmikosR committed
171
172
173
174
175
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
176

XhmikosR's avatar
XhmikosR committed
177
  var Dropdown = /*#__PURE__*/function () {
XhmikosR's avatar
Dist    
XhmikosR committed
178
179
180
181
182
183
    function Dropdown(element, config) {
      this._element = element;
      this._popper = null;
      this._config = this._getConfig(config);
      this._menu = this._getMenuElement();
      this._inNavbar = this._detectNavbar();
fat's avatar
fat committed
184

XhmikosR's avatar
Dist    
XhmikosR committed
185
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
186

XhmikosR's avatar
XhmikosR committed
187
      Data__default['default'].setData(element, DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
188
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
189

fat's avatar
fat committed
190

XhmikosR's avatar
Dist    
XhmikosR committed
191
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
192

XhmikosR's avatar
Dist    
XhmikosR committed
193
194
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
195
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
196
197
        return;
      }
fat's avatar
fat committed
198

XhmikosR's avatar
XhmikosR committed
199
      var isActive = this._element.classList.contains(CLASS_NAME_SHOW);
fat's avatar
fat committed
200

XhmikosR's avatar
XhmikosR committed
201
      Dropdown.clearMenus();
fat's avatar
fat committed
202

XhmikosR's avatar
Dist    
XhmikosR committed
203
204
205
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
206

XhmikosR's avatar
XhmikosR committed
207
208
209
210
      this.show();
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
211
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
XhmikosR committed
212
213
214
215
        return;
      }

      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
216
217
218
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
219
      var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
220

XhmikosR's avatar
XhmikosR committed
221
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
222
        return;
XhmikosR's avatar
XhmikosR committed
223
      } // Totally disable Popper for Dropdowns in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
224

Mark Otto's avatar
grunt    
Mark Otto committed
225

XhmikosR's avatar
Dist    
XhmikosR committed
226
      if (!this._inNavbar) {
XhmikosR's avatar
XhmikosR committed
227
        if (typeof Popper__default['default'] === 'undefined') {
XhmikosR's avatar
XhmikosR committed
228
          throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
229
        }
Mark Otto's avatar
dist    
Mark Otto committed
230

XhmikosR's avatar
Dist    
XhmikosR committed
231
        var referenceElement = this._element;
Mark Otto's avatar
dist    
Mark Otto committed
232

XhmikosR's avatar
Dist    
XhmikosR committed
233
234
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
235
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
236
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
237

XhmikosR's avatar
Dist    
XhmikosR committed
238
239
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
240
          }
XhmikosR's avatar
Dist    
XhmikosR committed
241
242
243
        } // If boundary is not `scrollParent`, then set position to `static`
        // to allow the menu to "escape" the scroll parent's boundaries
        // https://github.com/twbs/bootstrap/issues/24251
fat's avatar
fat committed
244

Mark Otto's avatar
dist    
Mark Otto committed
245

XhmikosR's avatar
Dist    
XhmikosR committed
246
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
247
          parent.classList.add(CLASS_NAME_POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
248
        }
Mark Otto's avatar
dist    
Mark Otto committed
249

XhmikosR's avatar
XhmikosR committed
250
        this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
XhmikosR's avatar
Dist    
XhmikosR committed
251
252
253
254
      } // If this is a touch-enabled device we add extra
      // empty mouseover listeners to the body's immediate children;
      // only needed because of broken event delegation on iOS
      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
Mark Otto's avatar
dist    
Mark Otto committed
255
256


XhmikosR's avatar
XhmikosR committed
257
      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
XhmikosR's avatar
XhmikosR committed
258
259
260
        var _ref;

        (_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) {
XhmikosR's avatar
XhmikosR committed
261
          return EventHandler__default['default'].on(elem, 'mouseover', null, noop());
XhmikosR's avatar
XhmikosR committed
262
        });
XhmikosR's avatar
Dist    
XhmikosR committed
263
      }
Mark Otto's avatar
dist    
Mark Otto committed
264

XhmikosR's avatar
Dist    
XhmikosR committed
265
      this._element.focus();
Mark Otto's avatar
dist    
Mark Otto committed
266

XhmikosR's avatar
Dist    
XhmikosR committed
267
      this._element.setAttribute('aria-expanded', true);
fat's avatar
fat committed
268

Mark Otto's avatar
Mark Otto committed
269
270
271
272
      this._menu.classList.toggle(CLASS_NAME_SHOW);

      this._element.classList.toggle(CLASS_NAME_SHOW);

XhmikosR's avatar
XhmikosR committed
273
      EventHandler__default['default'].trigger(parent, EVENT_SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
274
275
276
    };

    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
277
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
278
279
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
280

XhmikosR's avatar
XhmikosR committed
281
      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
282
283
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
284
      };
XhmikosR's avatar
XhmikosR committed
285
      var hideEvent = EventHandler__default['default'].trigger(parent, EVENT_HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
286

XhmikosR's avatar
XhmikosR committed
287
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
288
289
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
290

XhmikosR's avatar
XhmikosR committed
291
292
293
294
      if (this._popper) {
        this._popper.destroy();
      }

Mark Otto's avatar
Mark Otto committed
295
296
297
298
      this._menu.classList.toggle(CLASS_NAME_SHOW);

      this._element.classList.toggle(CLASS_NAME_SHOW);

XhmikosR's avatar
XhmikosR committed
299
      EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
300
    };
Mark Otto's avatar
dist    
Mark Otto committed
301

XhmikosR's avatar
Dist    
XhmikosR committed
302
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
303
304
      Data__default['default'].removeData(this._element, DATA_KEY);
      EventHandler__default['default'].off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
305
306
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
307

XhmikosR's avatar
XhmikosR committed
308
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
309
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
310

XhmikosR's avatar
Dist    
XhmikosR committed
311
312
313
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
314

XhmikosR's avatar
Dist    
XhmikosR committed
315
316
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
317

XhmikosR's avatar
XhmikosR committed
318
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
319
320
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
321
322
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
323

XhmikosR's avatar
Dist    
XhmikosR committed
324
325
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
326

XhmikosR's avatar
XhmikosR committed
327
      EventHandler__default['default'].on(this._element, EVENT_CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
328
329
330
331
332
333
        event.preventDefault();
        event.stopPropagation();

        _this.toggle();
      });
    };
Mark Otto's avatar
dist    
Mark Otto committed
334

XhmikosR's avatar
Dist    
XhmikosR committed
335
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
336
      config = _extends({}, this.constructor.Default, Manipulator__default['default'].getDataAttributes(this._element), config);
XhmikosR's avatar
XhmikosR committed
337
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
338
339
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
340

XhmikosR's avatar
Dist    
XhmikosR committed
341
    _proto._getMenuElement = function _getMenuElement() {
XhmikosR's avatar
XhmikosR committed
342
      return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
XhmikosR's avatar
Dist    
XhmikosR committed
343
    };
Mark Otto's avatar
dist    
Mark Otto committed
344

XhmikosR's avatar
Dist    
XhmikosR committed
345
    _proto._getPlacement = function _getPlacement() {
XhmikosR's avatar
XhmikosR committed
346
      var parentDropdown = this._element.parentNode;
XhmikosR's avatar
XhmikosR committed
347
      var placement = PLACEMENT_BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
348

XhmikosR's avatar
XhmikosR committed
349
      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
XhmikosR's avatar
XhmikosR committed
350
        placement = this._menu.classList.contains(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
XhmikosR's avatar
XhmikosR committed
351
352
353
354
355
356
      } else if (parentDropdown.classList.contains(CLASS_NAME_DROPRIGHT)) {
        placement = PLACEMENT_RIGHT;
      } else if (parentDropdown.classList.contains(CLASS_NAME_DROPLEFT)) {
        placement = PLACEMENT_LEFT;
      } else if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
        placement = PLACEMENT_BOTTOMEND;
XhmikosR's avatar
Dist    
XhmikosR committed
357
      }
Mark Otto's avatar
dist    
Mark Otto committed
358

XhmikosR's avatar
Dist    
XhmikosR committed
359
360
361
362
      return placement;
    };

    _proto._detectNavbar = function _detectNavbar() {
XhmikosR's avatar
XhmikosR committed
363
      return Boolean(this._element.closest("." + CLASS_NAME_NAVBAR));
XhmikosR's avatar
Dist    
XhmikosR committed
364
    };
Mark Otto's avatar
dist    
Mark Otto committed
365

Mark Otto's avatar
Mark Otto committed
366
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
Dist    
XhmikosR committed
367
368
      var _this2 = this;

Mark Otto's avatar
Mark Otto committed
369
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
370
371

      if (typeof this._config.offset === 'function') {
Mark Otto's avatar
Mark Otto committed
372
        offset.fn = function (data) {
XhmikosR's avatar
XhmikosR committed
373
          data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
XhmikosR's avatar
Dist    
XhmikosR committed
374
375
376
          return data;
        };
      } else {
Mark Otto's avatar
Mark Otto committed
377
        offset.offset = this._config.offset;
XhmikosR's avatar
Dist    
XhmikosR committed
378
      }
Mark Otto's avatar
dist    
Mark Otto committed
379

Mark Otto's avatar
Mark Otto committed
380
381
382
383
      return offset;
    };

    _proto._getPopperConfig = function _getPopperConfig() {
XhmikosR's avatar
Dist    
XhmikosR committed
384
385
386
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
Mark Otto's avatar
Mark Otto committed
387
          offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
388
389
390
391
392
          flip: {
            enabled: this._config.flip
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
Mark Otto's avatar
dist    
Mark Otto committed
393
          }
XhmikosR's avatar
XhmikosR committed
394
        }
XhmikosR's avatar
XhmikosR committed
395
      }; // Disable Popper if we have a static display
Mark Otto's avatar
build    
Mark Otto committed
396

XhmikosR's avatar
Dist    
XhmikosR committed
397
398
399
400
401
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
402

XhmikosR's avatar
XhmikosR committed
403
      return _extends({}, popperConfig, this._config.popperConfig);
Mark Otto's avatar
Mark Otto committed
404
405
    } // Static
    ;
fat's avatar
fat committed
406

XhmikosR's avatar
XhmikosR committed
407
    Dropdown.dropdownInterface = function dropdownInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
408
      var data = Data__default['default'].getData(element, DATA_KEY);
fat's avatar
fat committed
409

XhmikosR's avatar
XhmikosR committed
410
      var _config = typeof config === 'object' ? config : null;
fat's avatar
fat committed
411

XhmikosR's avatar
XhmikosR committed
412
413
414
415
416
417
      if (!data) {
        data = new Dropdown(element, _config);
      }

      if (typeof config === 'string') {
        if (typeof data[config] === 'undefined') {
XhmikosR's avatar
Dist.    
XhmikosR committed
418
          throw new TypeError("No method named \"" + config + "\"");
XhmikosR's avatar
Dist    
XhmikosR committed
419
        }
Johann-S's avatar
build    
Johann-S committed
420

XhmikosR's avatar
XhmikosR committed
421
422
423
        data[config]();
      }
    };
fat's avatar
fat committed
424

XhmikosR's avatar
XhmikosR committed
425
    Dropdown.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
426
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
427
        Dropdown.dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
428
429
      });
    };
fat's avatar
fat committed
430

XhmikosR's avatar
XhmikosR committed
431
    Dropdown.clearMenus = function clearMenus(event) {
XhmikosR's avatar
XhmikosR committed
432
      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
XhmikosR's avatar
Dist    
XhmikosR committed
433
434
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
435

XhmikosR's avatar
XhmikosR committed
436
      var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
Mark Otto's avatar
grunt    
Mark Otto committed
437

XhmikosR's avatar
Dist    
XhmikosR committed
438
      for (var i = 0, len = toggles.length; i < len; i++) {
XhmikosR's avatar
XhmikosR committed
439
        var parent = Dropdown.getParentFromElement(toggles[i]);
XhmikosR's avatar
XhmikosR committed
440
        var context = Data__default['default'].getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
441
442
443
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
444

XhmikosR's avatar
Dist    
XhmikosR committed
445
446
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
447
        }
Mark Otto's avatar
dist    
Mark Otto committed
448

XhmikosR's avatar
Dist    
XhmikosR committed
449
450
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
451
        }
fat's avatar
fat committed
452

XhmikosR's avatar
Dist    
XhmikosR committed
453
        var dropdownMenu = context._menu;
Mark Otto's avatar
dist    
Mark Otto committed
454

XhmikosR's avatar
XhmikosR committed
455
        if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
456
457
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
458

XhmikosR's avatar
XhmikosR committed
459
        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.key === TAB_KEY) && dropdownMenu.contains(event.target)) {
XhmikosR's avatar
Dist    
XhmikosR committed
460
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
461
        }
fat's avatar
fat committed
462

XhmikosR's avatar
XhmikosR committed
463
        var hideEvent = EventHandler__default['default'].trigger(parent, EVENT_HIDE, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
464

XhmikosR's avatar
XhmikosR committed
465
        if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
466
467
468
          continue;
        } // If this is a touch-enabled device we remove the extra
        // empty mouseover listeners we added for iOS support
fat's avatar
fat committed
469

XhmikosR's avatar
Dist    
XhmikosR committed
470
471

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
472
473
474
          var _ref2;

          (_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
XhmikosR's avatar
XhmikosR committed
475
            return EventHandler__default['default'].off(elem, 'mouseover', null, noop());
XhmikosR's avatar
XhmikosR committed
476
          });
Mark Otto's avatar
dist    
Mark Otto committed
477
        }
fat's avatar
fat committed
478

XhmikosR's avatar
Dist    
XhmikosR committed
479
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
480
481
482
483
484

        if (context._popper) {
          context._popper.destroy();
        }

XhmikosR's avatar
XhmikosR committed
485
486
        dropdownMenu.classList.remove(CLASS_NAME_SHOW);
        toggles[i].classList.remove(CLASS_NAME_SHOW);
XhmikosR's avatar
XhmikosR committed
487
        EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
488
489
      }
    };
fat's avatar
fat committed
490

XhmikosR's avatar
XhmikosR committed
491
492
    Dropdown.getParentFromElement = function getParentFromElement(element) {
      return getElementFromSelector(element) || element.parentNode;
XhmikosR's avatar
XhmikosR committed
493
    };
fat's avatar
fat committed
494

XhmikosR's avatar
XhmikosR committed
495
    Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
XhmikosR's avatar
Dist    
XhmikosR committed
496
497
498
499
500
501
502
      // If not input/textarea:
      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
      // If input/textarea:
      //  - If space key => not a dropdown command
      //  - If key is other than escape
      //    - If key is not up or down => not a dropdown command
      //    - If trigger inside the menu => not a dropdown command
XhmikosR's avatar
XhmikosR committed
503
      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)) {
XhmikosR's avatar
Dist    
XhmikosR committed
504
505
        return;
      }
fat's avatar
fat committed
506

XhmikosR's avatar
Dist    
XhmikosR committed
507
508
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
509

XhmikosR's avatar
XhmikosR committed
510
      if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
511
512
        return;
      }
Mark Otto's avatar
Mark Otto committed
513

XhmikosR's avatar
XhmikosR committed
514
      var parent = Dropdown.getParentFromElement(this);
XhmikosR's avatar
XhmikosR committed
515
      var isActive = this.classList.contains(CLASS_NAME_SHOW);
Mark Otto's avatar
Mark Otto committed
516

XhmikosR's avatar
XhmikosR committed
517
      if (event.key === ESCAPE_KEY) {
XhmikosR's avatar
XhmikosR committed
518
        var button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
XhmikosR's avatar
XhmikosR committed
519
520
521
522
        button.focus();
        Dropdown.clearMenus();
        return;
      }
fat's avatar
fat committed
523

XhmikosR's avatar
XhmikosR committed
524
      if (!isActive || event.key === SPACE_KEY) {
XhmikosR's avatar
XhmikosR committed
525
        Dropdown.clearMenus();
XhmikosR's avatar
Dist    
XhmikosR committed
526
527
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
528

XhmikosR's avatar
XhmikosR committed
529
      var items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
Mark Otto's avatar
dist    
Mark Otto committed
530

XhmikosR's avatar
XhmikosR committed
531
      if (!items.length) {
XhmikosR's avatar
Dist    
XhmikosR committed
532
533
        return;
      }
fat's avatar
fat committed
534

XhmikosR's avatar
XhmikosR committed
535
      var index = items.indexOf(event.target);
fat's avatar
fat committed
536

XhmikosR's avatar
XhmikosR committed
537
      if (event.key === ARROW_UP_KEY && index > 0) {
XhmikosR's avatar
Dist    
XhmikosR committed
538
539
540
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
541

XhmikosR's avatar
XhmikosR committed
542
      if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
XhmikosR's avatar
Dist    
XhmikosR committed
543
544
        // Down
        index++;
XhmikosR's avatar
XhmikosR committed
545
546
      } // index is -1 if the first keydown is an ArrowUp

Mark Otto's avatar
dist    
Mark Otto committed
547

XhmikosR's avatar
XhmikosR committed
548
      index = index === -1 ? 0 : index;
XhmikosR's avatar
Dist    
XhmikosR committed
549
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
550
    };
Mark Otto's avatar
dist    
Mark Otto committed
551

XhmikosR's avatar
XhmikosR committed
552
    Dropdown.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
553
      return Data__default['default'].getData(element, DATA_KEY);
XhmikosR's avatar
XhmikosR committed
554
555
    };

XhmikosR's avatar
Dist    
XhmikosR committed
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
    _createClass(Dropdown, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default;
      }
    }, {
      key: "DefaultType",
      get: function get() {
        return DefaultType;
      }
    }]);

Mark Otto's avatar
dist    
Mark Otto committed
573
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
574
575
576
577
578
579
580
581
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


XhmikosR's avatar
XhmikosR committed
582
583
584
585
586
  EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
  EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
  EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
587
588
    event.preventDefault();
    event.stopPropagation();
XhmikosR's avatar
XhmikosR committed
589
    Dropdown.dropdownInterface(this, 'toggle');
XhmikosR's avatar
XhmikosR committed
590
  });
XhmikosR's avatar
XhmikosR committed
591
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
XhmikosR's avatar
XhmikosR committed
592
    return e.stopPropagation();
XhmikosR's avatar
Dist    
XhmikosR committed
593
594
595
596
597
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
598
   * add .Dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
599
600
   */

XhmikosR's avatar
XhmikosR committed
601
602
603
  onDOMContentLoaded(function () {
    var $ = getjQuery();
    /* istanbul ignore if */
604

XhmikosR's avatar
XhmikosR committed
605
606
607
608
    if ($) {
      var JQUERY_NO_CONFLICT = $.fn[NAME];
      $.fn[NAME] = Dropdown.jQueryInterface;
      $.fn[NAME].Constructor = Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
609

XhmikosR's avatar
XhmikosR committed
610
611
612
613
614
615
      $.fn[NAME].noConflict = function () {
        $.fn[NAME] = JQUERY_NO_CONFLICT;
        return Dropdown.jQueryInterface;
      };
    }
  });
fat's avatar
fat committed
616
617

  return Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
618

XhmikosR's avatar
XhmikosR committed
619
})));
Mark Otto's avatar
dist    
Mark Otto committed
620
//# sourceMappingURL=dropdown.js.map