dropdown.js 17.6 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
/*!
Mark Otto's avatar
Mark Otto committed
2
  * Bootstrap dropdown.js v4.2.1 (https://getbootstrap.com/)
XhmikosR's avatar
Dist    
XhmikosR committed
3
4
5
  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
Mark Otto's avatar
dist    
Mark Otto committed
6
7
8
9
10
11
12
13
14
15
16
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
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) :
  typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) :
  (global.Dropdown = factory(global.jQuery,global.Popper,global.Util));
}(this, (function ($,Popper,Util) { 'use strict';

  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
  Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;

  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
57

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

Mark Otto's avatar
dist    
Mark Otto committed
63
64
    return target;
  }
fat's avatar
fat committed
65

XhmikosR's avatar
Dist    
XhmikosR committed
66
67
68
69
70
71
72
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
Mark Otto's avatar
Mark Otto committed
73
  var VERSION = '4.2.1';
XhmikosR's avatar
Dist    
XhmikosR committed
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  var DATA_KEY = 'bs.dropdown';
  var EVENT_KEY = "." + DATA_KEY;
  var DATA_API_KEY = '.data-api';
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  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
141
142
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
143
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
144
145
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
146

XhmikosR's avatar
Dist    
XhmikosR committed
147
  };
fat's avatar
fat committed
148

XhmikosR's avatar
Dist    
XhmikosR committed
149
150
151
152
153
154
155
156
157
  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
158

XhmikosR's avatar
Dist    
XhmikosR committed
159
160
      this._addEventListeners();
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
161

fat's avatar
fat committed
162

XhmikosR's avatar
Dist    
XhmikosR committed
163
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
164

XhmikosR's avatar
Dist    
XhmikosR committed
165
166
167
168
169
    // Public
    _proto.toggle = function toggle() {
      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
        return;
      }
fat's avatar
fat committed
170

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

XhmikosR's avatar
Dist    
XhmikosR committed
173
      var isActive = $(this._menu).hasClass(ClassName.SHOW);
fat's avatar
fat committed
174

XhmikosR's avatar
Dist    
XhmikosR committed
175
      Dropdown._clearMenus();
fat's avatar
fat committed
176

XhmikosR's avatar
Dist    
XhmikosR committed
177
178
179
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
180

XhmikosR's avatar
Dist    
XhmikosR committed
181
182
183
184
185
      var relatedTarget = {
        relatedTarget: this._element
      };
      var showEvent = $.Event(Event.SHOW, relatedTarget);
      $(parent).trigger(showEvent);
Mark Otto's avatar
dist    
Mark Otto committed
186

XhmikosR's avatar
Dist    
XhmikosR committed
187
188
189
      if (showEvent.isDefaultPrevented()) {
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
190

Mark Otto's avatar
grunt    
Mark Otto committed
191

XhmikosR's avatar
Dist    
XhmikosR committed
192
193
194
195
196
197
198
199
      if (!this._inNavbar) {
        /**
         * Check for Popper dependency
         * Popper - https://popper.js.org
         */
        if (typeof Popper === 'undefined') {
          throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)');
        }
Mark Otto's avatar
dist    
Mark Otto committed
200

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

XhmikosR's avatar
Dist    
XhmikosR committed
203
204
205
206
        if (this._config.reference === 'parent') {
          referenceElement = parent;
        } else if (Util.isElement(this._config.reference)) {
          referenceElement = this._config.reference; // Check if it's jQuery element
Mark Otto's avatar
dist    
Mark Otto committed
207

XhmikosR's avatar
Dist    
XhmikosR committed
208
209
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
210
          }
XhmikosR's avatar
Dist    
XhmikosR committed
211
212
213
        } // 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
214

Mark Otto's avatar
dist    
Mark Otto committed
215

XhmikosR's avatar
Dist    
XhmikosR committed
216
217
        if (this._config.boundary !== 'scrollParent') {
          $(parent).addClass(ClassName.POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
218
        }
Mark Otto's avatar
dist    
Mark Otto committed
219

XhmikosR's avatar
Dist    
XhmikosR committed
220
221
222
223
224
        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
225
226


XhmikosR's avatar
Dist    
XhmikosR committed
227
228
229
      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) {
        $(document.body).children().on('mouseover', null, $.noop);
      }
Mark Otto's avatar
dist    
Mark Otto committed
230

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
235
236
237
238
239
240
241
242
243
244
245
      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
    };

    _proto.show = function show() {
      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {
        return;
      }

      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
246
      };
XhmikosR's avatar
Dist    
XhmikosR committed
247
      var showEvent = $.Event(Event.SHOW, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
248

XhmikosR's avatar
Dist    
XhmikosR committed
249
      var parent = Dropdown._getParentFromElement(this._element);
Mark Otto's avatar
dist    
Mark Otto committed
250

XhmikosR's avatar
Dist    
XhmikosR committed
251
      $(parent).trigger(showEvent);
Mark Otto's avatar
dist    
Mark Otto committed
252

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

XhmikosR's avatar
Dist    
XhmikosR committed
257
258
259
      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
    };
Mark Otto's avatar
dist    
Mark Otto committed
260

XhmikosR's avatar
Dist    
XhmikosR committed
261
262
263
264
    _proto.hide = function hide() {
      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
265

XhmikosR's avatar
Dist    
XhmikosR committed
266
267
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
268
      };
XhmikosR's avatar
Dist    
XhmikosR committed
269
      var hideEvent = $.Event(Event.HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
270

XhmikosR's avatar
Dist    
XhmikosR committed
271
      var parent = Dropdown._getParentFromElement(this._element);
Johann-S's avatar
build    
Johann-S committed
272

XhmikosR's avatar
Dist    
XhmikosR committed
273
      $(parent).trigger(hideEvent);
Mark Otto's avatar
dist    
Mark Otto committed
274

XhmikosR's avatar
Dist    
XhmikosR committed
275
276
277
      if (hideEvent.isDefaultPrevented()) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
278

XhmikosR's avatar
Dist    
XhmikosR committed
279
280
281
      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
    };
Mark Otto's avatar
dist    
Mark Otto committed
282

XhmikosR's avatar
Dist    
XhmikosR committed
283
284
285
286
287
    _proto.dispose = function dispose() {
      $.removeData(this._element, DATA_KEY);
      $(this._element).off(EVENT_KEY);
      this._element = null;
      this._menu = null;
Mark Otto's avatar
dist    
Mark Otto committed
288

XhmikosR's avatar
Dist    
XhmikosR committed
289
290
      if (this._popper !== null) {
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
291

XhmikosR's avatar
Dist    
XhmikosR committed
292
293
294
        this._popper = null;
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
295

XhmikosR's avatar
Dist    
XhmikosR committed
296
297
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();
Mark Otto's avatar
dist    
Mark Otto committed
298

XhmikosR's avatar
Dist    
XhmikosR committed
299
300
301
302
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
    }; // Private
Mark Otto's avatar
dist    
Mark Otto committed
303
304


XhmikosR's avatar
Dist    
XhmikosR committed
305
306
    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;
Mark Otto's avatar
dist    
Mark Otto committed
307

XhmikosR's avatar
Dist    
XhmikosR committed
308
309
310
311
312
313
314
      $(this._element).on(Event.CLICK, function (event) {
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
316
317
318
319
320
    _proto._getConfig = function _getConfig(config) {
      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
      return config;
    };
Mark Otto's avatar
dist    
Mark Otto committed
321

XhmikosR's avatar
Dist    
XhmikosR committed
322
323
324
    _proto._getMenuElement = function _getMenuElement() {
      if (!this._menu) {
        var parent = Dropdown._getParentFromElement(this._element);
Mark Otto's avatar
dist    
Mark Otto committed
325

XhmikosR's avatar
Dist    
XhmikosR committed
326
327
        if (parent) {
          this._menu = parent.querySelector(Selector.MENU);
Mark Otto's avatar
dist    
Mark Otto committed
328
        }
XhmikosR's avatar
Dist    
XhmikosR committed
329
      }
Mark Otto's avatar
dist    
Mark Otto committed
330

XhmikosR's avatar
Dist    
XhmikosR committed
331
332
      return this._menu;
    };
Mark Otto's avatar
dist    
Mark Otto committed
333

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

XhmikosR's avatar
Dist    
XhmikosR committed
338
339
      if ($parentDropdown.hasClass(ClassName.DROPUP)) {
        placement = AttachmentMap.TOP;
Mark Otto's avatar
dist    
Mark Otto committed
340

XhmikosR's avatar
Dist    
XhmikosR committed
341
342
343
344
345
346
347
348
349
350
        if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
          placement = AttachmentMap.TOPEND;
        }
      } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
        placement = AttachmentMap.RIGHT;
      } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
        placement = AttachmentMap.LEFT;
      } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
        placement = AttachmentMap.BOTTOMEND;
      }
Mark Otto's avatar
dist    
Mark Otto committed
351

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

    _proto._detectNavbar = function _detectNavbar() {
      return $(this._element).closest('.navbar').length > 0;
    };
Mark Otto's avatar
dist    
Mark Otto committed
358

XhmikosR's avatar
Dist    
XhmikosR committed
359
360
361
362
363
364
365
366
367
368
369
370
371
    _proto._getPopperConfig = function _getPopperConfig() {
      var _this2 = this;

      var offsetConf = {};

      if (typeof this._config.offset === 'function') {
        offsetConf.fn = function (data) {
          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});
          return data;
        };
      } else {
        offsetConf.offset = this._config.offset;
      }
Mark Otto's avatar
dist    
Mark Otto committed
372

XhmikosR's avatar
Dist    
XhmikosR committed
373
374
375
376
377
378
379
380
381
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
          offset: offsetConf,
          flip: {
            enabled: this._config.flip
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
Mark Otto's avatar
dist    
Mark Otto committed
382
          }
XhmikosR's avatar
Dist    
XhmikosR committed
383
384
        } // Disable Popper.js if we have a static display

Mark Otto's avatar
dist    
Mark Otto committed
385
      };
Mark Otto's avatar
build    
Mark Otto committed
386

XhmikosR's avatar
Dist    
XhmikosR committed
387
388
389
390
391
      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }
Mark Otto's avatar
dist    
Mark Otto committed
392

XhmikosR's avatar
Dist    
XhmikosR committed
393
394
      return popperConfig;
    }; // Static
Mark Otto's avatar
build    
Mark Otto committed
395

fat's avatar
fat committed
396

XhmikosR's avatar
Dist    
XhmikosR committed
397
398
399
    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $(this).data(DATA_KEY);
fat's avatar
fat committed
400

XhmikosR's avatar
Dist    
XhmikosR committed
401
        var _config = typeof config === 'object' ? config : null;
fat's avatar
fat committed
402

XhmikosR's avatar
Dist    
XhmikosR committed
403
404
405
406
        if (!data) {
          data = new Dropdown(this, _config);
          $(this).data(DATA_KEY, data);
        }
Johann-S's avatar
build    
Johann-S committed
407

XhmikosR's avatar
Dist    
XhmikosR committed
408
409
410
        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
411
          }
fat's avatar
fat committed
412

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

XhmikosR's avatar
Dist    
XhmikosR committed
418
419
420
421
    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
422

XhmikosR's avatar
Dist    
XhmikosR committed
423
      var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
Mark Otto's avatar
grunt    
Mark Otto committed
424

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

XhmikosR's avatar
Dist    
XhmikosR committed
428
429
430
431
        var context = $(toggles[i]).data(DATA_KEY);
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
432

XhmikosR's avatar
Dist    
XhmikosR committed
433
434
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
Mark Otto's avatar
dist    
Mark Otto committed
435
        }
Mark Otto's avatar
dist    
Mark Otto committed
436

XhmikosR's avatar
Dist    
XhmikosR committed
437
438
        if (!context) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
439
        }
fat's avatar
fat committed
440

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

XhmikosR's avatar
Dist    
XhmikosR committed
443
444
445
        if (!$(parent).hasClass(ClassName.SHOW)) {
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
446

XhmikosR's avatar
Dist    
XhmikosR committed
447
448
        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
449
        }
fat's avatar
fat committed
450

XhmikosR's avatar
Dist    
XhmikosR committed
451
452
453
454
455
456
457
        var hideEvent = $.Event(Event.HIDE, relatedTarget);
        $(parent).trigger(hideEvent);

        if (hideEvent.isDefaultPrevented()) {
          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
458

XhmikosR's avatar
Dist    
XhmikosR committed
459
460
461

        if ('ontouchstart' in document.documentElement) {
          $(document.body).children().off('mouseover', null, $.noop);
Mark Otto's avatar
dist    
Mark Otto committed
462
        }
fat's avatar
fat committed
463

XhmikosR's avatar
Dist    
XhmikosR committed
464
465
466
467
468
        toggles[i].setAttribute('aria-expanded', 'false');
        $(dropdownMenu).removeClass(ClassName.SHOW);
        $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
      }
    };
fat's avatar
fat committed
469

XhmikosR's avatar
Dist    
XhmikosR committed
470
471
472
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
      var selector = Util.getSelectorFromElement(element);
Mark Otto's avatar
grunt    
Mark Otto committed
473

XhmikosR's avatar
Dist    
XhmikosR committed
474
475
476
      if (selector) {
        parent = document.querySelector(selector);
      }
Mark Otto's avatar
dist    
Mark Otto committed
477

XhmikosR's avatar
Dist    
XhmikosR committed
478
479
      return parent || element.parentNode;
    }; // eslint-disable-next-line complexity
fat's avatar
fat committed
480
481


XhmikosR's avatar
Dist    
XhmikosR committed
482
483
484
485
486
487
488
489
490
491
492
    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
      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 || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
        return;
      }
fat's avatar
fat committed
493

XhmikosR's avatar
Dist    
XhmikosR committed
494
495
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
496

XhmikosR's avatar
Dist    
XhmikosR committed
497
498
499
      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
        return;
      }
Mark Otto's avatar
Mark Otto committed
500

XhmikosR's avatar
Dist    
XhmikosR committed
501
502
503
      var parent = Dropdown._getParentFromElement(this);

      var isActive = $(parent).hasClass(ClassName.SHOW);
Mark Otto's avatar
Mark Otto committed
504

Mark Otto's avatar
dist    
Mark Otto committed
505
      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
XhmikosR's avatar
Dist    
XhmikosR committed
506
507
508
        if (event.which === ESCAPE_KEYCODE) {
          var toggle = parent.querySelector(Selector.DATA_TOGGLE);
          $(toggle).trigger('focus');
Mark Otto's avatar
dist    
Mark Otto committed
509
        }
fat's avatar
fat committed
510

XhmikosR's avatar
Dist    
XhmikosR committed
511
512
513
        $(this).trigger('click');
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
514

XhmikosR's avatar
Dist    
XhmikosR committed
515
      var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
Mark Otto's avatar
dist    
Mark Otto committed
516

XhmikosR's avatar
Dist    
XhmikosR committed
517
518
519
      if (items.length === 0) {
        return;
      }
fat's avatar
fat committed
520

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

XhmikosR's avatar
Dist    
XhmikosR committed
523
524
525
526
      if (event.which === ARROW_UP_KEYCODE && index > 0) {
        // Up
        index--;
      }
Mark Otto's avatar
dist    
Mark Otto committed
527

XhmikosR's avatar
Dist    
XhmikosR committed
528
529
530
531
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
        // Down
        index++;
      }
Mark Otto's avatar
dist    
Mark Otto committed
532

XhmikosR's avatar
Dist    
XhmikosR committed
533
534
535
      if (index < 0) {
        index = 0;
      }
fat's avatar
fat committed
536

XhmikosR's avatar
Dist    
XhmikosR committed
537
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
538
    };
Mark Otto's avatar
dist    
Mark Otto committed
539

XhmikosR's avatar
Dist    
XhmikosR committed
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
    _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
557
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */


  $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
    event.preventDefault();
    event.stopPropagation();

    Dropdown._jQueryInterface.call($(this), 'toggle');
  }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
    e.stopPropagation();
  });
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

  $.fn[NAME] = Dropdown._jQueryInterface;
  $.fn[NAME].Constructor = Dropdown;

  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Dropdown._jQueryInterface;
  };
fat's avatar
fat committed
587
588

  return Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
589
590
591

})));
//# sourceMappingURL=dropdown.js.map