dropdown.js 15.7 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.2): 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.2';
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
340
341
        if (event && event.type === 'click') {
          relatedTarget.clickEvent = event;
        }

Mark Otto's avatar
dist    
Mark Otto committed
342
343
        if (!context) {
          continue;
Johann-S's avatar
build    
Johann-S committed
344
345
        }

Mark Otto's avatar
dist    
Mark Otto committed
346
        var dropdownMenu = context._menu;
fat's avatar
fat committed
347

Mark Otto's avatar
dist    
Mark Otto committed
348
349
350
        if (!$(parent).hasClass(ClassName.SHOW)) {
          continue;
        }
fat's avatar
fat committed
351

Mark Otto's avatar
dist    
Mark Otto committed
352
353
354
        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
355

Mark Otto's avatar
dist    
Mark Otto committed
356
357
        var hideEvent = $.Event(Event.HIDE, relatedTarget);
        $(parent).trigger(hideEvent);
Mark Otto's avatar
grunt    
Mark Otto committed
358

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


Mark Otto's avatar
dist    
Mark Otto committed
365
        if ('ontouchstart' in document.documentElement) {
Mark Otto's avatar
dist    
Mark Otto committed
366
          $(document.body).children().off('mouseover', null, $.noop);
Mark Otto's avatar
dist    
Mark Otto committed
367
        }
Mark Otto's avatar
dist    
Mark Otto committed
368
369
370
371

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

Mark Otto's avatar
dist    
Mark Otto committed
375
376
377
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
      var selector = Util.getSelectorFromElement(element);
fat's avatar
fat committed
378

Mark Otto's avatar
dist    
Mark Otto committed
379
      if (selector) {
Mark Otto's avatar
dist    
Mark Otto committed
380
        parent = document.querySelector(selector);
Mark Otto's avatar
grunt    
Mark Otto committed
381
      }
Mark Otto's avatar
dist    
Mark Otto committed
382

Mark Otto's avatar
dist    
Mark Otto committed
383
      return parent || element.parentNode;
Mark Otto's avatar
dist    
Mark Otto committed
384
385
    }; // eslint-disable-next-line complexity

fat's avatar
fat committed
386

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

Mark Otto's avatar
dist    
Mark Otto committed
399
400
      event.preventDefault();
      event.stopPropagation();
fat's avatar
fat committed
401

Mark Otto's avatar
dist    
Mark Otto committed
402
403
404
      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
        return;
      }
fat's avatar
fat committed
405

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

Mark Otto's avatar
dist    
Mark Otto committed
408
409
410
411
      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
412
          var toggle = parent.querySelector(Selector.DATA_TOGGLE);
Mark Otto's avatar
dist    
Mark Otto committed
413
          $(toggle).trigger('focus');
fat's avatar
fat committed
414
415
        }

Mark Otto's avatar
dist    
Mark Otto committed
416
417
418
        $(this).trigger('click');
        return;
      }
fat's avatar
fat committed
419

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

Mark Otto's avatar
dist    
Mark Otto committed
422
      if (items.length === 0) {
Mark Otto's avatar
dist    
Mark Otto committed
423
424
        return;
      }
fat's avatar
fat committed
425

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

Mark Otto's avatar
dist    
Mark Otto committed
428
      if (event.which === ARROW_UP_KEYCODE && index > 0) {
Mark Otto's avatar
dist    
Mark Otto committed
429
        // Up
Mark Otto's avatar
dist    
Mark Otto committed
430
431
        index--;
      }
Mark Otto's avatar
Mark Otto committed
432

Mark Otto's avatar
dist    
Mark Otto committed
433
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
Mark Otto's avatar
dist    
Mark Otto committed
434
        // Down
Mark Otto's avatar
dist    
Mark Otto committed
435
436
        index++;
      }
fat's avatar
fat committed
437

Mark Otto's avatar
dist    
Mark Otto committed
438
439
      if (index < 0) {
        index = 0;
fat's avatar
fat committed
440
      }
Mark Otto's avatar
dist    
Mark Otto committed
441
442
443
444
445
446

      items[index].focus();
    };

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

    return Dropdown;
Mark Otto's avatar
grunt    
Mark Otto committed
463
464
465
466
467
468
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
469

Mark Otto's avatar
dist    
Mark Otto committed
470
471

  $(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
472
473
    event.preventDefault();
    event.stopPropagation();
Mark Otto's avatar
dist    
Mark Otto committed
474

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

Mark Otto's avatar
Mark Otto committed
485
  $.fn[NAME] = Dropdown._jQueryInterface;
fat's avatar
fat committed
486
  $.fn[NAME].Constructor = Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
487

fat's avatar
fat committed
488
489
490
491
492
493
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Dropdown._jQueryInterface;
  };

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