dataTable Sort and Filter Not Preserved with Poll - BUG

UI Components for JSF
Post Reply
sebek
Posts: 38
Joined: 19 Jul 2011, 18:56

12 Sep 2011, 17:45

Hello,

I have been trying to get the sorting and filtering preserved while poll updates the table. Unfortunately, I was not able to do that.

When dataTable is refreshed every two seconds, or any interval, by poll, the filter value is removed and column, when clicked on, only sorts ascending no matter how many times column header is clicked. Also, the sorting arrow always shows as "descending".

Unless I have missed something, I think this is a bug in dataTable.

Please take a look at this and let me know if a this is bug, or my implementation is incorrect. I have been trying to get this to work for couple days now. Any help would be greatly appreciate it.


Below is the code I used which is based on the Showcase:

sorting.xhtml

Code: Select all

<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.prime.com.tr/ui">

<f:view contentType="text/html">

	<h:head>
	</h:head>

	<h:body>

		<h:form id="pollForm">
			<p:poll id="poll" widgetVar="pollVar" interval="2"
				listener="#{tableBean.update}" async="true" autoStart="true" />
		</h:form>

		<h:form>

			<p:outputPanel autoUpdate="true">
				<p:dataTable var="car" value="#{tableBean.carsSmall}">
					<f:facet name="header">  
            		Ajax Sorting  
        		</f:facet>

					<p:column sortBy="#{car.model}">
						<f:facet name="header">
							<h:outputText value="Model" />
						</f:facet>
						<h:outputText value="#{car.model}" />
					</p:column>

					<p:column sortBy="#{car.year}">
						<f:facet name="header">
							<h:outputText value="Year" />
						</f:facet>
						<h:outputText value="#{car.year}" />
					</p:column>

					<p:column sortBy="#{car.manufacturer}" 
						filterBy="#{car.manufacturer}">
						<f:facet name="header">
							<h:outputText value="Manufacturer" />
						</f:facet>
						<h:outputText value="#{car.manufacturer}" />
					</p:column>

					<p:column sortBy="#{car.color}">
						<f:facet name="header">
							<h:outputText value="Color" />
						</f:facet>
						<h:outputText value="#{car.color}" />
					</p:column>
				</p:dataTable>
			</p:outputPanel>
		</h:form>

	</h:body>

</f:view>
</html>
TableBean.java

Code: Select all

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import org.primefaces.event.ColumnResizeEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

@ManagedBean
@SessionScoped
public class TableBean implements Serializable {

	private final static String[] colors;

	private final static String[] manufacturers;

	private String theme;

	static {
		colors = new String[10];
		colors[0] = "Black";
		colors[1] = "White";
		colors[2] = "Green";
		colors[3] = "Red";
		colors[4] = "Blue";
		colors[5] = "Orange";
		colors[6] = "Silver";
		colors[7] = "Yellow";
		colors[8] = "Brown";
		colors[9] = "Maroon";

		manufacturers = new String[10];
		manufacturers[0] = "Mercedes";
		manufacturers[1] = "BMW";
		manufacturers[2] = "Volvo";
		manufacturers[3] = "Audi";
		manufacturers[4] = "Renault";
		manufacturers[5] = "Opel";
		manufacturers[6] = "Volkswagen";
		manufacturers[7] = "Chrysler";
		manufacturers[8] = "Ferrari";
		manufacturers[9] = "Ford";
	}

	private List<Car> cars;

	private List<Car> carsSmall;

	private List<Car> carsLarge;

	private Date date = new Date();

	private Car selectedCar;

	private Car[] selectedCars;

	private SelectItem[] manufacturerOptions;

	private boolean editMode;

	public TableBean() {
		cars = new ArrayList<Car>();
		carsSmall = new ArrayList<Car>();
		carsLarge = new ArrayList<Car>();

		populateRandomCars(cars, 50);
		populateRandomCars(carsSmall, 9);
		populateRandomCars(carsLarge, 200);
	}

	public void update() {
		System.out.println("Updating with poll");
	}
	
	public Car[] getSelectedCars() {
		return selectedCars;
	}

	public void setSelectedCars(Car[] selectedCars) {
		this.selectedCars = selectedCars;
	}

	public Car getSelectedCar() {
		return selectedCar;
	}

	public void setSelectedCar(Car selectedCar) {
		this.selectedCar = selectedCar;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	private void populateRandomCars(List<Car> list, int size) {
		for (int i = 0; i < size; i++)
			list.add(new Car(getRandomModel(), getRandomYear(),
					getRandomManufacturer(), getRandomColor()));
	}

	public List<Car> getCars() {
		return cars;
	}

	public List<Car> getCarsSmall() {
		return carsSmall;
	}

	public List<Car> getCarsLarge() {
		return carsLarge;
	}

	private int getRandomYear() {
		return (int) (Math.random() * 50 + 1960);
	}

	private String getRandomColor() {
		return colors[(int) (Math.random() * 10)];
	}

	private String getRandomManufacturer() {
		return manufacturers[(int) (Math.random() * 10)];
	}

	private String getRandomModel() {
		return UUID.randomUUID().toString().substring(0, 8);
	}

	public String getTheme() {
		return theme;
	}

	public void setTheme(String theme) {
		this.theme = theme;
	}

	public void save() {
		FacesContext.getCurrentInstance().addMessage(
				null,
				new FacesMessage(FacesMessage.SEVERITY_INFO, "Info",
						"Changes Saved"));
	}

	public void onRowSelect(SelectEvent event) {
		FacesMessage msg = new FacesMessage("Car Selected",
				((Car) event.getObject()).getModel());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void onRowUnselect(UnselectEvent event) {
		FacesMessage msg = new FacesMessage("Car Unselected",
				((Car) event.getObject()).getModel());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public String onRowSelectNavigate(SelectEvent event) {
		FacesContext.getCurrentInstance().getExternalContext().getFlash()
				.put("selectedCar", event.getObject());

		return "carDetail?faces-redirect=true";
	}

	
	public String[] getManufacturers() {
		return manufacturers;
	}

	public String[] getColors() {
		return colors;
	}


	public SelectItem[] getManufacturerOptions() {
		return manufacturerOptions;
	}

	public void delete() {
		carsSmall.remove(selectedCar);
	}

	public boolean isEditMode() {
		return editMode;
	}

	public void setEditMode(boolean editMode) {
		this.editMode = editMode;
	}

	public String navigate() {
		return "home";
	}

	public void onEdit(RowEditEvent event) {
		FacesMessage msg = new FacesMessage("Car Edited",
				((Car) event.getObject()).getModel());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void onResize(ColumnResizeEvent event) {
		FacesMessage msg = new FacesMessage("Column "
				+ event.getColumn().getClientId() + " resized", "W:"
				+ event.getWidth() + ", H:" + event.getHeight());

		FacesContext.getCurrentInstance().addMessage(null, msg);
	}

	public void deleteCar() {
		carsSmall.remove(selectedCar);
	}
}
-- PrimeFaces 3.3-SNAPSHOT -- Mojarra 2.1.2 -- Tomcat 7.0.19 --

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 20 guests