From: Martijn Cuppens Date: Wed, 3 Jan 2018 14:40:58 +0000 (+0100) Subject: Multiple accordion support (#25161) X-Git-Tag: v4.0.0~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1d134f8a8a93ae82f8553674d3c5f8b76c504ad;p=thirdparty%2Fbootstrap.git Multiple accordion support (#25161) --- diff --git a/js/src/collapse.js b/js/src/collapse.js index eaad1be541..b0c17112c6 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 337ec647b6..f34225dd3b 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 = '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + $(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()