Uploaded image for project: 'MyFaces Core'
  1. MyFaces Core
  2. MYFACES-228

Sortheader functionality does not work if datatable contains editable components

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Critical
    • Resolution: Fixed
    • 1.0.9m9
    • 1.1.0
    • None
    • None
    • WindowsXP, JDK 1.4.1_06, Tomcat 5.5

    Description

      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)it.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 (child instanceof EditableValueHolder)
      {
      if (states != null)

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

      else if (initialStates != null)

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

      else

      { // 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++;
      }
      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.

      Attachments

        Activity

          People

            schof Sean Schofield
            roku Rolf Kulemann
            Votes:
            4 Vote for this issue
            Watchers:
            5 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: