diff options
| author | Johann-S <[email protected]> | 2017-06-14 13:21:49 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-06-14 13:21:49 +0200 |
| commit | f0124769c9850bea321cbd82d6250b756a52bb52 (patch) | |
| tree | e3a1f8867bae18511a9f0aa80dae22b5a4bb81c3 /js | |
| parent | ddf0dbbd29e556518f5f4baa3c6ba25a9891fe7b (diff) | |
| download | bootstrap-f0124769c9850bea321cbd82d6250b756a52bb52.tar.xz bootstrap-f0124769c9850bea321cbd82d6250b756a52bb52.zip | |
Collapse supports multi-target thanks to @vanduynslagerp (#22713)
Diffstat (limited to 'js')
| -rw-r--r-- | js/src/collapse.js | 35 | ||||
| -rw-r--r-- | js/tests/unit/collapse.js | 93 |
2 files changed, 116 insertions, 12 deletions
diff --git a/js/src/collapse.js b/js/src/collapse.js index bf1c738f5..78ed32906 100644 --- a/js/src/collapse.js +++ b/js/src/collapse.js @@ -77,6 +77,14 @@ const Collapse = (($) => { `[data-toggle="collapse"][href="#${element.id}"],` + `[data-toggle="collapse"][data-target="#${element.id}"]` )) + const tabToggles = $(Selector.DATA_TOGGLE) + for (let i = 0; i < tabToggles.length; i++) { + const elem = tabToggles[i] + const selector = Util.getSelectorFromElement(elem) + if (selector !== null && $(selector).filter(element).length > 0) { + this._triggerArray.push(elem) + } + } this._parent = this._config.parent ? this._getParent() : null @@ -215,9 +223,17 @@ const Collapse = (($) => { .removeClass(ClassName.SHOW) if (this._triggerArray.length) { - $(this._triggerArray) - .addClass(ClassName.COLLAPSED) - .attr('aria-expanded', false) + for (let i = 0; i < this._triggerArray.length; i++) { + const trigger = this._triggerArray[i] + const selector = Util.getSelectorFromElement(trigger) + if (selector !== null) { + const $elem = $(selector) + if (!$elem.hasClass(ClassName.SHOW)) { + $(trigger).addClass(ClassName.COLLAPSED) + .attr('aria-expanded', false) + } + } + } } this.setTransitioning(true) @@ -349,11 +365,14 @@ const Collapse = (($) => { event.preventDefault() } - const target = Collapse._getTargetFromElement(this) - const data = $(target).data(DATA_KEY) - const config = data ? 'toggle' : $(this).data() - - Collapse._jQueryInterface.call($(target), config) + const $trigger = $(this) + const selector = Util.getSelectorFromElement(this) + $(selector).each(function () { + const $target = $(this) + const data = $target.data(DATA_KEY) + const config = data ? 'toggle' : $trigger.data() + Collapse._jQueryInterface.call($target, config) + }) }) diff --git a/js/tests/unit/collapse.js b/js/tests/unit/collapse.js index 2b9d0e58f..0e9e8b6a7 100644 --- a/js/tests/unit/collapse.js +++ b/js/tests/unit/collapse.js @@ -52,8 +52,28 @@ $(function () { assert.ok(!/height/i.test($el.attr('style')), 'has height reset') }) + + QUnit.test('should show multiple collapsed elements', function (assert) { + assert.expect(4) + var done = assert.async() + var $target = $('<a role="button" data-toggle="collapse" class="collapsed" href=".multi"/>').appendTo('#qunit-fixture') + var $el = $('<div class="collapse multi"/>').appendTo('#qunit-fixture') + var $el2 = $('<div class="collapse multi"/>').appendTo('#qunit-fixture') + $el.one('shown.bs.collapse', function () { + assert.ok($el.hasClass('show'), 'has class "show"') + assert.ok(!/height/i.test($el.attr('style')), 'has height reset') + }) + $el2.one('shown.bs.collapse', function () { + assert.ok($el2.hasClass('show'), 'has class "show"') + assert.ok(!/height/i.test($el2.attr('style')), 'has height reset') + done() + }) + $target.trigger('click') + }) + QUnit.test('should collapse only the first collapse', function (assert) { assert.expect(2) + var done = assert.async() var html = [ '<div class="panel-group" id="accordion1">', '<div class="panel">', @@ -69,10 +89,11 @@ $(function () { $(html).appendTo('#qunit-fixture') var $el1 = $('#collapse1') var $el2 = $('#collapse2') - $el1.bootstrapCollapse('show') - - assert.ok($el1.hasClass('show')) - assert.ok($el2.hasClass('show')) + $el1.one('shown.bs.collapse', function () { + assert.ok($el1.hasClass('show')) + assert.ok($el2.hasClass('show')) + done() + }).bootstrapCollapse('show') }) QUnit.test('should hide a collapsed element', function (assert) { @@ -588,4 +609,68 @@ $(function () { $target.trigger($.Event('click')) }) + + QUnit.test('should add "collapsed" class to triggers only when all the targeted collapse are hidden', function (assert) { + assert.expect(9) + var done = assert.async() + + var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture') + var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture') + var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture') + + var $target1 = $('<div id="test1" class="multi"/>').appendTo('#qunit-fixture') + var $target2 = $('<div id="test2" class="multi"/>').appendTo('#qunit-fixture') + + $target2.one('shown.bs.collapse', function () { + assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class') + assert.ok(!$trigger2.hasClass('collapsed'), 'trigger2 does not have collapsed class') + assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class') + $target2.one('hidden.bs.collapse', function () { + assert.ok(!$trigger1.hasClass('collapsed'), 'trigger1 does not have collapsed class') + assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class') + assert.ok(!$trigger3.hasClass('collapsed'), 'trigger3 does not have collapsed class') + $target1.one('hidden.bs.collapse', function () { + assert.ok($trigger1.hasClass('collapsed'), 'trigger1 has collapsed class') + assert.ok($trigger2.hasClass('collapsed'), 'trigger2 has collapsed class') + assert.ok($trigger3.hasClass('collapsed'), 'trigger3 has collapsed class') + done() + }) + $trigger1.trigger('click') + }) + $trigger2.trigger('click') + }) + $trigger3.trigger('click') + }) + + QUnit.test('should set aria-expanded="true" to triggers targetting shown collaspe and aria-expanded="false" only when all the targeted collapses are shown', function (assert) { + assert.expect(9) + var done = assert.async() + + var $trigger1 = $('<a role="button" data-toggle="collapse" href="#test1"/>').appendTo('#qunit-fixture') + var $trigger2 = $('<a role="button" data-toggle="collapse" href="#test2"/>').appendTo('#qunit-fixture') + var $trigger3 = $('<a role="button" data-toggle="collapse" href=".multi"/>').appendTo('#qunit-fixture') + + var $target1 = $('<div id="test1" class="multi collapse"/>').appendTo('#qunit-fixture') + var $target2 = $('<div id="test2" class="multi collapse"/>').appendTo('#qunit-fixture') + + $target2.one('shown.bs.collapse', function () { + assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"') + assert.strictEqual($trigger2.attr('aria-expanded'), 'true', 'aria-expanded on trigger2 is "true"') + assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"') + $target2.one('hidden.bs.collapse', function () { + assert.strictEqual($trigger1.attr('aria-expanded'), 'true', 'aria-expanded on trigger1 is "true"') + assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"') + assert.strictEqual($trigger3.attr('aria-expanded'), 'true', 'aria-expanded on trigger3 is "true"') + $target1.one('hidden.bs.collapse', function () { + assert.strictEqual($trigger1.attr('aria-expanded'), 'false', 'aria-expanded on trigger1 is "fasle"') + assert.strictEqual($trigger2.attr('aria-expanded'), 'false', 'aria-expanded on trigger2 is "false"') + assert.strictEqual($trigger3.attr('aria-expanded'), 'false', 'aria-expanded on trigger3 is "false"') + done() + }) + $trigger1.trigger('click') + }) + $trigger2.trigger('click') + }) + $trigger3.trigger('click') + }) }) |
