dropdown.js 21.2 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/)
Mark Otto's avatar
Mark Otto committed
3
  * Copyright 2011-2019 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) {
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
10
11
12
13
14
  (global = global || self, global.Dropdown = factory(global.Data, global.EventHandler, global.Manipulator, global.Popper, global.SelectorEngine));
}(this, function (Data, EventHandler, Manipulator, Popper, SelectorEngine) { 'use strict';

  Data = Data && Data.hasOwnProperty('default') ? Data['default'] : Data;
  EventHandler = EventHandler && EventHandler.hasOwnProperty('default') ? EventHandler['default'] : EventHandler;
  Manipulator = Manipulator && Manipulator.hasOwnProperty('default') ? Manipulator['default'] : Manipulator;
Mark Otto's avatar
dist    
Mark Otto committed
15
  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
XhmikosR's avatar
XhmikosR committed
16
  SelectorEngine = SelectorEngine && SelectorEngine.hasOwnProperty('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
68
69
70
71
72
73
74
75
76
      if (i % 2) {
        ownKeys(source, true).forEach(function (key) {
          _defineProperty(target, key, source[key]);
        });
      } else if (Object.getOwnPropertyDescriptors) {
        Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
      } else {
        ownKeys(source).forEach(function (key) {
          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
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
XhmikosR's avatar
Dist.    
XhmikosR committed
89
90
  var _window = window,
      jQuery = _window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
XhmikosR's avatar
XhmikosR committed
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

  var toType = function toType(obj) {
    return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
  };

  var getSelectorFromElement = function getSelectorFromElement(element) {
    var selector = element.getAttribute('data-target');

    if (!selector || selector === '#') {
      var hrefAttr = element.getAttribute('href');
      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';
    }

    try {
      return document.querySelector(selector) ? selector : null;
XhmikosR's avatar
Dist.    
XhmikosR committed
106
    } catch (error) {
XhmikosR's avatar
XhmikosR committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
      return null;
    }
  };

  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 + "\"."));
      }
    });
  };

  var makeArray = function makeArray(nodeList) {
    if (!nodeList) {
      return [];
    }

    return [].slice.call(nodeList);
  };


  var noop = function noop() {
    return function () {};
  };

XhmikosR's avatar
Dist    
XhmikosR committed
140
141
142
143
144
145
146
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
XhmikosR's avatar
XhmikosR committed
147
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
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
205
206
207
208
209
210
211
212
  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);
  var Event = {
    HIDE: "hide" + EVENT_KEY,
    HIDDEN: "hidden" + EVENT_KEY,
    SHOW: "show" + EVENT_KEY,
    SHOWN: "shown" + EVENT_KEY,
    CLICK: "click" + EVENT_KEY,
    CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
    KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
    KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
  };
  var ClassName = {
    DISABLED: 'disabled',
    SHOW: 'show',
    DROPUP: 'dropup',
    DROPRIGHT: 'dropright',
    DROPLEFT: 'dropleft',
    MENURIGHT: 'dropdown-menu-right',
    POSITION_STATIC: 'position-static'
  };
  var Selector = {
    DATA_TOGGLE: '[data-toggle="dropdown"]',
    FORM_CHILD: '.dropdown form',
    MENU: '.dropdown-menu',
    NAVBAR_NAV: '.navbar-nav',
    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
  };
  var AttachmentMap = {
    TOP: 'top-start',
    TOPEND: 'top-end',
    BOTTOM: 'bottom-start',
    BOTTOMEND: 'bottom-end',
    RIGHT: 'right-start',
    RIGHTEND: 'right-end',
    LEFT: 'left-start',
    LEFTEND: 'left-end'
  };
  var Default = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
    display: 'dynamic'
  };
  var DefaultType = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
    display: 'string'
Mark Otto's avatar
dist    
Mark Otto committed
213
214
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
215
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
216
217
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
218

XhmikosR's avatar
Dist    
XhmikosR committed
219
  };
fat's avatar
fat committed
220

XhmikosR's avatar
Dist    
XhmikosR committed
221
222
223
224
225
226
227
228
229
  var Dropdown =
  /*#__PURE__*/
  function () {
    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
230

XhmikosR's avatar
Dist    
XhmikosR committed
231
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
232
233

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

fat's avatar
fat committed
236

XhmikosR's avatar
Dist    
XhmikosR committed
237
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
238

XhmikosR's avatar
Dist    
XhmikosR committed
239
240
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
241
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
242
243
        return;
      }
fat's avatar
fat committed
244

XhmikosR's avatar
Dist    
XhmikosR committed
245
      var parent = Dropdown._getParentFromElement(this._element);
fat's avatar
fat committed
246

XhmikosR's avatar
XhmikosR committed
247
      var isActive = this._menu.classList.contains(ClassName.SHOW);
fat's avatar
fat committed
248

XhmikosR's avatar
Dist    
XhmikosR committed
249
      Dropdown._clearMenus();
fat's avatar
fat committed
250

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

XhmikosR's avatar
Dist    
XhmikosR committed
255
256
257
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
258
      var showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
259

XhmikosR's avatar
XhmikosR committed
260
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
261
262
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
263

Mark Otto's avatar
grunt    
Mark Otto committed
264

XhmikosR's avatar
Dist    
XhmikosR committed
265
266
267
268
269
270
      if (!this._inNavbar) {
        /**
         * Check for Popper dependency
         * Popper - https://popper.js.org
         */
        if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
271
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
272
        }
Mark Otto's avatar
dist    
Mark Otto committed
273

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

XhmikosR's avatar
Dist    
XhmikosR committed
276
277
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
278
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
279
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
280

XhmikosR's avatar
Dist    
XhmikosR committed
281
282
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
283
          }
XhmikosR's avatar
Dist    
XhmikosR committed
284
285
286
        } // 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
287

Mark Otto's avatar
dist    
Mark Otto committed
288

XhmikosR's avatar
Dist    
XhmikosR committed
289
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
290
          parent.classList.add(ClassName.POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
291
        }
Mark Otto's avatar
dist    
Mark Otto committed
292

XhmikosR's avatar
Dist    
XhmikosR committed
293
294
295
296
297
        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
298
299


XhmikosR's avatar
XhmikosR committed
300
301
302
303
      if ('ontouchstart' in document.documentElement && !makeArray(SelectorEngine.closest(parent, Selector.NAVBAR_NAV)).length) {
        makeArray(document.body.children).forEach(function (elem) {
          return EventHandler.on(elem, 'mouseover', null, noop());
        });
XhmikosR's avatar
Dist    
XhmikosR committed
304
      }
Mark Otto's avatar
dist    
Mark Otto committed
305

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

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

XhmikosR's avatar
XhmikosR committed
310
311
312
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
313
314
315
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
316
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || this._menu.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
317
318
319
        return;
      }

XhmikosR's avatar
XhmikosR committed
320
321
      var parent = Dropdown._getParentFromElement(this._element);

XhmikosR's avatar
Dist    
XhmikosR committed
322
323
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
324
      };
XhmikosR's avatar
XhmikosR committed
325
      var showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
326

XhmikosR's avatar
XhmikosR committed
327
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
328
329
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
330

XhmikosR's avatar
XhmikosR committed
331
332
333
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
334
    };
Mark Otto's avatar
dist    
Mark Otto committed
335

XhmikosR's avatar
Dist    
XhmikosR committed
336
    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
337
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || !this._menu.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
338
339
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
340

XhmikosR's avatar
XhmikosR committed
341
342
      var parent = Dropdown._getParentFromElement(this._element);

XhmikosR's avatar
Dist    
XhmikosR committed
343
344
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
345
      };
XhmikosR's avatar
XhmikosR committed
346
      var hideEvent = EventHandler.trigger(parent, Event.HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
347

XhmikosR's avatar
XhmikosR committed
348
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
349
350
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
351

XhmikosR's avatar
XhmikosR committed
352
353
354
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
355
    };
Mark Otto's avatar
dist    
Mark Otto committed
356

XhmikosR's avatar
Dist    
XhmikosR committed
357
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
358
359
      Data.removeData(this._element, DATA_KEY);
      EventHandler.off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
360
361
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
362

XhmikosR's avatar
Dist    
XhmikosR committed
363
364
      if (this._popper !== null) {
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
365

XhmikosR's avatar
Dist    
XhmikosR committed
366
367
368
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
369

XhmikosR's avatar
Dist    
XhmikosR committed
370
371
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
372

XhmikosR's avatar
Dist    
XhmikosR committed
373
374
375
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
376
377
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
378

XhmikosR's avatar
Dist    
XhmikosR committed
379
380
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
381

XhmikosR's avatar
XhmikosR committed
382
      EventHandler.on(this._element, Event.CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
383
384
385
386
387
388
        event.preventDefault();
        event.stopPropagation();

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
396
    _proto._getMenuElement = function _getMenuElement() {
397
      var parent = Dropdown._getParentFromElement(this._element);
Mark Otto's avatar
dist    
Mark Otto committed
398

399
      return SelectorEngine.findOne(Selector.MENU, parent);
XhmikosR's avatar
Dist    
XhmikosR committed
400
    };
Mark Otto's avatar
dist    
Mark Otto committed
401

XhmikosR's avatar
Dist    
XhmikosR committed
402
    _proto._getPlacement = function _getPlacement() {
XhmikosR's avatar
XhmikosR committed
403
      var parentDropdown = this._element.parentNode;
XhmikosR's avatar
Dist    
XhmikosR committed
404
      var placement = AttachmentMap.BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
405

XhmikosR's avatar
XhmikosR committed
406
      if (parentDropdown.classList.contains(ClassName.DROPUP)) {
XhmikosR's avatar
Dist    
XhmikosR committed
407
        placement = AttachmentMap.TOP;
Mark Otto's avatar
dist    
Mark Otto committed
408

XhmikosR's avatar
XhmikosR committed
409
        if (this._menu.classList.contains(ClassName.MENURIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
410
411
          placement = AttachmentMap.TOPEND;
        }
XhmikosR's avatar
XhmikosR committed
412
      } else if (parentDropdown.classList.contains(ClassName.DROPRIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
413
        placement = AttachmentMap.RIGHT;
XhmikosR's avatar
XhmikosR committed
414
      } else if (parentDropdown.classList.contains(ClassName.DROPLEFT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
415
        placement = AttachmentMap.LEFT;
XhmikosR's avatar
XhmikosR committed
416
      } else if (this._menu.classList.contains(ClassName.MENURIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
417
418
        placement = AttachmentMap.BOTTOMEND;
      }
Mark Otto's avatar
dist    
Mark Otto committed
419

XhmikosR's avatar
Dist    
XhmikosR committed
420
421
422
423
      return placement;
    };

    _proto._detectNavbar = function _detectNavbar() {
XhmikosR's avatar
XhmikosR committed
424
      return Boolean(SelectorEngine.closest(this._element, '.navbar'));
XhmikosR's avatar
Dist    
XhmikosR committed
425
    };
Mark Otto's avatar
dist    
Mark Otto committed
426

Mark Otto's avatar
Mark Otto committed
427
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
Dist    
XhmikosR committed
428
429
      var _this2 = this;

Mark Otto's avatar
Mark Otto committed
430
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
431
432

      if (typeof this._config.offset === 'function') {
Mark Otto's avatar
Mark Otto committed
433
        offset.fn = function (data) {
434
          data.offsets = _objectSpread2({}, data.offsets, {}, _this2._config.offset(data.offsets, _this2._element) || {});
XhmikosR's avatar
Dist    
XhmikosR committed
435
436
437
          return data;
        };
      } else {
Mark Otto's avatar
Mark Otto committed
438
        offset.offset = this._config.offset;
XhmikosR's avatar
Dist    
XhmikosR committed
439
      }
Mark Otto's avatar
dist    
Mark Otto committed
440

Mark Otto's avatar
Mark Otto committed
441
442
443
444
      return offset;
    };

    _proto._getPopperConfig = function _getPopperConfig() {
XhmikosR's avatar
Dist    
XhmikosR committed
445
446
447
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
Mark Otto's avatar
Mark Otto committed
448
          offset: this._getOffset(),
XhmikosR's avatar
Dist    
XhmikosR committed
449
450
451
452
453
          flip: {
            enabled: this._config.flip
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
Mark Otto's avatar
dist    
Mark Otto committed
454
          }
XhmikosR's avatar
Dist    
XhmikosR committed
455
456
        } // Disable Popper.js if we have a static display

Mark Otto's avatar
dist    
Mark Otto committed
457
      };
Mark Otto's avatar
build    
Mark Otto committed
458

XhmikosR's avatar
Dist    
XhmikosR committed
459
460
461
462
463
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
464

XhmikosR's avatar
Dist    
XhmikosR committed
465
      return popperConfig;
Mark Otto's avatar
Mark Otto committed
466
467
    } // Static
    ;
fat's avatar
fat committed
468

XhmikosR's avatar
XhmikosR committed
469
470
    Dropdown._dropdownInterface = function _dropdownInterface(element, config) {
      var data = Data.getData(element, DATA_KEY);
fat's avatar
fat committed
471

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

XhmikosR's avatar
XhmikosR committed
474
475
476
477
478
479
      if (!data) {
        data = new Dropdown(element, _config);
      }

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

XhmikosR's avatar
XhmikosR committed
483
484
485
        data[config]();
      }
    };
fat's avatar
fat committed
486

XhmikosR's avatar
XhmikosR committed
487
488
489
    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        Dropdown._dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
490
491
      });
    };
fat's avatar
fat committed
492

XhmikosR's avatar
Dist    
XhmikosR committed
493
494
495
496
    Dropdown._clearMenus = function _clearMenus(event) {
      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
497

XhmikosR's avatar
XhmikosR committed
498
      var toggles = makeArray(SelectorEngine.find(Selector.DATA_TOGGLE));
Mark Otto's avatar
grunt    
Mark Otto committed
499

XhmikosR's avatar
Dist    
XhmikosR committed
500
501
      for (var i = 0, len = toggles.length; i < len; i++) {
        var parent = Dropdown._getParentFromElement(toggles[i]);
Mark Otto's avatar
grunt    
Mark Otto committed
502

XhmikosR's avatar
XhmikosR committed
503
        var context = Data.getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
504
505
506
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
507

XhmikosR's avatar
Dist    
XhmikosR committed
508
509
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
510
        }
Mark Otto's avatar
dist    
Mark Otto committed
511

XhmikosR's avatar
Dist    
XhmikosR committed
512
513
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
514
        }
fat's avatar
fat committed
515

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

XhmikosR's avatar
XhmikosR committed
518
        if (!parent.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
519
520
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
521

XhmikosR's avatar
XhmikosR committed
522
        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && parent.contains(event.target)) {
XhmikosR's avatar
Dist    
XhmikosR committed
523
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
524
        }
fat's avatar
fat committed
525

XhmikosR's avatar
XhmikosR committed
526
        var hideEvent = EventHandler.trigger(parent, Event.HIDE, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
527

XhmikosR's avatar
XhmikosR committed
528
        if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
529
530
531
          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
532

XhmikosR's avatar
Dist    
XhmikosR committed
533
534

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
535
536
537
          makeArray(document.body.children).forEach(function (elem) {
            return EventHandler.off(elem, 'mouseover', null, noop());
          });
Mark Otto's avatar
dist    
Mark Otto committed
538
        }
fat's avatar
fat committed
539

XhmikosR's avatar
Dist    
XhmikosR committed
540
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
541
542
543
        dropdownMenu.classList.remove(ClassName.SHOW);
        parent.classList.remove(ClassName.SHOW);
        EventHandler.trigger(parent, Event.HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
544
545
      }
    };
fat's avatar
fat committed
546

XhmikosR's avatar
Dist    
XhmikosR committed
547
548
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
XhmikosR's avatar
XhmikosR committed
549
      var selector = getSelectorFromElement(element);
Mark Otto's avatar
grunt    
Mark Otto committed
550

XhmikosR's avatar
Dist    
XhmikosR committed
551
      if (selector) {
XhmikosR's avatar
XhmikosR committed
552
        parent = SelectorEngine.findOne(selector);
XhmikosR's avatar
Dist    
XhmikosR committed
553
      }
Mark Otto's avatar
dist    
Mark Otto committed
554

XhmikosR's avatar
Dist    
XhmikosR committed
555
      return parent || element.parentNode;
XhmikosR's avatar
XhmikosR committed
556
    };
fat's avatar
fat committed
557

XhmikosR's avatar
Dist    
XhmikosR committed
558
559
560
561
562
563
564
565
    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
      // 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
566
      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
567
568
        return;
      }
fat's avatar
fat committed
569

XhmikosR's avatar
Dist    
XhmikosR committed
570
571
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
572

XhmikosR's avatar
XhmikosR committed
573
      if (this.disabled || this.classList.contains(ClassName.DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
574
575
        return;
      }
Mark Otto's avatar
Mark Otto committed
576

XhmikosR's avatar
Dist    
XhmikosR committed
577
578
      var parent = Dropdown._getParentFromElement(this);

XhmikosR's avatar
XhmikosR committed
579
      var isActive = parent.classList.contains(ClassName.SHOW);
Mark Otto's avatar
Mark Otto committed
580

Mark Otto's avatar
dist    
Mark Otto committed
581
      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
XhmikosR's avatar
Dist    
XhmikosR committed
582
        if (event.which === ESCAPE_KEYCODE) {
Mark Otto's avatar
dist v5    
Mark Otto committed
583
          SelectorEngine.findOne(Selector.DATA_TOGGLE, parent).focus();
Mark Otto's avatar
dist    
Mark Otto committed
584
        }
fat's avatar
fat committed
585

XhmikosR's avatar
XhmikosR committed
586
587
        Dropdown._clearMenus();

XhmikosR's avatar
Dist    
XhmikosR committed
588
589
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
590

XhmikosR's avatar
XhmikosR committed
591
      var items = makeArray(SelectorEngine.find(Selector.VISIBLE_ITEMS, parent));
Mark Otto's avatar
dist    
Mark Otto committed
592

XhmikosR's avatar
XhmikosR committed
593
      if (!items.length) {
XhmikosR's avatar
Dist    
XhmikosR committed
594
595
        return;
      }
fat's avatar
fat committed
596

XhmikosR's avatar
Dist    
XhmikosR committed
597
      var index = items.indexOf(event.target);
fat's avatar
fat committed
598

XhmikosR's avatar
Dist    
XhmikosR committed
599
600
601
602
      if (event.which === ARROW_UP_KEYCODE && index > 0) {
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
603

XhmikosR's avatar
Dist    
XhmikosR committed
604
605
606
607
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
        // Down
        index++;
      }
Mark Otto's avatar
dist    
Mark Otto committed
608

XhmikosR's avatar
Dist    
XhmikosR committed
609
610
611
      if (index < 0) {
        index = 0;
      }
fat's avatar
fat committed
612

XhmikosR's avatar
Dist    
XhmikosR committed
613
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
614
    };
Mark Otto's avatar
dist    
Mark Otto committed
615

XhmikosR's avatar
XhmikosR committed
616
617
618
619
    Dropdown._getInstance = function _getInstance(element) {
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
    _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
637
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
638
639
640
641
642
643
644
645
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


XhmikosR's avatar
XhmikosR committed
646
647
648
649
650
  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
651
652
653
    event.preventDefault();
    event.stopPropagation();

XhmikosR's avatar
XhmikosR committed
654
655
656
657
    Dropdown._dropdownInterface(this, 'toggle');
  });
  EventHandler.on(document, Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
    return e.stopPropagation();
XhmikosR's avatar
Dist    
XhmikosR committed
658
659
660
661
662
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
663
   * add .dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
664
665
   */

666
667
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
668
669
670
671
  if (typeof jQuery !== 'undefined') {
    var JQUERY_NO_CONFLICT = jQuery.fn[NAME];
    jQuery.fn[NAME] = Dropdown._jQueryInterface;
    jQuery.fn[NAME].Constructor = Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
672

XhmikosR's avatar
XhmikosR committed
673
674
675
676
677
    jQuery.fn[NAME].noConflict = function () {
      jQuery.fn[NAME] = JQUERY_NO_CONFLICT;
      return Dropdown._jQueryInterface;
    };
  }
fat's avatar
fat committed
678
679

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

Mark Otto's avatar
Mark Otto committed
681
}));
Mark Otto's avatar
dist    
Mark Otto committed
682
//# sourceMappingURL=dropdown.js.map