You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/12/11 16:55:12 UTC

svn commit: r889669 - in /labs/magma/trunk/website-beansview: ./ src/main/java/org/apache/magma/website/beansview/ src/main/resources/org/apache/magma/website/beansview/

Author: simoneg
Date: Fri Dec 11 15:55:11 2009
New Revision: 889669

URL: http://svn.apache.org/viewvc?rev=889669&view=rev
Log:
LABS-502 : filtering on lists

Added:
    labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyleDyna.java
    labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/dynaForm.js
Modified:
    labs/magma/trunk/website-beansview/pom.xml
    labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyle.java
    labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/ShowBean.java
    labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartList.java
    labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/magmaBeansview.css

Modified: labs/magma/trunk/website-beansview/pom.xml
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/pom.xml?rev=889669&r1=889668&r2=889669&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/pom.xml (original)
+++ labs/magma/trunk/website-beansview/pom.xml Fri Dec 11 15:55:11 2009
@@ -48,6 +48,11 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.magma</groupId>
+			<artifactId>website-jquery</artifactId>
+			<version>0.0.3-SNAPSHOT</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.magma</groupId>
 			<artifactId>lateconfig-api</artifactId>
 			<version>0.0.3-SNAPSHOT</version>
 		</dependency>

Modified: labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyle.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyle.java?rev=889669&r1=889668&r2=889669&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyle.java (original)
+++ labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyle.java Fri Dec 11 15:55:11 2009
@@ -225,11 +225,11 @@
 					int maxSize = property.getMaximumStringSize();
 					if (property.getViewSettings().isPassword()) {
 						baseclass += " TextField Password";
-						if (maxSize > maxFieldSize) baseclass += " NoSize";
+						if (maxSize <= 0 || maxSize > maxFieldSize) baseclass += " NoSize";
 					} else {
 						if (maxSize < 256) {
 							baseclass += " TextField";
-							if (maxSize > maxFieldSize) baseclass += " NoSize";
+							if (maxSize <= 0 || maxSize > maxFieldSize) baseclass += " NoSize";
 						} else {
 							baseclass += " TextArea";
 						}
@@ -314,4 +314,7 @@
 		buff.append("</div>");
 	}
 
+	public void head(Head head) {
+	}
+
 }

Added: labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyleDyna.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyleDyna.java?rev=889669&view=auto
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyleDyna.java (added)
+++ labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/BeanStyleDyna.java Fri Dec 11 15:55:11 2009
@@ -0,0 +1,68 @@
+package org.apache.magma.website.beansview;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.magma.view.tree.FieldNode;
+import org.apache.magma.view.tree.LabelNode;
+import org.apache.magma.view.tree.Node;
+import org.apache.magma.view.tree.Zone;
+import org.apache.magma.website.Head;
+
+public class BeanStyleDyna extends BeanStyle {
+
+	@Override
+	protected void createTable(Node node) {
+		buff.append("<div class=\"MagmaDynaForm\">");
+		Set<Node> allNodes = node.getAllNodes();
+		List<LabelNode> labels = new ArrayList<LabelNode>();
+		for (Node sub : allNodes) {
+			if (sub instanceof LabelNode) {
+				labels.add((LabelNode) sub);
+			}
+		}
+		Collections.sort(labels, new Comparator<LabelNode>() {
+			public int compare(LabelNode o1, LabelNode o2) {
+				return o1.getId().compareTo(o2.getId());
+			}
+		});
+		for (LabelNode ln : labels) {
+			Node rt = ln.getRelatedTo();
+			if (rt instanceof FieldNode) {
+				FieldNode fn = (FieldNode)rt;
+				buff.append("<div class=\"MagmaDynaBlock " + fn.getId() + "\">");
+				buff.append("<div>");
+				createLabelNodeOutput(ln);
+				buff.append("</div>");
+				buff.append("<div>");					
+				createFieldNodeOutput(fn);
+				buff.append("</div>");
+				buff.append("</div>");
+			}
+		}
+		buff.append("</div>");
+	}
+	
+	@Override
+	public void head(Head head) {
+		super.head(head);
+		head.addJQueryOnload();
+		head.addExternalScript("magma:/common/beansview/dynaForm.js");
+	}
+
+	@Override
+	protected void createInsideZonedNodeTable(Node node) {
+	}
+
+	@Override
+	protected void createOutsideZonedNodeTable(Node node) {
+	}
+
+	@Override
+	protected void createZoneTable(Zone zone, boolean vertical) {
+	}
+	
+}

Modified: labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/ShowBean.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/ShowBean.java?rev=889669&r1=889668&r2=889669&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/ShowBean.java (original)
+++ labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/ShowBean.java Fri Dec 11 15:55:11 2009
@@ -127,6 +127,9 @@
 	@Override
 	public void head(Head head) {
 		head.addCss("magma:/common/beansview/magmaBeansview.css");
+		if (beanStyle != null) {
+			beanStyle.head(head);
+		}
 		root = bean.beanData().getViewTree(this.layers);
 		Set<Node> nodes = root.getAllNodes();
 		for (Node node : nodes) {

Modified: labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartList.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartList.java?rev=889669&r1=889668&r2=889669&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartList.java (original)
+++ labs/magma/trunk/website-beansview/src/main/java/org/apache/magma/website/beansview/SmartList.java Fri Dec 11 15:55:11 2009
@@ -31,6 +31,8 @@
 import org.apache.magma.beans.MagmaBeanSupport;
 import org.apache.magma.beans.PropertyInfo;
 import org.apache.magma.database.Database;
+import org.apache.magma.database.QueryByExampleBuilder;
+import org.apache.magma.database.QueryByExampleBuilder.Query;
 import org.apache.magma.lateconfig.LateConfigurable;
 import org.apache.magma.lateconfig.LateConfigurationTrigger;
 import org.apache.magma.view.MagDefaultLayers;
@@ -50,8 +52,11 @@
 	
 	private String query = null;
 	private Object[] queryParams = null;
+	private MagmaBeanSupport sessionReservedQbe = null;
+	private QueryByExampleBuilder qbuilder = null;
 	
 	private Set<String> sortables = null;
+	private boolean withFilter = false;
 	
 	private HtmlProducer prodHeader = null;
 	private HtmlProducer prodFooter = null;
@@ -85,33 +90,51 @@
 		this.query = query;
 		this.queryParams = queryParams;
 	}
-	
+
+	public <T extends MagmaBeanSupport> SmartList(Class<T> beanClass, T qbe) {
+		this.myclass = beanClass;
+		this.sessionReservedQbe = qbe;
+	}
+
 	public HtmlProducer do_default() {
 		return doShow();
 	}
+
+	protected void computeQbeQuery() {
+		if (this.qbuilder == null) {
+			this.qbuilder = new QueryByExampleBuilder();
+			Query bequery = this.qbuilder.generateQuery(sessionReservedQbe);
+			this.query = bequery.query;
+			this.queryParams = bequery.params;
+		}
+	}
 	
-	@LateConfigurationTrigger
-	public HtmlProducer doShow() {
-		checkSortables();
-		Database db = new Database();
-		int count = -1;
-		StringBuilder countquery = new StringBuilder(this.query); 
-		if (!this.query.toLowerCase().startsWith("select")) {
-			countquery.insert(0, "SELECT COUNT(x) FROM " + this.myclass.getName() + " x ");
-		} else {
-			int index = this.query.toLowerCase().indexOf("from");
-			if (index == -1) {
-				countquery = null;
+	protected int countResults(Database db) {
+		if (this.sessionReservedQbe == null) { 
+			StringBuilder countquery = new StringBuilder(this.query); 
+			if (!this.query.toLowerCase().startsWith("select")) {
+				countquery.insert(0, "SELECT COUNT(x) FROM " + this.myclass.getName() + " x ");
 			} else {
-				countquery.delete(0, index);
-				countquery.insert(0, "SELECT COUNT(x) ");
+				int index = this.query.toLowerCase().indexOf("from");
+				if (index == -1) {
+					countquery = null;
+				} else {
+					countquery.delete(0, index);
+					countquery.insert(0, "SELECT COUNT(x) ");
+				}
 			}
+			if (countquery != null) {
+				return db.queryNumber(countquery.toString(), this.queryParams).intValue();
+			}
+			return -1;
+		} else {
+			computeQbeQuery();
+			return db.queryNumber("SELECT COUNT(x) FROM " + this.myclass.getName() + " x " + this.query, this.queryParams).intValue();
 		}
-		if (countquery != null) {
-			count = db.queryNumber(countquery.toString(), this.queryParams).intValue();
-		}
-		
-		StringBuilder acquery = new StringBuilder(this.query);
+	}
+	
+	protected String getOrderBy() {
+		String orderby = "";
 		if (sessionReservedSorting == null && defaultSorting != null) {
 			sessionReservedSorting = defaultSorting;
 			sessionReservedDesc = defaultDesc;
@@ -129,12 +152,41 @@
 					}
 				}
 				fieldJqlId += ((FieldNode)subnode).getProperty().getName();
-				acquery.append(" ORDER BY ");
-				acquery.append(fieldJqlId);
-				if (sessionReservedDesc) acquery.append(" DESC");
+				orderby = " ORDER BY " + fieldJqlId;
+				if (sessionReservedDesc) orderby += " DESC";
+			}
+		}	
+		return orderby;
+	}
+
+	private List<? extends MagmaBeanSupport> performQuery(Database db) {
+		if (this.sessionReservedQbe != null) {
+			computeQbeQuery();
+		}
+		List<? extends MagmaBeanSupport> list = db.query(myclass, start, len, this.query + getOrderBy(), this.queryParams);
+		return list;
+	}
+	
+	
+	@LateConfigurationTrigger
+	public HtmlProducer doShow() {
+		checkSortables();
+		if (this.withFilter) {
+			if (this.sessionReservedQbe == null) {
+				if (this.query == null || this.query.length() == 0) {
+					try {
+						this.sessionReservedQbe = this.myclass.newInstance();
+					} catch (Exception e) {
+						throw new MagmaException(e, "Cannot initialize an empty {0} to use as query by example for filtering", this.myclass);
+					}
+				} else {
+					throw new MagmaException("You required a filter but also provided a query, you should either provide an empty query or provide a query by example to use with the filter.");
+				}
 			}
 		}
-		List<? extends MagmaBeanSupport> list = db.query(myclass, start, len, acquery.toString(), this.queryParams);
+		Database db = new Database();
+		int count = countResults(db);
+		List<? extends MagmaBeanSupport> list = performQuery(db);
 		parametrize(prodHeader);
 		parametrize(prodFooter);
 		SmartListProducer producer = new SmartListProducer(myclass);
@@ -156,10 +208,27 @@
 		producer.setOuterCssClass(outerCssClass);
 		
 		producer.compoundWith(prodHeader, CompoundType.BEFORE);
+		if (withFilter && this.sessionReservedQbe != null) {
+			producer.compoundWith(handleFilter().do_default(), CompoundType.BEFORE);
+		}
 		producer.compoundWith(prodFooter, CompoundType.AFTER);
 		return producer;
 	}
 	
+	public SmartForm handleFilter() {
+		SmartForm filterform = new SmartForm(this.sessionReservedQbe, "hiddenFiltered");
+		filterform.setBeanStyle(new BeanStyleDyna());
+		filterform.setLayers(MagDefaultLayers.LIST);
+		filterform.setDontValidate(true);
+		return filterform;
+	}
+	
+	public HtmlProducer hiddenFiltered(MagmaBeanSupport qbe) {
+		this.sessionReservedQbe = qbe;
+		return doShow();
+	}
+
+	
 	protected void checkSortables() {
 		if (this.sortables != null) return;
 		BeanData bd = BeanData.getFor(this.myclass);
@@ -269,6 +338,24 @@
 		listStyle = new ListStyleTableWithSorting();
 		return this;
 	}
+	
+	@LateConfigurable	
+	public SmartList useFilter() {
+		this.withFilter = true;
+		return this;
+	}
+	
+	@LateConfigurable	
+	public SmartList setWithFilter(boolean filter) {
+		this.withFilter = filter;
+		return this;
+	}
+	
+	public SmartList setFilterQueryBuilder(QueryByExampleBuilder builder) {
+		this.qbuilder = builder;
+		return this;
+	}
+	
 
 	public String getOuterCssClass() {
 		return outerCssClass;

Added: labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/dynaForm.js
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/dynaForm.js?rev=889669&view=auto
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/dynaForm.js (added)
+++ labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/dynaForm.js Fri Dec 11 15:55:11 2009
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ */
+addOnload(function() {
+	$('.MagmaDynaBlock').each(function() {
+		if ($('.NotNullable', this).length == 0) {
+			$(this).toggle(false);
+		}
+	});
+	$('.MagmaDynaForm').each(function() {
+		var form = this;
+		var rc = 0;
+		this.df_blocks = new Array();
+		this.df_labels = new Array();
+		this.df_set = new Array();
+		$('.MagmaDynaBlock', this).each(function(i) {
+			var labdiv = $('.MagmaLabel',this).get(0);
+			var flddiv = $('.MagmaField',this).get(0);
+			var field = $('input', flddiv).get(0);
+			if (field && $('.NotNullable', this).length == 0) {
+				$(this).addClass('activeBlock');
+				$(this).addClass('block_' + rc);
+				form.df_labels[rc] = ($('label',labdiv).text());
+				form.df_blocks[rc] = this;
+				if (field.type != 'checkbox') {
+					if ($(field).val()) {
+						DynaForm_set(form, rc);
+					} else {
+						form.df_set[rc] = false;
+					}
+				} else {
+					if (field.checked) {
+						DynaForm_set(form, rc);
+					} else {
+						form.df_set[rc] = false;
+					}
+				}
+				rc++;
+			}
+		});
+		$(this).append($('<div class="MagmaDynaSelection"><select/></div>'));
+		DynaForm_resetSelection(this);
+		$('.MagmaDynaSelection select',this).change(DynaForm_selected);
+	});
+	
+});
+
+DynaForm_resetSelection = function(form) {
+	var opts = "<option>----</option>";
+	for (var i = 0; i < form.df_labels.length; i++) {
+		if (!form.df_set[i]) {
+			opts += '<option value="' + i + '">' + form.df_labels[i] + '</option>';
+		}
+	}
+	$('.MagmaDynaSelection select',form).html(opts);
+}
+
+DynaForm_set = function(form, i) {
+	var block = $('.block_' + i,form);
+	block.slideDown('normal');
+	form.df_set[i] = true;
+	block.append($('<div class="MagmaDynaBlockRemove">remove</div>').click(function() { DynaForm_unset(form, i) }));
+}
+
+DynaForm_unset = function(form, i) {
+	var block = $('.block_' + i,form);
+	block.slideUp('normal');
+	$('input', block).val('');
+	$('.MagmaDynaBlockRemove', block).remove();
+	form.df_set[i] = false;	
+	DynaForm_resetSelection(form);
+}
+
+DynaForm_selected = function(evt) {
+	var i = $(this).val();
+	var form =$(this).closest('.MagmaDynaForm')[0];
+	DynaForm_set(form, i);
+	DynaForm_resetSelection(form);
+}

Modified: labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/magmaBeansview.css
URL: http://svn.apache.org/viewvc/labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/magmaBeansview.css?rev=889669&r1=889668&r2=889669&view=diff
==============================================================================
--- labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/magmaBeansview.css (original)
+++ labs/magma/trunk/website-beansview/src/main/resources/org/apache/magma/website/beansview/magmaBeansview.css Fri Dec 11 15:55:11 2009
@@ -233,3 +233,47 @@
 	text-align: right;
 }
 
+.MagmaDynaBlock {
+	float: left;
+	width: 100%;	
+}
+
+.MagmaDynaBlock .MagmaLabel {
+	float:left;	
+	clear: left;
+	width: 15%;
+	text-align: right;
+	font-size:90%;
+	font-weight:bold;
+	padding-right:5px;
+	text-align:right;
+	vertical-align:top;
+	margin-bottom: 5px;	
+}
+
+.MagmaDynaBlock .MagmaField {
+	width: 75%;
+	float: left;
+	margin-bottom: 5px;	
+}
+
+.MagmaDynaBlockRemove {
+	float: right;	
+	clear: right;
+}
+
+.MagmActions {
+	clear: both;	
+}
+
+.MagmaDynaSelection {
+	float:left;	
+	clear: left;
+	width: 15%;
+	text-align: right;
+	font-size:90%;
+	font-weight:bold;
+	padding-right:5px;
+	margin-bottom: 5px;		
+	text-align:right;
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org