dropdown.js 21.2 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
2
  * Bootstrap dropdown.js v5.0.0-alpha1 (https://getbootstrap.com/)
XhmikosR's avatar
XhmikosR committed
3
  * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
XhmikosR's avatar
XhmikosR committed
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
XhmikosR's avatar
Dist    
XhmikosR committed
5
  */
Mark Otto's avatar
dist    
Mark Otto committed
6
(function (global, factory) {
XhmikosR's avatar
XhmikosR committed
7
8
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('popper.js'), require('./dom/selector-engine.js')) :
  typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/event-handler.js', './dom/manipulator.js', 'popper.js', './dom/selector-engine.js'], factory) :
XhmikosR's avatar
XhmikosR committed
9
  (global = 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

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

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

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

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

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

XhmikosR's avatar
XhmikosR committed
41
42
43
44
45
46
    return selector;
  };

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

  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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  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
79
80
81
82
  var noop = function noop() {
    return function () {};
  };

XhmikosR's avatar
XhmikosR committed
83
84
85
86
87
88
89
90
91
92
93
  var getjQuery = function getjQuery() {
    var _window = window,
        jQuery = _window.jQuery;

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

    return null;
  };

Mark Otto's avatar
Mark Otto committed
94
95
96
97
98
99
100
101
102
  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 _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

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

  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
XhmikosR's avatar
Dist    
XhmikosR committed
103
104
105
106
107
108
109
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
110
  var VERSION = '5.0.0-alpha1';
XhmikosR's avatar
Dist    
XhmikosR committed
111
112
113
  var DATA_KEY = 'bs.dropdown';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
XhmikosR's avatar
XhmikosR committed
114
115
116
117
118
119
120
121
  var ESCAPE_KEY = 'Escape';
  var SPACE_KEY = 'Space';
  var TAB_KEY = 'Tab';
  var ARROW_UP_KEY = 'ArrowUp';
  var ARROW_DOWN_KEY = 'ArrowDown';
  var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button

  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEY + "|" + ARROW_DOWN_KEY + "|" + ESCAPE_KEY);
XhmikosR's avatar
XhmikosR committed
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
  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
149
150
151
152
153
  var Default = {
    offset: 0,
    flip: true,
    boundary: 'scrollParent',
    reference: 'toggle',
XhmikosR's avatar
XhmikosR committed
154
155
    display: 'dynamic',
    popperConfig: null
XhmikosR's avatar
Dist    
XhmikosR committed
156
157
158
159
160
161
  };
  var DefaultType = {
    offset: '(number|string|function)',
    flip: 'boolean',
    boundary: '(string|element)',
    reference: '(string|element)',
XhmikosR's avatar
XhmikosR committed
162
163
    display: 'string',
    popperConfig: '(null|object)'
XhmikosR's avatar
Dist    
XhmikosR committed
164
  };
XhmikosR's avatar
XhmikosR committed
165
166
167
168
169
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
170

XhmikosR's avatar
XhmikosR committed
171
  var Dropdown = /*#__PURE__*/function () {
XhmikosR's avatar
Dist    
XhmikosR committed
172
173
174
175
176
177
    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
178

XhmikosR's avatar
Dist    
XhmikosR committed
179
      this._addEventListeners();
XhmikosR's avatar
XhmikosR committed
180
181

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

fat's avatar
fat committed
184

XhmikosR's avatar
Dist    
XhmikosR committed
185
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
186

XhmikosR's avatar
Dist    
XhmikosR committed
187
188
    // Public
    _proto.toggle = function toggle() {
XhmikosR's avatar
XhmikosR committed
189
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
190
191
        return;
      }
fat's avatar
fat committed
192

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

XhmikosR's avatar
XhmikosR committed
195
      Dropdown.clearMenus();
fat's avatar
fat committed
196

XhmikosR's avatar
Dist    
XhmikosR committed
197
198
199
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
200

XhmikosR's avatar
XhmikosR committed
201
202
203
204
      this.show();
    };

    _proto.show = function show() {
XhmikosR's avatar
XhmikosR committed
205
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
XhmikosR committed
206
207
208
209
        return;
      }

      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
210
211
212
      var relatedTarget = {
        relatedTarget: this._element
      };
XhmikosR's avatar
XhmikosR committed
213
      var showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
Mark Otto's avatar
dist    
Mark Otto committed
214

XhmikosR's avatar
XhmikosR committed
215
      if (showEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
216
217
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
218

Mark Otto's avatar
grunt    
Mark Otto committed
219

XhmikosR's avatar
Dist    
XhmikosR committed
220
221
      if (!this._inNavbar) {
        if (typeof Popper === 'undefined') {
XhmikosR's avatar
XhmikosR committed
222
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
XhmikosR's avatar
Dist    
XhmikosR committed
223
        }
Mark Otto's avatar
dist    
Mark Otto committed
224

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

XhmikosR's avatar
Dist    
XhmikosR committed
227
228
        if (this._config.reference === 'parent') {
          referenceElement = parent;
XhmikosR's avatar
XhmikosR committed
229
        } else if (isElement(this._config.reference)) {
XhmikosR's avatar
Dist    
XhmikosR committed
230
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
231

XhmikosR's avatar
Dist    
XhmikosR committed
232
233
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
234
          }
XhmikosR's avatar
Dist    
XhmikosR committed
235
236
237
        } // 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
238

Mark Otto's avatar
dist    
Mark Otto committed
239

XhmikosR's avatar
Dist    
XhmikosR committed
240
        if (this._config.boundary !== 'scrollParent') {
XhmikosR's avatar
XhmikosR committed
241
          parent.classList.add(CLASS_NAME_POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
242
        }
Mark Otto's avatar
dist    
Mark Otto committed
243

XhmikosR's avatar
Dist    
XhmikosR committed
244
245
246
247
248
        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
249
250


XhmikosR's avatar
XhmikosR committed
251
      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
XhmikosR's avatar
XhmikosR committed
252
253
254
        var _ref;

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

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

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

XhmikosR's avatar
XhmikosR committed
263
264
265
      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
266
267
268
    };

    _proto.hide = function hide() {
XhmikosR's avatar
XhmikosR committed
269
      if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
270
271
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
272

XhmikosR's avatar
XhmikosR committed
273
      var parent = Dropdown.getParentFromElement(this._element);
XhmikosR's avatar
Dist    
XhmikosR committed
274
275
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
276
      };
XhmikosR's avatar
XhmikosR committed
277
      var hideEvent = EventHandler.trigger(parent, EVENT_HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
278

XhmikosR's avatar
XhmikosR committed
279
      if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
280
281
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
282

XhmikosR's avatar
XhmikosR committed
283
284
285
286
      if (this._popper) {
        this._popper.destroy();
      }

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

XhmikosR's avatar
Dist    
XhmikosR committed
292
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
293
294
      Data.removeData(this._element, DATA_KEY);
      EventHandler.off(this._element, EVENT_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
295
296
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
297

XhmikosR's avatar
XhmikosR committed
298
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
299
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
300

XhmikosR's avatar
Dist    
XhmikosR committed
301
302
303
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
304

XhmikosR's avatar
Dist    
XhmikosR committed
305
306
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
307

XhmikosR's avatar
XhmikosR committed
308
      if (this._popper) {
XhmikosR's avatar
Dist    
XhmikosR committed
309
310
        this._popper.scheduleUpdate();
      }
Mark Otto's avatar
Mark Otto committed
311
312
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
313

XhmikosR's avatar
Dist    
XhmikosR committed
314
315
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
316

XhmikosR's avatar
XhmikosR committed
317
      EventHandler.on(this._element, EVENT_CLICK, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
318
319
320
321
322
323
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
325
    _proto._getConfig = function _getConfig(config) {
Mark Otto's avatar
Mark Otto committed
326
      config = _objectSpread(_objectSpread(_objectSpread({}, this.constructor.Default), Manipulator.getDataAttributes(this._element)), config);
XhmikosR's avatar
XhmikosR committed
327
      typeCheckConfig(NAME, config, this.constructor.DefaultType);
XhmikosR's avatar
Dist    
XhmikosR committed
328
329
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
330

XhmikosR's avatar
Dist    
XhmikosR committed
331
    _proto._getMenuElement = function _getMenuElement() {
XhmikosR's avatar
XhmikosR committed
332
      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
XhmikosR's avatar
Dist    
XhmikosR committed
333
    };
Mark Otto's avatar
dist    
Mark Otto committed
334

XhmikosR's avatar
Dist    
XhmikosR committed
335
    _proto._getPlacement = function _getPlacement() {
XhmikosR's avatar
XhmikosR committed
336
      var parentDropdown = this._element.parentNode;
XhmikosR's avatar
XhmikosR committed
337
      var placement = PLACEMENT_BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
338

XhmikosR's avatar
XhmikosR committed
339
340
      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
        placement = PLACEMENT_TOP;
Mark Otto's avatar
dist    
Mark Otto committed
341

XhmikosR's avatar
XhmikosR committed
342
343
        if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
          placement = PLACEMENT_TOPEND;
XhmikosR's avatar
Dist    
XhmikosR committed
344
        }
XhmikosR's avatar
XhmikosR committed
345
346
347
348
349
350
      } 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
351
      }
Mark Otto's avatar
dist    
Mark Otto committed
352

XhmikosR's avatar
Dist    
XhmikosR committed
353
354
355
356
      return placement;
    };

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

Mark Otto's avatar
Mark Otto committed
360
    _proto._getOffset = function _getOffset() {
XhmikosR's avatar
Dist    
XhmikosR committed
361
362
      var _this2 = this;

Mark Otto's avatar
Mark Otto committed
363
      var offset = {};
XhmikosR's avatar
Dist    
XhmikosR committed
364
365

      if (typeof this._config.offset === 'function') {
Mark Otto's avatar
Mark Otto committed
366
        offset.fn = function (data) {
Mark Otto's avatar
Mark Otto committed
367
          data.offsets = _objectSpread(_objectSpread({}, data.offsets), _this2._config.offset(data.offsets, _this2._element) || {});
XhmikosR's avatar
Dist    
XhmikosR committed
368
369
370
          return data;
        };
      } else {
Mark Otto's avatar
Mark Otto committed
371
        offset.offset = this._config.offset;
XhmikosR's avatar
Dist    
XhmikosR committed
372
      }
Mark Otto's avatar
dist    
Mark Otto committed
373

Mark Otto's avatar
Mark Otto committed
374
375
376
377
      return offset;
    };

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

XhmikosR's avatar
Dist    
XhmikosR committed
391
392
393
394
395
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
396

Mark Otto's avatar
Mark Otto committed
397
      return _objectSpread(_objectSpread({}, popperConfig), this._config.popperConfig);
Mark Otto's avatar
Mark Otto committed
398
399
    } // Static
    ;
fat's avatar
fat committed
400

XhmikosR's avatar
XhmikosR committed
401
    Dropdown.dropdownInterface = function dropdownInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
402
      var data = Data.getData(element, DATA_KEY);
fat's avatar
fat committed
403

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

XhmikosR's avatar
XhmikosR committed
406
407
408
409
410
411
      if (!data) {
        data = new Dropdown(element, _config);
      }

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

XhmikosR's avatar
XhmikosR committed
415
416
417
        data[config]();
      }
    };
fat's avatar
fat committed
418

XhmikosR's avatar
XhmikosR committed
419
    Dropdown.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
420
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
421
        Dropdown.dropdownInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
422
423
      });
    };
fat's avatar
fat committed
424

XhmikosR's avatar
XhmikosR committed
425
    Dropdown.clearMenus = function clearMenus(event) {
XhmikosR's avatar
XhmikosR committed
426
      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
XhmikosR's avatar
Dist    
XhmikosR committed
427
428
        return;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
429

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

XhmikosR's avatar
Dist    
XhmikosR committed
432
      for (var i = 0, len = toggles.length; i < len; i++) {
XhmikosR's avatar
XhmikosR committed
433
        var parent = Dropdown.getParentFromElement(toggles[i]);
XhmikosR's avatar
XhmikosR committed
434
        var context = Data.getData(toggles[i], DATA_KEY);
XhmikosR's avatar
Dist    
XhmikosR committed
435
436
437
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
438

XhmikosR's avatar
Dist    
XhmikosR committed
439
440
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
441
        }
Mark Otto's avatar
dist    
Mark Otto committed
442

XhmikosR's avatar
Dist    
XhmikosR committed
443
444
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
445
        }
fat's avatar
fat committed
446

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

XhmikosR's avatar
XhmikosR committed
449
        if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
450
451
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
452

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

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

XhmikosR's avatar
XhmikosR committed
459
        if (hideEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
460
461
462
          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
463

XhmikosR's avatar
Dist    
XhmikosR committed
464
465

        if ('ontouchstart' in document.documentElement) {
XhmikosR's avatar
XhmikosR committed
466
467
468
          var _ref2;

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

XhmikosR's avatar
Dist    
XhmikosR committed
473
        toggles[i].setAttribute('aria-expanded', 'false');
XhmikosR's avatar
XhmikosR committed
474
475
476
477
478

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

XhmikosR's avatar
XhmikosR committed
479
480
481
        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
482
483
      }
    };
fat's avatar
fat committed
484

XhmikosR's avatar
XhmikosR committed
485
486
    Dropdown.getParentFromElement = function getParentFromElement(element) {
      return getElementFromSelector(element) || element.parentNode;
XhmikosR's avatar
XhmikosR committed
487
    };
fat's avatar
fat committed
488

XhmikosR's avatar
XhmikosR committed
489
    Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
XhmikosR's avatar
Dist    
XhmikosR committed
490
491
492
493
494
495
496
      // 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
497
      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
XhmikosR's avatar
Dist    
XhmikosR committed
498
499
        return;
      }
fat's avatar
fat committed
500

XhmikosR's avatar
Dist    
XhmikosR committed
501
502
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
503

XhmikosR's avatar
XhmikosR committed
504
      if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
XhmikosR's avatar
Dist    
XhmikosR committed
505
506
        return;
      }
Mark Otto's avatar
Mark Otto committed
507

XhmikosR's avatar
XhmikosR committed
508
      var parent = Dropdown.getParentFromElement(this);
XhmikosR's avatar
XhmikosR committed
509
      var isActive = this.classList.contains(CLASS_NAME_SHOW);
Mark Otto's avatar
Mark Otto committed
510

XhmikosR's avatar
XhmikosR committed
511
      if (event.key === ESCAPE_KEY) {
XhmikosR's avatar
XhmikosR committed
512
513
514
515
516
        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
517

XhmikosR's avatar
XhmikosR committed
518
      if (!isActive || event.key === SPACE_KEY) {
XhmikosR's avatar
XhmikosR committed
519
        Dropdown.clearMenus();
XhmikosR's avatar
Dist    
XhmikosR committed
520
521
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
522

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

XhmikosR's avatar
XhmikosR committed
525
      if (!items.length) {
XhmikosR's avatar
Dist    
XhmikosR committed
526
527
        return;
      }
fat's avatar
fat committed
528

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

XhmikosR's avatar
XhmikosR committed
531
      if (event.key === ARROW_UP_KEY && index > 0) {
XhmikosR's avatar
Dist    
XhmikosR committed
532
533
534
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
535

XhmikosR's avatar
XhmikosR committed
536
      if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
XhmikosR's avatar
Dist    
XhmikosR committed
537
538
        // Down
        index++;
XhmikosR's avatar
XhmikosR committed
539
540
      } // index is -1 if the first keydown is an ArrowUp

Mark Otto's avatar
dist    
Mark Otto committed
541

XhmikosR's avatar
XhmikosR committed
542
      index = index === -1 ? 0 : index;
XhmikosR's avatar
Dist    
XhmikosR committed
543
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
544
    };
Mark Otto's avatar
dist    
Mark Otto committed
545

XhmikosR's avatar
XhmikosR committed
546
    Dropdown.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
547
548
549
      return Data.getData(element, DATA_KEY);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
    _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
567
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
568
569
570
571
572
573
574
575
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


XhmikosR's avatar
XhmikosR committed
576
577
578
579
580
  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
581
582
    event.preventDefault();
    event.stopPropagation();
XhmikosR's avatar
XhmikosR committed
583
    Dropdown.dropdownInterface(this, 'toggle');
XhmikosR's avatar
XhmikosR committed
584
  });
XhmikosR's avatar
XhmikosR committed
585
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
XhmikosR's avatar
XhmikosR committed
586
    return e.stopPropagation();
XhmikosR's avatar
Dist    
XhmikosR committed
587
  });
XhmikosR's avatar
XhmikosR committed
588
  var $ = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
589
590
591
592
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
593
   * add .dropdown to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
594
595
   */

596
597
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
598
599
600
601
  if ($) {
    var JQUERY_NO_CONFLICT = $.fn[NAME];
    $.fn[NAME] = Dropdown.jQueryInterface;
    $.fn[NAME].Constructor = Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
602

XhmikosR's avatar
XhmikosR committed
603
604
605
    $.fn[NAME].noConflict = function () {
      $.fn[NAME] = JQUERY_NO_CONFLICT;
      return Dropdown.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
606
607
    };
  }
fat's avatar
fat committed
608
609

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

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