Hi all, I just found a bug with RadioGroup/Radio not honoring their disabled state (It drove me quite mad...).
In RadioGroup submission is processed regardless of the disabled parameter value. In Fields derived from AbstractField submission processing is skipped altogether when the field is disabled (From Abstract Field): [...] private void processSubmission() { if (!disabled) processSubmission(controlName); } [...] The fix should be quite trivial. Anyway I might provide a patch (with test) but I'm not sure as I'm going abroad and don't know if I'll have access to the internet in the next days. While I was debugging it I created a test class [1] and page [2] that can be used to analyse what's going on . One last thing is that the behavior of radio group together with Boolean values (Capital B) is somehow unexpected as it would set the value of the bound property to false even if no selection has been made (that's probably because there is a coercion from null to false - and has nothing to do with the component disabled state anyway). My use case is that I want to force my user to make an explicit decision on some contract agreement. One "solution" could be to ignore standard coercion in RadioGroup iif the bound value class is Boolean bye, Luca [1] public class TestRadio { @Persist @Property private Boolean booleanValue; @Persist @Property private String textValue; @Persist @Property private boolean formDisabled; @Persist @Property private VOWEL_ENUM vowel; public Boolean getOn() { return Boolean.TRUE; } public Boolean getOff() { return Boolean.FALSE; } public VOWEL_ENUM getA() { return VOWEL_ENUM.A; } public VOWEL_ENUM getE() { return VOWEL_ENUM.E; } public VOWEL_ENUM getI() { return VOWEL_ENUM.I; } public VOWEL_ENUM getO() { return VOWEL_ENUM.O; } public VOWEL_ENUM getU() { return VOWEL_ENUM.U; } public boolean isBooleanValueNull() { return booleanValue == null; } public boolean isTextValueNull() { return textValue == null; } public boolean isVowelNull() { return vowel == null; } public void onActionFromResetvalues() { booleanValue = null; textValue = null; } public void onActionFromEnableFormControls() { formDisabled = false; } public void onActionFromDisableFormControls() { formDisabled = true; } public static enum VOWEL_ENUM { A, E, I, O, U; } } [2] <?xml version="1.0" encoding="UTF-8"?> <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" xmlns:p="tapestry:parameter"> <h2>DATA</h2> <p> booleanValue is '${booleanValue}' <t:if test="booleanValueNull"> (NULL)</t:if> </p> <p> textValue is '${textValue}' <t:if test="textValueNull"> (NULL)</t:if> </p> <p> vowel is '${vowel}' <t:if test="vowelNull"> (NULL)</t:if> </p> <t:actionLink t:id="resetvalues">Reset values</t:actionLink> <h2>CONTROL DISABLE STATUS</h2> <t:if test="formDisabled"> <p> Form controls are <b>disabled</b> !! </p> <t:actionLink t:id="enableFormControls">Enable form controls</t:actionLink> <p:else> <p>Form controls are enabled</p> <t:actionLink t:id="disableFormControls">Disable form controls</t:actionLink> </p:else> </t:if> <h2>FORM</h2> <t:form> <b>Expected behavior</b> <p>When disabled I will not update my value</p> <t:label for="textValue" /> <t:textField t:id="textValue" disabled="formDisabled" /> <b>Buggy behavior</b> <p>When disabled I'm still updating my value (and since no value is selected I will set it to null)</p> <t:label for="vowel" /> <t:radioGroup t:id="vowel" disabled="formDisabled"> <t:label for="A" /> <t:radio t:id="A" /> <t:label for="E" /> <t:radio t:id="E" /> <t:label for="I" /> <t:radio t:id="I" /> <t:label for="O" /> <t:radio t:id="O" /> <t:label for="U" /> <t:radio t:id="U" /> </t:radioGroup> <b>Buggy and somehow unexpected behavior</b> <p>When disabled I'm still updating my value.</p> <p>Moreover I'm updating my value to false (possibly because there is a coercion from null to false)</p> <p>This is somehow unexpected as I can't set my value to null (or unselected) even when I'm enabled</p> <t:label for="booleanValue" /> <t:radioGroup t:id="booleanValue" disabled="formDisabled"> <t:label for="on" /> <t:radio t:id="on" /> <t:label for="off" /> <t:radio t:id="off" /> </t:radioGroup> <t:submit /> </t:form> </html>