dropdown.js 21.7 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
170
171
172
173
174
175
176
177
178
179
180
181
182
  var DATA_KEY = 'bs.dropdown';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key

  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key

  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key

  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key

  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key

  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)

  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
XhmikosR's avatar
XhmikosR committed
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
  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
210
211
212
213
214
  var Default = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
XhmikosR's avatar
XhmikosR committed
215
216
    display: 'dynamic',
    popperConfig: null
XhmikosR's avatar
Dist    
XhmikosR committed
217
218
219
220
221
222
  };
  var DefaultType = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
XhmikosR's avatar
XhmikosR committed
223
224
    display: 'string',
    popperConfig: '(null|object)'
XhmikosR's avatar
Dist    
XhmikosR committed
225
  };
XhmikosR's avatar
XhmikosR committed
226
227
228
229
230
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
231

XhmikosR's avatar
XhmikosR committed
232
  var Dropdown = /*#__PURE__*/function () {
XhmikosR's avatar
Dist    
XhmikosR committed
233
234
235
236
237
238
    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
239

XhmikosR's avatar
Dist    
XhmikosR committed
240
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
241
242

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

fat's avatar
fat committed
245

XhmikosR's avatar
Dist    
XhmikosR committed
246
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
247

XhmikosR's avatar
Dist    
XhmikosR committed
248
249
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
250
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
251
252
        return;
      }
fat's avatar
fat committed
253

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

XhmikosR's avatar
XhmikosR committed
256
      Dropdown.clearMenus();
fat's avatar
fat committed
257

XhmikosR's avatar
Dist    
XhmikosR committed
258
259
260
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
261

XhmikosR's avatar
XhmikosR committed
262
263
264
265
      this.show();
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
266
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
XhmikosR committed
267
268
269
270
        return;
      }

      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
271
272
273
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
274
      var showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
275

XhmikosR's avatar
XhmikosR committed
276
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
277
278
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
279

Mark Otto's avatar
grunt    
Mark Otto committed
280

XhmikosR's avatar
Dist    
XhmikosR committed
281
282
      if (!this._inNavbar) {
        if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
283
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
284
        }
Mark Otto's avatar
dist    
Mark Otto committed
285

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

XhmikosR's avatar
Dist    
XhmikosR committed
288
289
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
290
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
291
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
292

XhmikosR's avatar
Dist    
XhmikosR committed
293
294
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
295
          }
XhmikosR's avatar
Dist    
XhmikosR committed
296
297
298
        } // 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
299

Mark Otto's avatar
dist    
Mark Otto committed
300

XhmikosR's avatar
Dist    
XhmikosR committed
301
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
302
          parent.classList.add(CLASS_NAME_POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
303
        }
Mark Otto's avatar
dist    
Mark Otto committed
304

XhmikosR's avatar
Dist    
XhmikosR committed
305
306
307
308
309
        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
310
311


XhmikosR's avatar
XhmikosR committed
312
313
314
315
      if ('ontouchstart' in document.documentElement && !SelectorEngine.closest(parent, SELECTOR_NAVBAR_NAV)) {
        var _ref;

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

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

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

XhmikosR's avatar
XhmikosR committed
324
325
326
      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
327
328
329
    };

    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
330
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
331
332
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
333

XhmikosR's avatar
XhmikosR committed
334
      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
335
336
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
337
      };
XhmikosR's avatar
XhmikosR committed
338
      var hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
339

XhmikosR's avatar
XhmikosR committed
340
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
341
342
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
343

XhmikosR's avatar
XhmikosR committed
344
345
346
347
      if (this._popper) {
        this._popper.destroy();
      }

XhmikosR's avatar
XhmikosR committed
348
349
350
      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
351
    };
Mark Otto's avatar
dist    
Mark Otto committed
352

XhmikosR's avatar
Dist    
XhmikosR committed
353
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
354
355
      Data.removeData(this._element, DATA_KEY);
      EventHandler.off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
356
357
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
358

XhmikosR's avatar
XhmikosR committed
359
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
360
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
361

XhmikosR's avatar
Dist    
XhmikosR committed
362
363
364
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
365

XhmikosR's avatar
Dist    
XhmikosR committed
366
367
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
368

XhmikosR's avatar
XhmikosR committed
369
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
370
371
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
372
373
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
374

XhmikosR's avatar
Dist    
XhmikosR committed
375
376
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
377

XhmikosR's avatar
XhmikosR committed
378
      EventHandler.on(this._element, EVENT_CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
379
380
381
382
383
384
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
386
    _proto._getConfig = function _getConfig(config) {
387
      config = _objectSpread2({}, this.constructor.Default, {}, Manipulator.getDataAttributes(this._element), {}, config);
XhmikosR's avatar
XhmikosR committed
388
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
389
390
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
391

XhmikosR's avatar
Dist    
XhmikosR committed
392
    _proto._getMenuElement = function _getMenuElement() {
XhmikosR's avatar
XhmikosR committed
393
      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
XhmikosR's avatar
Dist    
XhmikosR committed
394
    };
Mark Otto's avatar
dist    
Mark Otto committed
395

XhmikosR's avatar
Dist    
XhmikosR committed
396
    _proto._getPlacement = function _getPlacement() {
XhmikosR's avatar
XhmikosR committed
397
      var parentDropdown = this._element.parentNode;
XhmikosR's avatar
XhmikosR committed
398
      var placement = PLACEMENT_BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
399

XhmikosR's avatar
XhmikosR committed
400
401
      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
        placement = PLACEMENT_TOP;
Mark Otto's avatar
dist    
Mark Otto committed
402

XhmikosR's avatar
XhmikosR committed
403
404
        if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
          placement = PLACEMENT_TOPEND;
XhmikosR's avatar
Dist    
XhmikosR committed
405
        }
XhmikosR's avatar
XhmikosR committed
406
407
408
409
410
411
      } 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
412
      }
Mark Otto's avatar
dist    
Mark Otto committed
413

XhmikosR's avatar
Dist    
XhmikosR committed
414
415
416
417
      return placement;
    };

    _proto._detectNavbar = function _detectNavbar() {
XhmikosR's avatar
XhmikosR committed
418
      return Boolean(SelectorEngine.closest(this._element, "." + CLASS_NAME_NAVBAR));
XhmikosR's avatar
Dist    
XhmikosR committed
419
    };
Mark Otto's avatar
dist    
Mark Otto committed
420

Mark Otto's avatar
Mark Otto committed
421
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
Dist    
XhmikosR committed
422
423
      var _this2 = this;

Mark Otto's avatar
Mark Otto committed
424
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
425
426

      if (typeof this._config.offset === 'function') {
Mark Otto's avatar
Mark Otto committed
427
        offset.fn = function (data) {
428
          data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
XhmikosR's avatar
Dist    
XhmikosR committed
429
430
431
          return data;
        };
      } else {
Mark Otto's avatar
Mark Otto committed
432
        offset.offset = this._config.offset;
XhmikosR's avatar
Dist    
XhmikosR committed
433
      }
Mark Otto's avatar
dist    
Mark Otto committed
434

Mark Otto's avatar
Mark Otto committed
435
436
437
438
      return offset;
    };

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

XhmikosR's avatar
Dist    
XhmikosR committed
452
453
454
455
456
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
457

XhmikosR's avatar
XhmikosR committed
458
      return _objectSpread2({}, popperConfig, {}, this._config.popperConfig);
Mark Otto's avatar
Mark Otto committed
459
460
    } // Static
    ;
fat's avatar
fat committed
461

XhmikosR's avatar
XhmikosR committed
462
    Dropdown.dropdownInterface = function dropdownInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
463
      var data = Data.getData(element, DATA_KEY);
fat's avatar
fat committed
464

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

XhmikosR's avatar
XhmikosR committed
467
468
469
470
471
472
      if (!data) {
        data = new Dropdown(element, _config);
      }

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

XhmikosR's avatar
XhmikosR committed
476
477
478
        data[config]();
      }
    };
fat's avatar
fat committed
479

XhmikosR's avatar
XhmikosR committed
480
    Dropdown.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
481
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
482
        Dropdown.dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
483
484
      });
    };
fat's avatar
fat committed
485

XhmikosR's avatar
XhmikosR committed
486
    Dropdown.clearMenus = function clearMenus(event) {
XhmikosR's avatar
Dist    
XhmikosR committed
487
488
489
      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
490

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

XhmikosR's avatar
Dist    
XhmikosR committed
493
      for (var i = 0, len = toggles.length; i < len; i++) {
XhmikosR's avatar
XhmikosR committed
494
        var parent = Dropdown.getParentFromElement(toggles[i]);
XhmikosR's avatar
XhmikosR committed
495
        var context = Data.getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
496
497
498
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
499

XhmikosR's avatar
Dist    
XhmikosR committed
500
501
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
502
        }
Mark Otto's avatar
dist    
Mark Otto committed
503

XhmikosR's avatar
Dist    
XhmikosR committed
504
505
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
506
        }
fat's avatar
fat committed
507

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

XhmikosR's avatar
XhmikosR committed
510
        if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
511
512
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
513

XhmikosR's avatar
XhmikosR committed
514
        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && dropdownMenu.contains(event.target)) {
XhmikosR's avatar
Dist    
XhmikosR committed
515
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
516
        }
fat's avatar
fat committed
517

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

XhmikosR's avatar
XhmikosR committed
520
        if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
521
522
523
          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
524

XhmikosR's avatar
Dist    
XhmikosR committed
525
526

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
527
528
529
          var _ref2;

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

XhmikosR's avatar
Dist    
XhmikosR committed
534
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
535
536
537
538
539

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

XhmikosR's avatar
XhmikosR committed
540
541
542
        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
543
544
      }
    };
fat's avatar
fat committed
545

XhmikosR's avatar
XhmikosR committed
546
547
    Dropdown.getParentFromElement = function getParentFromElement(element) {
      return getElementFromSelector(element) || element.parentNode;
XhmikosR's avatar
XhmikosR committed
548
    };
fat's avatar
fat committed
549

XhmikosR's avatar
XhmikosR committed
550
    Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
XhmikosR's avatar
Dist    
XhmikosR committed
551
552
553
554
555
556
557
      // 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
558
      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || SelectorEngine.closest(event.target, SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.which)) {
XhmikosR's avatar
Dist    
XhmikosR committed
559
560
        return;
      }
fat's avatar
fat committed
561

XhmikosR's avatar
Dist    
XhmikosR committed
562
563
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
564

XhmikosR's avatar
XhmikosR committed
565
      if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
566
567
        return;
      }
Mark Otto's avatar
Mark Otto committed
568

XhmikosR's avatar
XhmikosR committed
569
      var parent = Dropdown.getParentFromElement(this);
XhmikosR's avatar
XhmikosR committed
570
      var isActive = this.classList.contains(CLASS_NAME_SHOW);
Mark Otto's avatar
Mark Otto committed
571

XhmikosR's avatar
XhmikosR committed
572
573
574
575
576
577
      if (event.which === ESCAPE_KEYCODE) {
        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
578

XhmikosR's avatar
XhmikosR committed
579
      if (!isActive || event.which === SPACE_KEYCODE) {
XhmikosR's avatar
XhmikosR committed
580
        Dropdown.clearMenus();
XhmikosR's avatar
Dist    
XhmikosR committed
581
582
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
583

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

XhmikosR's avatar
XhmikosR committed
586
      if (!items.length) {
XhmikosR's avatar
Dist    
XhmikosR committed
587
588
        return;
      }
fat's avatar
fat committed
589

XhmikosR's avatar
XhmikosR committed
590
      var index = items.indexOf(event.target) || 0;
fat's avatar
fat committed
591

XhmikosR's avatar
Dist    
XhmikosR committed
592
593
594
595
      if (event.which === ARROW_UP_KEYCODE && index > 0) {
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
596

XhmikosR's avatar
Dist    
XhmikosR committed
597
598
599
600
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
        // Down
        index++;
      }
Mark Otto's avatar
dist    
Mark Otto committed
601

XhmikosR's avatar
Dist    
XhmikosR committed
602
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
603
    };
Mark Otto's avatar
dist    
Mark Otto committed
604

XhmikosR's avatar
XhmikosR committed
605
    Dropdown.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
606
607
608
      return Data.getData(element, DATA_KEY);
    };

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


XhmikosR's avatar
XhmikosR committed
635
636
637
638
639
  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
640
641
    event.preventDefault();
    event.stopPropagation();
XhmikosR's avatar
XhmikosR committed
642
    Dropdown.dropdownInterface(this, 'toggle');
XhmikosR's avatar
XhmikosR committed
643
  });
XhmikosR's avatar
XhmikosR committed
644
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
XhmikosR's avatar
XhmikosR committed
645
    return e.stopPropagation();
XhmikosR's avatar
Dist    
XhmikosR committed
646
  });
XhmikosR's avatar
XhmikosR committed
647
  var $ = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
648
649
650
651
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
652
   * add .dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
653
654
   */

655
656
  /* istanbul ignore if */

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

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

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

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