aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn Cuppens <[email protected]>2018-01-03 15:40:58 +0100
committerXhmikosR <[email protected]>2018-01-03 16:40:58 +0200
commita1d134f8a8a93ae82f8553674d3c5f8b76c504ad (patch)
tree7a331ae59ead17e3f983c0741da75e1a5c21e81b
parent7044ea82c17853c4d6d3483114b860ce4a5cf7b1 (diff)
downloadbootstrap-a1d134f8a8a93ae82f8553674d3c5f8b76c504ad.tar.xz
bootstrap-a1d134f8a8a93ae82f8553674d3c5f8b76c504ad.zip
Multiple accordion support (#25161)
-rw-r--r--js/src/collapse.js5
-rw-r--r--js/tests/unit/collapse.js75
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()