dropdown.js 21.5 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
XhmikosR's avatar
XhmikosR committed
2
  * Bootstrap dropdown.js v4.3.1 (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
Dist    
XhmikosR committed
4
5
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
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 = 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
  Data = Data && Object.prototype.hasOwnProperty.call(Data, 'default') ? Data['default'] : Data;
  EventHandler = EventHandler && Object.prototype.hasOwnProperty.call(EventHandler, 'default') ? EventHandler['default'] : EventHandler;
  Manipulator = Manipulator && Object.prototype.hasOwnProperty.call(Manipulator, 'default') ? Manipulator['default'] : Manipulator;
  Popper = Popper && Object.prototype.hasOwnProperty.call(Popper, 'default') ? Popper['default'] : Popper;
  SelectorEngine = SelectorEngine && Object.prototype.hasOwnProperty.call(SelectorEngine, 'default') ? SelectorEngine['default'] : SelectorEngine;
Mark Otto's avatar
dist    
Mark Otto committed
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

  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;
  }

  function _defineProperty(obj, key, value) {
    if (key in obj) {
      Object.defineProperty(obj, key, {
        value: value,
        enumerable: true,
        configurable: true,
        writable: true
      });
    } else {
      obj[key] = value;
    }

    return obj;
  }

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  function ownKeys(object, enumerableOnly) {
    var keys = Object.keys(object);

    if (Object.getOwnPropertySymbols) {
      var symbols = Object.getOwnPropertySymbols(object);
      if (enumerableOnly) symbols = symbols.filter(function (sym) {
        return Object.getOwnPropertyDescriptor(object, sym).enumerable;
      });
      keys.push.apply(keys, symbols);
    }

    return keys;
  }

  function _objectSpread2(target) {
Mark Otto's avatar
dist    
Mark Otto committed
64
65
66
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};

67
      if (i % 2) {
XhmikosR's avatar
XhmikosR committed
68
        ownKeys(Object(source), true).forEach(function (key) {
69
70
71
72
73
          _defineProperty(target, key, source[key]);
        });
      } else if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
      } else {
XhmikosR's avatar
XhmikosR committed
74
        ownKeys(Object(source)).forEach(function (key) {
75
76
          Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
        });
Mark Otto's avatar
dist    
Mark Otto committed
77
78
      }
    }
Mark Otto's avatar
dist    
Mark Otto committed
79

Mark Otto's avatar
dist    
Mark Otto committed
80
81
    return target;
  }
fat's avatar
fat committed
82

XhmikosR's avatar
XhmikosR committed
83
84
85
86
87
88
89
90
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */

  var toType = function toType(obj) {
XhmikosR's avatar
XhmikosR committed
91
92
93
94
    if (obj === null || obj === undefined) {
      return "" + obj;
    }

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

XhmikosR's avatar
XhmikosR committed
98
  var getSelector = function getSelector(element) {
XhmikosR's avatar
XhmikosR committed
99
100
101
102
    var selector = element.getAttribute('data-target');

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

XhmikosR's avatar
XhmikosR committed
106
107
108
109
110
111
    return selector;
  };

  var getElementFromSelector = function getElementFromSelector(element) {
    var selector = getSelector(element);
    return selector ? document.querySelector(selector) : null;
XhmikosR's avatar
XhmikosR committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  };

  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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  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
144
145
146
147
  var noop = function noop() {
    return function () {};
  };

XhmikosR's avatar
XhmikosR committed
148
149
150
151
152
153
154
155
156
157
158
  var getjQuery = function getjQuery() {
    var _window = window,
        jQuery = _window.jQuery;

    if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
      return jQuery;
    }

    return null;
  };

XhmikosR's avatar
Dist    
XhmikosR committed
159
160
161
162
163
164
165
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
XhmikosR's avatar
XhmikosR committed
166
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
167
168
169
  var DATA_KEY = 'bs.dropdown';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
170
171
172
173
174
175
176
177
  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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  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';
  var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
  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
205
206
207
208
209
  var Default = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
XhmikosR's avatar
XhmikosR committed
210
211
    display: 'dynamic',
    popperConfig: null
XhmikosR's avatar
Dist    
XhmikosR committed
212
213
214
215
216
217
  };
  var DefaultType = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
XhmikosR's avatar
XhmikosR committed
218
219
    display: 'string',
    popperConfig: '(null|object)'
XhmikosR's avatar
Dist    
XhmikosR committed
220
  };
XhmikosR's avatar
XhmikosR committed
221
222
223
224
225
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
226

XhmikosR's avatar
XhmikosR committed
227
  var Dropdown = /*#__PURE__*/function () {
XhmikosR's avatar
Dist    
XhmikosR committed
228
229
230
231
232
233
    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
234

XhmikosR's avatar
Dist    
XhmikosR committed
235
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
236
237

      Data.setData(element, DATA_KEY, this);
XhmikosR's avatar
Dist    
XhmikosR committed
238
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
239

fat's avatar
fat committed
240

XhmikosR's avatar
Dist    
XhmikosR committed
241
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
242

XhmikosR's avatar
Dist    
XhmikosR committed
243
244
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
245
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
246
247
        return;
      }
fat's avatar
fat committed
248

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

XhmikosR's avatar
XhmikosR committed
251
      Dropdown.clearMenus();
fat's avatar
fat committed
252

XhmikosR's avatar
Dist    
XhmikosR committed
253
254
255
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
256

XhmikosR's avatar
XhmikosR committed
257
258
259
260
      this.show();
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
261
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
XhmikosR committed
262
263
264
265
        return;
      }

      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
266
267
268
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
269
      var showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
270

XhmikosR's avatar
XhmikosR committed
271
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
272
273
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
274

Mark Otto's avatar
grunt    
Mark Otto committed
275

XhmikosR's avatar
Dist    
XhmikosR committed
276
277
      if (!this._inNavbar) {
        if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
278
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
279
        }
Mark Otto's avatar
dist    
Mark Otto committed
280

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

XhmikosR's avatar
Dist    
XhmikosR committed
283
284
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
285
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
286
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
287

XhmikosR's avatar
Dist    
XhmikosR committed
288
289
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
290
          }
XhmikosR's avatar
Dist    
XhmikosR committed
291
292
293
        } // 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
294

Mark Otto's avatar
dist    
Mark Otto committed
295

XhmikosR's avatar
Dist    
XhmikosR committed
296
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
297
          parent.classList.add(CLASS_NAME_POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
298
        }
Mark Otto's avatar
dist    
Mark Otto committed
299

XhmikosR's avatar
Dist    
XhmikosR committed
300
301
302
303
304
        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
      } // 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
305
306


XhmikosR's avatar
XhmikosR committed
307
      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
XhmikosR's avatar
XhmikosR committed
308
309
310
        var _ref;

        (_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) {
XhmikosR's avatar
XhmikosR committed
311
312
          return EventHandler.on(elem, 'mouseover', null, noop());
        });
XhmikosR's avatar
Dist    
XhmikosR committed
313
      }
Mark Otto's avatar
dist    
Mark Otto committed
314

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

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

XhmikosR's avatar
XhmikosR committed
319
320
321
      Manipulator.toggleClass(this._menu, CLASS_NAME_SHOW);
      Manipulator.toggleClass(this._element, CLASS_NAME_SHOW);
      EventHandler.trigger(parent, EVENT_SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
322
323
324
    };

    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
325
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
326
327
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
328

XhmikosR's avatar
XhmikosR committed
329
      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
330
331
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
332
      };
XhmikosR's avatar
XhmikosR committed
333
      var hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
334

XhmikosR's avatar
XhmikosR committed
335
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
336
337
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
338

XhmikosR's avatar
XhmikosR committed
339
340
341
342
      if (this._popper) {
        this._popper.destroy();
      }

XhmikosR's avatar
XhmikosR committed
343
344
345
      Manipulator.toggleClass(this._menu, CLASS_NAME_SHOW);
      Manipulator.toggleClass(this._element, CLASS_NAME_SHOW);
      EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
346
    };
Mark Otto's avatar
dist    
Mark Otto committed
347

XhmikosR's avatar
Dist    
XhmikosR committed
348
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
349
350
      Data.removeData(this._element, DATA_KEY);
      EventHandler.off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
351
352
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
353

XhmikosR's avatar
XhmikosR committed
354
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
355
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
356

XhmikosR's avatar
Dist    
XhmikosR committed
357
358
359
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
360

XhmikosR's avatar
Dist    
XhmikosR committed
361
362
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
363

XhmikosR's avatar
XhmikosR committed
364
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
365
366
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
367
368
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
369

XhmikosR's avatar
Dist    
XhmikosR committed
370
371
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
372

XhmikosR's avatar
XhmikosR committed
373
      EventHandler.on(this._element, EVENT_CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
374
375
376
377
378
379
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
381
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
382
      config = _objectSpread2(_objectSpread2(_objectSpread2({}, this.constructor.Default), Manipulator.getDataAttributes(this._element)), config);
XhmikosR's avatar
XhmikosR committed
383
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
384
385
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
386

XhmikosR's avatar
Dist    
XhmikosR committed
387
    _proto._getMenuElement = function _getMenuElement() {
XhmikosR's avatar
XhmikosR committed
388
      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
XhmikosR's avatar
Dist    
XhmikosR committed
389
    };
Mark Otto's avatar
dist    
Mark Otto committed
390

XhmikosR's avatar
Dist    
XhmikosR committed
391
    _proto._getPlacement = function _getPlacement() {
XhmikosR's avatar
XhmikosR committed
392
      var parentDropdown = this._element.parentNode;
XhmikosR's avatar
XhmikosR committed
393
      var placement = PLACEMENT_BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
394

XhmikosR's avatar
XhmikosR committed
395
396
      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
        placement = PLACEMENT_TOP;
Mark Otto's avatar
dist    
Mark Otto committed
397

XhmikosR's avatar
XhmikosR committed
398
399
        if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
          placement = PLACEMENT_TOPEND;
XhmikosR's avatar
Dist    
XhmikosR committed
400
        }
XhmikosR's avatar
XhmikosR committed
401
402
403
404
405
406
      } 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
407
      }
Mark Otto's avatar
dist    
Mark Otto committed
408

XhmikosR's avatar
Dist    
XhmikosR committed
409
410
411
412
      return placement;
    };

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

Mark Otto's avatar
Mark Otto committed
416
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
Dist    
XhmikosR committed
417
418
      var _this2 = this;

Mark Otto's avatar
Mark Otto committed
419
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
420
421

      if (typeof this._config.offset === 'function') {
Mark Otto's avatar
Mark Otto committed
422
        offset.fn = function (data) {
XhmikosR's avatar
XhmikosR committed
423
          data.offsets = _objectSpread2(_objectSpread2({}, data.offsets), _this2._config.offset(data.offsets, _this2._element) || {});
XhmikosR's avatar
Dist    
XhmikosR committed
424
425
426
          return data;
        };
      } else {
Mark Otto's avatar
Mark Otto committed
427
        offset.offset = this._config.offset;
XhmikosR's avatar
Dist    
XhmikosR committed
428
      }
Mark Otto's avatar
dist    
Mark Otto committed
429

Mark Otto's avatar
Mark Otto committed
430
431
432
433
      return offset;
    };

    _proto._getPopperConfig = function _getPopperConfig() {
XhmikosR's avatar
Dist    
XhmikosR committed
434
435
436
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
Mark Otto's avatar
Mark Otto committed
437
          offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
438
439
440
441
442
          flip: {
            enabled: this._config.flip
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
Mark Otto's avatar
dist    
Mark Otto committed
443
          }
XhmikosR's avatar
XhmikosR committed
444
445
        }
      }; // Disable Popper.js if we have a static display
Mark Otto's avatar
build    
Mark Otto committed
446

XhmikosR's avatar
Dist    
XhmikosR committed
447
448
449
450
451
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
452

XhmikosR's avatar
XhmikosR committed
453
      return _objectSpread2(_objectSpread2({}, popperConfig), this._config.popperConfig);
Mark Otto's avatar
Mark Otto committed
454
455
    } // Static
    ;
fat's avatar
fat committed
456

XhmikosR's avatar
XhmikosR committed
457
    Dropdown.dropdownInterface = function dropdownInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
458
      var data = Data.getData(element, DATA_KEY);
fat's avatar
fat committed
459

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

XhmikosR's avatar
XhmikosR committed
462
463
464
465
466
467
      if (!data) {
        data = new Dropdown(element, _config);
      }

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

XhmikosR's avatar
XhmikosR committed
471
472
473
        data[config]();
      }
    };
fat's avatar
fat committed
474

XhmikosR's avatar
XhmikosR committed
475
    Dropdown.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
476
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
477
        Dropdown.dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
478
479
      });
    };
fat's avatar
fat committed
480

XhmikosR's avatar
XhmikosR committed
481
    Dropdown.clearMenus = function clearMenus(event) {
XhmikosR's avatar
XhmikosR committed
482
      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
XhmikosR's avatar
Dist    
XhmikosR committed
483
484
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
485

XhmikosR's avatar
XhmikosR committed
486
      var toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
Mark Otto's avatar
grunt    
Mark Otto committed
487

XhmikosR's avatar
Dist    
XhmikosR committed
488
      for (var i = 0, len = toggles.length; i < len; i++) {
XhmikosR's avatar
XhmikosR committed
489
        var parent = Dropdown.getParentFromElement(toggles[i]);
XhmikosR's avatar
XhmikosR committed
490
        var context = Data.getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
491
492
493
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
494

XhmikosR's avatar
Dist    
XhmikosR committed
495
496
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
497
        }
Mark Otto's avatar
dist    
Mark Otto committed
498

XhmikosR's avatar
Dist    
XhmikosR committed
499
500
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
501
        }
fat's avatar
fat committed
502

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

XhmikosR's avatar
XhmikosR committed
505
        if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
506
507
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
508

XhmikosR's avatar
XhmikosR committed
509
        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
510
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
511
        }
fat's avatar
fat committed
512

XhmikosR's avatar
XhmikosR committed
513
        var hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
514

XhmikosR's avatar
XhmikosR committed
515
        if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
516
517
518
          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
519

XhmikosR's avatar
Dist    
XhmikosR committed
520
521

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
522
523
524
          var _ref2;

          (_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
XhmikosR's avatar
XhmikosR committed
525
526
            return EventHandler.off(elem, 'mouseover', null, noop());
          });
Mark Otto's avatar
dist    
Mark Otto committed
527
        }
fat's avatar
fat committed
528

XhmikosR's avatar
Dist    
XhmikosR committed
529
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
530
531
532
533
534

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

XhmikosR's avatar
XhmikosR committed
535
536
537
        dropdownMenu.classList.remove(CLASS_NAME_SHOW);
        toggles[i].classList.remove(CLASS_NAME_SHOW);
        EventHandler.trigger(parent, EVENT_HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
538
539
      }
    };
fat's avatar
fat committed
540

XhmikosR's avatar
XhmikosR committed
541
542
    Dropdown.getParentFromElement = function getParentFromElement(element) {
      return getElementFromSelector(element) || element.parentNode;
XhmikosR's avatar
XhmikosR committed
543
    };
fat's avatar
fat committed
544

XhmikosR's avatar
XhmikosR committed
545
    Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
XhmikosR's avatar
Dist    
XhmikosR committed
546
547
548
549
550
551
552
      // 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
553
      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
554
555
        return;
      }
fat's avatar
fat committed
556

XhmikosR's avatar
Dist    
XhmikosR committed
557
558
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
559

XhmikosR's avatar
XhmikosR committed
560
      if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
561
562
        return;
      }
Mark Otto's avatar
Mark Otto committed
563

XhmikosR's avatar
XhmikosR committed
564
      var parent = Dropdown.getParentFromElement(this);
XhmikosR's avatar
XhmikosR committed
565
      var isActive = this.classList.contains(CLASS_NAME_SHOW);
Mark Otto's avatar
Mark Otto committed
566

XhmikosR's avatar
XhmikosR committed
567
      if (event.key === ESCAPE_KEY) {
XhmikosR's avatar
XhmikosR committed
568
569
570
571
572
        var button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0];
        button.focus();
        Dropdown.clearMenus();
        return;
      }
fat's avatar
fat committed
573

XhmikosR's avatar
XhmikosR committed
574
      if (!isActive || event.key === SPACE_KEY) {
XhmikosR's avatar
XhmikosR committed
575
        Dropdown.clearMenus();
XhmikosR's avatar
Dist    
XhmikosR committed
576
577
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
578

XhmikosR's avatar
XhmikosR committed
579
      var items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
Mark Otto's avatar
dist    
Mark Otto committed
580

XhmikosR's avatar
XhmikosR committed
581
      if (!items.length) {
XhmikosR's avatar
Dist    
XhmikosR committed
582
583
        return;
      }
fat's avatar
fat committed
584

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

XhmikosR's avatar
XhmikosR committed
587
      if (event.key === ARROW_UP_KEY && index > 0) {
XhmikosR's avatar
Dist    
XhmikosR committed
588
589
590
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
591

XhmikosR's avatar
XhmikosR committed
592
      if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
XhmikosR's avatar
Dist    
XhmikosR committed
593
594
        // Down
        index++;
XhmikosR's avatar
XhmikosR committed
595
596
      } // index is -1 if the first keydown is an ArrowUp

Mark Otto's avatar
dist    
Mark Otto committed
597

XhmikosR's avatar
XhmikosR committed
598
      index = index === -1 ? 0 : index;
XhmikosR's avatar
Dist    
XhmikosR committed
599
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
600
    };
Mark Otto's avatar
dist    
Mark Otto committed
601

XhmikosR's avatar
XhmikosR committed
602
    Dropdown.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
603
604
605
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
    _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
623
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
624
625
626
627
628
629
630
631
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


XhmikosR's avatar
XhmikosR committed
632
633
634
635
636
  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
  EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
637
638
    event.preventDefault();
    event.stopPropagation();
XhmikosR's avatar
XhmikosR committed
639
    Dropdown.dropdownInterface(this, 'toggle');
XhmikosR's avatar
XhmikosR committed
640
  });
XhmikosR's avatar
XhmikosR committed
641
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
XhmikosR's avatar
XhmikosR committed
642
    return e.stopPropagation();
XhmikosR's avatar
Dist    
XhmikosR committed
643
  });
XhmikosR's avatar
XhmikosR committed
644
  var $ = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
645
646
647
648
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
649
   * add .dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
650
651
   */

652
653
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
654
655
656
657
  if ($) {
    var JQUERY_NO_CONFLICT = $.fn[NAME];
    $.fn[NAME] = Dropdown.jQueryInterface;
    $.fn[NAME].Constructor = Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
658

XhmikosR's avatar
XhmikosR committed
659
660
661
    $.fn[NAME].noConflict = function () {
      $.fn[NAME] = JQUERY_NO_CONFLICT;
      return Dropdown.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
662
663
    };
  }
fat's avatar
fat committed
664
665

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

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