diff options
| author | galczo5 <[email protected]> | 2018-10-20 13:27:51 +0200 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2018-10-20 14:27:51 +0300 |
| commit | 6cbcd03efbcb58e37e4a4d31048758c82ed6c849 (patch) | |
| tree | c8ae64576c1c56d7f4f944ab89fe381ffe5976e2 /js | |
| parent | 5088f02730a38bf833db3a8ac1f3c53c154278bc (diff) | |
| download | bootstrap-6cbcd03efbcb58e37e4a4d31048758c82ed6c849.tar.xz bootstrap-6cbcd03efbcb58e37e4a4d31048758c82ed6c849.zip | |
Add `show` and `hide` methods to dropdown (#27370)
Diffstat (limited to 'js')
| -rw-r--r-- | js/src/dropdown.js | 46 | ||||
| -rw-r--r-- | js/tests/unit/dropdown.js | 264 |
2 files changed, 310 insertions, 0 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js index a7a77cb3b..e52c51e4d 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -194,6 +194,52 @@ 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 + } + + const relatedTarget = { + relatedTarget: this._element + } + const hideEvent = $.Event(Event.HIDE, relatedTarget) + + const parent = Dropdown._getParentFromElement(this._element) + $(parent).trigger(hideEvent) + + if (hideEvent.isDefaultPrevented()) { + return + } + + $(this._menu).toggleClass(ClassName.SHOW) + $(parent) + .toggleClass(ClassName.SHOW) + .trigger($.Event(Event.HIDDEN, relatedTarget)) + } + dispose() { $.removeData(this._element, DATA_KEY) $(this._element).off(EVENT_KEY) diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js index 40489c5f2..fd9b7f962 100644 --- a/js/tests/unit/dropdown.js +++ b/js/tests/unit/dropdown.js @@ -1097,4 +1097,268 @@ $(function () { assert.ok(dropdown._menu === null) assert.ok(dropdown._element === null) }) + + QUnit.test('should show dropdown', function (assert) { + assert.expect(2) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + var done = assert.async() + + $dropdown + .parent('.dropdown') + .on('show.bs.dropdown', function () { + assert.ok(true, 'show was fired') + }) + .on('shown.bs.dropdown', function () { + assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown') + done() + }) + + dropdown.show() + }) + + QUnit.test('should hide dropdown', function (assert) { + assert.expect(2) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + var done = assert.async() + $dropdown.trigger('click') + + $dropdown + .parent('.dropdown') + .on('hide.bs.dropdown', function () { + assert.ok(true, 'hide was fired') + }) + .on('hidden.bs.dropdown', function () { + assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is hidden') + done() + }) + + dropdown.hide() + }) + + QUnit.test('should not hide dropdown', function (assert) { + assert.expect(1) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + $dropdown.trigger('click') + dropdown.show() + + assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is still shown') + }) + + QUnit.test('should not show dropdown', function (assert) { + assert.expect(1) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + dropdown.hide() + assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is still hidden') + }) + + QUnit.test('should show dropdown', function (assert) { + assert.expect(2) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + var done = assert.async() + + $dropdown + .parent('.dropdown') + .on('show.bs.dropdown', function () { + assert.ok(true, 'show was fired') + }) + .on('shown.bs.dropdown', function () { + assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown') + done() + }) + + dropdown.show() + }) + + QUnit.test('should prevent default event on show method call', function (assert) { + assert.expect(1) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + var done = assert.async() + + $dropdown + .parent('.dropdown') + .on('show.bs.dropdown', function (event) { + event.preventDefault() + done() + }) + + dropdown.show() + assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is hidden') + }) + + QUnit.test('should prevent default event on hide method call', function (assert) { + assert.expect(1) + + var dropdownHTML = + '<div class="dropdown">' + + ' <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var dropdown = $dropdown.data('bs.dropdown') + var done = assert.async() + $dropdown.trigger('click') + + $dropdown + .parent('.dropdown') + .on('hide.bs.dropdown', function (event) { + event.preventDefault() + done() + }) + + dropdown.hide() + assert.ok($dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu is shown') + }) + + QUnit.test('should not open dropdown via show method if target is disabled via attribute', function (assert) { + assert.expect(1) + var dropdownHTML = + '<div class="dropdown">' + + ' <button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + $(dropdownHTML).appendTo('#qunit-fixture') + var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown() + $dropdown.show() + assert.ok(!$dropdown.parent('.dropdown').hasClass('show')) + }) + + QUnit.test('should not open dropdown via show method if target is disabled via class', function (assert) { + assert.expect(1) + var dropdownHTML = + '<div class="dropdown">' + + ' <button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + $(dropdownHTML).appendTo('#qunit-fixture') + var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown() + $dropdown.show() + assert.ok(!$dropdown.parent('.dropdown').hasClass('show')) + }) + + QUnit.test('should not hide dropdown via hide method if target is disabled via attribute', function (assert) { + assert.expect(1) + var dropdownHTML = + '<div class="dropdown show">' + + ' <button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + $(dropdownHTML).appendTo('#qunit-fixture') + var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown() + $dropdown.hide() + assert.ok($dropdown.parent('.dropdown').hasClass('show')) + }) + + QUnit.test('should not hide dropdown via hide method if target is disabled via class', function (assert) { + assert.expect(1) + var dropdownHTML = + '<div class="dropdown show">' + + ' <button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' + + ' <div class="dropdown-menu">' + + ' <a class="dropdown-item" href="#">Another link</a>' + + ' </div>' + + '</div>' + + $(dropdownHTML).appendTo('#qunit-fixture') + var $dropdown = $('#qunit-fixture').find('[data-toggle="dropdown"]').bootstrapDropdown() + $dropdown.hide() + assert.ok($dropdown.parent('.dropdown').hasClass('show')) + }) }) |
