[ http://issues.apache.org/jira/browse/MYFACES-627?page=all ]
Senthil Chelladurai updated MYFACES-627:
----------------------------------------
Attachment: HtmlDataTableHack.patch
I have identified the bug and have a solution.
----------------------Start from SUN RI
UIData----------------------------------------------------
public String getClientId(FacesContext context) {
if (context == null) {
throw new NullPointerException();
}
String baseClientId = super.getClientId(context);
if (rowIndex >= 0) {
return (baseClientId + NamingContainer.SEPARATOR_CHAR + rowIndex);
} else {
return (baseClientId);
}
}
-----------------------End SUN RI
UIData------------------------------------------------------------
-----------------------Start Myfaces
UIData----------------------------------------------------------
public String getClientId(FacesContext context)
{
String clientId = super.getClientId(context);
int rowIndex = getRowIndex();
if (rowIndex == -1)
{
return clientId;
}
return clientId + "_" + rowIndex;
}
-----------------------End Myfaces
UIData------------------------------------------------------------
Carefully look at the above code fragment and you will notice that SUN RI uses
a class private variable rowIndex to check for current row and creates the
clientId accordingly, whereas Myfaces uses the method getRowIndex() method to
get the current row number.
Why is this a problem?
Myfaces(tomahawk) has a class called HtmlDataTableHack which duplicates and
overrides most of the methods and field variables, so the rowIndex variable is
not getting updated in Sun RI UIData which uses field variable instead of the
getRowIndex() method. This ends up creating the same id for all rows so the
Decode phase sees only one value and so updates only the first value, this has
a slightly different effect on command components where the action is fired for
all rows even though only a specific action was triggered.
Solution: the getClientId method should also be overridden in HtmlDataTableHack
to solve this problem.
I have attached the patch file with the fix.
Hope to see the fix incorporated.
Senthil
> valueChangeListener not called for elements in HtmlDataTable
> ------------------------------------------------------------
>
> Key: MYFACES-627
> URL: http://issues.apache.org/jira/browse/MYFACES-627
> Project: MyFaces
> Type: Bug
> Components: Tomahawk
> Versions: 1.1.1
> Environment: JSF RI 1.1.01
> Reporter: Keith Lynch
> Priority: Critical
> Attachments: HtmlDataTableHack.patch
>
> The processValueChange method is never called in some cases and called only
> for the first element in the list for others.
> If the value of the first row inside the inputText component is changed then
> the valueChangeListener is called. If the inputText component in any other
> row is changed the valueChangeListener is not called.
> The valueChangeListener is never called for the selectBooleanCheckbox.
> I have not tested with any other sub-components.
> This is possibly an RI compatibility issue however I cannot test with the
> myfaces impl as I am using components which are not compatible with it.
> x:dataTable value="#{ilrTestsMgr.details.currentPageContent}"
> var="test"
> rendered="true"
> rowClasses="even-row,odd-row"
> styleClass="bluelist"
> width="100%">
> <h:column>
> <f:facet name="header">
> <h:outputText value="#{bundle.generic_enabled}"/>
> </f:facet>
> <h:selectBooleanCheckbox value="#{test.enabled}"
> valueChangeListener="#{ilrTestsMgr.details.processValueChange}"/>
> </h:column>
> <h:column>
> <f:facet name="header">
> <h:outputText value="#{bundle.testcase_value}"/>
> </f:facet>
> <h:inputText value="#{test.expected}"
> valueChangeListener="#{ilrTestsMgr.details.processValueChange}"/>
> </h:column>
>
> </x:dataTable>
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira