Richfaces extendedDataTable inside another extendedDataTable

371 Views Asked by At

so I have an extendedDataTables as follows(Code is shortened to keep it straightforward).

    <rich:extendedDataTable value="#{package.packageList}" var="o"
                styleClass="listStyle" selection="#{package.selection}"
                selectionMode="single">

                <a4j:ajax execute="@form" event="selectionchange"
                    listener="#{package.selectionListener}" render=":res" />
                <rich:column>

                    <f:facet name="header">Package ID</f:facet>
                    #{o.packageID}

                </rich:column>
    </rich:extendedDataTable>

So when the user clicks on this it outputs the details of it to another table inside the a4j:outputPanel that follows.

     <a4j:outputPanel id="res">
            <rich:panel header="Selected Package"
                rendered="#{not empty package.selectionPackage}">
                </rich:panel>
      </a4j:outputPanel>

This part works. However this new detail now contains several variables and also an arrayList of objects with which I need to also be able to select. So this arrayList generates its own extendedDataTable which I need to then select and retrieve its information. This part is where it is breaking. What I have attempted so far looks as follows.

   <a4j:outputPanel id="res">
            <rich:panel header="Selected Package"
         rendered="#{not empty package.selectionPackage}">
                 <rich:dataTable value="#{package.selectionPackage}"
                    var="extensionTable" styleClass="listStyle" selectionMode="single">
                    <rich:column>
                        <rich:extendedDataTable value="#                                         {extensionTable.extensionList}"
                            var="selectedExtension" styleClass="listStyle" style="height:200px;"
                            selection="#{package.extensionSelection}" selectionMode="single">

                            <a4j:ajax execute="@form" event="selectionchange"
                    listener="#{package.selectionExtensionListener}" render=":extensions" />
                            <rich:column>
                                <f:facet name="header">Extension Add on list</f:facet>
                                #{selectedExtension.extensionName}"
                            </rich:column>
                        </rich:extendedDataTable>
                    </rich:column>
                </rich:dataTable>
                                   </rich:panel>
        </a4j:outputPanel>

I have another a4j panel to handle the new extensions selected object. The problem is that my selectedExtensionListener is not being called. I do not know why, is what I am trying even possible. The selection is working as the rows are changing colour however the selectionExtensionListener is never being called. I have some system.out.printlnts in just to check and whereas the first listener is being called the second one is not. Forgive me if this is obvious or not even possible but I am relatively new to jsf. Any help would be greatly appreciated.

I will copy and paste my bean below to show you the backend of the code. I will exclude declaring all of my variables and populating my lists and objects etc as it will just clog up the code, if you need them just let me know and I will edit them in. (Sorry for formatting, I do not know if you can format code here?)

   public class Package implements Serializable{
        public void selectionListener(AjaxBehaviorEvent event) {
    System.out.println("In selection listener");
           UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
           Object originalKey = dataTable.getRowKey();
           selectionPackage.clear();
           for (Object selectionKey : selection) {
             dataTable.setRowKey(selectionKey);
             if (dataTable.isRowAvailable()) {
                selectionPackage.add((PackageClass) dataTable.getRowData());
            }
      }
    dataTable.setRowKey(originalKey);
}
public void selectionExtensionListener(AjaxBehaviorEvent event) {
    System.out.println("Testing 1");
    UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
    Object originalKey = dataTable.getRowKey();
    selectionExtension.clear();
    for (Object selectionKey : extensionSelection) {
        dataTable.setRowKey(selectionKey);
        if (dataTable.isRowAvailable()) {
            System.out.println("Testing 2");
            selectionExtension.add((ExtensionClass) dataTable.getRowData());
        }
    }
    dataTable.setRowKey(originalKey);
}
 public Collection<Object> getSelection() {
    return selection;
}

public void setSelection(Collection<Object> selection) {
    this.selection = selection;
}
public Collection<Object> getExtensionSelection() {
    return extensionSelection;
}

public void setExtensionSelection(Collection<Object> extensionSelection) {
    this.extensionSelection = extensionSelection;
}


public List<PackageClass> getPackageList() {
    return packageList;
}
 public void setPackageList(ArrayList<PackageClass> packageList) {
        this.packageList = packageList;
}
 public PackageClass getSelectionPackage() {
    if (selectionPackage == null || selectionPackage.isEmpty()) {
        return null;
    }
    return selectionPackage.get(0);
}
 public void setSelectionPackage(ArrayList<PackageClass> selectionPackage) {
        this.selectionPackage = selectionPackage;
}
 public ArrayList<PackageClass> getSelectionPackages() {
    return selectionPackage;
}
 public ExtensionClass getSelectionExtension() {
    if (selectionExtension == null || selectionExtension.isEmpty()) {
        return null;
    }
    return selectionExtension.get(0);
}
 public void setSelectionExtension(ArrayList<ExtensionClass> selectionExtension) {
        this.selectionExtension = selectionExtension;
}
 public ArrayList<ExtensionClass> getSelectionExtensions() {
    return selectionExtension;
}
     }
0

There are 0 best solutions below