proposal: dataTable wildcard filter

UI Components for JSF
Post Reply
kumm
Posts: 7
Joined: 21 Nov 2010, 21:07

17 Jun 2011, 16:07

Hi,
it's not a huge feature, but maybe somebody need it too.
This approach understands '%' as any character, and '?' as one character,
and by default renders an '%' to the filter input.

(I can't send as an issue, because 'quota exceed' encounters at attachments.)

Usage:

Code: Select all

<p:column filterBy="#{car.model}"  filterMatchMode="wildcard">
Patch:

Code: Select all

Index: primefaces/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java
===================================================================
--- primefaces.orig/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java	2011-06-16 19:54:35.145039860 +0200
+++ primefaces/src/main/java-templates/org/primefaces/component/column/ColumnTemplate.java	2011-06-16 20:38:02.278863715 +0200
@@ -21,6 +21,7 @@
     private final static String ENDS_WITH_MATCH_MODE = "endsWith";
     private final static String CONTAINS_MATCH_MODE = "contains";
     private final static String EXACT_MATCH_MODE = "exact";
+    private final static String WILDCARD_MATCH_MODE = "wildcard";
 
     public FilterConstraint getFilterConstraint() {
         String filterMatchMode = getFilterMatchMode();
@@ -34,8 +35,14 @@
                 filterConstraint = new ContainsFilterConstraint();
             } else if(filterMatchMode.equals(EXACT_MATCH_MODE)) {
                 filterConstraint = new ExactFilterConstraint();
+            } else if(filterMatchMode.equals(WILDCARD_MATCH_MODE)) {
+                filterConstraint = new WildcardFilterConstraint();
             }
         }
 
         return filterConstraint;
+    }
+
+    public String getEmptyFilterValue() {
+        return WILDCARD_MATCH_MODE.equals(getFilterMatchMode()) ? WildcardFilterConstraint.ANY : "";
     }
\ No newline at end of file
Index: primefaces/src/main/java/org/primefaces/model/filter/WildcardFilterConstraint.java
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ primefaces/src/main/java/org/primefaces/model/filter/WildcardFilterConstraint.java	2011-06-16 20:51:32.220051641 +0200
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2010 Prime Technology.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.primefaces.model.filter;
+
+import java.util.regex.Pattern;
+
+public class WildcardFilterConstraint implements FilterConstraint {
+    public final static String ANY = "%";
+    
+    public boolean applies(String value, String filter) {
+        if (filter.equals(ANY)) return true;
+        String regex = wildcardToRegex(filter.toLowerCase());
+        return Pattern.matches(regex, value.toLowerCase());
+    }
+    
+    //stolen from here: http://www.rgagnon.com/javadetails/java-0515.html
+    private String wildcardToRegex(String wildcard){
+        StringBuilder s = new StringBuilder(wildcard.length());
+        s.append('^');
+        for (int i = 0, is = wildcard.length(); i < is; i++) {
+            char c = wildcard.charAt(i);
+            switch(c) {
+                case '%':                    
+                    s.append(".*");
+                    break;
+                case '?':
+                    s.append(".");
+                    break;
+                    // escape special regexp-characters
+                case '(': case ')': case '[': case ']': case '$':
+                case '^': case '.': case '{': case '}': case '|': case '*':
+                case '\\':
+                    s.append("\\");
+                    s.append(c);
+                    break;
+                default:
+                    s.append(c);
+                    break;
+            }
+        }
+        s.append("$");
+        return(s.toString());
+    }
+}
\ No newline at end of file
Index: primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java
===================================================================
--- primefaces.orig/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java	2011-06-16 20:30:41.218216819 +0200
+++ primefaces/src/main/java/org/primefaces/component/datatable/DataTableRenderer.java	2011-06-16 20:31:23.678279086 +0200
@@ -325,7 +325,7 @@
 
         if(column.getValueExpression("filterOptions") == null) {
             String filterEvent = "on" + column.getFilterEvent();
-            String filterValue = params.containsKey(filterId) ? params.get(filterId) : "";
+            String filterValue = params.containsKey(filterId) ? params.get(filterId) : column.getEmptyFilterValue();
 
             writer.startElement("input", null);
             writer.writeAttribute("id", filterId, null);

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 66 guests