modal.js 17.7 KB
Newer Older
Mark Otto's avatar
grunt    
Mark Otto committed
1
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
2

Mark Otto's avatar
grunt    
Mark Otto committed
3
var _createClass = function () { 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4

Mark Otto's avatar
grunt    
Mark Otto committed
5
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6
7
8

/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
9
 * Bootstrap (v4.0.0-beta): modal.js
10
11
12
13
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

Mark Otto's avatar
grunt    
Mark Otto committed
14
var Modal = function ($) {
15
16
17
18
19
20
21
22

  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */

  var NAME = 'modal';
Mark Otto's avatar
Mark Otto committed
23
  var VERSION = '4.0.0-beta';
24
  var DATA_KEY = 'bs.modal';
fat's avatar
fat committed
25
26
  var EVENT_KEY = '.' + DATA_KEY;
  var DATA_API_KEY = '.data-api';
27
28
29
  var JQUERY_NO_CONFLICT = $.fn[NAME];
  var TRANSITION_DURATION = 300;
  var BACKDROP_TRANSITION_DURATION = 150;
Chris Rebert's avatar
grunt    
Chris Rebert committed
30
  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
31
32
33
34

  var Default = {
    backdrop: true,
    keyboard: true,
fat's avatar
fat committed
35
    focus: true,
36
37
38
    show: true
  };

fat's avatar
fat committed
39
40
41
42
43
44
45
  var DefaultType = {
    backdrop: '(boolean|string)',
    keyboard: 'boolean',
    focus: 'boolean',
    show: 'boolean'
  };

46
  var Event = {
fat's avatar
fat committed
47
48
49
50
51
52
53
54
55
56
    HIDE: 'hide' + EVENT_KEY,
    HIDDEN: 'hidden' + EVENT_KEY,
    SHOW: 'show' + EVENT_KEY,
    SHOWN: 'shown' + EVENT_KEY,
    FOCUSIN: 'focusin' + EVENT_KEY,
    RESIZE: 'resize' + EVENT_KEY,
    CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
    KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
    MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
    MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
Jacob Thornton's avatar
Jacob Thornton committed
57
    CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY
58
59
60
  };

  var ClassName = {
61
    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
62
63
64
    BACKDROP: 'modal-backdrop',
    OPEN: 'modal-open',
    FADE: 'fade',
Mark Otto's avatar
grunt    
Mark Otto committed
65
    SHOW: 'show'
66
67
68
69
70
71
  };

  var Selector = {
    DIALOG: '.modal-dialog',
    DATA_TOGGLE: '[data-toggle="modal"]',
    DATA_DISMISS: '[data-dismiss="modal"]',
Mark Otto's avatar
grunt    
Mark Otto committed
72
73
    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
    NAVBAR_TOGGLER: '.navbar-toggler'
Mark Otto's avatar
dist    
Mark Otto committed
74
  };
75

Mark Otto's avatar
dist    
Mark Otto committed
76
77
78
79
80
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
81

Mark Otto's avatar
grunt    
Mark Otto committed
82
  var Modal = function () {
83
84
85
    function Modal(element, config) {
      _classCallCheck(this, Modal);

fat's avatar
fat committed
86
      this._config = this._getConfig(config);
87
88
89
90
91
92
93
94
95
96
      this._element = element;
      this._dialog = $(element).find(Selector.DIALOG)[0];
      this._backdrop = null;
      this._isShown = false;
      this._isBodyOverflowing = false;
      this._ignoreBackdropClick = false;
      this._originalBodyPadding = 0;
      this._scrollbarWidth = 0;
    }

Jacob Thornton's avatar
Jacob Thornton committed
97
98
    // getters

Mark Otto's avatar
grunt    
Mark Otto committed
99
    // public
100

Mark Otto's avatar
grunt    
Mark Otto committed
101
102
103
    Modal.prototype.toggle = function toggle(relatedTarget) {
      return this._isShown ? this.hide() : this.show(relatedTarget);
    };
104

Mark Otto's avatar
grunt    
Mark Otto committed
105
106
    Modal.prototype.show = function show(relatedTarget) {
      var _this = this;
107

Mark Otto's avatar
grunt    
Mark Otto committed
108
      if (this._isTransitioning) {
Mark Otto's avatar
grunt    
Mark Otto committed
109
        return;
Mark Otto's avatar
grunt    
Mark Otto committed
110
111
112
113
114
      }

      if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
        this._isTransitioning = true;
      }
Mark Otto's avatar
grunt    
Mark Otto committed
115

Mark Otto's avatar
grunt    
Mark Otto committed
116
117
118
      var showEvent = $.Event(Event.SHOW, {
        relatedTarget: relatedTarget
      });
119

Mark Otto's avatar
grunt    
Mark Otto committed
120
      $(this._element).trigger(showEvent);
121

Mark Otto's avatar
grunt    
Mark Otto committed
122
123
124
      if (this._isShown || showEvent.isDefaultPrevented()) {
        return;
      }
125

Mark Otto's avatar
grunt    
Mark Otto committed
126
      this._isShown = true;
127

Mark Otto's avatar
grunt    
Mark Otto committed
128
129
      this._checkScrollbar();
      this._setScrollbar();
130

Mark Otto's avatar
grunt    
Mark Otto committed
131
      $(document.body).addClass(ClassName.OPEN);
132

Mark Otto's avatar
grunt    
Mark Otto committed
133
134
      this._setEscapeEvent();
      this._setResizeEvent();
135

Mark Otto's avatar
grunt    
Mark Otto committed
136
137
138
      $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
        return _this.hide(event);
      });
139

Mark Otto's avatar
grunt    
Mark Otto committed
140
141
142
143
144
      $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
        $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
          if ($(event.target).is(_this._element)) {
            _this._ignoreBackdropClick = true;
          }
145
        });
Mark Otto's avatar
grunt    
Mark Otto committed
146
147
      });

Mark Otto's avatar
grunt    
Mark Otto committed
148
149
150
      this._showBackdrop(function () {
        return _this._showElement(relatedTarget);
      });
Mark Otto's avatar
grunt    
Mark Otto committed
151
    };
152

Mark Otto's avatar
grunt    
Mark Otto committed
153
    Modal.prototype.hide = function hide(event) {
Mark Otto's avatar
grunt    
Mark Otto committed
154
155
      var _this2 = this;

Mark Otto's avatar
grunt    
Mark Otto committed
156
157
      if (event) {
        event.preventDefault();
158
159
      }

Mark Otto's avatar
grunt    
Mark Otto committed
160
161
      if (this._isTransitioning || !this._isShown) {
        return;
Mark Otto's avatar
grunt    
Mark Otto committed
162
163
164
      }

      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
Mark Otto's avatar
grunt    
Mark Otto committed
165

Mark Otto's avatar
grunt    
Mark Otto committed
166
167
168
      if (transition) {
        this._isTransitioning = true;
      }
169

Mark Otto's avatar
grunt    
Mark Otto committed
170
      var hideEvent = $.Event(Event.HIDE);
Mark Otto's avatar
grunt    
Mark Otto committed
171

Mark Otto's avatar
grunt    
Mark Otto committed
172
      $(this._element).trigger(hideEvent);
173

Mark Otto's avatar
grunt    
Mark Otto committed
174
175
176
      if (!this._isShown || hideEvent.isDefaultPrevented()) {
        return;
      }
177

Mark Otto's avatar
grunt    
Mark Otto committed
178
      this._isShown = false;
179

Mark Otto's avatar
grunt    
Mark Otto committed
180
181
      this._setEscapeEvent();
      this._setResizeEvent();
182

Mark Otto's avatar
grunt    
Mark Otto committed
183
      $(document).off(Event.FOCUSIN);
184

Mark Otto's avatar
grunt    
Mark Otto committed
185
      $(this._element).removeClass(ClassName.SHOW);
186

Mark Otto's avatar
grunt    
Mark Otto committed
187
188
      $(this._element).off(Event.CLICK_DISMISS);
      $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
189

Mark Otto's avatar
grunt    
Mark Otto committed
190
      if (transition) {
Mark Otto's avatar
grunt    
Mark Otto committed
191

Mark Otto's avatar
grunt    
Mark Otto committed
192
193
194
        $(this._element).one(Util.TRANSITION_END, function (event) {
          return _this2._hideModal(event);
        }).emulateTransitionEnd(TRANSITION_DURATION);
Mark Otto's avatar
grunt    
Mark Otto committed
195
196
      } else {
        this._hideModal();
fat's avatar
fat committed
197
      }
Mark Otto's avatar
grunt    
Mark Otto committed
198
    };
199

Mark Otto's avatar
grunt    
Mark Otto committed
200
201
    Modal.prototype.dispose = function dispose() {
      $.removeData(this._element, DATA_KEY);
202

Mark Otto's avatar
grunt    
Mark Otto committed
203
      $(window, document, this._element, this._backdrop).off(EVENT_KEY);
Mark Otto's avatar
grunt    
Mark Otto committed
204
205
206
207
208
209
210
211
212
213
214

      this._config = null;
      this._element = null;
      this._dialog = null;
      this._backdrop = null;
      this._isShown = null;
      this._isBodyOverflowing = null;
      this._ignoreBackdropClick = null;
      this._scrollbarWidth = null;
    };

Mark Otto's avatar
grunt    
Mark Otto committed
215
216
217
218
    Modal.prototype.handleUpdate = function handleUpdate() {
      this._adjustDialog();
    };

Mark Otto's avatar
grunt    
Mark Otto committed
219
220
221
222
223
224
225
226
227
    // private

    Modal.prototype._getConfig = function _getConfig(config) {
      config = $.extend({}, Default, config);
      Util.typeCheckConfig(NAME, config, DefaultType);
      return config;
    };

    Modal.prototype._showElement = function _showElement(relatedTarget) {
Mark Otto's avatar
grunt    
Mark Otto committed
228
      var _this3 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
229
230
231
232
233
234

      var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);

      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
        // don't move modals dom position
        document.body.appendChild(this._element);
fat's avatar
fat committed
235
      }
236

Mark Otto's avatar
grunt    
Mark Otto committed
237
238
239
      this._element.style.display = 'block';
      this._element.removeAttribute('aria-hidden');
      this._element.scrollTop = 0;
240

Mark Otto's avatar
grunt    
Mark Otto committed
241
242
243
      if (transition) {
        Util.reflow(this._element);
      }
244

Mark Otto's avatar
grunt    
Mark Otto committed
245
      $(this._element).addClass(ClassName.SHOW);
246

Mark Otto's avatar
grunt    
Mark Otto committed
247
248
249
      if (this._config.focus) {
        this._enforceFocus();
      }
250

Mark Otto's avatar
grunt    
Mark Otto committed
251
252
253
      var shownEvent = $.Event(Event.SHOWN, {
        relatedTarget: relatedTarget
      });
254

Mark Otto's avatar
grunt    
Mark Otto committed
255
      var transitionComplete = function transitionComplete() {
Mark Otto's avatar
grunt    
Mark Otto committed
256
257
        if (_this3._config.focus) {
          _this3._element.focus();
Mark Otto's avatar
Mark Otto committed
258
        }
Mark Otto's avatar
grunt    
Mark Otto committed
259
        _this3._isTransitioning = false;
Mark Otto's avatar
grunt    
Mark Otto committed
260
        $(_this3._element).trigger(shownEvent);
Mark Otto's avatar
grunt    
Mark Otto committed
261
      };
262

Mark Otto's avatar
grunt    
Mark Otto committed
263
264
265
266
267
268
      if (transition) {
        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION);
      } else {
        transitionComplete();
      }
    };
269

Mark Otto's avatar
grunt    
Mark Otto committed
270
    Modal.prototype._enforceFocus = function _enforceFocus() {
Mark Otto's avatar
grunt    
Mark Otto committed
271
      var _this4 = this;
272

Mark Otto's avatar
Mark Otto committed
273
274
      $(document).off(Event.FOCUSIN) // guard against infinite focus loop
      .on(Event.FOCUSIN, function (event) {
Mark Otto's avatar
grunt    
Mark Otto committed
275
276
        if (document !== event.target && _this4._element !== event.target && !$(_this4._element).has(event.target).length) {
          _this4._element.focus();
277
        }
Mark Otto's avatar
grunt    
Mark Otto committed
278
279
280
281
      });
    };

    Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
Mark Otto's avatar
grunt    
Mark Otto committed
282
      var _this5 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
283
284
285
286

      if (this._isShown && this._config.keyboard) {
        $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
          if (event.which === ESCAPE_KEYCODE) {
Mark Otto's avatar
grunt    
Mark Otto committed
287
            event.preventDefault();
Mark Otto's avatar
grunt    
Mark Otto committed
288
            _this5.hide();
289
290
          }
        });
Mark Otto's avatar
grunt    
Mark Otto committed
291
292
      } else if (!this._isShown) {
        $(this._element).off(Event.KEYDOWN_DISMISS);
293
      }
Mark Otto's avatar
grunt    
Mark Otto committed
294
295
296
    };

    Modal.prototype._setResizeEvent = function _setResizeEvent() {
Mark Otto's avatar
grunt    
Mark Otto committed
297
298
      var _this6 = this;

Mark Otto's avatar
grunt    
Mark Otto committed
299
      if (this._isShown) {
Mark Otto's avatar
grunt    
Mark Otto committed
300
        $(window).on(Event.RESIZE, function (event) {
Mark Otto's avatar
grunt    
Mark Otto committed
301
          return _this6.handleUpdate(event);
Mark Otto's avatar
grunt    
Mark Otto committed
302
        });
Mark Otto's avatar
grunt    
Mark Otto committed
303
304
      } else {
        $(window).off(Event.RESIZE);
305
      }
Mark Otto's avatar
grunt    
Mark Otto committed
306
307
308
    };

    Modal.prototype._hideModal = function _hideModal() {
Mark Otto's avatar
grunt    
Mark Otto committed
309
      var _this7 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
310
311

      this._element.style.display = 'none';
Mark Otto's avatar
grunt    
Mark Otto committed
312
      this._element.setAttribute('aria-hidden', true);
Mark Otto's avatar
grunt    
Mark Otto committed
313
      this._isTransitioning = false;
Mark Otto's avatar
grunt    
Mark Otto committed
314
315
      this._showBackdrop(function () {
        $(document.body).removeClass(ClassName.OPEN);
Mark Otto's avatar
grunt    
Mark Otto committed
316
317
318
        _this7._resetAdjustments();
        _this7._resetScrollbar();
        $(_this7._element).trigger(Event.HIDDEN);
Mark Otto's avatar
grunt    
Mark Otto committed
319
320
321
322
323
324
325
      });
    };

    Modal.prototype._removeBackdrop = function _removeBackdrop() {
      if (this._backdrop) {
        $(this._backdrop).remove();
        this._backdrop = null;
326
      }
Mark Otto's avatar
grunt    
Mark Otto committed
327
    };
328

Mark Otto's avatar
grunt    
Mark Otto committed
329
    Modal.prototype._showBackdrop = function _showBackdrop(callback) {
Mark Otto's avatar
grunt    
Mark Otto committed
330
      var _this8 = this;
331

Mark Otto's avatar
grunt    
Mark Otto committed
332
      var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
333

Mark Otto's avatar
grunt    
Mark Otto committed
334
335
      if (this._isShown && this._config.backdrop) {
        var doAnimate = Util.supportsTransitionEnd() && animate;
336

Mark Otto's avatar
grunt    
Mark Otto committed
337
338
        this._backdrop = document.createElement('div');
        this._backdrop.className = ClassName.BACKDROP;
339

Mark Otto's avatar
grunt    
Mark Otto committed
340
341
342
        if (animate) {
          $(this._backdrop).addClass(animate);
        }
343

Mark Otto's avatar
grunt    
Mark Otto committed
344
        $(this._backdrop).appendTo(document.body);
345

Mark Otto's avatar
grunt    
Mark Otto committed
346
        $(this._element).on(Event.CLICK_DISMISS, function (event) {
Mark Otto's avatar
grunt    
Mark Otto committed
347
348
          if (_this8._ignoreBackdropClick) {
            _this8._ignoreBackdropClick = false;
349
350
            return;
          }
Mark Otto's avatar
grunt    
Mark Otto committed
351
          if (event.target !== event.currentTarget) {
352
353
            return;
          }
Mark Otto's avatar
grunt    
Mark Otto committed
354
355
          if (_this8._config.backdrop === 'static') {
            _this8._element.focus();
356
          } else {
Mark Otto's avatar
grunt    
Mark Otto committed
357
            _this8.hide();
358
          }
Mark Otto's avatar
grunt    
Mark Otto committed
359
        });
360

Mark Otto's avatar
grunt    
Mark Otto committed
361
362
363
        if (doAnimate) {
          Util.reflow(this._backdrop);
        }
364

Mark Otto's avatar
grunt    
Mark Otto committed
365
        $(this._backdrop).addClass(ClassName.SHOW);
366

Mark Otto's avatar
grunt    
Mark Otto committed
367
368
        if (!callback) {
          return;
369
370
        }

Mark Otto's avatar
grunt    
Mark Otto committed
371
372
373
        if (!doAnimate) {
          callback();
          return;
374
375
        }

Mark Otto's avatar
grunt    
Mark Otto committed
376
377
        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
      } else if (!this._isShown && this._backdrop) {
Mark Otto's avatar
grunt    
Mark Otto committed
378
        $(this._backdrop).removeClass(ClassName.SHOW);
379

Mark Otto's avatar
grunt    
Mark Otto committed
380
        var callbackRemove = function callbackRemove() {
Mark Otto's avatar
grunt    
Mark Otto committed
381
          _this8._removeBackdrop();
Mark Otto's avatar
grunt    
Mark Otto committed
382
383
384
385
386
387
388
389
390
          if (callback) {
            callback();
          }
        };

        if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION);
        } else {
          callbackRemove();
391
        }
Mark Otto's avatar
grunt    
Mark Otto committed
392
393
      } else if (callback) {
        callback();
394
      }
Mark Otto's avatar
grunt    
Mark Otto committed
395
396
397
398
399
400
401
402
403
404
405
406
    };

    // ----------------------------------------------------------------------
    // the following methods are used to handle overflowing modals
    // todo (fat): these should probably be refactored out of modal.js
    // ----------------------------------------------------------------------

    Modal.prototype._adjustDialog = function _adjustDialog() {
      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;

      if (!this._isBodyOverflowing && isModalOverflowing) {
        this._element.style.paddingLeft = this._scrollbarWidth + 'px';
407
      }
Mark Otto's avatar
grunt    
Mark Otto committed
408
409
410

      if (this._isBodyOverflowing && !isModalOverflowing) {
        this._element.style.paddingRight = this._scrollbarWidth + 'px';
411
      }
Mark Otto's avatar
grunt    
Mark Otto committed
412
    };
413

Mark Otto's avatar
grunt    
Mark Otto committed
414
415
416
417
    Modal.prototype._resetAdjustments = function _resetAdjustments() {
      this._element.style.paddingLeft = '';
      this._element.style.paddingRight = '';
    };
418

Mark Otto's avatar
grunt    
Mark Otto committed
419
420
421
422
    Modal.prototype._checkScrollbar = function _checkScrollbar() {
      this._isBodyOverflowing = document.body.clientWidth < window.innerWidth;
      this._scrollbarWidth = this._getScrollbarWidth();
    };
423

Mark Otto's avatar
grunt    
Mark Otto committed
424
    Modal.prototype._setScrollbar = function _setScrollbar() {
Mark Otto's avatar
grunt    
Mark Otto committed
425
      var _this9 = this;
Mark Otto's avatar
grunt    
Mark Otto committed
426
427

      if (this._isBodyOverflowing) {
Mark Otto's avatar
grunt    
Mark Otto committed
428
429
430
431
432
433
434
435
        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set

        // Adjust fixed content padding
        $(Selector.FIXED_CONTENT).each(function (index, element) {
          var actualPadding = $(element)[0].style.paddingRight;
          var calculatedPadding = $(element).css('padding-right');
          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + 'px');
Mark Otto's avatar
Mark Otto committed
436
        });
Mark Otto's avatar
grunt    
Mark Otto committed
437
438

        // Adjust navbar-toggler margin
Mark Otto's avatar
Mark Otto committed
439
        $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
Mark Otto's avatar
grunt    
Mark Otto committed
440
441
442
          var actualMargin = $(element)[0].style.marginRight;
          var calculatedMargin = $(element).css('margin-right');
          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + 'px');
Mark Otto's avatar
Mark Otto committed
443
        });
Mark Otto's avatar
grunt    
Mark Otto committed
444
445

        // Adjust body padding
Mark Otto's avatar
Mark Otto committed
446
        var actualPadding = document.body.style.paddingRight;
Mark Otto's avatar
grunt    
Mark Otto committed
447
448
        var calculatedPadding = $('body').css('padding-right');
        $('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + 'px');
449
      }
Mark Otto's avatar
grunt    
Mark Otto committed
450
451
452
    };

    Modal.prototype._resetScrollbar = function _resetScrollbar() {
Mark Otto's avatar
grunt    
Mark Otto committed
453
454
455
456
457
458
      // Restore fixed content padding
      $(Selector.FIXED_CONTENT).each(function (index, element) {
        var padding = $(element).data('padding-right');
        if (typeof padding !== 'undefined') {
          $(element).css('padding-right', padding).removeData('padding-right');
        }
Mark Otto's avatar
Mark Otto committed
459
      });
Mark Otto's avatar
grunt    
Mark Otto committed
460
461

      // Restore navbar-toggler margin
Mark Otto's avatar
Mark Otto committed
462
      $(Selector.NAVBAR_TOGGLER).each(function (index, element) {
Mark Otto's avatar
grunt    
Mark Otto committed
463
464
465
466
        var margin = $(element).data('margin-right');
        if (typeof margin !== 'undefined') {
          $(element).css('margin-right', margin).removeData('margin-right');
        }
Mark Otto's avatar
Mark Otto committed
467
      });
Mark Otto's avatar
grunt    
Mark Otto committed
468
469

      // Restore body padding
Mark Otto's avatar
Mark Otto committed
470
      var padding = $('body').data('padding-right');
Mark Otto's avatar
grunt    
Mark Otto committed
471
472
473
      if (typeof padding !== 'undefined') {
        $('body').css('padding-right', padding).removeData('padding-right');
      }
Mark Otto's avatar
grunt    
Mark Otto committed
474
475
476
477
478
479
480
    };

    Modal.prototype._getScrollbarWidth = function _getScrollbarWidth() {
      // thx d.walsh
      var scrollDiv = document.createElement('div');
      scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
      document.body.appendChild(scrollDiv);
Mark Otto's avatar
grunt    
Mark Otto committed
481
      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
Mark Otto's avatar
grunt    
Mark Otto committed
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
      document.body.removeChild(scrollDiv);
      return scrollbarWidth;
    };

    // static

    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
      return this.each(function () {
        var data = $(this).data(DATA_KEY);
        var _config = $.extend({}, Modal.Default, $(this).data(), (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config);

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

        if (typeof config === 'string') {
          if (data[config] === undefined) {
            throw new Error('No method named "' + config + '"');
          }
          data[config](relatedTarget);
        } else if (_config.show) {
          data.show(relatedTarget);
        }
      });
    };

    _createClass(Modal, null, [{
Jacob Thornton's avatar
Jacob Thornton committed
510
511
512
513
514
515
516
517
518
      key: 'VERSION',
      get: function get() {
        return VERSION;
      }
    }, {
      key: 'Default',
      get: function get() {
        return Default;
      }
519
520
521
    }]);

    return Modal;
Mark Otto's avatar
grunt    
Mark Otto committed
522
523
524
525
526
527
528
  }();

  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
529

fat's avatar
fat committed
530
  $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
Mark Otto's avatar
grunt    
Mark Otto committed
531
    var _this10 = this;
532

Mark Otto's avatar
grunt    
Mark Otto committed
533
    var target = void 0;
534
535
536
537
538
539
540
541
    var selector = Util.getSelectorFromElement(this);

    if (selector) {
      target = $(selector)[0];
    }

    var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data());

Mark Otto's avatar
grunt    
Mark Otto committed
542
    if (this.tagName === 'A' || this.tagName === 'AREA') {
543
544
545
546
547
548
549
550
551
552
      event.preventDefault();
    }

    var $target = $(target).one(Event.SHOW, function (showEvent) {
      if (showEvent.isDefaultPrevented()) {
        // only register focus restorer if modal will actually get shown
        return;
      }

      $target.one(Event.HIDDEN, function () {
Mark Otto's avatar
grunt    
Mark Otto committed
553
554
        if ($(_this10).is(':visible')) {
          _this10.focus();
555
556
557
558
559
        }
      });
    });

    Modal._jQueryInterface.call($(target), config, this);
Mark Otto's avatar
Mark Otto committed
560
  });
561
562
563
564
565
566
567

  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */

Mark Otto's avatar
Mark Otto committed
568
  $.fn[NAME] = Modal._jQueryInterface;
569
570
571
572
573
574
575
  $.fn[NAME].Constructor = Modal;
  $.fn[NAME].noConflict = function () {
    $.fn[NAME] = JQUERY_NO_CONFLICT;
    return Modal._jQueryInterface;
  };

  return Modal;
Mark Otto's avatar
grunt    
Mark Otto committed
576
}(jQuery);
Mark Otto's avatar
build    
Mark Otto committed
577
//# sourceMappingURL=modal.js.map