Skip to content
Permalink
Browse files

Checkboxradio: Properly find radio groups from the associated form

Fixes #9973
Closes gh-1631
  • Loading branch information...
scottgonzalez committed Oct 27, 2015
1 parent 5157c25 commit e77fbe5388abeeb1d0f8f377161a0fc039897594
Showing with 39 additions and 8 deletions.
  1. +7 −0 tests/unit/checkboxradio/checkboxradio.html
  2. +19 −0 tests/unit/checkboxradio/core.js
  3. +13 −8 ui/widgets/checkboxradio.js
@@ -64,6 +64,13 @@
<label>
<input type="checkbox" id="label-with-no-for"/>
</label>

<form id="form3"></form>
<input type="radio" name="crazy-form" id="crazy-form-1" form="form3" checked="checked">
<label for="crazy-form-1">Choice 1</label>
<input type="radio" name="crazy-form" id="crazy-form-2" form="form3">
<label for="crazy-form-2">Choice 2</label>

</div>
</body>
</html>
@@ -49,6 +49,25 @@ asyncTest( "Ensure checked after single click on checkbox label button", functio
} );
} );

test( "Handle form association via form attribute", function( assert ) {
expect( 4 );

var radio1 = $( "#crazy-form-1" ).checkboxradio();
var radio1Label = radio1.checkboxradio( "widget" );
var radio2 = $( "#crazy-form-2" ).checkboxradio();
var radio2Label = radio2.checkboxradio( "widget" );

radio2.change( function() {
ok( this.checked, "#2 checked" );
ok( !radio1[ 0 ].checked, "#1 not checked" );

assert.hasClasses( radio2Label, "ui-state-active" );
assert.lacksClasses( radio1Label, "ui-state-active" );
} );

radio2Label.simulate( "click" );
} );

test( "Checkbox creation requires a label, and finds it in all cases", function( assert ) {
expect( 7 );
var groups = [
@@ -93,9 +93,6 @@ $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {

this._bindFormResetHandler();

// this.form is set by the form-reset-mixin
this.formParent = this.form.length ? this.form : $( "body" );

if ( this.options.disabled == null ) {
this.options.disabled = this.element[ 0 ].disabled;
}
@@ -151,17 +148,25 @@ $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
},

_getRadioGroup: function() {
var group;
var name = this.element[ 0 ].name;
var formParent = this.formParent[ 0 ];
var nameSelector = "input[name='" + $.ui.escapeSelector( name ) + "']";

if ( !name ) {
return $( [] );
}

return this.formParent.find( "[name='" + $.ui.escapeSelector( name ) + "']" ).filter( function() {
var form = $( this ).form();
return ( form.length ? form : $( "body" ) )[ 0 ] === formParent;
} ).not( this.element );
if ( this.form.length ) {
group = $( this.form[ 0 ].elements ).filter( nameSelector );
} else {

// Not inside a form, check all inputs that also are not inside a form
group = $( nameSelector ).filter( function() {
return $( this ).form().length === 0;
} );
}

return group.not( this.element );
},

_toggleClasses: function() {

0 comments on commit e77fbe5

Please sign in to comment.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.