3

In my application (RichFaces 4.1) I have an extendedDataTable, in my backing bean I need to track the selected rows. I achieve this with the following code:

JSF:

<rich:extendedDataTable id="freie"
    selectionMode="multipleKeyboardFree"
    selection="#{myBean.tableSelection}"
    ...
<a4j:ajax execute="@this" event="selectionchange" 
          listener="#{myBean.tableSelection}"
          render="indicatorPanel" />

Java:

    UIExtendedDataTable dataTable= (UIExtendedDataTable) event.getComponent();
    Object originalKey= dataTable.getRowKey();
    _tableSelectedEntries.clear();
    for (Object selectionKey: _tableSelection) {
        dataTable.setRowKey(selectionKey);
        if (dataTable.isRowAvailable()) {
            _tableSelectedEntries.add((Entry) dataTable.getRowData());
        }
    }
    dataTable.setRowKey(originalKey);

This works fine, as long as the table is not filtered. I use the standard RichFaces way to filter the table:

<rich:column sortBy="#{mitarbeiter.vorname}"
 filterValue="#{mitarbeiterFilterBean.firstNameFilter}"
 filterExpression="#{fn:containsIgnoreCase(mitarbeiter.vorname, mitarbeiterFilterBean.firstNameFilter)}">

When the table is filtered and I select for instance the first row, I get the rowKey for the first row of the unfiltered table in the backing bean. How can I get the rowData of the selected row when my table is filtered?

I think my code works the same way as in the showcase.

Sandro
  • 1,266
  • 2
  • 13
  • 25

2 Answers2

2

I could solve my problem by making my filter bean SessionScoped. I also don't bind the currently selected rows to my backing bean anymore. I get the selected rows using:

public void tableSelection (AjaxBehaviorEvent event) {
    UIExtendedDataTable dataTable= (UIExtendedDataTable) event.getComponent();
    for (Object selectionKey: dataTable.getSelection()) {

It could also be achieved using rowKeyVar to get the correct row index.

Community
  • 1
  • 1
Sandro
  • 1,266
  • 2
  • 13
  • 25
1

Maybe you have overlooked something because I tried it and it works.

I copied the source for selectableTable and added the filter method from filterTable

Example usage: To get the selected item/items data just use a get method for selected items list


Source code (xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Richfaces Welcome Page</title>
    </h:head>
    <h:body>

        <h:panelGrid columns="2">
            <h:form>
                <fieldset style="margin-bottom: 10px;">
                    <legend>
                        <h:outputText value="Selection Mode " />
                    </legend>
                    <h:selectOneRadio value="#{exTableSelect.selectionMode}">
                        <f:selectItem itemLabel="Single" itemValue="single" />
                        <f:selectItem itemLabel="Multiple" itemValue="multiple" />
                        <f:selectItem itemLabel="Multiple Keyboard-free" itemValue="multipleKeyboardFree" />
                        <a4j:ajax render="table, res" />
                    </h:selectOneRadio>
                </fieldset>
                <rich:extendedDataTable value="#{exTableSelect.inventoryItems}" var="car"
                                        selection="#{exTableSelect.selection}" id="table" style="height:300px; width:500px;"
                                        selectionMode="#{exTableSelect.selectionMode}">
                    <a4j:ajax execute="@form" event="selectionchange" listener="#{exTableSelect.selectionListener}"
                              render=":res" />
                    <f:facet name="header">
                        <h:outputText value="Cars marketplace" />
                    </f:facet>
                    <rich:column filterValue="#{exTableSelect.vendorFilter}"
                                 filterExpression="#{fn:containsIgnoreCase(car.vendor, exTableSelect.vendorFilter)}">
                        <f:facet name="header">
                            <h:panelGroup>
                                <h:outputText value="Vendor " />
                                <h:inputText value="#{exTableSelect.vendorFilter}">

                                    <a4j:ajax render="table" execute="@this" event="change" />
                                </h:inputText>
                            </h:panelGroup>
                        </f:facet>
                        <h:outputText value="#{car.vendor}" />
                    </rich:column>
                </rich:extendedDataTable>
            </h:form>
            <a4j:outputPanel id="res">
                <rich:panel header="Selected Rows:" rendered="#{not empty exTableSelect.selectionItems}">
                    <rich:list type="unordered" value="#{exTableSelect.selectionItems}" var="sel">
                        <h:outputText value="#{sel.vendor} - #{sel.model} - #{sel.price}" />
                    </rich:list>
                </rich:panel>
            </a4j:outputPanel>
        </h:panelGrid>
    </h:body>
</html>

Managed Bean:

public class ExTableSelect {

    private String selectionMode = "multiple";
    private Collection<Object> selection;

    private List<InventoryItem> inventoryItems;
    private List<InventoryItem> selectionItems = new ArrayList<InventoryItem>();

    private String vendorFilter;

    public void selectionListener(AjaxBehaviorEvent event) {
        UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
        Object originalKey = dataTable.getRowKey();
        selectionItems.clear();
        for (Object selectionKey : selection) {
            dataTable.setRowKey(selectionKey);
            if (dataTable.isRowAvailable()) {
                selectionItems.add((InventoryItem) dataTable.getRowData());
            }
        }
        dataTable.setRowKey(originalKey);
    }

     public Filter<?> getFilterVendor() {
        return new Filter<InventoryItem>() {
            public boolean accept(InventoryItem t) {
                String vendor = getVendorFilter();
                if (vendor == null || vendor.length() == 0 || vendor.equals(t.getVendor())) {
                    return true;
                }
                return false;
            }
        };
    }

    @PostConstruct
    public void addInventory(){

        InventoryItem i = new InventoryItem();
        i.setVendor("A");
        InventoryItem i2 = new InventoryItem();
        i2.setVendor("AB");
        InventoryItem i3 = new InventoryItem();
        i3.setVendor("AC");
        InventoryItem i4= new InventoryItem();
        i4.setVendor("E");
        InventoryItem i5 = new InventoryItem();
        i5.setVendor("F");
        InventoryItem i6 = new InventoryItem();
        i6.setVendor("G");
        InventoryItem i7 = new InventoryItem();
        i7.setVendor("H");
        InventoryItem i8 = new InventoryItem();
        i8.setVendor("I");
        InventoryItem i9 = new InventoryItem();
        i9.setVendor("J");

        inventoryItems= new ArrayList<InventoryItem>();

        inventoryItems.add(i);
        inventoryItems.add(i2);
        inventoryItems.add(i3);
        inventoryItems.add(i4);
        inventoryItems.add(i5);
        inventoryItems.add(i6);
        inventoryItems.add(i7);
        inventoryItems.add(i8);
        inventoryItems.add(i9);
    }

    public Collection<Object> getSelection() {
        return selection;
    }

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

    public List<InventoryItem> getInventoryItems() {
        return inventoryItems;
    }

    public void setInventoryItems(List<InventoryItem> inventoryItems) {
        this.inventoryItems = inventoryItems;
    }

    public InventoryItem getSelectionItem() {
        if (selectionItems == null || selectionItems.isEmpty()) {
            return null;
        }
        return selectionItems.get(0);
    }

    public List<InventoryItem> getSelectionItems() {
        return selectionItems;
    }

    public void setSelectionItems(List<InventoryItem> selectionItems) {
        this.selectionItems = selectionItems;
    }

    public String getSelectionMode() {
        return selectionMode;
    }

    public void setSelectionMode(String selectionMode) {
        this.selectionMode = selectionMode;
    }

    public void setVendorFilter(String vendorFilter) {
        this.vendorFilter = vendorFilter;
    }

    public String getVendorFilter() {
        return vendorFilter;
    }
}
raging met
  • 356
  • 2
  • 8