dropdown.js 20.9 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) {
XhmikosR's avatar
XhmikosR committed
7
8
9
10
11
12
13
14
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/eventHandler.js'), require('./dom/manipulator.js'), require('popper.js'), require('./dom/selectorEngine.js')) :
  typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/eventHandler.js', './dom/manipulator.js', 'popper.js', './dom/selectorEngine.js'], factory) :
  (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
49
50
51
52
53
54
55
56
57
58

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

  function _objectSpread(target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};
      var ownKeys = Object.keys(source);

      if (typeof Object.getOwnPropertySymbols === 'function') {
        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
          return Object.getOwnPropertyDescriptor(source, sym).enumerable;
        }));
      }
Mark Otto's avatar
dist    
Mark Otto committed
59

Mark Otto's avatar
dist    
Mark Otto committed
60
61
62
63
      ownKeys.forEach(function (key) {
        _defineProperty(target, key, source[key]);
      });
    }
Mark Otto's avatar
dist    
Mark Otto committed
64

Mark Otto's avatar
dist    
Mark Otto committed
65
66
    return target;
  }
fat's avatar
fat committed
67

XhmikosR's avatar
XhmikosR committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  /**
   * --------------------------------------------------------------------------
   * Bootstrap (v4.3.1): util/index.js
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
   */
  var jQuery = window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp)

  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;
    } catch (err) {
      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
124
125
126
127
128
129
130
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
XhmikosR's avatar
XhmikosR committed
131
  var VERSION = '4.3.1';
XhmikosR's avatar
Dist    
XhmikosR committed
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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
  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',
    MENULEFT: 'dropdown-menu-left',
    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
198
199
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
200
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
201
202
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
203

XhmikosR's avatar
Dist    
XhmikosR committed
204
  };
fat's avatar
fat committed
205

XhmikosR's avatar
Dist    
XhmikosR committed
206
207
208
209
210
211
212
213
214
  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
215

XhmikosR's avatar
Dist    
XhmikosR committed
216
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
217
218

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

fat's avatar
fat committed
221

XhmikosR's avatar
Dist    
XhmikosR committed
222
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
223

XhmikosR's avatar
Dist    
XhmikosR committed
224
225
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
226
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
227
228
        return;
      }
fat's avatar
fat committed
229

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
234
      Dropdown._clearMenus();
fat's avatar
fat committed
235

XhmikosR's avatar
Dist    
XhmikosR committed
236
237
238
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
239

XhmikosR's avatar
Dist    
XhmikosR committed
240
241
242
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
243
      var showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
244

XhmikosR's avatar
XhmikosR committed
245
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
246
247
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
248

Mark Otto's avatar
grunt    
Mark Otto committed
249

XhmikosR's avatar
Dist    
XhmikosR committed
250
251
252
253
254
255
      if (!this._inNavbar) {
        /**
         * Check for Popper dependency
         * Popper - https://popper.js.org
         */
        if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
256
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
257
        }
Mark Otto's avatar
dist    
Mark Otto committed
258

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

XhmikosR's avatar
Dist    
XhmikosR committed
261
262
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
263
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
264
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
265

XhmikosR's avatar
Dist    
XhmikosR committed
266
267
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
268
          }
XhmikosR's avatar
Dist    
XhmikosR committed
269
270
271
        } // 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
272

Mark Otto's avatar
dist    
Mark Otto committed
273

XhmikosR's avatar
Dist    
XhmikosR committed
274
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
275
          parent.classList.add(ClassName.POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
276
        }
Mark Otto's avatar
dist    
Mark Otto committed
277

XhmikosR's avatar
Dist    
XhmikosR committed
278
279
280
281
282
        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
283
284


XhmikosR's avatar
XhmikosR committed
285
286
287
288
      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
289
      }
Mark Otto's avatar
dist    
Mark Otto committed
290

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

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

XhmikosR's avatar
XhmikosR committed
295
296
297
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
298
299
300
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
301
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || this._menu.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
302
303
304
        return;
      }

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

XhmikosR's avatar
Dist    
XhmikosR committed
307
308
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
309
      };
XhmikosR's avatar
XhmikosR committed
310
      var showEvent = EventHandler.trigger(parent, Event.SHOW, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
311

XhmikosR's avatar
XhmikosR committed
312
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
313
314
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
315

XhmikosR's avatar
XhmikosR committed
316
317
318
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.SHOWN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
319
    };
Mark Otto's avatar
dist    
Mark Otto committed
320

XhmikosR's avatar
Dist    
XhmikosR committed
321
    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
322
      if (this._element.disabled || this._element.classList.contains(ClassName.DISABLED) || !this._menu.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
323
324
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
325

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

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

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

XhmikosR's avatar
XhmikosR committed
337
338
339
      Manipulator.toggleClass(this._menu, ClassName.SHOW);
      Manipulator.toggleClass(parent, ClassName.SHOW);
      EventHandler.trigger(parent, Event.HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
340
    };
Mark Otto's avatar
dist    
Mark Otto committed
341

XhmikosR's avatar
Dist    
XhmikosR committed
342
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
343
344
      Data.removeData(this._element, DATA_KEY);
      EventHandler.off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
345
346
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
347

XhmikosR's avatar
Dist    
XhmikosR committed
348
349
      if (this._popper !== null) {
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
350

XhmikosR's avatar
Dist    
XhmikosR committed
351
352
353
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
354

XhmikosR's avatar
Dist    
XhmikosR committed
355
356
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
357

XhmikosR's avatar
Dist    
XhmikosR committed
358
359
360
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
361
362
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
363

XhmikosR's avatar
Dist    
XhmikosR committed
364
365
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
366

XhmikosR's avatar
XhmikosR committed
367
      EventHandler.on(this._element, Event.CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
368
369
370
371
372
373
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
375
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
376
377
      config = _objectSpread({}, this.constructor.Default, Manipulator.getDataAttributes(this._element), config);
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
378
379
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
380

XhmikosR's avatar
Dist    
XhmikosR committed
381
382
383
    _proto._getMenuElement = function _getMenuElement() {
      if (!this._menu) {
        var parent = Dropdown._getParentFromElement(this._element);
Mark Otto's avatar
dist    
Mark Otto committed
384

XhmikosR's avatar
Dist    
XhmikosR committed
385
        if (parent) {
XhmikosR's avatar
XhmikosR committed
386
          this._menu = SelectorEngine.findOne(Selector.MENU, parent);
Mark Otto's avatar
dist    
Mark Otto committed
387
        }
XhmikosR's avatar
Dist    
XhmikosR committed
388
      }
Mark Otto's avatar
dist    
Mark Otto committed
389

XhmikosR's avatar
Dist    
XhmikosR committed
390
391
      return this._menu;
    };
Mark Otto's avatar
dist    
Mark Otto committed
392

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

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

XhmikosR's avatar
XhmikosR committed
400
        if (this._menu.classList.contains(ClassName.MENURIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
401
402
          placement = AttachmentMap.TOPEND;
        }
XhmikosR's avatar
XhmikosR committed
403
      } else if (parentDropdown.classList.contains(ClassName.DROPRIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
404
        placement = AttachmentMap.RIGHT;
XhmikosR's avatar
XhmikosR committed
405
      } else if (parentDropdown.classList.contains(ClassName.DROPLEFT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
406
        placement = AttachmentMap.LEFT;
XhmikosR's avatar
XhmikosR committed
407
      } else if (this._menu.classList.contains(ClassName.MENURIGHT)) {
XhmikosR's avatar
Dist    
XhmikosR committed
408
409
        placement = AttachmentMap.BOTTOMEND;
      }
Mark Otto's avatar
dist    
Mark Otto committed
410

XhmikosR's avatar
Dist    
XhmikosR committed
411
412
413
414
      return placement;
    };

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

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

Mark Otto's avatar
Mark Otto committed
421
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
422
423

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

Mark Otto's avatar
Mark Otto committed
432
433
434
435
      return offset;
    };

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

Mark Otto's avatar
dist    
Mark Otto committed
448
      };
Mark Otto's avatar
build    
Mark Otto committed
449

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

XhmikosR's avatar
Dist    
XhmikosR committed
456
      return popperConfig;
Mark Otto's avatar
Mark Otto committed
457
458
    } // Static
    ;
fat's avatar
fat committed
459

XhmikosR's avatar
XhmikosR committed
460
461
    Dropdown._dropdownInterface = function _dropdownInterface(element, config) {
      var data = Data.getData(element, DATA_KEY);
fat's avatar
fat committed
462

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

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

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

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

XhmikosR's avatar
XhmikosR committed
478
479
480
    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        Dropdown._dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
481
482
      });
    };
fat's avatar
fat committed
483

XhmikosR's avatar
Dist    
XhmikosR committed
484
485
486
487
    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
488

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

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

XhmikosR's avatar
XhmikosR committed
494
        var context = Data.getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
495
496
497
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
498

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

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

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

XhmikosR's avatar
XhmikosR committed
509
        if (!parent.classList.contains(ClassName.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
510
511
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
512

XhmikosR's avatar
XhmikosR committed
513
        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
514
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
515
        }
fat's avatar
fat committed
516

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
524
525

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
526
527
528
          makeArray(document.body.children).forEach(function (elem) {
            return EventHandler.off(elem, 'mouseover', null, noop());
          });
Mark Otto's avatar
dist    
Mark Otto committed
529
        }
fat's avatar
fat committed
530

XhmikosR's avatar
Dist    
XhmikosR committed
531
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
532
533
534
        dropdownMenu.classList.remove(ClassName.SHOW);
        parent.classList.remove(ClassName.SHOW);
        EventHandler.trigger(parent, Event.HIDDEN, relatedTarget);
XhmikosR's avatar
Dist    
XhmikosR committed
535
536
      }
    };
fat's avatar
fat committed
537

XhmikosR's avatar
Dist    
XhmikosR committed
538
539
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
XhmikosR's avatar
XhmikosR committed
540
      var selector = getSelectorFromElement(element);
Mark Otto's avatar
grunt    
Mark Otto committed
541

XhmikosR's avatar
Dist    
XhmikosR committed
542
      if (selector) {
XhmikosR's avatar
XhmikosR committed
543
        parent = SelectorEngine.findOne(selector);
XhmikosR's avatar
Dist    
XhmikosR committed
544
      }
Mark Otto's avatar
dist    
Mark Otto committed
545

XhmikosR's avatar
Dist    
XhmikosR committed
546
      return parent || element.parentNode;
XhmikosR's avatar
XhmikosR committed
547
    };
fat's avatar
fat committed
548

XhmikosR's avatar
Dist    
XhmikosR committed
549
550
551
552
553
554
555
556
    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
557
      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
558
559
        return;
      }
fat's avatar
fat committed
560

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

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

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

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

Mark Otto's avatar
dist    
Mark Otto committed
572
      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
XhmikosR's avatar
Dist    
XhmikosR committed
573
        if (event.which === ESCAPE_KEYCODE) {
XhmikosR's avatar
XhmikosR committed
574
          EventHandler.trigger(SelectorEngine.findOne(Selector.DATA_TOGGLE, parent), 'focus');
Mark Otto's avatar
dist    
Mark Otto committed
575
        }
fat's avatar
fat committed
576

XhmikosR's avatar
XhmikosR committed
577
578
        Dropdown._clearMenus();

XhmikosR's avatar
Dist    
XhmikosR committed
579
580
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
581

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

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

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
600
601
602
      if (index < 0) {
        index = 0;
      }
fat's avatar
fat committed
603

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

XhmikosR's avatar
XhmikosR committed
607
608
609
610
    Dropdown._getInstance = function _getInstance(element) {
      return Data.getData(element, DATA_KEY);
    };

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


XhmikosR's avatar
XhmikosR committed
637
638
639
640
641
  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
642
643
644
    event.preventDefault();
    event.stopPropagation();

XhmikosR's avatar
XhmikosR committed
645
646
647
648
    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
649
650
651
652
653
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
654
   * add .dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
655
656
   */

XhmikosR's avatar
XhmikosR committed
657
658
659
660
  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
661

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

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

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