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="<tc:link>">
<pre><code class="language-markup"><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} <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"><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="<tc:sheet/>" image="image/feather-leaf.png"
+ link="#{overviewBundle.tagDocUrl}/sheet.html"/>
+ |
+ <tc:link label="<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>