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:26:07 UTC

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

    [ 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.