4 Replies Latest reply on Mar 17, 2009 11:52 PM by alibsd

    Strange problem with subTable and AJAX refreshes

    alibsd

      Hi

      I'm working on creating some kind of grouping by use of rich:subTable.
      The sample code is:
      xhtml file:

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:rich="http://richfaces.org/rich"
       xmlns:a4j="http://richfaces.org/a4j">
      <body>
      <f:view>
       <h:form>
       <rich:dataTable id="lettersGrid" value="#{lettersBean.lettersGroup}"
       var="letterGroup">
       <f:facet name="header">
       <rich:columnGroup>
       <rich:column>
       <h:outputText value="subject" />
       </rich:column>
       <rich:column>
       <h:outputText value="sender" />
       </rich:column>
       <rich:column>
       <h:outputText value="receiver" />
       </rich:column>
       <rich:column>
       <h:outputText value="type" />
       </rich:column>
       </rich:columnGroup>
       </f:facet>
      
       <rich:column colspan="4">
       <h:commandButton action="#{letterGroup.toggleShow}"
       value="#{letterGroup.name}" />
       </rich:column>
      
      
       <rich:subTable id="subTable" value="#{letterGroup.letters}"
       var="letter">
       <rich:column>
       <h:outputText value="#{letter.subject}" />
       </rich:column>
       <rich:column>
       <h:outputText value="#{letter.sender}" />
       </rich:column>
       <rich:column>
       <h:outputText value="#{letter.receiver}" />
       </rich:column>
       <rich:column>
       <h:outputText value="#{letter.type}" />
       </rich:column>
       </rich:subTable>
      
       </rich:dataTable>
       </h:form>
      </f:view>
      </body>
      </html>


      and the managed beans are:
      package com.salimi;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class LettersBean {
       private String groupCol = "type";
       private List<LetterGroup> letterGroups;
      
       public LettersBean() {
       letterGroups = new ArrayList<LetterGroup>(3);
       for (int i = 0; i < 3; i++) {
       String typeName = "type " + i;
       List<Letter> groupLetters = new ArrayList<Letter>();
       LetterGroup grp = new LetterGroup((i % 2 == 0), typeName, groupLetters);
       letterGroups.add(grp);
       for (int j = 0; j < 10; j++) {
       groupLetters.add(new Letter("subject " + i + "_" + j, typeName,
       "sender " + i + "_" + j, "receiver " + i + "_" + j));
       }
       }
       }
      
       public List<LetterGroup> getLettersGroup() {
       return letterGroups;
       }
      
       public void setLettersGroup(List<LetterGroup> group) {
      
       }
      
       public String getGroupCol() {
       return groupCol;
       }
      
       public void setGroupCol(String groupCol) {
       this.groupCol = groupCol;
       }
      
      }
      


      package com.salimi;
      
      import java.util.ArrayList;
      import java.util.List;
      
      public class LetterGroup {
       private String name;
       private List<Letter> letters;
       private boolean mustShow;
      
       public LetterGroup(boolean mustShow, String name, List<Letter> letters) {
       super();
       this.name = name;
       this.letters = letters;
       this.mustShow = mustShow;
       }
      
       public String getName() {
       return name;
       }
      
       public void setName(String name) {
       this.name = name;
       }
      
       public List<Letter> getLetters() {
       if (mustShow) {
       System.err.println(name + " returning list with size = " + letters.size());
       return letters;
       } else {
       System.err.println(name + " returning EMPTY list");
       return new ArrayList<Letter>();
       }
       }
      
       public void setLetters(List<Letter> letters) {
       this.letters = letters;
       }
      
       public boolean isMustShow() {
       System.err.println(name + " must " + (mustShow ? "" : "not") + " be shown");
       return mustShow;
       }
      
       public void setMustShow(boolean mustShow) {
       this.mustShow = mustShow;
       }
      
       public void toggleShow() {
       mustShow = !mustShow;
       }
      }
      


      Managed beans are Session Scoped. Everything is fine when h:commandButton
      is used. But when it is replaced by a4j:commandButton, the data of subTable is
      not shown. I can't understand the reason for this strange behavior. Any ideas why
      AJAX updates do not work, while normal postbacks work correctly.

      BTW, first I wanted to use rendered attribute of the subTable, but since it was
      not work either, I had to handle show/hide subtable in LetterGroup.getLetters() method.

      Regards