diff options
| author | Johann-S <[email protected]> | 2019-08-25 18:12:02 +0200 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2019-08-27 16:32:25 +0300 |
| commit | ef1c7aadbc61c69e03ecc7c6e13bdccd1901cbd4 (patch) | |
| tree | aa936dcac6452b6e63259a58a01604da0e9ca05d | |
| parent | dd181e91bd174776cf81a8747d39d1d2f89c339e (diff) | |
| download | bootstrap-ef1c7aadbc61c69e03ecc7c6e13bdccd1901cbd4.tar.xz bootstrap-ef1c7aadbc61c69e03ecc7c6e13bdccd1901cbd4.zip | |
Backport #29298
dropdown show method should do the same as toggle
| -rw-r--r-- | bundlesize.config.json | 2 | ||||
| -rw-r--r-- | js/src/dropdown.js | 39 | ||||
| -rw-r--r-- | js/tests/unit/dropdown.js | 37 |
3 files changed, 51 insertions, 27 deletions
diff --git a/bundlesize.config.json b/bundlesize.config.json index 8c33e3abb..6a5bfd27b 100644 --- a/bundlesize.config.json +++ b/bundlesize.config.json @@ -26,7 +26,7 @@ }, { "path": "./dist/js/bootstrap.bundle.js", - "maxSize": "47 kB" + "maxSize": "47.50 kB" }, { "path": "./dist/js/bootstrap.bundle.min.js", diff --git a/js/src/dropdown.js b/js/src/dropdown.js index f38712e47..48125517e 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -126,7 +126,6 @@ class Dropdown { return } - const parent = Dropdown._getParentFromElement(this._element) const isActive = $(this._menu).hasClass(ClassName.SHOW) Dropdown._clearMenus() @@ -135,10 +134,19 @@ class Dropdown { return } + this.show(true) + } + + show(usePopper = false) { + if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) { + return + } + const relatedTarget = { relatedTarget: this._element } const showEvent = $.Event(Event.SHOW, relatedTarget) + const parent = Dropdown._getParentFromElement(this._element) $(parent).trigger(showEvent) @@ -147,7 +155,7 @@ class Dropdown { } // Disable totally Popper.js for Dropdown in Navbar - if (!this._inNavbar) { + if (!this._inNavbar && usePopper) { /** * Check for Popper dependency * Popper - https://popper.js.org @@ -196,29 +204,6 @@ class Dropdown { .trigger($.Event(Event.SHOWN, relatedTarget)) } - show() { - if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) { - return - } - - const relatedTarget = { - relatedTarget: this._element - } - const showEvent = $.Event(Event.SHOW, relatedTarget) - const parent = Dropdown._getParentFromElement(this._element) - - $(parent).trigger(showEvent) - - if (showEvent.isDefaultPrevented()) { - return - } - - $(this._menu).toggleClass(ClassName.SHOW) - $(parent) - .toggleClass(ClassName.SHOW) - .trigger($.Event(Event.SHOWN, relatedTarget)) - } - hide() { if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) { return @@ -236,6 +221,10 @@ class Dropdown { return } + if (this._popper) { + this._popper.destroy() + } + $(this._menu).toggleClass(ClassName.SHOW) $(parent) .toggleClass(ClassName.SHOW) diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js index 07702e2f6..bfe5aebf5 100644 --- a/js/tests/unit/dropdown.js +++ b/js/tests/unit/dropdown.js @@ -1272,7 +1272,7 @@ $(function () { }) QUnit.test('should show dropdown', function (assert) { - assert.expect(2) + assert.expect(3) var dropdownHTML = '<div class="dropdown">' + @@ -1293,6 +1293,7 @@ $(function () { $dropdown .parent('.dropdown') .on('show.bs.dropdown', function () { + assert.ok(dropdown._popper === null) assert.ok(true, 'show was fired') }) .on('shown.bs.dropdown', function () { @@ -1550,4 +1551,38 @@ $(function () { dropdown1.toggle() }) + + QUnit.test('should hide a dropdown and destroy popper', function (assert) { + assert.expect(1) + var done = assert.async() + + var fixtureHtml = [ + '<div class="dropdown">', + ' <button href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>', + ' <div class="dropdown-menu">', + ' <a class="dropdown-item" href="#">Secondary link</a>', + ' </div>', + '</div>' + ].join('') + + $(fixtureHtml).appendTo('#qunit-fixture') + + var $dropdownEl = $('.dropdown') + var dropdown = $('[data-toggle="dropdown"]') + .bootstrapDropdown() + .data('bs.dropdown') + var spyPopper + + $dropdownEl.one('shown.bs.dropdown', function () { + spyPopper = sinon.spy(dropdown._popper, 'destroy') + dropdown.hide() + }) + + $dropdownEl.one('hidden.bs.dropdown', function () { + assert.ok(spyPopper.called) + done() + }) + + dropdown.show(true) + }) }) |
