MyFaces Core
  1. MyFaces Core
  2. MYFACES-3385

Entered values for input fields conatined in a Composite Component are lost, if the CC is used in a datatable

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Critical Critical
    • Resolution: Fixed
    • Affects Version/s: 2.1.2
    • Fix Version/s: 2.0.10, 2.1.4
    • Component/s: None
    • Labels:
      None

      Description

      Assume, a Composite Component contains input fields, i.e any subclass of EditableValueHolder (e.g. inputText, inputTextarea, ..). If this CC is than used in a subclass of UIData, e.g. a dataTable, the values entered in the CCs input fields get lost (despite for the last row in the Model of the UIData object).

      This seems to be related to the fact how the method "saveDescendantComponentStates(..)" of the UIData class checks, if a component has childs, whos state must be saved, before changing the rowIndex. The mentioned method only checks "child.getChildCount() > 0", but getChildCount() is 0 for a CC. I assume it would be necessary to check the FacetCount for a CC instead.

      The attached WAR file can help to reproduce the issue with a simple example.

      1. MyFacesCCUIData212Test.war
        3.73 MB
        Michael Dietrich
      2. MYFACES-3385-1.patch
        1 kB
        Leonardo Uribe

        Issue Links

          Activity

          Hide
          Leonardo Uribe added a comment -

          Many thanks for the example webapp. It makes easier and faster debug this issue. In the optimization done over UIData, it seems this condition was not taken into account, but fortunately the fix is simple. I have attached a patch and committed the solution.

          Show
          Leonardo Uribe added a comment - Many thanks for the example webapp. It makes easier and faster debug this issue. In the optimization done over UIData, it seems this condition was not taken into account, but fortunately the fix is simple. I have attached a patch and committed the solution.
          Hide
          Keith Wong added a comment -

          I want to make a note that this issue also affects the components that using facets to store input components such as <p:cellEditor> of PrimeFaces. For example,

          <p:dataTable var="customer" value="#

          {customers}

          ">
          <p:column headerText="First Name">
          <p:cellEditor>
          <f:facet name="output">
          <h:outputText value="#

          {customer.firstName}"/>
          </f:facet>
          <f:facet name="input">
          <p:inputText value="#{customer.firstName}

          "/>
          </f:facet>
          </p:cellEditor>
          </p:column>

          <p:column headerText="Options">
          <p:rowEditor/>
          </p:column>
          </p:dataTable>

          In this case, the first row is always be overwritten by the last row whatever which row is editing. See http://forum.primefaces.org/viewtopic.php?f=3&t=15349 for further discussion.

          Show
          Keith Wong added a comment - I want to make a note that this issue also affects the components that using facets to store input components such as <p:cellEditor> of PrimeFaces. For example, <p:dataTable var="customer" value="# {customers} "> <p:column headerText="First Name"> <p:cellEditor> <f:facet name="output"> <h:outputText value="# {customer.firstName}"/> </f:facet> <f:facet name="input"> <p:inputText value="#{customer.firstName} "/> </f:facet> </p:cellEditor> </p:column> <p:column headerText="Options"> <p:rowEditor/> </p:column> </p:dataTable> In this case, the first row is always be overwritten by the last row whatever which row is editing. See http://forum.primefaces.org/viewtopic.php?f=3&t=15349 for further discussion.

            People

            • Assignee:
              Leonardo Uribe
              Reporter:
              Michael Dietrich
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development