dropdown.js 18 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
1
2
3
4
5
/*!
  * Bootstrap dropdown.js v4.1.3 (https://getbootstrap.com/)
  * 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
66

  /**
Mark Otto's avatar
dist    
Mark Otto committed
67
   * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
68
   * Bootstrap (v4.1.3): dropdown.js
Mark Otto's avatar
dist    
Mark Otto committed
69
70
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
fat's avatar
fat committed
71
   */
Mark Otto's avatar
dist    
Mark Otto committed
72

XhmikosR's avatar
Dist    
XhmikosR committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'dropdown';
  var VERSION = '4.1.3';
  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
148
149
    /**
     * ------------------------------------------------------------------------
XhmikosR's avatar
Dist    
XhmikosR committed
150
     * Class Definition
Mark Otto's avatar
dist    
Mark Otto committed
151
152
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
153

XhmikosR's avatar
Dist    
XhmikosR committed
154
  };
fat's avatar
fat committed
155

XhmikosR's avatar
Dist    
XhmikosR committed
156
157
158
159
160
161
162
163
164
  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
165

XhmikosR's avatar
Dist    
XhmikosR committed
166
167
      this._addEventListeners();
    } // Getters
Jacob Thornton's avatar
Jacob Thornton committed
168

fat's avatar
fat committed
169

XhmikosR's avatar
Dist    
XhmikosR committed
170
    var _proto = Dropdown.prototype;
fat's avatar
fat committed
171

XhmikosR's avatar
Dist    
XhmikosR committed
172
173
174
175
176
    // Public
    _proto.toggle = function toggle() {
      if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
        return;
      }
fat's avatar
fat committed
177

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
182
      Dropdown._clearMenus();
fat's avatar
fat committed
183

XhmikosR's avatar
Dist    
XhmikosR committed
184
185
186
      if (isActive) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
187

XhmikosR's avatar
Dist    
XhmikosR committed
188
189
190
191
192
      var relatedTarget = {
        relatedTarget: this._element
      };
      var showEvent = $.Event(Event.SHOW, relatedTarget);
      $(parent).trigger(showEvent);
Mark Otto's avatar
dist    
Mark Otto committed
193

XhmikosR's avatar
Dist    
XhmikosR committed
194
195
196
      if (showEvent.isDefaultPrevented()) {
        return;
      } // Disable totally Popper.js for Dropdown in Navbar
Mark Otto's avatar
dist    
Mark Otto committed
197

Mark Otto's avatar
grunt    
Mark Otto committed
198

XhmikosR's avatar
Dist    
XhmikosR committed
199
200
201
202
203
204
205
206
      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
207

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

XhmikosR's avatar
Dist    
XhmikosR committed
210
211
212
213
        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
214

XhmikosR's avatar
Dist    
XhmikosR committed
215
216
          if (typeof this._config.reference.jquery !== 'undefined') {
            referenceElement = this._config.reference[0];
Mark Otto's avatar
dist    
Mark Otto committed
217
          }
XhmikosR's avatar
Dist    
XhmikosR committed
218
219
220
        } // 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
221

Mark Otto's avatar
dist    
Mark Otto committed
222

XhmikosR's avatar
Dist    
XhmikosR committed
223
224
        if (this._config.boundary !== 'scrollParent') {
          $(parent).addClass(ClassName.POSITION_STATIC);
Mark Otto's avatar
dist    
Mark Otto committed
225
        }
Mark Otto's avatar
dist    
Mark Otto committed
226

XhmikosR's avatar
Dist    
XhmikosR committed
227
228
229
230
231
        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
232
233


XhmikosR's avatar
Dist    
XhmikosR committed
234
235
236
      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
237

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
242
243
244
245
246
247
248
249
250
251
252
      $(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
253
      };
XhmikosR's avatar
Dist    
XhmikosR committed
254
      var showEvent = $.Event(Event.SHOW, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
255

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
260
261
262
      if (showEvent.isDefaultPrevented()) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
263

XhmikosR's avatar
Dist    
XhmikosR committed
264
265
266
      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
    };
Mark Otto's avatar
dist    
Mark Otto committed
267

XhmikosR's avatar
Dist    
XhmikosR committed
268
269
270
271
    _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
272

XhmikosR's avatar
Dist    
XhmikosR committed
273
274
      var relatedTarget = {
        relatedTarget: this._element
Mark Otto's avatar
dist    
Mark Otto committed
275
      };
XhmikosR's avatar
Dist    
XhmikosR committed
276
      var hideEvent = $.Event(Event.HIDE, relatedTarget);
Johann-S's avatar
build    
Johann-S committed
277

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
282
283
284
      if (hideEvent.isDefaultPrevented()) {
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
285

XhmikosR's avatar
Dist    
XhmikosR committed
286
287
288
      $(this._menu).toggleClass(ClassName.SHOW);
      $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
    };
Mark Otto's avatar
dist    
Mark Otto committed
289

XhmikosR's avatar
Dist    
XhmikosR committed
290
291
292
293
294
    _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
295

XhmikosR's avatar
Dist    
XhmikosR committed
296
297
      if (this._popper !== null) {
        this._popper.destroy();
Mark Otto's avatar
dist    
Mark Otto committed
298

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
306
307
308
309
      if (this._popper !== null) {
        this._popper.scheduleUpdate();
      }
    }; // Private
Mark Otto's avatar
dist    
Mark Otto committed
310
311


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

XhmikosR's avatar
Dist    
XhmikosR committed
315
316
317
318
319
320
321
      $(this._element).on(Event.CLICK, function (event) {
        event.preventDefault();
        event.stopPropagation();

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

XhmikosR's avatar
Dist    
XhmikosR committed
323
324
325
326
327
    _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
328

XhmikosR's avatar
Dist    
XhmikosR committed
329
330
331
    _proto._getMenuElement = function _getMenuElement() {
      if (!this._menu) {
        var parent = Dropdown._getParentFromElement(this._element);
Mark Otto's avatar
dist    
Mark Otto committed
332

XhmikosR's avatar
Dist    
XhmikosR committed
333
334
        if (parent) {
          this._menu = parent.querySelector(Selector.MENU);
Mark Otto's avatar
dist    
Mark Otto committed
335
        }
XhmikosR's avatar
Dist    
XhmikosR committed
336
      }
Mark Otto's avatar
dist    
Mark Otto committed
337

XhmikosR's avatar
Dist    
XhmikosR committed
338
339
      return this._menu;
    };
Mark Otto's avatar
dist    
Mark Otto committed
340

XhmikosR's avatar
Dist    
XhmikosR committed
341
342
343
    _proto._getPlacement = function _getPlacement() {
      var $parentDropdown = $(this._element.parentNode);
      var placement = AttachmentMap.BOTTOM; // Handle dropup
Mark Otto's avatar
dist    
Mark Otto committed
344

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

XhmikosR's avatar
Dist    
XhmikosR committed
348
349
350
351
352
353
354
355
356
357
        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
358

XhmikosR's avatar
Dist    
XhmikosR committed
359
360
361
362
363
364
      return placement;
    };

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

XhmikosR's avatar
Dist    
XhmikosR committed
366
367
368
369
370
371
372
373
374
375
376
377
378
    _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
379

XhmikosR's avatar
Dist    
XhmikosR committed
380
381
382
383
384
385
386
387
388
      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
389
          }
XhmikosR's avatar
Dist    
XhmikosR committed
390
391
        } // Disable Popper.js if we have a static display

Mark Otto's avatar
dist    
Mark Otto committed
392
      };
Mark Otto's avatar
build    
Mark Otto committed
393

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

XhmikosR's avatar
Dist    
XhmikosR committed
400
401
      return popperConfig;
    }; // Static
Mark Otto's avatar
build    
Mark Otto committed
402

fat's avatar
fat committed
403

XhmikosR's avatar
Dist    
XhmikosR committed
404
405
406
    Dropdown._jQueryInterface = function _jQueryInterface(config) {
      return this.each(function () {
        var data = $(this).data(DATA_KEY);
fat's avatar
fat committed
407

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

XhmikosR's avatar
Dist    
XhmikosR committed
410
411
412
413
        if (!data) {
          data = new Dropdown(this, _config);
          $(this).data(DATA_KEY, data);
        }
Johann-S's avatar
build    
Johann-S committed
414

XhmikosR's avatar
Dist    
XhmikosR committed
415
416
417
        if (typeof config === 'string') {
          if (typeof data[config] === 'undefined') {
            throw new TypeError("No method named \"" + config + "\"");
Mark Otto's avatar
dist    
Mark Otto committed
418
          }
fat's avatar
fat committed
419

XhmikosR's avatar
Dist    
XhmikosR committed
420
421
422
423
          data[config]();
        }
      });
    };
fat's avatar
fat committed
424

XhmikosR's avatar
Dist    
XhmikosR committed
425
426
427
428
    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
429

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
435
436
437
438
        var context = $(toggles[i]).data(DATA_KEY);
        var relatedTarget = {
          relatedTarget: toggles[i]
        };
Mark Otto's avatar
grunt    
Mark Otto committed
439

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
450
451
452
        if (!$(parent).hasClass(ClassName.SHOW)) {
          continue;
        }
Mark Otto's avatar
dist    
Mark Otto committed
453

XhmikosR's avatar
Dist    
XhmikosR committed
454
455
        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
456
        }
fat's avatar
fat committed
457

XhmikosR's avatar
Dist    
XhmikosR committed
458
459
460
461
462
463
464
        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
465

XhmikosR's avatar
Dist    
XhmikosR committed
466
467
468

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

XhmikosR's avatar
Dist    
XhmikosR committed
471
472
473
474
475
        toggles[i].setAttribute('aria-expanded', 'false');
        $(dropdownMenu).removeClass(ClassName.SHOW);
        $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
      }
    };
fat's avatar
fat committed
476

XhmikosR's avatar
Dist    
XhmikosR committed
477
478
479
    Dropdown._getParentFromElement = function _getParentFromElement(element) {
      var parent;
      var selector = Util.getSelectorFromElement(element);
Mark Otto's avatar
grunt    
Mark Otto committed
480

XhmikosR's avatar
Dist    
XhmikosR committed
481
482
483
      if (selector) {
        parent = document.querySelector(selector);
      }
Mark Otto's avatar
dist    
Mark Otto committed
484

XhmikosR's avatar
Dist    
XhmikosR committed
485
486
      return parent || element.parentNode;
    }; // eslint-disable-next-line complexity
fat's avatar
fat committed
487
488


XhmikosR's avatar
Dist    
XhmikosR committed
489
490
491
492
493
494
495
496
497
498
499
    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
500

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

XhmikosR's avatar
Dist    
XhmikosR committed
504
505
506
      if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
        return;
      }
Mark Otto's avatar
Mark Otto committed
507

XhmikosR's avatar
Dist    
XhmikosR committed
508
509
510
      var parent = Dropdown._getParentFromElement(this);

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

XhmikosR's avatar
Dist    
XhmikosR committed
512
513
514
515
      if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
        if (event.which === ESCAPE_KEYCODE) {
          var toggle = parent.querySelector(Selector.DATA_TOGGLE);
          $(toggle).trigger('focus');
Mark Otto's avatar
dist    
Mark Otto committed
516
        }
fat's avatar
fat committed
517

XhmikosR's avatar
Dist    
XhmikosR committed
518
519
520
        $(this).trigger('click');
        return;
      }
Mark Otto's avatar
dist    
Mark Otto committed
521

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

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

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

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

XhmikosR's avatar
Dist    
XhmikosR committed
535
536
537
538
      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
        // Down
        index++;
      }
Mark Otto's avatar
dist    
Mark Otto committed
539

XhmikosR's avatar
Dist    
XhmikosR committed
540
541
542
      if (index < 0) {
        index = 0;
      }
fat's avatar
fat committed
543

XhmikosR's avatar
Dist    
XhmikosR committed
544
      items[index].focus();
Mark Otto's avatar
dist    
Mark Otto committed
545
    };
Mark Otto's avatar
dist    
Mark Otto committed
546

XhmikosR's avatar
Dist    
XhmikosR committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
    _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
564
    return Dropdown;
XhmikosR's avatar
Dist    
XhmikosR committed
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
  }();
  /**
   * ------------------------------------------------------------------------
   * 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
594
595

  return Dropdown;
Mark Otto's avatar
dist    
Mark Otto committed
596
597
598

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