[ http://issues.apache.org/jira/browse/MYFACES-288?page=all ] sean schofield closed MYFACES-288: ----------------------------------
Fix Version: Nightly Build Resolution: Fixed > DataTable: Facets Bug > --------------------- > > Key: MYFACES-288 > URL: http://issues.apache.org/jira/browse/MYFACES-288 > Project: MyFaces > Type: Bug > Versions: 1.0.9 beta > Reporter: Mathias Werlitz > Priority: Blocker > Fix For: Nightly Build > > There seems to be a big bug in the dataTable component implementation. > If you use two dataTable components within each other the facets of the inner > table do not work correctly. > For example if you use a inputText component in the footer (of the inner > table) the value is not updated an no valueChangeListener is notified. > Here an example: > <f:view> > <html> > <body> > <h:form> > <h:dataTable id="outer" value="#{test}" var="outeritem"> > <h:column> > <h:dataTable id="inner" value="#{outeritem}" var="item" > > ..... > > <f:facet name="header"> > <h:inputText id="myinput" > valueChangeListener="#{testBean.listener}" /> > </f:facet> > </h:dataTable> > </h:column> > </h:dataTable> > </h:form> > </body> > </html> > </f:view> > I have found one solution, but I'm not sure if it is the right way: > The funkctions to save the childState for the nested UIData have to be fixed > in javax.faces.component.UIData: > private void restoreDescendantComponentStates( > FacesContext context, > UIComponent component, > boolean saveState) > { > for (Iterator i = component.getFacetsAndChildren(); > i.hasNext();) > { > UIComponent child = (UIComponent) i.next(); > //clear this descendant's clientId: > child.setId(child.getId()); > //HACK: This assumes that setId always clears the > cached clientId. Can we be sure? > if (saveState) > { > //see saveDescendantComponentStates(UIComponent) > if (child instanceof UIData) > { > UIData childUIData = (UIData) child; > Object state = > > _rowState._clientIdsToChildUIDataStates.get( > > childUIData.getClientId(context)); > if (state == null) > { > UIDataRowState initialState = > (UIDataRowState) > _rowState._clientIdsToChildUIDataStates.get(getInitialClientId(context, > child)); > if (initialState == null) > { > throw new > IllegalStateException( > "No initial > state defined for clientId: " + child.getClientId(context)); > } > state = new > UIDataRowState(initialState); > } > childUIData._rowState = > (UIDataRowState) state; > > childUIData.restoreDescendantComponentStates(context, childUIData, true); // > fix > > > restoreDescendantComponentStates(context, component, false); > continue; > } > if (!_firstTimeRendered && child instanceof > EditableValueHolder) > { > EditableValueHolder childEVH = > (EditableValueHolder) child; > Object state = > > _rowState._clientIdsToChildEVHStates.get(child.getClientId(context)); > if (state == null) > { > state = > > _rowState._clientIdsToChildEVHStates.get( > > getInitialClientId(context, child)); > } > ((EditableValueHolderState) > state).restore(childEVH); > > } > } > restoreDescendantComponentStates(context, child, > saveState); > } > } > private void saveDescendantComponentStates(FacesContext context, UIComponent > component) > { > for (Iterator i = component.getFacetsAndChildren(); > i.hasNext();) > { > //TODO: what if child is an EditableValueHolder AND a > UIData? > UIComponent child = (UIComponent) i.next(); > if (child instanceof UIData) > { > > UIData childUIData = (UIData) child; > > childUIData.saveDescendantComponentStates(context, childUIData); // fix > _rowState._clientIdsToChildUIDataStates.put( > childUIData.getClientId(context), > childUIData._rowState); > continue; > } > if (child instanceof EditableValueHolder) > { > EditableValueHolder childEVH = > (EditableValueHolder) child; > _rowState._clientIdsToChildEVHStates.put( > child.getClientId(context), > new EditableValueHolderState(childEVH)); > } > saveDescendantComponentStates(context, child); > } > } -- 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