From ab39defe74914109df164c823af927de68320d55 Mon Sep 17 00:00:00 2001 From: Pierre Vanduynslager Date: Tue, 25 Apr 2017 03:32:14 -0400 Subject: [PATCH 01/10] Detach accordion from card without requiring 'data-children' --- js/src/collapse.js | 16 +++------ js/tests/unit/collapse.js | 76 ++++++++++++++++++++++++++++++++++----- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/js/src/collapse.js b/js/src/collapse.js index dec272297..bf1c738f5 100644 --- a/js/src/collapse.js +++ b/js/src/collapse.js @@ -56,9 +56,8 @@ const Collapse = (($) => { } const Selector = { - ACTIVES : '.card > .show, .card > .collapsing', - DATA_TOGGLE : '[data-toggle="collapse"]', - DATA_CHILDREN : 'data-children' + ACTIVES : '.show, .collapsing', + DATA_TOGGLE : '[data-toggle="collapse"]' } @@ -78,20 +77,13 @@ const Collapse = (($) => { `[data-toggle="collapse"][href="#${element.id}"],` + `[data-toggle="collapse"][data-target="#${element.id}"]` )) + this._parent = this._config.parent ? this._getParent() : null if (!this._config.parent) { this._addAriaAndCollapsedClass(this._element, this._triggerArray) } - this._selectorActives = Selector.ACTIVES - if (this._parent) { - const childrenSelector = this._parent.hasAttribute(Selector.DATA_CHILDREN) ? this._parent.getAttribute(Selector.DATA_CHILDREN) : null - if (childrenSelector !== null) { - this._selectorActives = `${childrenSelector} > .show, ${childrenSelector} > .collapsing` - } - } - if (this._config.toggle) { this.toggle() } @@ -129,7 +121,7 @@ const Collapse = (($) => { let activesData if (this._parent) { - actives = $.makeArray($(this._parent).find(this._selectorActives)) + actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES)) if (!actives.length) { actives = null } diff --git a/js/tests/unit/collapse.js b/js/tests/unit/collapse.js index 35fcf2108..2b9d0e58f 100644 --- a/js/tests/unit/collapse.js +++ b/js/tests/unit/collapse.js @@ -491,27 +491,85 @@ $(function () { }) QUnit.test('should allow accordion to use children other than card', function (assert) { - assert.expect(2) + assert.expect(4) var done = assert.async() - var accordionHTML = '
' + var accordionHTML = '
' + '
' + '' + '
' + '
' + '
' - + '' + + '' + '
' + '
' + '
' $(accordionHTML).appendTo('#qunit-fixture') - var $target = $('#linkTrigger') - $('#collapseOne').on('shown.bs.collapse', function () { - assert.ok($(this).hasClass('show')) - assert.ok(!$('#collapseTwo').hasClass('show')) - done() + var $trigger = $('#linkTrigger') + var $triggerTwo = $('#linkTriggerTwo') + var $collapseOne = $('#collapseOne') + var $collapseTwo = $('#collapseTwo') + $collapseOne.on('shown.bs.collapse', function () { + assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown') + assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown') + $collapseTwo.on('shown.bs.collapse', function () { + assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown') + assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown') + done() + }) + $triggerTwo.trigger($.Event('click')) }) - $target.trigger($.Event('click')) + $trigger.trigger($.Event('click')) + }) + + QUnit.test('should collapse accordion children but not nested accordion children', function (assert) { + assert.expect(9) + var done = assert.async() + $('
' + + '
' + + '' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '
').appendTo('#qunit-fixture') + var $trigger = $('#linkTrigger') + var $triggerTwo = $('#linkTriggerTwo') + var $nestedTrigger = $('#nestedLinkTrigger') + var $collapseOne = $('#collapseOne') + var $collapseTwo = $('#collapseTwo') + var $nestedCollapseOne = $('#nestedCollapseOne') + + + $collapseOne.one('shown.bs.collapse', function () { + assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown') + assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown') + assert.ok(!$('#nestedCollapseOne').hasClass('show'), '#nestedCollapseOne is not shown') + $nestedCollapseOne.one('shown.bs.collapse', function () { + assert.ok($collapseOne.hasClass('show'), '#collapseOne is shown') + assert.ok(!$collapseTwo.hasClass('show'), '#collapseTwo is not shown') + assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown') + $collapseTwo.one('shown.bs.collapse', function () { + assert.ok(!$collapseOne.hasClass('show'), '#collapseOne is not shown') + assert.ok($collapseTwo.hasClass('show'), '#collapseTwo is shown') + assert.ok($nestedCollapseOne.hasClass('show'), '#nestedCollapseOne is shown') + done() + }) + $triggerTwo.trigger($.Event('click')) + }) + $nestedTrigger.trigger($.Event('click')) + }) + $trigger.trigger($.Event('click')) }) QUnit.test('should not prevent event for input', function (assert) { From 33715a73d2eae3865cb4c1e0a13d1da4b6aeb278 Mon Sep 17 00:00:00 2001 From: Anna Date: Wed, 26 Apr 2017 19:46:05 +0300 Subject: [PATCH 02/10] Fix Toggle buttons don't honor [disabled] or .disabled --- js/src/button.js | 6 ++++++ js/tests/unit/button.js | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/js/src/button.js b/js/src/button.js index 6295d0db0..722fd489d 100644 --- a/js/src/button.js +++ b/js/src/button.js @@ -90,6 +90,12 @@ const Button = (($) => { } if (triggerChangeEvent) { + if (input.hasAttribute('disabled') || + rootElement.hasAttribute('disabled') || + input.classList.contains('disabled') || + rootElement.classList.contains('disabled')) { + return + } input.checked = !$(this._element).hasClass(ClassName.ACTIVE) $(input).trigger('change') } diff --git a/js/tests/unit/button.js b/js/tests/unit/button.js index abc04e10a..489d400a6 100644 --- a/js/tests/unit/button.js +++ b/js/tests/unit/button.js @@ -156,4 +156,21 @@ $(function () { assert.ok($btn2.is(':not([aria-pressed])'), 'label for nested radio input has not been given an aria-pressed attribute') }) + QUnit.test('should handle disabled attribute on non-button elements', function (assert) { + assert.expect(2) + var groupHTML = '
' + + '' + + '
' + var $group = $(groupHTML).appendTo('#qunit-fixture') + + var $btn = $group.children().eq(0) + var $input = $btn.children().eq(0) + + $btn.trigger('click') + assert.ok($btn.is(':not(.active)'), 'button did not become active') + assert.ok(!$input.is(':checked'), 'checkbox did not get checked') + }) + }) From d336adfafdf2c8edf8715a9d5dc3becaee819483 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Thu, 27 Apr 2017 23:03:17 +0200 Subject: [PATCH 03/10] Fix build by installing grunt dependencies before js-test-cloud --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ab1185bd7..4833746d1 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,9 @@ "js-minify": "uglifyjs --compress warnings=false --mangle --comments '/^!/' --output dist/js/bootstrap.min.js dist/js/bootstrap.js", "js-minify-docs": "uglifyjs --compress warnings=false --mangle --comments '/^!/' --output docs/assets/js/docs.min.js docs/assets/js/vendor/anchor.min.js docs/assets/js/vendor/clipboard.min.js docs/assets/js/vendor/holder.min.js docs/assets/js/src/application.js", "js-test": "phantomjs ./node_modules/qunit-phantomjs-runner/runner.js js/tests/index.html 60", - "js-test-cloud": "ruby -run -ehttpd . -p3000 > /dev/null & grunt saucelabs-qunit", + "js-test-dep": "npm install grunt && npm install grunt-saucelabs", + "js-launch-cloud": "ruby -run -ehttpd . -p3000 > /dev/null & grunt saucelabs-qunit", + "js-test-cloud": "npm-run-all js-test-dep js-launch-cloud", "docs": "npm-run-all docs-compile docs-lint", "docs-lint": "htmlhint --config docs/.htmlhintrc _gh_pages/ js/tests/visual/ && htmllint --rc docs/.htmllintrc _gh_pages/*.html _gh_pages/**/*.html js/tests/visual/*.html", "docs-clean": "shx rm -r docs/dist/* && shx cp -r dist/* docs/dist/", @@ -76,8 +78,6 @@ "babel-preset-es2015": "^7.0.0-alpha.7", "clean-css-cli": "^4.0.12", "eslint": "^3.19.0", - "grunt": "^1.0.1", - "grunt-saucelabs": "^9.0.0", "htmlhint": "^0.9.13", "htmllint-cli": "^0.0.6", "node-sass": "^4.5.2", From ebf0c3104e8c70daeb77696277e22366ec144b88 Mon Sep 17 00:00:00 2001 From: Johann-S Date: Thu, 27 Apr 2017 23:20:29 +0200 Subject: [PATCH 04/10] Run js-test locally before js-test-cloud --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4833746d1..28937f563 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "release-version": "node build/change-version.js", "release-zip": "cd dist/ && zip -r9 bootstrap-$npm_package_version-dist.zip * && shx mv bootstrap-$npm_package_version-dist.zip ..", "dist": "npm-run-all --parallel css js", - "test": "npm-run-all dist docs" + "test": "npm-run-all dist js-test docs" }, "style": "dist/css/bootstrap.css", "sass": "scss/bootstrap.scss", From f7f644a4e52a7e875d5c8574d2a8b7fd919e5005 Mon Sep 17 00:00:00 2001 From: "Patrick H. Lauke" Date: Thu, 27 Apr 2017 23:57:10 +0100 Subject: [PATCH 05/10] Documentation cleanup (inc. use of for static form controls example) * Fix incorrect code indentation * Remove unnecessary vendor prefix for `box-sizing` - all modern browsers now support this unprefixed * Remove incorrect `