MyFaces Core
  1. MyFaces Core
  2. MYFACES-228

Sortheader functionality does not work if datatable contains editable components


    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 1.0.9m9
    • Fix Version/s: 1.1.0
    • Component/s: None
    • Labels:
    • Environment:
      WindowsXP, JDK 1.4.1_06, Tomcat 5.5


      I'm using a dataTable with sortheader. Everything is fine as long as I
      use outputText instead of a inputText. If I use inputText, the
      List/array is sorted correct on the srever side when my value binding is invkoked by the datatable, but the old model (unsorted) is displayed.

      I debuged that a bit and recognized, that as soon as I click any command button, the sorted list gets displayed correctly. This is because refresh() is called in the datatable when clicking a commandButton. Refresh isn't called when u click on the sort header command. On the other hand using outputText works fine. While looking at the HtmlDataTableHack class i found

      private static int restoreDescendantComponentStates(UIComponent component,
      EditableValueHolderState[] states,
      EditableValueHolderState[] initialStates,
      int counter, int level)
      for (Iterator it=getChildrenAndOptionalFacetsIterator(level, component); it.hasNext()
      UIComponent child = (UIComponent);
      //clear this descendant's clientId:
      child.setId(child.getId()); //HACK: This assumes that setId always clears the cached clientId. Can we be sure?
      if (child instanceof EditableValueHolder)
      if (states != null)

      { states[counter].restore((EditableValueHolder)child); }

      else if (initialStates != null)

      { initialStates[counter].restore((EditableValueHolder)child); }


      { // No state saved yet and no initial state !? // Should never be possible, but let's reset the component // state to null values ((EditableValueHolder)child).setValue(null); ((EditableValueHolder)child).setLocalValueSet(false); ((EditableValueHolder)child).setValid(true); ((EditableValueHolder)child).setSubmittedValue(null); }

      counter = restoreDescendantComponentStates(child, states, initialStates, counter,level+1);
      return counter;

      Not sure, but it seems that this codes cuases the old model state to be rendered and not the newly sorted one. If I have time, I will track it down a bit more.

      You can simply reproduce this by changing the sortTable example. You
      only need to change outputText into inputText.



          • Assignee:
            sean schofield
            Rolf Kulemann
          • Votes:
            4 Vote for this issue
            5 Start watching this issue


            • Created: