Filtering updates the data based on the constraints.
<style type="text/css">
.ui-filter-column .ui-column-customfilter .custom-filter {
width: 100%;
box-sizing: border-box;
}
</style>
<div class="card">
<h5>Column Filtering</h5>
<h:form>
<p:dataTable var="customer" value="#{dtFilterView.customers1}" widgetVar="customersTable"
emptyMessage="No customers found with given criteria"
filteredValue="#{dtFilterView.filteredCustomers1}">
<f:facet name="header">
<div class="p-d-flex p-ai-center p-jc-between">
<span>List of Customers</span>
<p:inputText id="globalFilter" onkeyup="PF('customersTable').filter()" style="width:10rem" placeholder="Enter keyword" />
</div>
</f:facet>
<p:column headerText="Name" sortBy="#{customer.name}" filterBy="#{customer.name}">
<h:outputText value="#{customer.name}" />
</p:column>
<p:column headerText="Country" sortBy="#{customer.country.name}" filterBy="#{customer.country.name}">
<span class="flag flag-#{customer.country.code}" style="width: 30px; height: 20px" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.country.name}" />
</p:column>
<p:column field="representative" headerText="Representative" filterMatchMode="exact"
sortBy="#{customer.representative.name}">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('customersTable').filter()" styleClass="custom-filter">
<f:selectItem itemLabel="All" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{dtFilterView.representatives}" />
</p:selectOneMenu>
</f:facet>
<p:graphicImage name="images/avatar/#{customer.representative.image}" library="demo" width="32"
style="vertical-align: middle" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.representative.name}" />
</p:column>
<p:column field="date" headerText="Join Date" filterMatchMode="range">
<f:facet name="filter">
<p:datePicker selectionMode="range" onchange="PF('customersTable').filter()" />
</f:facet>
</p:column>
<p:column field="status" headerText="Status" filterMatchMode="exact">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('customersTable').filter()" styleClass="custom-filter">
<f:selectItem itemLabel="All" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{dtFilterView.customerStatus}" />
</p:selectOneMenu>
</f:facet>
<span class="customer-badge status-#{customer.status.name().toLowerCase()}">#{customer.status.toString()}</span>
</p:column>
<p:column headerText="Activity" sortBy="#{customer.activity}">
<p:progressBar value="#{customer.activity}" displayOnly="true" style="height: .5rem" />
</p:column>
</p:dataTable>
</h:form>
</div>
<div class="card">
<h5>Default Filter</h5>
<h:form>
<p:dataTable var="customer" value="#{dtFilterView.customers2}" widgetVar="customersTable2"
emptyMessage="No customers found with given criteria"
filteredValue="#{dtFilterView.filteredCustomers2}" filterBy="#{dtFilterView.filterBy}">
<f:facet name="header">
<span>List of Customers</span>
</f:facet>
<p:column headerText="Name" sortBy="#{customer.name}" filterBy="#{customer.name}">
<h:outputText value="#{customer.name}" />
</p:column>
<p:column headerText="Country" sortBy="#{customer.country.name}" filterBy="#{customer.country.name}">
<span class="flag flag-#{customer.country.code}" style="width: 30px; height: 20px" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.country.name}" />
</p:column>
<p:column field="representative" headerText="Representative" filterMatchMode="exact"
sortBy="#{customer.representative.name}">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('customersTable').filter()" styleClass="custom-filter">
<f:selectItem itemLabel="All" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{dtFilterView.representatives}" />
</p:selectOneMenu>
</f:facet>
<p:graphicImage name="images/avatar/#{customer.representative.image}" library="demo" width="32"
style="vertical-align: middle" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.representative.name}" />
</p:column>
<p:column field="date" headerText="Join Date" filterMatchMode="range">
<f:facet name="filter">
<p:datePicker selectionMode="range" onchange="PF('customersTable2').filter()" />
</f:facet>
</p:column>
<p:column field="status" headerText="Status" filterMatchMode="exact">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('customersTable2').filter()" styleClass="custom-filter">
<f:selectItem itemLabel="All" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{dtFilterView.customerStatus}" />
</p:selectOneMenu>
</f:facet>
<span class="customer-badge status-#{customer.status.name().toLowerCase()}">#{customer.status.toString()}</span>
</p:column>
<p:column headerText="Activity" sortBy="#{customer.activity}">
<p:progressBar value="#{customer.activity}" displayOnly="true" style="height: .5rem" />
</p:column>
</p:dataTable>
</h:form>
</div>
<div class="card">
<h5>Global Filter Function</h5>
<h:form>
<p:dataTable var="customer" value="#{dtFilterView.customers3}" widgetVar="customersTable3"
emptyMessage="No customers found with given criteria"
filteredValue="#{dtFilterView.filteredCustomers3}"
globalFilterFunction="#{dtFilterView.globalFilterFunction}">
<f:facet name="header">
<div class="p-d-flex p-jc-end">
<p:inputText id="globalFilter" onkeyup="PF('customersTable3').filter()" style="width:300px"
placeholder="Search all fields using global function" />
</div>
</f:facet>
<p:column field="name" filterable="false"/>
<p:column headerText="Country" sortBy="#{customer.country.name}" >
<span class="flag flag-#{customer.country.code}" style="width: 30px; height: 20px" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.country.name}" />
</p:column>
<p:column field="representative" headerText="Representative" filterable="false">
<p:graphicImage name="images/avatar/#{customer.representative.image}" library="demo" width="32"
style="vertical-align: middle" />
<h:outputText style="vertical-align: middle; margin-left: .5rem" value="#{customer.representative.name}" />
</p:column>
<p:column field="date" filterable="false"/>
<p:column field="status" filterable="false">
<span class="customer-badge status-#{customer.status.name().toLowerCase()}">#{customer.status.toString()}</span>
</p:column>
<p:column headerText="Activity" sortBy="#{customer.activity}">
<p:progressBar value="#{customer.activity}" displayOnly="true" style="height: .5rem" />
</p:column>
</p:dataTable>
</h:form>
</div>
@Named("dtFilterView")
@ViewScoped
public class FilterView implements Serializable {
@Inject
private CustomerService service;
private List<Customer> customers1;
private List<Customer> customers2;
private List<Customer> customers3;
private List<Customer> filteredCustomers1;
private List<Customer> filteredCustomers2;
private List<Customer> filteredCustomers3;
private List<FilterMeta> filterBy;
@PostConstruct
public void init() {
customers1 = service.getCustomers(10);
customers2 = service.getCustomers(50);
customers3 = service.getCustomers(10);
filterBy = new ArrayList<>();
filterBy.add(FilterMeta.builder()
.field("status")
.filterValue(CustomerStatus.NEW)
.matchMode(MatchMode.EQUALS)
.build());
filterBy.add(FilterMeta.builder()
.field("date")
.filterValue(Arrays.asList(LocalDate.now().minusDays(28), LocalDate.now().plusDays(28)))
.matchMode(MatchMode.RANGE)
.build());
}
public boolean globalFilterFunction(Object value, Object filter, Locale locale) {
String filterText = (filter == null) ? null : filter.toString().trim().toLowerCase();
if (LangUtils.isValueBlank(filterText)) {
return true;
}
int filterInt = getInteger(filterText);
Customer customer = (Customer) value;
return customer.getName().toLowerCase().contains(filterText)
|| customer.getCountry().getName().toLowerCase().contains(filterText)
|| customer.getRepresentative().getName().toLowerCase().contains(filterText)
|| customer.getDate().toString().toLowerCase().contains(filterText)
|| customer.getStatus().name().toLowerCase().contains(filterText)
|| customer.getActivity() < filterInt;
}
private int getInteger(String string) {
try {
return Integer.parseInt(string);
}
catch (NumberFormatException ex) {
return 0;
}
}
public List<Representative> getRepresentatives() {
return service.getRepresentatives();
}
public CustomerStatus[] getCustomerStatus() {
return service.getCustomerStatus();
}
public List<Customer> getCustomers1() {
return customers1;
}
public List<Customer> getCustomers2() {
return customers2;
}
public List<Customer> getCustomers3() {
return customers3;
}
public List<Customer> getFilteredCustomers1() {
return filteredCustomers1;
}
public void setFilteredCustomers1(List<Customer> filteredCustomers1) {
this.filteredCustomers1 = filteredCustomers1;
}
public List<Customer> getFilteredCustomers2() {
return filteredCustomers2;
}
public void setFilteredCustomers2(List<Customer> filteredCustomers2) {
this.filteredCustomers2 = filteredCustomers2;
}
public List<Customer> getFilteredCustomers3() {
return filteredCustomers3;
}
public void setFilteredCustomers3(List<Customer> filteredCustomers3) {
this.filteredCustomers3 = filteredCustomers3;
}
public void setService(CustomerService service) {
this.service = service;
}
public List<FilterMeta> getFilterBy() {
return filterBy;
}
}
@Named
@ApplicationScoped
public class CustomerService {
List<Customer> customers;
private Country[] countries;
private Representative[] representatives;
private String[] names;
private String[] companies;
@PostConstruct
public void init() {
customers = new ArrayList<>();
countries = new Country[]{
new Country(0, "Argentina", "ar"),
new Country(1, "Australia", "au"),
new Country(2, "Brazil", "br"),
new Country(3, "Canada", "ca"),
new Country(4, "Germany", "de"),
new Country(5, "France", "fr"),
new Country(6, "India", "in"),
new Country(7, "Italy", "it"),
new Country(8, "Japan", "jp"),
new Country(9, "Russia", "ru"),
new Country(10, "Spain", "es"),
new Country(11, "United Kingdom", "gb")};
companies = new String[]{"Benton, John B Jr", "Chanay, Jeffrey A Esq", "Chemel, James L Cpa", "Feltz Printing Service",
"Printing Dimensions", "Chapman, Ross E Esq", "Morlong Associates", "Commercial Press", "Truhlar And Truhlar Attys",
"King, Christopher A Esq","Dorl, James J Esq","Rangoni Of Florence","Feiner Bros","Buckley Miller Wright","Rousseaux, Michael Esq",};
representatives = new Representative[]{new Representative("Amy Elsner", "amyelsner.png"), new Representative("Anna Fali", "annafali.png"),
new Representative("Asiya Javayant", "asiyajavayant.png"), new Representative("Bernardo Dominic", "bernardodominic.png"),
new Representative("Elwin Sharvill", "elwinsharvill.png"), new Representative("Ioni Bowcher", "ionibowcher.png"),
new Representative("Ivan Magalhaes", "ivanmagalhaes.png"), new Representative("Onyama Limba", "onyamalimba.png"),
new Representative("Stephen Shaw", "stephenshaw.png"), new Representative("Xuxue Feng", "xuxuefeng.png")};
names = new String[]{"James Butt", "David Darakjy", "Jeanfrancois Venere", "Ivar Paprocki", "Tony Foller",
"Adams Morasca", "Claire Tollner", "Costa Dilliard", "Juan Wieser", "Maria Marrier", "Jennifer Amigon",
"Stacey Maclead", "Leja Caldarera", "Morrow Ruta", "Arvin Albares", "Darci Poquette", "Izzy Garufi",
"Ricardo Gaucho", "Clifford Rim", "Emily Whobrey", "Kadeem Flosi", "Mujtaba Nicka", "Aika Inouye",
"Mayumi Kolmetz", "Misaki Royster", "Silvio Slusarski", "Nicolas Iturbide", "Antonio Caudy", "" +
"Deepesh Chui", "Aditya Kusko", "Aruna Figeroa", "Jones Vocelka", "Julie Stenseth", "Smith Glick",
"Johnson Sergi", "Francesco Shinko", "Salvatore Stockham", "Kaitlin Ostrosky", "Faith Gillian",
"Maisha Rulapaugh", "Jefferson Schemmer", "Leon Oldroyd", "Rodrigues Campain", "Alejandro Perin",
"Munro Ferencz", "Cody Saylors", "Chavez Briddick", "Sinclair Waycott", "Isabel Bowley", "Octavia Malet",
"Murillo Malet", "Greenwood Bolognia", "Wickens Nestle", "Ashley Doe"};
}
public List<Customer> getCustomers(int number) {
List<Customer> customers = new ArrayList<>();
for (int i = 0; i < number; i++) {
customers.add(new Customer(i + 1000, getName(), getCompany(), getCountry(), getDate(), CustomerStatus.random(), getActivity(), getRepresentative()));
}
return customers;
}
public List<Country> getCountries() {
return Arrays.asList(countries);
}
public CustomerStatus[] getCustomerStatus() {
return CustomerStatus.values();
}
public List<Representative> getRepresentatives() {
return Arrays.asList(representatives);
}
private String getName() {
return names[(int) (Math.random() * names.length)];
}
private Country getCountry() {
return countries[(int) (Math.random() * countries.length)];
}
private String getCompany() {
return companies[(int) (Math.random() * companies.length)];
}
private LocalDate getDate() {
LocalDate now = LocalDate.now();
long randomDay = ThreadLocalRandom.current().nextLong(now.minusDays(30).toEpochDay(), now.toEpochDay());
return LocalDate.ofEpochDay(randomDay);
}
private int getActivity() {
return (int) (Math.random() * 100);
}
private Representative getRepresentative() {
return representatives[(int) (Math.random() * representatives.length)];
}
}