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: [email protected]
For additional commands, e-mail: [email protected]