external filtering with rich:columnGroup
peter.bachl May 18, 2010 5:01 AMHello,
although I have come across some postings and entries in the issue tracker, I want to ask for your comments on a rather simple example concerning external filtering and rich:columnGroup.
the example mainly contains:
- a rich:dataTable listing all supported locales returned by java.util.Locale.getAvailableLocales()
- a text-input for entering some filter-criteria, rerendering the table for onkeyup events
- a Bean providing a filter method working on the row's display name (java.util.Locale.getDisplayName())
(obviously, the javascript function is taken from the RichFaches live demo...)
here's my JSP page:
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" xmlns:layout="urn:jsptagdir:/WEB-INF/tags" version="2.1"> <jsp:directive.page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" /> <script type="text/javascript"> function setCaretToEnd (e) { var control = $((e.target ? e.target : e.srcElement).id); if (control.createTextRange) { var range = control.createTextRange(); range.collapse(false); range.select(); } else if (control.setSelectionRange) { control.focus(); var length = control.value.length; control.setSelectionRange(length, length); } control.selectionStart = control.selectionEnd = control.value.length; } </script> <jsp:body> <f:subview id="page"> <a4j:form id="filterForm"> <h:outputLabel for="filterInput" value="filtering: " /> <h:inputText id="filterInput" value="#{tableBean.filterByDisplayNameValue}"> <a4j:support event="onkeyup" reRender="table" ignoreDupResponses="true" requestDelay="500" oncomplete="setCaretToEnd(event);" /> </h:inputText> </a4j:form> <rich:dataTable id="table" value="#{tableBean.tableData}" var="item"> <f:facet name="header"> <rich:columnGroup> <rich:column rowspan="2"><h:outputText value="Country" /></rich:column> <rich:column rowspan="2"><h:outputText value="Language" /></rich:column> <rich:column rowspan="2"><h:outputText value="Variant" /></rich:column> <rich:column rowspan="2"><h:outputText value="ISO specific" /></rich:column> <rich:column colspan="4"><h:outputText value="for display" /></rich:column> <rich:column breakBefore="true"><h:outputText value="name" /></rich:column> <rich:column><h:outputText value="country" /></rich:column> <rich:column><h:outputText value="language" /></rich:column> <rich:column><h:outputText value="variant" /></rich:column> </rich:columnGroup> </f:facet> <rich:columnGroup> <rich:column rowspan="2"><h:outputText value="#{item.country}" /></rich:column> <rich:column rowspan="2"><h:outputText value="#{item.language}" /></rich:column> <rich:column rowspan="2"><h:outputText value="#{item.variant}" /></rich:column> <rich:column><h:outputText value="#{item.ISO3Country}" /></rich:column> <rich:column rowspan="2" filterMethod="#{tableBean.doFilterTable}"> <h:outputText value="#{item.displayName}" /> </rich:column> <rich:column rowspan="2"><h:outputText value="#{item.displayCountry}" /></rich:column> <rich:column rowspan="2"><h:outputText value="#{item.displayLanguage}" /></rich:column> <rich:column rowspan="2"><h:outputText value="#{item.displayVariant}" /></rich:column> <rich:column breakBefore="true"><h:outputText value="#{item.ISO3Language}" /></rich:column> </rich:columnGroup> <!-- <rich:column><h:outputText value="#{item.country}" /></rich:column> <rich:column><h:outputText value="#{item.language}" /></rich:column> <rich:column><h:outputText value="#{item.variant}" /></rich:column> <rich:column> <h:outputText value="#{item.ISO3Country}" /> <br /> <h:outputText value="#{item.ISO3Language}" /> </rich:column> <rich:column filterMethod="#{tableBean.doFilterTable}"><h:outputText value="#{item.displayName}" /></rich:column> <rich:column><h:outputText value="#{item.displayCountry}" /></rich:column> <rich:column><h:outputText value="#{item.displayLanguage}" /></rich:column> <rich:column><h:outputText value="#{item.displayVariant}" /></rich:column> --> </rich:dataTable> </f:subview> </jsp:body> </jsp:root>
and the bean (omitting the imports):
public class TableBean { private ListDataModel data; private String filterByDisplayNameValue; public boolean doFilterTable(Object current) { if (getFilterByDisplayNameValue() != null && !"".equals(getFilterByDisplayNameValue()) && current != null && current instanceof Locale) { return ((Locale) current).getDisplayName().startsWith(getFilterByDisplayNameValue()); } else { return true; } } public ListDataModel getTableData() { if (data == null) { data = new ListDataModel(Arrays.asList(Locale.getAvailableLocales())); } return data; } public String getFilterByDisplayNameValue() { return filterByDisplayNameValue; } public void setFilterByDisplayNameValue(String filterByDisplayNameValue) { this.filterByDisplayNameValue = filterByDisplayNameValue; } }
Why is the filter method, specified for the column contained within a columnGroup, NOT called?
Using the commented columns instead of the columnGroup everything works like charm...
Is this meant be design or is some kind of bug?
I am really interested in using a columnGroup, since we already have this rather complex dataTable using columnGroup where we have to add filtering now and I want to avoid refactoring this complex table to not use columnGroup...
Thanks for your comments!
Peter