dropdown.js 15.6 KB
Newer Older
Mark Otto's avatar
dist    
Mark Otto committed
1
2
3
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; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, 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; }
Mark Otto's avatar
dist    
Mark Otto committed
4

Mark Otto's avatar
dist    
Mark Otto committed
5
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); } }
Mark Otto's avatar
dist    
Mark Otto committed
6

Mark Otto's avatar
dist    
Mark Otto committed
7
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
fat's avatar
fat committed
8
9
10

/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
11
 * Bootstrap (v4.1.1): dropdown.js
fat's avatar
fat committed
12
13
14
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */
Mark Otto's avatar
dist    
Mark Otto committed
15
var Dropdown = function ($) {
fat's avatar
fat committed
16
17
18
19
20
21
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */
  var NAME = 'dropdown';
Mark Otto's avatar
Mark Otto committed
22
  var VERSION = '4.1.1';
fat's avatar
fat committed
23
  var DATA_KEY = 'bs.dropdown';
Mark Otto's avatar
dist    
Mark Otto committed
24
  var EVENT_KEY = "." + DATA_KEY;
fat's avatar
fat committed
25
  var DATA_API_KEY = '.data-api';
fat's avatar
fat committed
26
  var JQUERY_NO_CONFLICT = $.fn[NAME];
Chris Rebert's avatar
grunt    
Chris Rebert committed
27
  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
Mark Otto's avatar
dist    
Mark Otto committed
28

Mark Otto's avatar
grunt    
Mark Otto committed
29
  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
Mark Otto's avatar
dist    
Mark Otto committed
30

Mark Otto's avatar
grunt    
Mark Otto committed
31
  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
Mark Otto's avatar
dist    
Mark Otto committed
32

Chris Rebert's avatar
grunt    
Chris Rebert committed
33
  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
Mark Otto's avatar
dist    
Mark Otto committed
34

Chris Rebert's avatar
grunt    
Chris Rebert committed
35
  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
Mark Otto's avatar
dist    
Mark Otto committed
36

Chris Rebert's avatar
grunt    
Chris Rebert committed
37
  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
fat's avatar
fat committed
38

Mark Otto's avatar
dist    
Mark Otto committed
39
  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
fat's avatar
fat committed
40
  var Event = {
Mark Otto's avatar
dist    
Mark Otto committed
41
42
43
44
45
46
47
48
    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
fat's avatar
fat committed
49
50
51
  };
  var ClassName = {
    DISABLED: 'disabled',
Mark Otto's avatar
build    
Mark Otto committed
52
53
    SHOW: 'show',
    DROPUP: 'dropup',
Mark Otto's avatar
dist    
Mark Otto committed
54
55
    DROPRIGHT: 'dropright',
    DROPLEFT: 'dropleft',
Mark Otto's avatar
build    
Mark Otto committed
56
    MENURIGHT: 'dropdown-menu-right',
Mark Otto's avatar
dist    
Mark Otto committed
57
58
    MENULEFT: 'dropdown-menu-left',
    POSITION_STATIC: 'position-static'
fat's avatar
fat committed
59
60
61
62
  };
  var Selector = {
    DATA_TOGGLE: '[data-toggle="dropdown"]',
    FORM_CHILD: '.dropdown form',
Mark Otto's avatar
grunt    
Mark Otto committed
63
    MENU: '.dropdown-menu',
fat's avatar
fat committed
64
    NAVBAR_NAV: '.navbar-nav',
Mark Otto's avatar
dist    
Mark Otto committed
65
    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
fat's avatar
fat committed
66
  };
Johann-S's avatar
build    
Johann-S committed
67
68
  var AttachmentMap = {
    TOP: 'top-start',
Mark Otto's avatar
build    
Mark Otto committed
69
70
    TOPEND: 'top-end',
    BOTTOM: 'bottom-start',
Mark Otto's avatar
dist    
Mark Otto committed
71
72
73
74
75
    BOTTOMEND: 'bottom-end',
    RIGHT: 'right-start',
    RIGHTEND: 'right-end',
    LEFT: 'left-start',
    LEFTEND: 'left-end'
Johann-S's avatar
build    
Johann-S committed
76
77
78
  };
  var Default = {
    offset: 0,
Mark Otto's avatar
dist    
Mark Otto committed
79
    flip: true,
Mark Otto's avatar
dist    
Mark Otto committed
80
    boundary: 'scrollParent',
Mark Otto's avatar
dist    
Mark Otto committed
81
82
    reference: 'toggle',
    display: 'dynamic'
Johann-S's avatar
build    
Johann-S committed
83
84
  };
  var DefaultType = {
Mark Otto's avatar
dist    
Mark Otto committed
85
    offset: '(number|string|function)',
Mark Otto's avatar
dist    
Mark Otto committed
86
    flip: 'boolean',
Mark Otto's avatar
dist    
Mark Otto committed
87
    boundary: '(string|element)',
Mark Otto's avatar
dist    
Mark Otto committed
88
89
    reference: '(string|element)',
    display: 'string'
Mark Otto's avatar
dist    
Mark Otto committed
90
91
92
93
94
    /**
     * ------------------------------------------------------------------------
     * Class Definition
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
95

Mark Otto's avatar
dist    
Mark Otto committed
96
  };
fat's avatar
fat committed
97

Mark Otto's avatar
dist    
Mark Otto committed
98
99
100
101
  var Dropdown =
  /*#__PURE__*/
  function () {
    function Dropdown(element, config) {
fat's avatar
fat committed
102
      this._element = element;
Johann-S's avatar
build    
Johann-S committed
103
104
105
      this._popper = null;
      this._config = this._getConfig(config);
      this._menu = this._getMenuElement();
Mark Otto's avatar
build    
Mark Otto committed
106
      this._inNavbar = this._detectNavbar();
fat's avatar
fat committed
107
108

      this._addEventListeners();
Mark Otto's avatar
dist    
Mark Otto committed
109
    } // Getters
fat's avatar
fat committed
110

Jacob Thornton's avatar
Jacob Thornton committed
111

Mark Otto's avatar
dist    
Mark Otto committed
112
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
113

Mark Otto's avatar
dist    
Mark Otto committed
114
    // Public
Mark Otto's avatar
dist    
Mark Otto committed
115
116
117
118
    _proto.toggle = function toggle() {
      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
        return;
      }
fat's avatar
fat committed
119

Mark Otto's avatar
dist    
Mark Otto committed
120
      var parent = Dropdown._getParentFromElement(this._element);
fat's avatar
fat committed
121

Mark Otto's avatar
dist    
Mark Otto committed
122
      var isActive = $(this._menu).hasClass(ClassName.SHOW);
fat's avatar
fat committed
123

Mark Otto's avatar
dist    
Mark Otto committed
124
      Dropdown._clearMenus();
fat's avatar
fat committed
125

Mark Otto's avatar
dist    
Mark Otto committed
126
127
128
      if (isActive) {
        return;
      }
fat's avatar
fat committed
129

Mark Otto's avatar
dist    
Mark Otto committed
130
131
132
133
134
      var relatedTarget = {
        relatedTarget: this._element
      };
      var showEvent = $.Event(Event.SHOW, relatedTarget);
      $(parent).trigger(showEvent);
fat's avatar
fat committed
135

Mark Otto's avatar
dist    
Mark Otto committed
136
137
      if (showEvent.isDefaultPrevented()) {
        return;
Mark Otto's avatar
dist    
Mark Otto committed
138
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
139
140


Mark Otto's avatar
dist    
Mark Otto committed
141
142
143
144
145
146
      if (!this._inNavbar) {
        /**
         * Check for Popper dependency
         * Popper - https://popper.js.org
         */
        if (typeof Popper === 'undefined') {
Mark Otto's avatar
dist    
Mark Otto committed
147
          throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');
Mark Otto's avatar
dist    
Mark Otto committed
148
        }
Mark Otto's avatar
dist    
Mark Otto committed
149

Mark Otto's avatar
dist    
Mark Otto committed
150
        var referenceElement = this._element;
Mark Otto's avatar
grunt    
Mark Otto committed
151

Mark Otto's avatar
dist    
Mark Otto committed
152
153
154
155
156
157
158
        if (this._config.reference === 'parent') {
          referenceElement = parent;
        } else if (Util.isElement(this._config.reference)) {
          referenceElement = this._config.reference; // Check if it's jQuery element

          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
159
          }
Mark Otto's avatar
dist    
Mark Otto committed
160
161
162
163
164
165
166
        } // 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


        if (this._config.boundary !== 'scrollParent') {
          $(parent).addClass(ClassName.POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
167
        }
fat's avatar
fat committed
168

Mark Otto's avatar
dist    
Mark Otto committed
169
        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
Mark Otto's avatar
dist    
Mark Otto committed
170
      } // If this is a touch-enabled device we add extra
Mark Otto's avatar
dist    
Mark Otto committed
171
172
173
      // 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
fat's avatar
fat committed
174

Mark Otto's avatar
dist    
Mark Otto committed
175

Mark Otto's avatar
dist    
Mark Otto committed
176
      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) {
Mark Otto's avatar
dist    
Mark Otto committed
177
        $(document.body).children().on('mouseover', null, $.noop);
Mark Otto's avatar
dist    
Mark Otto committed
178
      }
Mark Otto's avatar
dist    
Mark Otto committed
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

      this._element.focus();

      this._element.setAttribute('aria-expanded', true);

      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
    };

    _proto.dispose = function dispose() {
      $.removeData(this._element, DATA_KEY);
      $(this._element).off(EVENT_KEY);
      this._element = null;
      this._menu = null;

      if (this._popper !== null) {
        this._popper.destroy();
fat's avatar
fat committed
196

Mark Otto's avatar
dist    
Mark Otto committed
197
198
        this._popper = null;
      }
Mark Otto's avatar
dist    
Mark Otto committed
199
    };
Johann-S's avatar
build    
Johann-S committed
200

Mark Otto's avatar
dist    
Mark Otto committed
201
202
203
204
205
    _proto.update = function update() {
      this._inNavbar = this._detectNavbar();

      if (this._popper !== null) {
        this._popper.scheduleUpdate();
Johann-S's avatar
build    
Johann-S committed
206
      }
Mark Otto's avatar
dist    
Mark Otto committed
207
    }; // Private
Mark Otto's avatar
dist    
Mark Otto committed
208
209
210
211
212
213
214
215
216
217
218
219


    _proto._addEventListeners = function _addEventListeners() {
      var _this = this;

      $(this._element).on(Event.CLICK, function (event) {
        event.preventDefault();
        event.stopPropagation();

        _this.toggle();
      });
    };
Johann-S's avatar
build    
Johann-S committed
220

Mark Otto's avatar
dist    
Mark Otto committed
221
    _proto._getConfig = function _getConfig(config) {
Mark Otto's avatar
dist    
Mark Otto committed
222
      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);
Mark Otto's avatar
dist    
Mark Otto committed
223
224
225
      Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
      return config;
    };
Johann-S's avatar
build    
Johann-S committed
226

Mark Otto's avatar
dist    
Mark Otto committed
227
228
229
230
    _proto._getMenuElement = function _getMenuElement() {
      if (!this._menu) {
        var parent = Dropdown._getParentFromElement(this._element);

Mark Otto's avatar
dist    
Mark Otto committed
231
232
233
        if (parent) {
          this._menu = parent.querySelector(Selector.MENU);
        }
Johann-S's avatar
build    
Johann-S committed
234
      }
Mark Otto's avatar
dist    
Mark Otto committed
235
236
237
238
239

      return this._menu;
    };

    _proto._getPlacement = function _getPlacement() {
Mark Otto's avatar
dist    
Mark Otto committed
240
      var $parentDropdown = $(this._element.parentNode);
Mark Otto's avatar
dist    
Mark Otto committed
241
242
243
244
245
246
247
      var placement = AttachmentMap.BOTTOM; // Handle dropup

      if ($parentDropdown.hasClass(ClassName.DROPUP)) {
        placement = AttachmentMap.TOP;

        if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
          placement = AttachmentMap.TOPEND;
Mark Otto's avatar
build    
Mark Otto committed
248
        }
Mark Otto's avatar
dist    
Mark Otto committed
249
250
251
252
      } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
        placement = AttachmentMap.RIGHT;
      } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
        placement = AttachmentMap.LEFT;
Mark Otto's avatar
dist    
Mark Otto committed
253
254
      } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
        placement = AttachmentMap.BOTTOMEND;
Mark Otto's avatar
build    
Mark Otto committed
255
      }
Mark Otto's avatar
dist    
Mark Otto committed
256
257
258
259
260
261
262
263
264

      return placement;
    };

    _proto._detectNavbar = function _detectNavbar() {
      return $(this._element).closest('.navbar').length > 0;
    };

    _proto._getPopperConfig = function _getPopperConfig() {
Mark Otto's avatar
dist    
Mark Otto committed
265
266
267
268
269
270
      var _this2 = this;

      var offsetConf = {};

      if (typeof this._config.offset === 'function') {
        offsetConf.fn = function (data) {
Mark Otto's avatar
dist    
Mark Otto committed
271
          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});
Mark Otto's avatar
dist    
Mark Otto committed
272
273
274
275
276
277
          return data;
        };
      } else {
        offsetConf.offset = this._config.offset;
      }

Mark Otto's avatar
dist    
Mark Otto committed
278
279
280
      var popperConfig = {
        placement: this._getPlacement(),
        modifiers: {
Mark Otto's avatar
dist    
Mark Otto committed
281
          offset: offsetConf,
Mark Otto's avatar
dist    
Mark Otto committed
282
283
          flip: {
            enabled: this._config.flip
Mark Otto's avatar
dist    
Mark Otto committed
284
285
286
          },
          preventOverflow: {
            boundariesElement: this._config.boundary
Mark Otto's avatar
build    
Mark Otto committed
287
          }
Mark Otto's avatar
dist    
Mark Otto committed
288
289
        } // Disable Popper.js if we have a static display

Mark Otto's avatar
dist    
Mark Otto committed
290
      };
Mark Otto's avatar
dist    
Mark Otto committed
291
292
293
294
295
296
297

      if (this._config.display === 'static') {
        popperConfig.modifiers.applyStyle = {
          enabled: false
        };
      }

Mark Otto's avatar
dist    
Mark Otto committed
298
      return popperConfig;
Mark Otto's avatar
dist    
Mark Otto committed
299
    }; // Static
Mark Otto's avatar
dist    
Mark Otto committed
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314


    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $(this).data(DATA_KEY);

        var _config = typeof config === 'object' ? config : null;

        if (!data) {
          data = new Dropdown(this, _config);
          $(this).data(DATA_KEY, data);
        }

        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
Mark Otto's avatar
dist    
Mark Otto committed
315
            throw new TypeError("No method named \"" + config + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
316
          }
Mark Otto's avatar
build    
Mark Otto committed
317

Mark Otto's avatar
dist    
Mark Otto committed
318
          data[config]();
Mark Otto's avatar
dist    
Mark Otto committed
319
        }
Mark Otto's avatar
dist    
Mark Otto committed
320
321
322
323
324
325
      });
    };

    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
build    
Mark Otto committed
326
327
      }

Mark Otto's avatar
dist    
Mark Otto committed
328
      var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
fat's avatar
fat committed
329

Mark Otto's avatar
dist    
Mark Otto committed
330
      for (var i = 0, len = toggles.length; i < len; i++) {
Mark Otto's avatar
dist    
Mark Otto committed
331
        var parent = Dropdown._getParentFromElement(toggles[i]);
fat's avatar
fat committed
332

Mark Otto's avatar
dist    
Mark Otto committed
333
334
335
336
        var context = $(toggles[i]).data(DATA_KEY);
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
fat's avatar
fat committed
337

Mark Otto's avatar
dist    
Mark Otto committed
338
339
        if (!context) {
          continue;
Johann-S's avatar
build    
Johann-S committed
340
341
        }

Mark Otto's avatar
dist    
Mark Otto committed
342
        var dropdownMenu = context._menu;
fat's avatar
fat committed
343

Mark Otto's avatar
dist    
Mark Otto committed
344
345
346
        if (!$(parent).hasClass(ClassName.SHOW)) {
          continue;
        }
fat's avatar
fat committed
347

Mark Otto's avatar
dist    
Mark Otto committed
348
349
350
        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
grunt    
Mark Otto committed
351

Mark Otto's avatar
dist    
Mark Otto committed
352
353
        var hideEvent = $.Event(Event.HIDE, relatedTarget);
        $(parent).trigger(hideEvent);
Mark Otto's avatar
grunt    
Mark Otto committed
354

Mark Otto's avatar
dist    
Mark Otto committed
355
356
        if (hideEvent.isDefaultPrevented()) {
          continue;
Mark Otto's avatar
dist    
Mark Otto committed
357
        } // If this is a touch-enabled device we remove the extra
Mark Otto's avatar
dist    
Mark Otto committed
358
        // empty mouseover listeners we added for iOS support
Mark Otto's avatar
grunt    
Mark Otto committed
359
360


Mark Otto's avatar
dist    
Mark Otto committed
361
        if ('ontouchstart' in document.documentElement) {
Mark Otto's avatar
dist    
Mark Otto committed
362
          $(document.body).children().off('mouseover', null, $.noop);
Mark Otto's avatar
dist    
Mark Otto committed
363
        }
Mark Otto's avatar
dist    
Mark Otto committed
364
365
366
367

        toggles[i].setAttribute('aria-expanded', 'false');
        $(dropdownMenu).removeClass(ClassName.SHOW);
        $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
fat's avatar
fat committed
368
      }
Mark Otto's avatar
dist    
Mark Otto committed
369
    };
fat's avatar
fat committed
370

Mark Otto's avatar
dist    
Mark Otto committed
371
372
373
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
      var selector = Util.getSelectorFromElement(element);
fat's avatar
fat committed
374

Mark Otto's avatar
dist    
Mark Otto committed
375
      if (selector) {
Mark Otto's avatar
dist    
Mark Otto committed
376
        parent = document.querySelector(selector);
Mark Otto's avatar
grunt    
Mark Otto committed
377
      }
Mark Otto's avatar
dist    
Mark Otto committed
378

Mark Otto's avatar
dist    
Mark Otto committed
379
      return parent || element.parentNode;
Mark Otto's avatar
dist    
Mark Otto committed
380
381
    }; // eslint-disable-next-line complexity

fat's avatar
fat committed
382

Mark Otto's avatar
dist    
Mark Otto committed
383
    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
Mark Otto's avatar
dist    
Mark Otto committed
384
385
386
387
388
389
390
391
      // 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)) {
Mark Otto's avatar
dist    
Mark Otto committed
392
393
        return;
      }
fat's avatar
fat committed
394

Mark Otto's avatar
dist    
Mark Otto committed
395
396
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
397

Mark Otto's avatar
dist    
Mark Otto committed
398
399
400
      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
        return;
      }
fat's avatar
fat committed
401

Mark Otto's avatar
dist    
Mark Otto committed
402
      var parent = Dropdown._getParentFromElement(this);
Mark Otto's avatar
grunt    
Mark Otto committed
403

Mark Otto's avatar
dist    
Mark Otto committed
404
405
406
407
      var isActive = $(parent).hasClass(ClassName.SHOW);

      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
        if (event.which === ESCAPE_KEYCODE) {
Mark Otto's avatar
dist    
Mark Otto committed
408
          var toggle = parent.querySelector(Selector.DATA_TOGGLE);
Mark Otto's avatar
dist    
Mark Otto committed
409
          $(toggle).trigger('focus');
fat's avatar
fat committed
410
411
        }

Mark Otto's avatar
dist    
Mark Otto committed
412
413
414
        $(this).trigger('click');
        return;
      }
fat's avatar
fat committed
415

Mark Otto's avatar
dist    
Mark Otto committed
416
      var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
fat's avatar
fat committed
417

Mark Otto's avatar
dist    
Mark Otto committed
418
      if (items.length === 0) {
Mark Otto's avatar
dist    
Mark Otto committed
419
420
        return;
      }
fat's avatar
fat committed
421

Mark Otto's avatar
dist    
Mark Otto committed
422
      var index = items.indexOf(event.target);
Mark Otto's avatar
Mark Otto committed
423

Mark Otto's avatar
dist    
Mark Otto committed
424
      if (event.which === ARROW_UP_KEYCODE && index > 0) {
Mark Otto's avatar
dist    
Mark Otto committed
425
        // Up
Mark Otto's avatar
dist    
Mark Otto committed
426
427
        index--;
      }
Mark Otto's avatar
Mark Otto committed
428

Mark Otto's avatar
dist    
Mark Otto committed
429
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
Mark Otto's avatar
dist    
Mark Otto committed
430
        // Down
Mark Otto's avatar
dist    
Mark Otto committed
431
432
        index++;
      }
fat's avatar
fat committed
433

Mark Otto's avatar
dist    
Mark Otto committed
434
435
      if (index < 0) {
        index = 0;
fat's avatar
fat committed
436
      }
Mark Otto's avatar
dist    
Mark Otto committed
437
438
439
440
441
442

      items[index].focus();
    };

    _createClass(Dropdown, null, [{
      key: "VERSION",
Jacob Thornton's avatar
Jacob Thornton committed
443
444
445
      get: function get() {
        return VERSION;
      }
Johann-S's avatar
build    
Johann-S committed
446
    }, {
Mark Otto's avatar
dist    
Mark Otto committed
447
      key: "Default",
Johann-S's avatar
build    
Johann-S committed
448
449
450
451
      get: function get() {
        return Default;
      }
    }, {
Mark Otto's avatar
dist    
Mark Otto committed
452
      key: "DefaultType",
Johann-S's avatar
build    
Johann-S committed
453
454
455
      get: function get() {
        return DefaultType;
      }
fat's avatar
fat committed
456
457
458
    }]);

    return Dropdown;
Mark Otto's avatar
grunt    
Mark Otto committed
459
460
461
462
463
464
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
465

Mark Otto's avatar
dist    
Mark Otto committed
466
467

  $(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) {
Johann-S's avatar
build    
Johann-S committed
468
469
    event.preventDefault();
    event.stopPropagation();
Mark Otto's avatar
dist    
Mark Otto committed
470

Johann-S's avatar
build    
Johann-S committed
471
472
    Dropdown._jQueryInterface.call($(this), 'toggle');
  }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
fat's avatar
fat committed
473
    e.stopPropagation();
Mark Otto's avatar
Mark Otto committed
474
  });
fat's avatar
fat committed
475
476
477
478
479
480
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

Mark Otto's avatar
Mark Otto committed
481
  $.fn[NAME] = Dropdown._jQueryInterface;
fat's avatar
fat committed
482
  $.fn[NAME].Constructor = Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
483

fat's avatar
fat committed
484
485
486
487
488
489
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Dropdown._jQueryInterface;
  };

  return Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
490
}($, Popper);
Mark Otto's avatar
build    
Mark Otto committed
491
//# sourceMappingURL=dropdown.js.map