You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Mathias Werlitz (JIRA)" <de...@myfaces.apache.org> on 2009/06/15 18:24:07 UTC

[jira] Created: (TOMAHAWK-1429) t:checkbox not checked correctly after validation error

t:checkbox not checked correctly after validation error
-------------------------------------------------------

                 Key: TOMAHAWK-1429
                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-1429
             Project: MyFaces Tomahawk
          Issue Type: Bug
    Affects Versions: 1.1.8
         Environment: Sun RI, JSF 1.2
            Reporter: Mathias Werlitz


If you use t:selectManyCheckbox with layout="spread" and t:checkbox the selection of the checkboxes after an validation error is incorrect. When using layout="pageDirection" it is correct.

When using layout="spread" and t:checkbox HtmlCheckboxRenderer renders the last successfully validated component values (intenally stored HtmlSelectManyCheckbox.value) checked after an validation error. This is not correct. It should render the checkboxes as submitted like HtmlCheckboxRenderer does when t:selectManyCheckbox is used with layout="pageDirection".

The method renderSingleCheckbox() of org.apache.myfaces.renderkit.html.ext.HtmlCheckboxRenderer should lookup the valueSet like in renderCheckboxListVertically() and determine the checked boolean more like renderGroupOrItemCheckbox().

Example:

<t:selectManyCheckbox id="test" required="true" value="#{value}"  layout="spread" >
	<t:selectItems ...../>
</t:selectManyCheckbox>

<t:checkbox for="test" index="0" />
<t:checkbox for="test" index="1" />
<t:checkbox for="test" index="2" />

<h:inputText required="true" />

1. you select checkbox one and submit the form -> validation error for inputText
2. you deselect checkbox one and submit the form -> validation error for selectManyCheckbox  and inputText BUT
    checkbox one is checked although it was submited not checked


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (TOMAHAWK-1429) t:checkbox not checked correctly after validation error

Posted by "Leonardo Uribe (JIRA)" <de...@myfaces.apache.org>.
     [ https://issues.apache.org/jira/browse/TOMAHAWK-1429?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Leonardo Uribe resolved TOMAHAWK-1429.
--------------------------------------

       Resolution: Fixed
    Fix Version/s: 1.1.9-SNAPSHOT
         Assignee: Leonardo Uribe

I tested it and did some small modifications(the var checked is not necessary). Please the next time if is possible try to send it in diff format to make it easier to understand and commit.

        Set lookupSet = RendererUtils.getSubmittedValuesAsSet(facesContext, uiComponent, converter, uiSelectMany);
        
        boolean useSubmittedValues = (lookupSet != null);
        if (!useSubmittedValues)
        {
            lookupSet = RendererUtils.getSelectedValuesAsSet(facesContext, uiComponent, converter, uiSelectMany);
        }

Thanks to Mathias Werlitz for provide this patch.


> t:checkbox not checked correctly after validation error
> -------------------------------------------------------
>
>                 Key: TOMAHAWK-1429
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-1429
>             Project: MyFaces Tomahawk
>          Issue Type: Bug
>    Affects Versions: 1.1.8
>         Environment: Sun RI, JSF 1.2
>            Reporter: Mathias Werlitz
>            Assignee: Leonardo Uribe
>             Fix For: 1.1.9-SNAPSHOT
>
>
> If you use t:selectManyCheckbox with layout="spread" and t:checkbox the selection of the checkboxes after an validation error is incorrect. When using layout="pageDirection" it is correct.
> When using layout="spread" and t:checkbox HtmlCheckboxRenderer renders the last successfully validated component values (intenally stored HtmlSelectManyCheckbox.value) checked after an validation error. This is not correct. It should render the checkboxes as submitted like HtmlCheckboxRenderer does when t:selectManyCheckbox is used with layout="pageDirection".
> The method renderSingleCheckbox() of org.apache.myfaces.renderkit.html.ext.HtmlCheckboxRenderer should lookup the valueSet like in renderCheckboxListVertically() and determine the checked boolean more like renderGroupOrItemCheckbox().
> Example:
> <t:selectManyCheckbox id="test" required="true" value="#{value}"  layout="spread" >
> 	<t:selectItems ...../>
> </t:selectManyCheckbox>
> <t:checkbox for="test" index="0" />
> <t:checkbox for="test" index="1" />
> <t:checkbox for="test" index="2" />
> <h:inputText required="true" />
> 1. you select checkbox one and submit the form -> validation error for inputText
> 2. you deselect checkbox one and submit the form -> validation error for selectManyCheckbox  and inputText BUT
>     checkbox one is checked although it was submited not checked

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (TOMAHAWK-1429) t:checkbox not checked correctly after validation error

Posted by "Mathias Werlitz (JIRA)" <de...@myfaces.apache.org>.
    [ https://issues.apache.org/jira/browse/TOMAHAWK-1429?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12719627#action_12719627 ] 

Mathias Werlitz commented on TOMAHAWK-1429:
-------------------------------------------

org.apache.myfaces.renderkit.html.ext.HtmlCheckboxRenderer.renderSingleCheckbox() should looke like:

protected void renderSingleCheckbox(FacesContext facesContext, HtmlCheckbox checkbox) throws IOException
	    {
	        String forAttr = checkbox.getFor();
	        if (forAttr == null)
	        {
	            throw new IllegalStateException("mandatory attribute 'for'");
	        }
	        int index = checkbox.getIndex();
	        if (index < 0)
	        {
	            throw new IllegalStateException("positive index must be given");
	        }

	        UIComponent uiComponent = checkbox.findComponent(forAttr);
	        if (uiComponent == null)
	        {
	            throw new IllegalStateException("Could not find component '" + forAttr + "' (calling findComponent on component '" + checkbox.getClientId(facesContext) + "')");
	        }
	        if (!(uiComponent instanceof UISelectMany))
	        {
	            throw new IllegalStateException("UISelectMany expected");
	        }

	        UISelectMany uiSelectMany = (UISelectMany)uiComponent;
	        Converter converter = getConverter(facesContext, uiSelectMany);
	        List selectItemList = RendererUtils.getSelectItemList(uiSelectMany);
	        if (index >= selectItemList.size())
	        {
	            throw new IndexOutOfBoundsException("index " + index + " >= " + selectItemList.size());
	        }

	        SelectItem selectItem = (SelectItem)selectItemList.get(index);
	        Object itemValue = selectItem.getValue();
	        String itemStrValue = getItemStringValue(facesContext, uiSelectMany, converter, itemValue);

	        Set lookupSet = RendererUtils.getSubmittedValuesAsSet(facesContext, uiSelectMany, converter, uiSelectMany);
	        boolean useSubmittedValues = lookupSet != null;
	        if (!useSubmittedValues)
	        {
	            lookupSet = RendererUtils.getSelectedValuesAsSet(facesContext, uiComponent, converter, uiSelectMany);
	        }    
	        boolean checked = (useSubmittedValues && lookupSet.contains(itemStrValue))
                    || (!useSubmittedValues && lookupSet.contains(itemStrValue));
	        
	        ResponseWriter writer = facesContext.getResponseWriter();
	        
	        //renderCheckbox(facesContext,
	        //               uiSelectMany,
	        //               itemStrValue,
	        //               selectItem.getLabel(),
	        //               isDisabled(facesContext,uiSelectMany),
	        //               lookupSet.contains(itemStrValue), true);
	        
	        String itemId = renderCheckbox(facesContext,
	                uiSelectMany,
	                itemStrValue,
	                isDisabled(facesContext,uiSelectMany),
	                checked, false, index);

	        //Render the
	        // label element after the input
	        boolean componentDisabled = isDisabled(facesContext, uiSelectMany);
	        boolean itemDisabled = selectItem.isDisabled();
	        boolean disabled = (componentDisabled || itemDisabled);

	        HtmlRendererUtils.renderLabel(writer, uiSelectMany, itemId, selectItem.getLabel(), disabled);
	        
	    }

> t:checkbox not checked correctly after validation error
> -------------------------------------------------------
>
>                 Key: TOMAHAWK-1429
>                 URL: https://issues.apache.org/jira/browse/TOMAHAWK-1429
>             Project: MyFaces Tomahawk
>          Issue Type: Bug
>    Affects Versions: 1.1.8
>         Environment: Sun RI, JSF 1.2
>            Reporter: Mathias Werlitz
>
> If you use t:selectManyCheckbox with layout="spread" and t:checkbox the selection of the checkboxes after an validation error is incorrect. When using layout="pageDirection" it is correct.
> When using layout="spread" and t:checkbox HtmlCheckboxRenderer renders the last successfully validated component values (intenally stored HtmlSelectManyCheckbox.value) checked after an validation error. This is not correct. It should render the checkboxes as submitted like HtmlCheckboxRenderer does when t:selectManyCheckbox is used with layout="pageDirection".
> The method renderSingleCheckbox() of org.apache.myfaces.renderkit.html.ext.HtmlCheckboxRenderer should lookup the valueSet like in renderCheckboxListVertically() and determine the checked boolean more like renderGroupOrItemCheckbox().
> Example:
> <t:selectManyCheckbox id="test" required="true" value="#{value}"  layout="spread" >
> 	<t:selectItems ...../>
> </t:selectManyCheckbox>
> <t:checkbox for="test" index="0" />
> <t:checkbox for="test" index="1" />
> <t:checkbox for="test" index="2" />
> <h:inputText required="true" />
> 1. you select checkbox one and submit the form -> validation error for inputText
> 2. you deselect checkbox one and submit the form -> validation error for selectManyCheckbox  and inputText BUT
>     checkbox one is checked although it was submited not checked

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.