You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2016/08/24 08:38:07 UTC

svn commit: r1757472 - in /myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main: java/org/apache/myfaces/tobago/example/demo/ webapp/content/20-component/040-command/00-button+link/ webapp/content/20-component/080-sheet/50-filter/

Author: lofwyr
Date: Wed Aug 24 08:38:07 2016
New Revision: 1757472

URL: http://svn.apache.org/viewvc?rev=1757472&view=rev
Log:
TOBAGO 1544  Demo  
* sheet filter
[developed by hnoeth]

Added:
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilterController.java
Removed:
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilter.java
Modified:
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/040-command/00-button+link/button+link.xhtml
    myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/50-filter/sheet-filter.xhtml

Added: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilterController.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilterController.java?rev=1757472&view=auto
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilterController.java (added)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SheetFilterController.java Wed Aug 24 08:38:07 2016
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.myfaces.tobago.example.demo;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.tobago.example.data.SolarObject;
+import org.apache.myfaces.tobago.model.SelectItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.enterprise.context.RequestScoped;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
+import javax.faces.event.AjaxBehaviorEvent;
+import javax.inject.Named;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+@RequestScoped
+@Named
+public class SheetFilterController extends SheetController implements Serializable {
+
+  private static final Logger LOG = LoggerFactory.getLogger(SheetFilterController.class);
+
+  private List<SolarObject> filteredSolarList = new ArrayList<SolarObject>();
+
+  private SelectItem[] distanceItems;
+  private SelectItem[] minYearItems;
+  private SelectItem[] maxYearItems;
+
+  private DistanceRangeConverter distanceRangeConverter;
+
+  private String name;
+  private String orbit;
+  private DistanceRange distance;
+  private String discoverer;
+  private Integer minYear;
+  private Integer maxYear;
+
+  public SheetFilterController() {
+    distanceItems = new SelectItem[]{
+        new SelectItem(new DistanceRange(-1, Integer.MAX_VALUE), "any"),
+        new SelectItem(new DistanceRange(-1, 10), "≤ 10"),
+        new SelectItem(new DistanceRange(10, 100), "10 < x ≤ 100"),
+        new SelectItem(new DistanceRange(100, 1000), "100 < x ≤ 1000"),
+        new SelectItem(new DistanceRange(1000, 10000), "1000 < x ≤ 10000"),
+        new SelectItem(new DistanceRange(10000, 100000), "10000 < x ≤ 100000"),
+        new SelectItem(new DistanceRange(100000, 1000000), "100000 < x ≤ 1000000"),
+        new SelectItem(new DistanceRange(1000000, Integer.MAX_VALUE), "1000000 < x")
+    };
+
+    Set<Integer> years = new TreeSet<Integer>();
+    for (SolarObject solarObject : getSolarList()) {
+      if (solarObject.getDiscoverYear() != null) {
+        years.add(solarObject.getDiscoverYear());
+      }
+    }
+    minYearItems = new SelectItem[years.size() + 1];
+    maxYearItems = new SelectItem[years.size() + 1];
+    minYearItems[0] = new SelectItem(0, "min");
+    maxYearItems[0] = new SelectItem(Integer.MAX_VALUE, "max");
+    int i = 1;
+    for (Integer year : years) {
+      SelectItem selectItem = new SelectItem(year, String.valueOf(year));
+
+      minYearItems[i] = selectItem;
+      maxYearItems[i] = selectItem;
+
+      i++;
+    }
+
+    distanceRangeConverter = new DistanceRangeConverter();
+
+    filter();
+  }
+
+  public String filter() {
+    filteredSolarList.clear();
+    if (name == null) {
+      name = "";
+    }
+    if (orbit == null) {
+      orbit = "";
+    }
+    if (distance == null) {
+      distance = (DistanceRange) distanceItems[0].getValue();
+    }
+    if (discoverer == null) {
+      discoverer = "";
+    }
+    if (minYear == null) {
+      minYear = 0;
+    }
+    if (maxYear == null) {
+      maxYear = Integer.MAX_VALUE;
+    }
+    for (final SolarObject solarObject : getSolarList()) {
+      int discoverYear = 0;
+      if (solarObject.getDiscoverYear() != null) {
+        discoverYear = solarObject.getDiscoverYear();
+      }
+      if (StringUtils.containsIgnoreCase(solarObject.getName(), name)
+          && StringUtils.containsIgnoreCase(solarObject.getOrbit(), orbit)
+          && distance.getMin() < solarObject.getDistance() && solarObject.getDistance() <= distance.getMax()
+          && StringUtils.containsIgnoreCase(solarObject.getDiscoverer(), discoverer)
+          && minYear <= discoverYear && discoverYear <= maxYear) {
+        filteredSolarList.add(solarObject);
+      }
+    }
+    return null;
+  }
+
+  public void filter(AjaxBehaviorEvent event) {
+    filter();
+  }
+
+  public List<SolarObject> getFilteredSolarList() {
+    return filteredSolarList;
+  }
+
+  public SelectItem[] getDistanceItems() {
+    return distanceItems;
+  }
+
+  public SelectItem[] getMinYearItems() {
+    return minYearItems;
+  }
+
+  public SelectItem[] getMaxYearItems() {
+    return maxYearItems;
+  }
+
+  public DistanceRangeConverter getDistanceRangeConverter() {
+    return distanceRangeConverter;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getOrbit() {
+    return orbit;
+  }
+
+  public void setOrbit(String orbit) {
+    this.orbit = orbit;
+  }
+
+  public DistanceRange getDistance() {
+    return distance;
+  }
+
+  public void setDistance(DistanceRange distance) {
+    this.distance = distance;
+  }
+
+  public String getDiscoverer() {
+    return discoverer;
+  }
+
+  public void setDiscoverer(String discoverer) {
+    this.discoverer = discoverer;
+  }
+
+  public Integer getMinYear() {
+    return minYear;
+  }
+
+  public void setMinYear(Integer minYear) {
+    this.minYear = minYear;
+  }
+
+  public Integer getMaxYear() {
+    return maxYear;
+  }
+
+  public void setMaxYear(Integer maxYear) {
+    this.maxYear = maxYear;
+  }
+
+  private class DistanceRange {
+
+    private int min;
+    private int max;
+    private final String label;
+
+    public DistanceRange(int min, int max) {
+      this.min = min;
+      this.max = max;
+      label = String.valueOf(min) + " < x ≤ " + String.valueOf(max);
+    }
+
+    public DistanceRange(int min, int max, String label) {
+      this.min = min;
+      this.max = max;
+      this.label = label;
+    }
+
+    public int getMin() {
+      return min;
+    }
+
+    public int getMax() {
+      return max;
+    }
+
+    public String getLabel() {
+      return label;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+      if (this == object) {
+        return true;
+      }
+      if (object == null || getClass() != object.getClass()) {
+        return false;
+      }
+      final DistanceRange that = (DistanceRange) object;
+      return max == that.max && min == that.min;
+    }
+
+    @Override
+    public int hashCode() {
+      return 31 * min + max;
+    }
+  }
+
+  public class DistanceRangeConverter implements Converter {
+    @Override
+    public Object getAsObject(final FacesContext context, final UIComponent component, final String value)
+        throws ConverterException {
+      try {
+        for (SelectItem distanceItem : distanceItems) {
+          if (distanceItem.getLabel().equals(value)) {
+            return distanceItem.getValue();
+          }
+        }
+        return distanceItems[0].getValue();
+      } catch (RuntimeException e) {
+        LOG.warn("unknown value='" + value + "'", e);
+        return distanceItems[0].getValue();
+      }
+    }
+
+    @Override
+    public String getAsString(
+        final FacesContext context, final UIComponent component, final Object value) throws ConverterException {
+      if (value instanceof DistanceRange) {
+        for (SelectItem distanceItem : distanceItems) {
+          if (distanceItem.getValue().equals(value)) {
+            return distanceItem.getLabel();
+          }
+        }
+      }
+      return distanceItems[0].getLabel();
+    }
+  }
+}

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/040-command/00-button+link/button+link.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/040-command/00-button%2Blink/button%2Blink.xhtml?rev=1757472&r1=1757471&r2=1757472&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/040-command/00-button+link/button+link.xhtml (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/040-command/00-button+link/button+link.xhtml Wed Aug 24 08:38:07 2016
@@ -31,6 +31,11 @@
 
   <tc:section label="Basics">
     <p>The next two sections show how a link and a button is set.</p>
+    <p>'apache.org' leads to the appropriated website.<br/>
+      'Disable' show a disabled link/button.<br/>
+      'Resource' use the <code>resource</code> attribute, leading to the #{overviewBundle.component} section.<br/>
+      'Action' use the <code>action</code> attribute to link the #{overviewBundle.component} section.<br/>
+      The image leads to www.apache.org.</p>
     <tc:section label="&lt;tc:link>">
       <pre><code class="language-markup">&lt;tc:link label="apache.org" link="https://www.apache.org/"/></code></pre>
       <tc:link id="l1" label="apache.org" link="https://www.apache.org/"/>

Modified: myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/50-filter/sheet-filter.xhtml
URL: http://svn.apache.org/viewvc/myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/50-filter/sheet-filter.xhtml?rev=1757472&r1=1757471&r2=1757472&view=diff
==============================================================================
--- myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/50-filter/sheet-filter.xhtml (original)
+++ myfaces/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/080-sheet/50-filter/sheet-filter.xhtml Wed Aug 24 08:38:07 2016
@@ -22,69 +22,86 @@
                 xmlns:ui="http://java.sun.com/jsf/facelets"
                 xmlns:f="http://java.sun.com/jsf/core"
                 xmlns="http://www.w3.org/1999/xhtml">
-  <ui:param name="title" value="#{overviewBundle.sheet_filter}"/>
-
-  <tc:panel>
-    <f:facet name="layout">
-      <tc:gridLayout rows="1*;5*"/>
-    </f:facet>
-
-    <tc:panel>
-      Filter demo.
-      <br/>
-      <b>Warning:</b> paging currently doesn't work with filters
-    </tc:panel>
-
-    <tc:sheet value="#{sheetFilter.filtered}" id="sheet" rows="20"
-              columns="3*;2*;2*;2*" var="luminary"
-              state="#{sheetFilter.state}"
-              showRowRange="none"
-              showPageRange="none"
-              showDirectLinks="none">
-<!-- XXX paging currently doesn't work with filters -->
-
+  <ui:param name="title" value="#{overviewBundle.sheet_filter} &lt;tc:sheet/>"/>
+  <p>Filtering is not a explicit feature of the sheet. It is done in the controller.</p>
+  <p>To add filtering components to the header of a sheet, use
+    <code class="language-markup">&lt;f:facet name="header"></code>.</p>
+  <p><b>Warning:</b> Paging currently doesn't work with filters!</p>
+  <p>Tag Library Documentation:
+    <tc:link label="&lt;tc:sheet/>" image="image/feather-leaf.png"
+             link="#{overviewBundle.tagDocUrl}/sheet.html"/>
+    |
+    <tc:link label="&lt;tc:column/>" image="image/feather-leaf.png"
+             link="#{overviewBundle.tagDocUrl}/column.html"/></p>
+
+  <tc:section label="#{overviewBundle.sheet_filter}">
+    <p>Add a search string to the inputfield or change the value of the dropdown boxes to filter the sheet.
+      If an inputfield lost focus the filtering will be executed.</p>
+    <tc:sheet id="sheet" value="#{sheetFilterController.filteredSolarList}" var="object" rows="15">
       <f:facet name="header">
-        <tc:form>
-
-          <tc:out value="Name"/>
-          <tc:out value="Orbit of"/>
-          <tc:out value="#{overviewBundle.solarArrayDistance} [1000 km]"/>
-          <tc:out value="Discoverer"/>
-
-          <tc:in value="#{sheetFilter.name}">
-            <!-- a change facet works, but is not nice to use in most cases -->
-<!--
-                        <f:facet name="change">
-                          <tc:command action="#{sheetFilter.filter}" renderedPartially="sheet"/>
-                        </f:facet>
--->
-          </tc:in>
-          <tc:in value="#{sheetFilter.orbit}"/>
-          <tc:selectOneChoice value="#{sheetFilter.distance}" converter="#{sheetFilter.converter}">
-            <tc:selectItems value="#{sheetFilter.distanceItems}"/>
-          </tc:selectOneChoice>
-
-          <!-- XXX workaround -->
+        <tc:form id="headerForm">
           <tc:panel>
-            <tc:in value="#{sheetFilter.discoverer}"/>
-            <tc:button action="#{sheetFilter.filter}" label="Filter" renderedPartially="sheet" defaultCommand="true"/>
+            <tc:out value="Name"/>
+            <tc:in value="#{sheetFilterController.name}">
+              <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+            </tc:in>
+          </tc:panel>
+          <tc:panel>
+            <tc:out value="Orbit"/>
+            <tc:in value="#{sheetFilterController.orbit}">
+              <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+            </tc:in>
+          </tc:panel>
+          <tc:panel>
+            <tc:out value="Distance [1000 km]"/>
+            <tc:selectOneChoice value="#{sheetFilterController.distance}"
+                                converter="#{sheetFilterController.distanceRangeConverter}">
+              <tc:selectItems value="#{sheetFilterController.distanceItems}"/>
+              <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+            </tc:selectOneChoice>
+          </tc:panel>
+          <tc:out value="Period"/>
+          <tc:panel>
+            <tc:out value="Discoverer"/>
+            <tc:in value="#{sheetFilterController.discoverer}">
+              <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+            </tc:in>
+          </tc:panel>
+          <tc:panel>
+            <tc:out value="Year"/>
+            <tc:flexLayout columns="1*;1*">
+              <tc:selectOneChoice value="#{sheetFilterController.minYear}">
+                <tc:style width="70px"/>
+                <tc:selectItems value="#{sheetFilterController.minYearItems}"/>
+                <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+              </tc:selectOneChoice>
+              <tc:selectOneChoice value="#{sheetFilterController.maxYear}">
+                <tc:style width="70px"/>
+                <tc:selectItems value="#{sheetFilterController.maxYearItems}"/>
+                <f:ajax execute=":::sheet" render=":::sheet" listener="#{sheetFilterController.filter}"/>
+              </tc:selectOneChoice>
+            </tc:flexLayout>
           </tc:panel>
-
         </tc:form>
       </f:facet>
-
-      <tc:column id="name">
-        <tc:out value="#{luminary.name}" id="t_name"/>
+      <tc:column>
+        #{object.name}
+      </tc:column>
+      <tc:column>
+        #{object.orbit}
+      </tc:column>
+      <tc:column>
+        #{object.distance}
       </tc:column>
-      <tc:column id="orbit" label="#{overviewBundle.solarArrayOrbit}" sortable="true">
-        <tc:out value="#{luminary.orbit}" id="t_orbit"/>
+      <tc:column>
+        #{object.period}
       </tc:column>
-      <tc:column sortable="true" align="right" id="distance">
-        <tc:out value="#{luminary.distance}" id="t_distance"/>
+      <tc:column>
+        #{object.discoverer}
       </tc:column>
-      <tc:column label="#{overviewBundle.solarArrayPeriod}" sortable="true" align="right" id="discoverer">
-        <tc:out value="#{luminary.discoverer}" id="t_discoverer"/>
+      <tc:column>
+        #{object.discoverYear}
       </tc:column>
     </tc:sheet>
-  </tc:panel>
+  </tc:section>
 </ui:composition>