Harry
Harry

Reputation: 51

Primefaces DataTable filtering and RowSelection not working

I'am new to PrimeFaces. I'am using it to code the front end of a Saas Application. I' am using a primefaces datatable to display a list of customers. I need to sort and filter the values. Also I need to populate another widget when a row is selected on the datatable. Sorting works but filtering and selection don't work. Below are the code snippets of the bean and the faces page. I'am using PrimeFaces 2.2.1 and JSF 2.0.2.

<html xmlns="http://www.w3c.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head></h:head>
<h:body>

<h:form>
<p:growl id="growl" showDetail="true" />
<p:layout fullPage="true">

    <!-- Top Tabbed Panel -->

    <p:layoutUnit position="top" id="main" width="600" resizable="false">
        <center><h3>SAAS Admin Tool</h3></center>
        <p:tabView effect="opacity" effectDuration="normal" collapsible="true" >

        <p:tab title="Customer">
            <!-- Start of customer datatable -->
            <p:dataTable var="customer" value="#{customerBean.customers}" paginator="true" selection="#{customerBean.selectedCustomer}" 
            selectionMode="single" onRowSelectUpdate="custList" onRowSelectComplete="custTest.show()" id="custList" widgetVar="custList">
                <f:facet name="header">
                List of Customers
                    <p:outputPanel>
                        <p:commandButton value="+" type="button" onclick="addCustDlg.show()"/>
                     </p:outputPanel>
                </f:facet>


                <p:column sortBy="#{customer.id}" filterBy="#{customer.id}" update=":custList" headerText="ID">
                    <h:outputText value="#{customer.id}"/>
                </p:column>

                <p:column sortBy="#{customer.name}" filterBy="#{customer.name}" headerText="NAME" filterMatchMode="contains">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.name}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.name}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.description}" filterBy="#{customer.description}" headerText="DESCRIPTION">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.description}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.description}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.signupDate}" filterBy="#{customer.signupDate}" headerText="SIGN UP DATE">
                        <h:outputText value="#{customer.signupDate}"/>
                </p:column>

                <p:column sortBy="#{customer.validUntil}" filterBy="#{customer.validUntil}" headerText="EXPIRY DATE">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.validUntil}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.validUntil}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column sortBy="#{customer.status}" filterBy="#{customer.status}" headerText="STATUS">
                  <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.status}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.status}"/>
                    </f:facet>
                  </p:cellEditor>
                </p:column>

                <p:column headerText="CREATION DATE" sortBy="#{customer.creationDate}" filterBy="#{customer.creationDate}">
                        <h:outputText value="#{customer.creationDate}"/>
                </p:column>

                <p:column headerText="LAST UPDATE DATE" sortBy="#{customer.lastUpdateDate}" filterBy="#{customer.lastUpdateDate}">
                        <h:outputText value="#{customer.lastUpdateDate}"/>
                </p:column>

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

            </p:dataTable>
            <!-- End of dataTable (customer datatable) -->

                <!-- Customer Details Tabbed Panel-->
                <p:tabView effect="opacity" effectDuration="normal" id="custTab" widgetVar="custTab">
                    <p:tab title="Lines">
                        lines info..
                    </p:tab>
                    <p:tab title="LineCards">
                        Linecards.. 
                    </p:tab>
                </p:tabView>

                <!-- END of customer details tabbed view -->
        </p:tab>

        <p:tab title="Deployment">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="software"/>
                </h:panelGrid>
        </p:tab>

        <p:tab title="Maintainence">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="test."/>
                </h:panelGrid>
        </p:tab>

        <p:tab title="Audit Trail">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputText value="Hardware Summary"/>
                </h:panelGrid>
        </p:tab>

        </p:tabView>
    </p:layoutUnit>

    <!-- DIALOGs -->

    <p:dialog header="Add Customer" widgetVar="addCustDlg" id="addCustDlg" resizable="false" width="420" onCloseUpdate="custList">
        <h:panelGrid columns="2">
            <h:outputLabel value="Name:"/>
            <p:inputText value="#{customerBean.newCustomer.name}" required="true"/>
            <h:outputLabel value="Description:"/>
            <p:inputText value="#{customerBean.newCustomer.description}" required="true"/>
            <h:outputLabel value="Sign Up Date:"/>
            <p:inputMask value="#{customerBean.signDate}" mask="99/99/2099"/>
            <h:outputLabel value="Expiry Date:"/>
            <p:inputMask value="#{customerBean.exDate}" mask="99/99/2099"/>
            <h:outputLabel value="Status:"/>
            <p:inputText value="#{customerBean.newCustomer.status}" required="true"/>
            <p:commandButton value="Submit" oncomplete="addCustDlg.hide();" actionListener="#{customerBean.addCustomer}" update=":custList"/>
        </h:panelGrid>

    </p:dialog>

    <p:dialog header="customer info" widgetVar="custTest" id="custTest" closable="true">
            <h:outputLabel value="Name: #{customerBean.selectedCustomer.name}"/>
    </p:dialog>

    <!-- Save and Reset buttons -->
    <p:layoutUnit position="bottom" id="buttons" height="75">
    <center>
        <p:commandButton value="Save Changes" actionListener="#{customerBean.save}" update="growl"/>
        <p:commandButton value="Reset" actionListener="#{customerBean.reset}" update="growl"/>
    </center>
    </p:layoutUnit>

</p:layout>

</h:form>


</h:body>
</html>

The Bean code:

import java.io.Serializable;
import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import com.assia.saas.dao.AbstractSearchDAO;
import com.assia.saas.dao.EntityManagerHelper;
import com.assia.saas.entities.Customer;


@ManagedBean(name="customerBean")
@ViewScoped
public class CustomerBean implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
AbstractSearchDAO<Customer> custDao = new AbstractSearchDAO<Customer>() {

    @Override
    protected Class<Customer> getEntityClass() {
        return Customer.class;
    }

    @Override
    protected Customer getEntityReference(Customer entity) {
        return getEntityManager().getReference(Customer.class, entity.getId());
    }

};
List<Customer> customers = new ArrayList<Customer>();
private Customer selectedCustomer = new Customer();
private Customer newCustomer;
private String signDate;
private String exDate;

/**
 * @return the signDate
 */
public String getSignDate() {
    return signDate;
}

/**
 * @param signDate the signDate to set
 */
public void setSignDate(String signDate) {
    this.signDate = signDate;
}

/**
 * @return the exDate
 */
public String getExDate() {
    return exDate;
}

/**
 * @param exDate the exDate to set
 */
public void setExDate(String exDate) {
    this.exDate = exDate;
}

/**
 * @return the newCustomer
 */
public Customer getNewCustomer() {
    return newCustomer;
}

/**
 * @param newCustomer the newCustomer to set
 */
public void setNewCustomer(Customer newCustomer) {
    this.newCustomer = newCustomer;
}

public CustomerBean(){
    customers = custDao.findAll(null);
    newCustomer = new Customer();

}

public void save(){
    //TODO: CODE METHOD
}

public void reset(){
    //TODO: Code Method
}

/**
 * @return the customers
 */
public List<Customer> getCustomers() {
    return customers;
}

/**
 * @param customers the customers to set
 */
public void setCustomers(List<Customer> customers) {
    this.customers = customers;
}

/**
 * @param selectedCustomer the selectedCustomer to set
 */
public void setSelectedCustomer(Customer selectedCustomer) {
    this.selectedCustomer = selectedCustomer;
}

/**
 * @return the selectedCustomer
 */
public Customer getSelectedCustomer() {
    return selectedCustomer;
}

public void addCustomer(ActionEvent event) throws ParseException{

    Date date = new Date(Calendar.getInstance().getTimeInMillis());
    newCustomer.setCreationDate(date);
    newCustomer.setLastUpdateDate(date);

    DateFormat formatter;
    formatter = new SimpleDateFormat("MM/dd/yyyy");
    java.sql.Date sqlDate = new java.sql.Date(formatter.parse(signDate).getTime());
    newCustomer.setSignupDate(sqlDate);
    sqlDate = new java.sql.Date(formatter.parse(exDate).getTime());
    newCustomer.setValidUntil(sqlDate);

    EntityManagerHelper.beginTransaction();
    custDao.save(newCustomer);
    EntityManagerHelper.commit();

    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Success", "New Customer Added"));
}


}

The code is not populating the "selectedCustomer" object in the bean.

Upvotes: 1

Views: 7852

Answers (1)

Maddy
Maddy

Reputation: 3816

What i Undestand from your question is you want create an Editable DataTable. As you are using dataTable attribute selectionMode="Single" which seems everything right for me. I cant say what went wrong with it as it involved many other complexities. But you can achieve the samething (populating selectedCustomer In Backing bean)

Solution1: you implement Below listener

 rowEditListener="#{customerBean.listenerInBackingBean}"

And In backing bean..........

 public void listenerInBackingBean(org.primefaces.event.RowEditEvent ev) {

        Customer selectedCustomer  = (Customer) ev.getObject();
        //write Logic to Store Customer in Database

}

Solution 2:

 <p:commandButton >
  <f:setPropertyActionListener value="#{customer}" target="#{customerBean.selectedCustomer}" />
 </p:commandButton>

Here selectedCustomer is instance of type Customer.

Upvotes: 3

Related Questions