assets/javascripts/bootstrap.js in bootstrap-4.0.0.alpha5 vs assets/javascripts/bootstrap.js in bootstrap-4.0.0.alpha6

- old
+ new

@@ -1,13 +1,13 @@ /*! - * Bootstrap v4.0.0-alpha.5 (https://getbootstrap.com) - * Copyright 2011-2016 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ if (typeof jQuery === 'undefined') { - throw new Error('Bootstrap\'s JavaScript requires jQuery') + throw new Error('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.') } +function ($) { var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] >= 4)) { @@ -28,11 +28,11 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): util.js + * Bootstrap (v4.0.0-alpha.6): util.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Util = function ($) { @@ -83,11 +83,13 @@ var el = document.createElement('bootstrap'); for (var name in TransitionEndEvent) { if (el.style[name] !== undefined) { - return { end: TransitionEndEvent[name] }; + return { + end: TransitionEndEvent[name] + }; } } return false; } @@ -130,13 +132,12 @@ TRANSITION_END: 'bsTransitionEnd', getUID: function getUID(prefix) { do { - /* eslint-disable no-bitwise */ + // eslint-disable-next-line no-bitwise prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here - /* eslint-enable no-bitwise */ } while (document.getElementById(prefix)); return prefix; }, getSelectorFromElement: function getSelectorFromElement(element) { var selector = element.getAttribute('data-target'); @@ -147,11 +148,11 @@ } return selector; }, reflow: function reflow(element) { - new Function('bs', 'return bs')(element.offsetHeight); + return element.offsetHeight; }, triggerTransitionEnd: function triggerTransitionEnd(element) { $(element).trigger(transition.end); }, supportsTransitionEnd: function supportsTransitionEnd() { @@ -160,18 +161,12 @@ typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { for (var property in configTypes) { if (configTypes.hasOwnProperty(property)) { var expectedTypes = configTypes[property]; var value = config[property]; - var valueType = void 0; + var valueType = value && isElement(value) ? 'element' : toType(value); - if (value && isElement(value)) { - valueType = 'element'; - } else { - valueType = toType(value); - } - if (!new RegExp(expectedTypes).test(valueType)) { throw new Error(componentName.toUpperCase() + ': ' + ('Option "' + property + '" provided type "' + valueType + '" ') + ('but expected type "' + expectedTypes + '".')); } } } @@ -183,11 +178,11 @@ return Util; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): alert.js + * Bootstrap (v4.0.0-alpha.6): alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Alert = function ($) { @@ -197,11 +192,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'alert'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.alert'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 150; @@ -217,11 +212,11 @@ }; var ClassName = { ALERT: 'alert', FADE: 'fade', - IN: 'in' + SHOW: 'show' }; /** * ------------------------------------------------------------------------ * Class Definition @@ -280,18 +275,22 @@ $(element).trigger(closeEvent); return closeEvent; }; Alert.prototype._removeElement = function _removeElement(element) { - $(element).removeClass(ClassName.IN); + var _this2 = this; + $(element).removeClass(ClassName.SHOW); + if (!Util.supportsTransitionEnd() || !$(element).hasClass(ClassName.FADE)) { this._destroyElement(element); return; } - $(element).one(Util.TRANSITION_END, $.proxy(this._destroyElement, this, element)).emulateTransitionEnd(TRANSITION_DURATION); + $(element).one(Util.TRANSITION_END, function (event) { + return _this2._destroyElement(element, event); + }).emulateTransitionEnd(TRANSITION_DURATION); }; Alert.prototype._destroyElement = function _destroyElement(element) { $(element).detach().trigger(Event.CLOSED).remove(); }; @@ -358,11 +357,11 @@ return Alert; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): button.js + * Bootstrap (v4.0.0-alpha.6): button.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Button = function ($) { @@ -372,11 +371,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'button'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.button'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; @@ -436,19 +435,19 @@ } } if (triggerChangeEvent) { input.checked = !$(this._element).hasClass(ClassName.ACTIVE); - $(this._element).trigger('change'); + $(input).trigger('change'); } input.focus(); } - } else { - this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE)); } + this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE)); + if (triggerChangeEvent) { $(this._element).toggleClass(ClassName.ACTIVE); } }; @@ -521,11 +520,11 @@ return Button; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): carousel.js + * Bootstrap (v4.0.0-alpha.6): carousel.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Carousel = function ($) { @@ -535,11 +534,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'carousel'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.carousel'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 600; @@ -562,11 +561,13 @@ wrap: 'boolean' }; var Direction = { NEXT: 'next', - PREVIOUS: 'prev' + PREV: 'prev', + LEFT: 'left', + RIGHT: 'right' }; var Event = { SLIDE: 'slide' + EVENT_KEY, SLID: 'slid' + EVENT_KEY, @@ -579,20 +580,22 @@ var ClassName = { CAROUSEL: 'carousel', ACTIVE: 'active', SLIDE: 'slide', - RIGHT: 'right', - LEFT: 'left', + RIGHT: 'carousel-item-right', + LEFT: 'carousel-item-left', + NEXT: 'carousel-item-next', + PREV: 'carousel-item-prev', ITEM: 'carousel-item' }; var Selector = { ACTIVE: '.active', ACTIVE_ITEM: '.active.carousel-item', ITEM: '.carousel-item', - NEXT_PREV: '.next, .prev', + NEXT_PREV: '.carousel-item-next, .carousel-item-prev', INDICATORS: '.carousel-indicators', DATA_SLIDE: '[data-slide], [data-slide-to]', DATA_RIDE: '[data-ride="carousel"]' }; @@ -623,26 +626,28 @@ // getters // public Carousel.prototype.next = function next() { - if (!this._isSliding) { - this._slide(Direction.NEXT); + if (this._isSliding) { + throw new Error('Carousel is sliding'); } + this._slide(Direction.NEXT); }; Carousel.prototype.nextWhenVisible = function nextWhenVisible() { // Don't call next when the page isn't visible if (!document.hidden) { this.next(); } }; Carousel.prototype.prev = function prev() { - if (!this._isSliding) { - this._slide(Direction.PREVIOUS); + if (this._isSliding) { + throw new Error('Carousel is sliding'); } + this._slide(Direction.PREVIOUS); }; Carousel.prototype.pause = function pause(event) { if (!event) { this._isPaused = true; @@ -666,16 +671,16 @@ clearInterval(this._interval); this._interval = null; } if (this._config.interval && !this._isPaused) { - this._interval = setInterval($.proxy(document.visibilityState ? this.nextWhenVisible : this.next, this), this._config.interval); + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); } }; Carousel.prototype.to = function to(index) { - var _this2 = this; + var _this3 = this; this._activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]; var activeIndex = this._getItemIndex(this._activeElement); @@ -683,11 +688,11 @@ return; } if (this._isSliding) { $(this._element).one(Event.SLID, function () { - return _this2.to(index); + return _this3.to(index); }); return; } if (activeIndex === index) { @@ -722,31 +727,39 @@ Util.typeCheckConfig(NAME, config, DefaultType); return config; }; Carousel.prototype._addEventListeners = function _addEventListeners() { + var _this4 = this; + if (this._config.keyboard) { - $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this)); + $(this._element).on(Event.KEYDOWN, function (event) { + return _this4._keydown(event); + }); } if (this._config.pause === 'hover' && !('ontouchstart' in document.documentElement)) { - $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this)); + $(this._element).on(Event.MOUSEENTER, function (event) { + return _this4.pause(event); + }).on(Event.MOUSELEAVE, function (event) { + return _this4.cycle(event); + }); } }; Carousel.prototype._keydown = function _keydown(event) { - event.preventDefault(); - if (/input|textarea/i.test(event.target.tagName)) { return; } switch (event.which) { case ARROW_LEFT_KEYCODE: + event.preventDefault(); this.prev(); break; case ARROW_RIGHT_KEYCODE: + event.preventDefault(); this.next(); break; default: return; } @@ -772,14 +785,14 @@ var itemIndex = (activeIndex + delta) % this._items.length; return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; }; - Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, directionalClassname) { + Carousel.prototype._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { var slideEvent = $.Event(Event.SLIDE, { relatedTarget: relatedTarget, - direction: directionalClassname + direction: eventDirectionName }); $(this._element).trigger(slideEvent); return slideEvent; @@ -796,25 +809,37 @@ } } }; Carousel.prototype._slide = function _slide(direction, element) { - var _this3 = this; + var _this5 = this; var activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]; var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); var isCycling = Boolean(this._interval); - var directionalClassName = direction === Direction.NEXT ? ClassName.LEFT : ClassName.RIGHT; + var directionalClassName = void 0; + var orderClassName = void 0; + var eventDirectionName = void 0; + if (direction === Direction.NEXT) { + directionalClassName = ClassName.LEFT; + orderClassName = ClassName.NEXT; + eventDirectionName = Direction.LEFT; + } else { + directionalClassName = ClassName.RIGHT; + orderClassName = ClassName.PREV; + eventDirectionName = Direction.RIGHT; + } + if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) { this._isSliding = false; return; } - var slideEvent = this._triggerSlideEvent(nextElement, directionalClassName); + var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); if (slideEvent.isDefaultPrevented()) { return; } if (!activeElement || !nextElement) { @@ -830,33 +855,31 @@ this._setActiveIndicatorElement(nextElement); var slidEvent = $.Event(Event.SLID, { relatedTarget: nextElement, - direction: directionalClassName + direction: eventDirectionName }); if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.SLIDE)) { - $(nextElement).addClass(direction); + $(nextElement).addClass(orderClassName); Util.reflow(nextElement); $(activeElement).addClass(directionalClassName); $(nextElement).addClass(directionalClassName); $(activeElement).one(Util.TRANSITION_END, function () { - $(nextElement).removeClass(directionalClassName).removeClass(direction); + $(nextElement).removeClass(directionalClassName + ' ' + orderClassName).addClass(ClassName.ACTIVE); - $(nextElement).addClass(ClassName.ACTIVE); + $(activeElement).removeClass(ClassName.ACTIVE + ' ' + orderClassName + ' ' + directionalClassName); - $(activeElement).removeClass(ClassName.ACTIVE).removeClass(direction).removeClass(directionalClassName); + _this5._isSliding = false; - _this3._isSliding = false; - setTimeout(function () { - return $(_this3._element).trigger(slidEvent); + return $(_this5._element).trigger(slidEvent); }, 0); }).emulateTransitionEnd(TRANSITION_DURATION); } else { $(activeElement).removeClass(ClassName.ACTIVE); $(nextElement).addClass(ClassName.ACTIVE); @@ -977,11 +1000,11 @@ return Carousel; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): collapse.js + * Bootstrap (v4.0.0-alpha.6): collapse.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Collapse = function ($) { @@ -991,11 +1014,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'collapse'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.collapse'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 600; @@ -1017,11 +1040,11 @@ HIDDEN: 'hidden' + EVENT_KEY, CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY }; var ClassName = { - IN: 'in', + SHOW: 'show', COLLAPSE: 'collapse', COLLAPSING: 'collapsing', COLLAPSED: 'collapsed' }; @@ -1029,11 +1052,11 @@ WIDTH: 'width', HEIGHT: 'height' }; var Selector = { - ACTIVES: '.card > .in, .card > .collapsing', + ACTIVES: '.card > .show, .card > .collapsing', DATA_TOGGLE: '[data-toggle="collapse"]' }; /** * ------------------------------------------------------------------------ @@ -1064,29 +1087,33 @@ // getters // public Collapse.prototype.toggle = function toggle() { - if ($(this._element).hasClass(ClassName.IN)) { + if ($(this._element).hasClass(ClassName.SHOW)) { this.hide(); } else { this.show(); } }; Collapse.prototype.show = function show() { - var _this4 = this; + var _this6 = this; - if (this._isTransitioning || $(this._element).hasClass(ClassName.IN)) { + if (this._isTransitioning) { + throw new Error('Collapse is transitioning'); + } + + if ($(this._element).hasClass(ClassName.SHOW)) { return; } var actives = void 0; var activesData = void 0; if (this._parent) { - actives = $.makeArray($(Selector.ACTIVES)); + actives = $.makeArray($(this._parent).find(Selector.ACTIVES)); if (!actives.length) { actives = null; } } @@ -1122,17 +1149,17 @@ } this.setTransitioning(true); var complete = function complete() { - $(_this4._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.IN); + $(_this6._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); - _this4._element.style[dimension] = ''; + _this6._element.style[dimension] = ''; - _this4.setTransitioning(false); + _this6.setTransitioning(false); - $(_this4._element).trigger(Event.SHOWN); + $(_this6._element).trigger(Event.SHOWN); }; if (!Util.supportsTransitionEnd()) { complete(); return; @@ -1145,13 +1172,17 @@ this._element.style[dimension] = this._element[scrollSize] + 'px'; }; Collapse.prototype.hide = function hide() { - var _this5 = this; + var _this7 = this; - if (this._isTransitioning || !$(this._element).hasClass(ClassName.IN)) { + if (this._isTransitioning) { + throw new Error('Collapse is transitioning'); + } + + if (!$(this._element).hasClass(ClassName.SHOW)) { return; } var startEvent = $.Event(Event.HIDE); $(this._element).trigger(startEvent); @@ -1164,23 +1195,23 @@ this._element.style[dimension] = this._element[offsetDimension] + 'px'; Util.reflow(this._element); - $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.IN); + $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW); this._element.setAttribute('aria-expanded', false); if (this._triggerArray.length) { $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false); } this.setTransitioning(true); var complete = function complete() { - _this5.setTransitioning(false); - $(_this5._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); + _this7.setTransitioning(false); + $(_this7._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); }; this._element.style[dimension] = ''; if (!Util.supportsTransitionEnd()) { @@ -1218,25 +1249,25 @@ var hasWidth = $(this._element).hasClass(Dimension.WIDTH); return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; }; Collapse.prototype._getParent = function _getParent() { - var _this6 = this; + var _this8 = this; var parent = $(this._config.parent)[0]; var selector = '[data-toggle="collapse"][data-parent="' + this._config.parent + '"]'; $(parent).find(selector).each(function (i, element) { - _this6._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + _this8._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); }); return parent; }; Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { if (element) { - var isOpen = $(element).hasClass(ClassName.IN); + var isOpen = $(element).hasClass(ClassName.SHOW); element.setAttribute('aria-expanded', isOpen); if (triggerArray.length) { $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); } @@ -1321,11 +1352,11 @@ return Collapse; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): dropdown.js + * Bootstrap (v4.0.0-alpha.6): dropdown.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Dropdown = function ($) { @@ -1335,11 +1366,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'dropdown'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; 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 @@ -1352,17 +1383,18 @@ 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, + FOCUSIN_DATA_API: 'focusin' + EVENT_KEY + DATA_API_KEY, KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + DATA_API_KEY }; var ClassName = { BACKDROP: 'dropdown-backdrop', DISABLED: 'disabled', - OPEN: 'open' + SHOW: 'show' }; var Selector = { BACKDROP: '.dropdown-backdrop', DATA_TOGGLE: '[data-toggle="dropdown"]', @@ -1396,11 +1428,11 @@ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) { return false; } var parent = Dropdown._getParentFromElement(this); - var isActive = $(parent).hasClass(ClassName.OPEN); + var isActive = $(parent).hasClass(ClassName.SHOW); Dropdown._clearMenus(); if (isActive) { return false; @@ -1413,23 +1445,25 @@ dropdown.className = ClassName.BACKDROP; $(dropdown).insertBefore(this); $(dropdown).on('click', Dropdown._clearMenus); } - var relatedTarget = { relatedTarget: this }; + var relatedTarget = { + relatedTarget: this + }; var showEvent = $.Event(Event.SHOW, relatedTarget); $(parent).trigger(showEvent); if (showEvent.isDefaultPrevented()) { return false; } this.focus(); - this.setAttribute('aria-expanded', 'true'); + this.setAttribute('aria-expanded', true); - $(parent).toggleClass(ClassName.OPEN); + $(parent).toggleClass(ClassName.SHOW); $(parent).trigger($.Event(Event.SHOWN, relatedTarget)); return false; }; @@ -1450,11 +1484,12 @@ Dropdown._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $(this).data(DATA_KEY); if (!data) { - $(this).data(DATA_KEY, data = new Dropdown(this)); + data = new Dropdown(this); + $(this).data(DATA_KEY, data); } if (typeof config === 'string') { if (data[config] === undefined) { throw new Error('No method named "' + config + '"'); @@ -1476,17 +1511,19 @@ var toggles = $.makeArray($(Selector.DATA_TOGGLE)); for (var i = 0; i < toggles.length; i++) { var parent = Dropdown._getParentFromElement(toggles[i]); - var relatedTarget = { relatedTarget: toggles[i] }; + var relatedTarget = { + relatedTarget: toggles[i] + }; - if (!$(parent).hasClass(ClassName.OPEN)) { + if (!$(parent).hasClass(ClassName.SHOW)) { continue; } - if (event && event.type === 'click' && /input|textarea/i.test(event.target.tagName) && $.contains(parent, event.target)) { + if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) { continue; } var hideEvent = $.Event(Event.HIDE, relatedTarget); $(parent).trigger(hideEvent); @@ -1494,11 +1531,11 @@ continue; } toggles[i].setAttribute('aria-expanded', 'false'); - $(parent).removeClass(ClassName.OPEN).trigger($.Event(Event.HIDDEN, relatedTarget)); + $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget)); } }; Dropdown._getParentFromElement = function _getParentFromElement(element) { var parent = void 0; @@ -1522,11 +1559,11 @@ if (this.disabled || $(this).hasClass(ClassName.DISABLED)) { return; } var parent = Dropdown._getParentFromElement(this); - var isActive = $(parent).hasClass(ClassName.OPEN); + var isActive = $(parent).hasClass(ClassName.SHOW); if (!isActive && event.which !== ESCAPE_KEYCODE || isActive && event.which === ESCAPE_KEYCODE) { if (event.which === ESCAPE_KEYCODE) { var toggle = $(parent).find(Selector.DATA_TOGGLE)[0]; @@ -1535,16 +1572,12 @@ $(this).trigger('click'); return; } - var items = $.makeArray($(Selector.VISIBLE_ITEMS)); + var items = $(parent).find(Selector.VISIBLE_ITEMS).get(); - items = items.filter(function (item) { - return item.offsetWidth || item.offsetHeight; - }); - if (!items.length) { return; } var index = items.indexOf(event.target); @@ -1580,11 +1613,11 @@ * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ - $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { + $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.FOCUSIN_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { e.stopPropagation(); }); /** * ------------------------------------------------------------------------ @@ -1602,11 +1635,11 @@ return Dropdown; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): modal.js + * Bootstrap (v4.0.0-alpha.6): modal.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Modal = function ($) { @@ -1616,11 +1649,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'modal'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.modal'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 300; @@ -1658,18 +1691,18 @@ var ClassName = { SCROLLBAR_MEASURER: 'modal-scrollbar-measure', BACKDROP: 'modal-backdrop', OPEN: 'modal-open', FADE: 'fade', - IN: 'in' + SHOW: 'show' }; var Selector = { DIALOG: '.modal-dialog', DATA_TOGGLE: '[data-toggle="modal"]', DATA_DISMISS: '[data-dismiss="modal"]', - FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed' + FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' }; /** * ------------------------------------------------------------------------ * Class Definition @@ -1685,10 +1718,11 @@ this._dialog = $(element).find(Selector.DIALOG)[0]; this._backdrop = null; this._isShown = false; this._isBodyOverflowing = false; this._ignoreBackdropClick = false; + this._isTransitioning = false; this._originalBodyPadding = 0; this._scrollbarWidth = 0; } // getters @@ -1698,12 +1732,19 @@ Modal.prototype.toggle = function toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); }; Modal.prototype.show = function show(relatedTarget) { - var _this7 = this; + var _this9 = this; + if (this._isTransitioning) { + throw new Error('Modal is transitioning'); + } + + if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { + this._isTransitioning = true; + } var showEvent = $.Event(Event.SHOW, { relatedTarget: relatedTarget }); $(this._element).trigger(showEvent); @@ -1720,30 +1761,44 @@ $(document.body).addClass(ClassName.OPEN); this._setEscapeEvent(); this._setResizeEvent(); - $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this)); + $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { + return _this9.hide(event); + }); $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { - $(_this7._element).one(Event.MOUSEUP_DISMISS, function (event) { - if ($(event.target).is(_this7._element)) { - _this7._ignoreBackdropClick = true; + $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this9._element)) { + _this9._ignoreBackdropClick = true; } }); }); - this._showBackdrop($.proxy(this._showElement, this, relatedTarget)); + this._showBackdrop(function () { + return _this9._showElement(relatedTarget); + }); }; Modal.prototype.hide = function hide(event) { + var _this10 = this; + if (event) { event.preventDefault(); } - var hideEvent = $.Event(Event.HIDE); + if (this._isTransitioning) { + throw new Error('Modal is transitioning'); + } + var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); + if (transition) { + this._isTransitioning = true; + } + + var hideEvent = $.Event(Event.HIDE); $(this._element).trigger(hideEvent); if (!this._isShown || hideEvent.isDefaultPrevented()) { return; } @@ -1753,30 +1808,28 @@ this._setEscapeEvent(); this._setResizeEvent(); $(document).off(Event.FOCUSIN); - $(this._element).removeClass(ClassName.IN); + $(this._element).removeClass(ClassName.SHOW); $(this._element).off(Event.CLICK_DISMISS); $(this._dialog).off(Event.MOUSEDOWN_DISMISS); - if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { - - $(this._element).one(Util.TRANSITION_END, $.proxy(this._hideModal, this)).emulateTransitionEnd(TRANSITION_DURATION); + if (transition) { + $(this._element).one(Util.TRANSITION_END, function (event) { + return _this10._hideModal(event); + }).emulateTransitionEnd(TRANSITION_DURATION); } else { this._hideModal(); } }; Modal.prototype.dispose = function dispose() { $.removeData(this._element, DATA_KEY); - $(window).off(EVENT_KEY); - $(document).off(EVENT_KEY); - $(this._element).off(EVENT_KEY); - $(this._backdrop).off(EVENT_KEY); + $(window, document, this._element, this._backdrop).off(EVENT_KEY); this._config = null; this._element = null; this._dialog = null; this._backdrop = null; @@ -1794,11 +1847,11 @@ Util.typeCheckConfig(NAME, config, DefaultType); return config; }; Modal.prototype._showElement = function _showElement(relatedTarget) { - var _this8 = this; + var _this11 = this; 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 @@ -1811,77 +1864,83 @@ if (transition) { Util.reflow(this._element); } - $(this._element).addClass(ClassName.IN); + $(this._element).addClass(ClassName.SHOW); if (this._config.focus) { this._enforceFocus(); } var shownEvent = $.Event(Event.SHOWN, { relatedTarget: relatedTarget }); var transitionComplete = function transitionComplete() { - if (_this8._config.focus) { - _this8._element.focus(); + if (_this11._config.focus) { + _this11._element.focus(); } - $(_this8._element).trigger(shownEvent); + _this11._isTransitioning = false; + $(_this11._element).trigger(shownEvent); }; if (transition) { $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION); } else { transitionComplete(); } }; Modal.prototype._enforceFocus = function _enforceFocus() { - var _this9 = this; + var _this12 = this; $(document).off(Event.FOCUSIN) // guard against infinite focus loop .on(Event.FOCUSIN, function (event) { - if (document !== event.target && _this9._element !== event.target && !$(_this9._element).has(event.target).length) { - _this9._element.focus(); + if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) { + _this12._element.focus(); } }); }; Modal.prototype._setEscapeEvent = function _setEscapeEvent() { - var _this10 = this; + var _this13 = this; if (this._isShown && this._config.keyboard) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) { if (event.which === ESCAPE_KEYCODE) { - _this10.hide(); + _this13.hide(); } }); } else if (!this._isShown) { $(this._element).off(Event.KEYDOWN_DISMISS); } }; Modal.prototype._setResizeEvent = function _setResizeEvent() { + var _this14 = this; + if (this._isShown) { - $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this)); + $(window).on(Event.RESIZE, function (event) { + return _this14._handleUpdate(event); + }); } else { $(window).off(Event.RESIZE); } }; Modal.prototype._hideModal = function _hideModal() { - var _this11 = this; + var _this15 = this; this._element.style.display = 'none'; this._element.setAttribute('aria-hidden', 'true'); + this._isTransitioning = false; this._showBackdrop(function () { $(document.body).removeClass(ClassName.OPEN); - _this11._resetAdjustments(); - _this11._resetScrollbar(); - $(_this11._element).trigger(Event.HIDDEN); + _this15._resetAdjustments(); + _this15._resetScrollbar(); + $(_this15._element).trigger(Event.HIDDEN); }); }; Modal.prototype._removeBackdrop = function _removeBackdrop() { if (this._backdrop) { @@ -1889,11 +1948,11 @@ this._backdrop = null; } }; Modal.prototype._showBackdrop = function _showBackdrop(callback) { - var _this12 = this; + var _this16 = this; var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; if (this._isShown && this._config.backdrop) { var doAnimate = Util.supportsTransitionEnd() && animate; @@ -1906,29 +1965,29 @@ } $(this._backdrop).appendTo(document.body); $(this._element).on(Event.CLICK_DISMISS, function (event) { - if (_this12._ignoreBackdropClick) { - _this12._ignoreBackdropClick = false; + if (_this16._ignoreBackdropClick) { + _this16._ignoreBackdropClick = false; return; } if (event.target !== event.currentTarget) { return; } - if (_this12._config.backdrop === 'static') { - _this12._element.focus(); + if (_this16._config.backdrop === 'static') { + _this16._element.focus(); } else { - _this12.hide(); + _this16.hide(); } }); if (doAnimate) { Util.reflow(this._backdrop); } - $(this._backdrop).addClass(ClassName.IN); + $(this._backdrop).addClass(ClassName.SHOW); if (!callback) { return; } @@ -1937,14 +1996,14 @@ return; } $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION); } else if (!this._isShown && this._backdrop) { - $(this._backdrop).removeClass(ClassName.IN); + $(this._backdrop).removeClass(ClassName.SHOW); var callbackRemove = function callbackRemove() { - _this12._removeBackdrop(); + _this16._removeBackdrop(); if (callback) { callback(); } }; @@ -2056,34 +2115,34 @@ * Data Api implementation * ------------------------------------------------------------------------ */ $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { - var _this13 = this; + var _this17 = this; var target = void 0; var selector = Util.getSelectorFromElement(this); if (selector) { target = $(selector)[0]; } var config = $(target).data(DATA_KEY) ? 'toggle' : $.extend({}, $(target).data(), $(this).data()); - if (this.tagName === 'A') { + if (this.tagName === 'A' || this.tagName === 'AREA') { 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 () { - if ($(_this13).is(':visible')) { - _this13.focus(); + if ($(_this17).is(':visible')) { + _this17.focus(); } }); }); Modal._jQueryInterface.call($(target), config, this); @@ -2105,11 +2164,11 @@ return Modal; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): scrollspy.js + * Bootstrap (v4.0.0-alpha.6): scrollspy.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var ScrollSpy = function ($) { @@ -2119,11 +2178,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'scrollspy'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.scrollspy'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; @@ -2176,10 +2235,12 @@ * ------------------------------------------------------------------------ */ var ScrollSpy = function () { function ScrollSpy(element, config) { + var _this18 = this; + _classCallCheck(this, ScrollSpy); this._element = element; this._scrollElement = element.tagName === 'BODY' ? window : element; this._config = this._getConfig(config); @@ -2187,22 +2248,24 @@ this._offsets = []; this._targets = []; this._activeTarget = null; this._scrollHeight = 0; - $(this._scrollElement).on(Event.SCROLL, $.proxy(this._process, this)); + $(this._scrollElement).on(Event.SCROLL, function (event) { + return _this18._process(event); + }); this.refresh(); this._process(); } // getters // public ScrollSpy.prototype.refresh = function refresh() { - var _this14 = this; + var _this19 = this; var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET; var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; @@ -2231,12 +2294,12 @@ }).filter(function (item) { return item; }).sort(function (a, b) { return a[0] - b[0]; }).forEach(function (item) { - _this14._offsets.push(item[0]); - _this14._targets.push(item[1]); + _this19._offsets.push(item[0]); + _this19._targets.push(item[1]); }); }; ScrollSpy.prototype.dispose = function dispose() { $.removeData(this._element, DATA_KEY); @@ -2270,21 +2333,25 @@ return config; }; ScrollSpy.prototype._getScrollTop = function _getScrollTop() { - return this._scrollElement === window ? this._scrollElement.scrollY : this._scrollElement.scrollTop; + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; }; ScrollSpy.prototype._getScrollHeight = function _getScrollHeight() { return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); }; + ScrollSpy.prototype._getOffsetHeight = function _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.offsetHeight; + }; + ScrollSpy.prototype._process = function _process() { var scrollTop = this._getScrollTop() + this._config.offset; var scrollHeight = this._getScrollHeight(); - var maxScroll = this._config.offset + scrollHeight - this._scrollElement.offsetHeight; + var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); if (this._scrollHeight !== scrollHeight) { this.refresh(); } @@ -2292,13 +2359,14 @@ var target = this._targets[this._targets.length - 1]; if (this._activeTarget !== target) { this._activate(target); } + return; } - if (this._activeTarget && scrollTop < this._offsets[0]) { + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { this._activeTarget = null; this._clear(); return; } @@ -2327,11 +2395,11 @@ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE); $link.addClass(ClassName.ACTIVE); } else { // todo (fat) this is kinda sus... // recursively add actives to tested nav-links - $link.parents(Selector.LI).find(Selector.NAV_LINKS).addClass(ClassName.ACTIVE); + $link.parents(Selector.LI).find('> ' + Selector.NAV_LINKS).addClass(ClassName.ACTIVE); } $(this._scrollElement).trigger(Event.ACTIVATE, { relatedTarget: target }); @@ -2344,11 +2412,11 @@ // static ScrollSpy._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $(this).data(DATA_KEY); - var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config || null; + var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config; if (!data) { data = new ScrollSpy(this, _config); $(this).data(DATA_KEY, data); } @@ -2408,11 +2476,11 @@ return ScrollSpy; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): tab.js + * Bootstrap (v4.0.0-alpha.6): tab.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Tab = function ($) { @@ -2422,11 +2490,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'tab'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.tab'; var EVENT_KEY = '.' + DATA_KEY; var DATA_API_KEY = '.data-api'; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 150; @@ -2440,19 +2508,20 @@ }; var ClassName = { DROPDOWN_MENU: 'dropdown-menu', ACTIVE: 'active', + DISABLED: 'disabled', FADE: 'fade', - IN: 'in' + SHOW: 'show' }; var Selector = { A: 'a', LI: 'li', DROPDOWN: '.dropdown', - UL: 'ul:not(.dropdown-menu)', + LIST: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)', FADE_CHILD: '> .nav-item .fade, > .fade', ACTIVE: '.active', ACTIVE_CHILD: '> .nav-item > .active, > .active', DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"]', DROPDOWN_TOGGLE: '.dropdown-toggle', @@ -2475,23 +2544,23 @@ // getters // public Tab.prototype.show = function show() { - var _this15 = this; + var _this20 = this; - if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE)) { + if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) { return; } var target = void 0; var previous = void 0; - var ulElement = $(this._element).closest(Selector.UL)[0]; + var listElement = $(this._element).closest(Selector.LIST)[0]; var selector = Util.getSelectorFromElement(this._element); - if (ulElement) { - previous = $.makeArray($(ulElement).find(Selector.ACTIVE)); + if (listElement) { + previous = $.makeArray($(listElement).find(Selector.ACTIVE)); previous = previous[previous.length - 1]; } var hideEvent = $.Event(Event.HIDE, { relatedTarget: this._element @@ -2513,23 +2582,23 @@ if (selector) { target = $(selector)[0]; } - this._activate(this._element, ulElement); + this._activate(this._element, listElement); var complete = function complete() { var hiddenEvent = $.Event(Event.HIDDEN, { - relatedTarget: _this15._element + relatedTarget: _this20._element }); var shownEvent = $.Event(Event.SHOWN, { relatedTarget: previous }); $(previous).trigger(hiddenEvent); - $(_this15._element).trigger(shownEvent); + $(_this20._element).trigger(shownEvent); }; if (target) { this._activate(target, target.parentNode, complete); } else { @@ -2543,31 +2612,35 @@ }; // private Tab.prototype._activate = function _activate(element, container, callback) { + var _this21 = this; + var active = $(container).find(Selector.ACTIVE_CHILD)[0]; var isTransitioning = callback && Util.supportsTransitionEnd() && (active && $(active).hasClass(ClassName.FADE) || Boolean($(container).find(Selector.FADE_CHILD)[0])); - var complete = $.proxy(this._transitionComplete, this, element, active, isTransitioning, callback); + var complete = function complete() { + return _this21._transitionComplete(element, active, isTransitioning, callback); + }; if (active && isTransitioning) { $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION); } else { complete(); } if (active) { - $(active).removeClass(ClassName.IN); + $(active).removeClass(ClassName.SHOW); } }; Tab.prototype._transitionComplete = function _transitionComplete(element, active, isTransitioning, callback) { if (active) { $(active).removeClass(ClassName.ACTIVE); - var dropdownChild = $(active).find(Selector.DROPDOWN_ACTIVE_CHILD)[0]; + var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0]; if (dropdownChild) { $(dropdownChild).removeClass(ClassName.ACTIVE); } @@ -2577,11 +2650,11 @@ $(element).addClass(ClassName.ACTIVE); element.setAttribute('aria-expanded', true); if (isTransitioning) { Util.reflow(element); - $(element).addClass(ClassName.IN); + $(element).addClass(ClassName.SHOW); } else { $(element).removeClass(ClassName.FADE); } if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) { @@ -2605,11 +2678,11 @@ return this.each(function () { var $this = $(this); var data = $this.data(DATA_KEY); if (!data) { - data = data = new Tab(this); + data = new Tab(this); $this.data(DATA_KEY, data); } if (typeof config === 'string') { if (data[config] === undefined) { @@ -2659,33 +2732,33 @@ /* global Tether */ /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): tooltip.js + * Bootstrap (v4.0.0-alpha.6): tooltip.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Tooltip = function ($) { /** * Check for Tether dependency * Tether - http://tether.io/ */ - if (window.Tether === undefined) { + if (typeof Tether === 'undefined') { throw new Error('Bootstrap tooltips require Tether (http://tether.io/)'); } /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ var NAME = 'tooltip'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.tooltip'; var EVENT_KEY = '.' + DATA_KEY; var JQUERY_NO_CONFLICT = $.fn[NAME]; var TRANSITION_DURATION = 150; var CLASS_PREFIX = 'bs-tether'; @@ -2698,11 +2771,12 @@ delay: 0, html: false, selector: false, placement: 'top', offset: '0 0', - constraints: [] + constraints: [], + container: false }; var DefaultType = { animation: 'boolean', template: 'string', @@ -2711,22 +2785,23 @@ delay: '(number|object)', html: 'boolean', selector: '(string|boolean)', placement: '(string|function)', offset: 'string', - constraints: 'array' + constraints: 'array', + container: '(string|element|boolean)' }; var AttachmentMap = { TOP: 'bottom center', RIGHT: 'middle left', BOTTOM: 'top center', LEFT: 'middle right' }; var HoverState = { - IN: 'in', + SHOW: 'show', OUT: 'out' }; var Event = { HIDE: 'hide' + EVENT_KEY, @@ -2741,11 +2816,11 @@ MOUSELEAVE: 'mouseleave' + EVENT_KEY }; var ClassName = { FADE: 'fade', - IN: 'in' + SHOW: 'show' }; var Selector = { TOOLTIP: '.tooltip', TOOLTIP_INNER: '.tooltip-inner' @@ -2776,10 +2851,11 @@ // private this._isEnabled = true; this._timeout = 0; this._hoverState = ''; this._activeTrigger = {}; + this._isTransitioning = false; this._tether = null; // protected this.element = element; this.config = this._getConfig(config); @@ -2821,11 +2897,11 @@ } else { context._leave(null, context); } } else { - if ($(this.getTipElement()).hasClass(ClassName.IN)) { + if ($(this.getTipElement()).hasClass(ClassName.SHOW)) { this._leave(null, this); return; } this._enter(null, this); @@ -2838,10 +2914,11 @@ this.cleanupTether(); $.removeData(this.element, this.constructor.DATA_KEY); $(this.element).off(this.constructor.EVENT_KEY); + $(this.element).closest('.modal').off('hide.bs.modal'); if (this.tip) { $(this.tip).remove(); } @@ -2855,15 +2932,21 @@ this.config = null; this.tip = null; }; Tooltip.prototype.show = function show() { - var _this16 = this; + var _this22 = this; - var showEvent = $.Event(this.constructor.Event.SHOW); + if ($(this.element).css('display') === 'none') { + throw new Error('Please use show on visible elements'); + } + var showEvent = $.Event(this.constructor.Event.SHOW); if (this.isWithContent() && this._isEnabled) { + if (this._isTransitioning) { + throw new Error('Tooltip is transitioning'); + } $(this.element).trigger(showEvent); var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element); if (showEvent.isDefaultPrevented() || !isInTheDom) { @@ -2884,12 +2967,14 @@ var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; var attachment = this._getAttachment(placement); - $(tip).data(this.constructor.DATA_KEY, this).appendTo(document.body); + var container = this.config.container === false ? document.body : $(this.config.container); + $(tip).data(this.constructor.DATA_KEY, this).appendTo(container); + $(this.element).trigger(this.constructor.Event.INSERTED); this._tether = new Tether({ attachment: attachment, element: tip, @@ -2902,45 +2987,51 @@ }); Util.reflow(tip); this._tether.position(); - $(tip).addClass(ClassName.IN); + $(tip).addClass(ClassName.SHOW); var complete = function complete() { - var prevHoverState = _this16._hoverState; - _this16._hoverState = null; + var prevHoverState = _this22._hoverState; + _this22._hoverState = null; + _this22._isTransitioning = false; - $(_this16.element).trigger(_this16.constructor.Event.SHOWN); + $(_this22.element).trigger(_this22.constructor.Event.SHOWN); if (prevHoverState === HoverState.OUT) { - _this16._leave(null, _this16); + _this22._leave(null, _this22); } }; if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) { + this._isTransitioning = true; $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION); return; } complete(); } }; Tooltip.prototype.hide = function hide(callback) { - var _this17 = this; + var _this23 = this; var tip = this.getTipElement(); var hideEvent = $.Event(this.constructor.Event.HIDE); + if (this._isTransitioning) { + throw new Error('Tooltip is transitioning'); + } var complete = function complete() { - if (_this17._hoverState !== HoverState.IN && tip.parentNode) { + if (_this23._hoverState !== HoverState.SHOW && tip.parentNode) { tip.parentNode.removeChild(tip); } - _this17.element.removeAttribute('aria-describedby'); - $(_this17.element).trigger(_this17.constructor.Event.HIDDEN); - _this17.cleanupTether(); + _this23.element.removeAttribute('aria-describedby'); + $(_this23.element).trigger(_this23.constructor.Event.HIDDEN); + _this23._isTransitioning = false; + _this23.cleanupTether(); if (callback) { callback(); } }; @@ -2949,14 +3040,18 @@ if (hideEvent.isDefaultPrevented()) { return; } - $(tip).removeClass(ClassName.IN); + $(tip).removeClass(ClassName.SHOW); - if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) { + this._activeTrigger[Trigger.CLICK] = false; + this._activeTrigger[Trigger.FOCUS] = false; + this._activeTrigger[Trigger.HOVER] = false; + if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) { + this._isTransitioning = true; $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION); } else { complete(); } @@ -2976,11 +3071,11 @@ Tooltip.prototype.setContent = function setContent() { var $tip = $(this.getTipElement()); this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle()); - $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN); + $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW); this.cleanupTether(); }; Tooltip.prototype.setElementContent = function setElementContent($element, content) { @@ -3020,23 +3115,33 @@ Tooltip.prototype._getAttachment = function _getAttachment(placement) { return AttachmentMap[placement.toUpperCase()]; }; Tooltip.prototype._setListeners = function _setListeners() { - var _this18 = this; + var _this24 = this; var triggers = this.config.trigger.split(' '); triggers.forEach(function (trigger) { if (trigger === 'click') { - $(_this18.element).on(_this18.constructor.Event.CLICK, _this18.config.selector, $.proxy(_this18.toggle, _this18)); + $(_this24.element).on(_this24.constructor.Event.CLICK, _this24.config.selector, function (event) { + return _this24.toggle(event); + }); } else if (trigger !== Trigger.MANUAL) { - var eventIn = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSEENTER : _this18.constructor.Event.FOCUSIN; - var eventOut = trigger === Trigger.HOVER ? _this18.constructor.Event.MOUSELEAVE : _this18.constructor.Event.FOCUSOUT; + var eventIn = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSEENTER : _this24.constructor.Event.FOCUSIN; + var eventOut = trigger === Trigger.HOVER ? _this24.constructor.Event.MOUSELEAVE : _this24.constructor.Event.FOCUSOUT; - $(_this18.element).on(eventIn, _this18.config.selector, $.proxy(_this18._enter, _this18)).on(eventOut, _this18.config.selector, $.proxy(_this18._leave, _this18)); + $(_this24.element).on(eventIn, _this24.config.selector, function (event) { + return _this24._enter(event); + }).on(eventOut, _this24.config.selector, function (event) { + return _this24._leave(event); + }); } + + $(_this24.element).closest('.modal').on('hide.bs.modal', function () { + return _this24.hide(); + }); }); if (this.config.selector) { this.config = $.extend({}, this.config, { trigger: 'manual', @@ -3067,26 +3172,26 @@ if (event) { context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; } - if ($(context.getTipElement()).hasClass(ClassName.IN) || context._hoverState === HoverState.IN) { - context._hoverState = HoverState.IN; + if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) { + context._hoverState = HoverState.SHOW; return; } clearTimeout(context._timeout); - context._hoverState = HoverState.IN; + context._hoverState = HoverState.SHOW; if (!context.config.delay || !context.config.delay.show) { context.show(); return; } context._timeout = setTimeout(function () { - if (context._hoverState === HoverState.IN) { + if (context._hoverState === HoverState.SHOW) { context.show(); } }, context.config.delay.show); }; @@ -3166,11 +3271,11 @@ // static Tooltip._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { var data = $(this).data(DATA_KEY); - var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null; + var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' && config; if (!data && /dispose|hide/.test(config)) { return; } @@ -3244,11 +3349,11 @@ return Tooltip; }(jQuery); /** * -------------------------------------------------------------------------- - * Bootstrap (v4.0.0-alpha.5): popover.js + * Bootstrap (v4.0.0-alpha.6): popover.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ var Popover = function ($) { @@ -3258,11 +3363,11 @@ * Constants * ------------------------------------------------------------------------ */ var NAME = 'popover'; - var VERSION = '4.0.0-alpha.5'; + var VERSION = '4.0.0-alpha.6'; var DATA_KEY = 'bs.popover'; var EVENT_KEY = '.' + DATA_KEY; var JQUERY_NO_CONFLICT = $.fn[NAME]; var Default = $.extend({}, Tooltip.Default, { @@ -3276,11 +3381,11 @@ content: '(string|element|function)' }); var ClassName = { FADE: 'fade', - IN: 'in' + SHOW: 'show' }; var Selector = { TITLE: '.popover-title', CONTENT: '.popover-content' @@ -3329,10 +3434,10 @@ // we use append for html objects to maintain js events this.setElementContent($tip.find(Selector.TITLE), this.getTitle()); this.setElementContent($tip.find(Selector.CONTENT), this._getContent()); - $tip.removeClass(ClassName.FADE).removeClass(ClassName.IN); + $tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW); this.cleanupTether(); }; // private