aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorJohann-S <[email protected]>2017-06-14 13:21:49 +0200
committerGitHub <[email protected]>2017-06-14 13:21:49 +0200
commitf0124769c9850bea321cbd82d6250b756a52bb52 (patch)
treee3a1f8867bae18511a9f0aa80dae22b5a4bb81c3 /js
parentddf0dbbd29e556518f5f4baa3c6ba25a9891fe7b (diff)
downloadbootstrap-f0124769c9850bea321cbd82d6250b756a52bb52.tar.xz
bootstrap-f0124769c9850bea321cbd82d6250b756a52bb52.zip
Collapse supports multi-target thanks to @vanduynslagerp (#22713)
Diffstat (limited to 'js')
-rw-r--r--js/src/collapse.js35
-rw-r--r--js/tests/unit/collapse.js93
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')
+ })
})