diff options
| author | Martijn Cuppens <[email protected]> | 2018-01-03 15:40:58 +0100 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2018-01-03 16:40:58 +0200 |
| commit | a1d134f8a8a93ae82f8553674d3c5f8b76c504ad (patch) | |
| tree | 7a331ae59ead17e3f983c0741da75e1a5c21e81b | |
| parent | 7044ea82c17853c4d6d3483114b860ce4a5cf7b1 (diff) | |
| download | bootstrap-a1d134f8a8a93ae82f8553674d3c5f8b76c504ad.tar.xz bootstrap-a1d134f8a8a93ae82f8553674d3c5f8b76c504ad.zip | |
Multiple accordion support (#25161)
| -rw-r--r-- | js/src/collapse.js | 5 | ||||
| -rw-r--r-- | js/tests/unit/collapse.js | 75 |
2 files changed, 78 insertions, 2 deletions
diff --git a/js/src/collapse.js b/js/src/collapse.js index eaad1be54..b0c17112c 100644 --- a/js/src/collapse.js +++ b/js/src/collapse.js @@ -83,6 +83,7 @@ const Collapse = (($) => { const elem = tabToggles[i] const selector = Util.getSelectorFromElement(elem) if (selector !== null && $(selector).filter(element).length > 0) { + this._selector = selector this._triggerArray.push(elem) } } @@ -141,7 +142,7 @@ const Collapse = (($) => { } if (actives) { - activesData = $(actives).data(DATA_KEY) + activesData = $(actives).not(this._selector).data(DATA_KEY) if (activesData && activesData._isTransitioning) { return } @@ -154,7 +155,7 @@ const Collapse = (($) => { } if (actives) { - Collapse._jQueryInterface.call($(actives), 'hide') + Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide') if (!activesData) { $(actives).data(DATA_KEY, null) } diff --git a/js/tests/unit/collapse.js b/js/tests/unit/collapse.js index 337ec647b..f34225dd3 100644 --- a/js/tests/unit/collapse.js +++ b/js/tests/unit/collapse.js @@ -581,6 +581,81 @@ $(function () { $trigger.trigger($.Event('click')) }) + QUnit.test('should allow accordion to target multiple elements', function (assert) { + assert.expect(8) + var done = assert.async() + var accordionHTML = '<div id="accordion">' + + '<a id="linkTriggerOne" data-toggle="collapse" data-target=".collapseOne" href="#" aria-expanded="false" aria-controls="collapseOne"></a>' + + '<a id="linkTriggerTwo" data-toggle="collapse" data-target=".collapseTwo" href="#" aria-expanded="false" aria-controls="collapseTwo"></a>' + + '<div id="collapseOneOne" class="collapse collapseOne" role="tabpanel" data-parent="#accordion"></div>' + + '<div id="collapseOneTwo" class="collapse collapseOne" role="tabpanel" data-parent="#accordion"></div>' + + '<div id="collapseTwoOne" class="collapse collapseTwo" role="tabpanel" data-parent="#accordion"></div>' + + '<div id="collapseTwoTwo" class="collapse collapseTwo" role="tabpanel" data-parent="#accordion"></div>' + + '</div>' + + $(accordionHTML).appendTo('#qunit-fixture') + var $trigger = $('#linkTriggerOne') + var $triggerTwo = $('#linkTriggerTwo') + var $collapseOneOne = $('#collapseOneOne') + var $collapseOneTwo = $('#collapseOneTwo') + var $collapseTwoOne = $('#collapseTwoOne') + var $collapseTwoTwo = $('#collapseTwoTwo') + var collapsedElements = { + one : false, + two : false + } + + function firstTest() { + assert.ok($collapseOneOne.hasClass('show'), '#collapseOneOne is shown') + assert.ok($collapseOneTwo.hasClass('show'), '#collapseOneTwo is shown') + assert.ok(!$collapseTwoOne.hasClass('show'), '#collapseTwoOne is not shown') + assert.ok(!$collapseTwoTwo.hasClass('show'), '#collapseTwoTwo is not shown') + $triggerTwo.trigger($.Event('click')) + } + + function secondTest() { + assert.ok(!$collapseOneOne.hasClass('show'), '#collapseOneOne is not shown') + assert.ok(!$collapseOneTwo.hasClass('show'), '#collapseOneTwo is not shown') + assert.ok($collapseTwoOne.hasClass('show'), '#collapseTwoOne is shown') + assert.ok($collapseTwoTwo.hasClass('show'), '#collapseTwoTwo is shown') + done() + } + + $collapseOneOne.on('shown.bs.collapse', function () { + if (collapsedElements.one) { + firstTest() + } else { + collapsedElements.one = true + } + }) + + $collapseOneTwo.on('shown.bs.collapse', function () { + if (collapsedElements.one) { + firstTest() + } else { + collapsedElements.one = true + } + }) + + $collapseTwoOne.on('shown.bs.collapse', function () { + if (collapsedElements.two) { + secondTest() + } else { + collapsedElements.two = true + } + }) + + $collapseTwoTwo.on('shown.bs.collapse', function () { + if (collapsedElements.two) { + secondTest() + } else { + collapsedElements.two = true + } + }) + + $trigger.trigger($.Event('click')) + }) + QUnit.test('should collapse accordion children but not nested accordion children', function (assert) { assert.expect(9) var done = assert.async() |
