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]

Reply via email to