You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by an...@apache.org on 2007/04/20 17:40:41 UTC

svn commit: r530835 - in /tapestry/tapestry4/trunk/tapestry-framework/src: java/org/apache/tapestry/dojo/form/Autocompleter.java java/org/apache/tapestry/dojo/form/Autocompleter.jwc test/org/apache/tapestry/dojo/form/TestAutocompleter.java

Author: andyhot
Date: Fri Apr 20 08:40:37 2007
New Revision: 530835

URL: http://svn.apache.org/viewvc?view=rev&rev=530835
Log:
Autocompleter to support local mode, i.e. getting values from the option tags.

Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.jwc
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java?view=diff&rev=530835&r1=530834&r2=530835
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java Fri Apr 20 08:40:37 2007
@@ -49,6 +49,7 @@
 {
     // mode, can be remote or local (local being from html rendered option elements)
     private static final String MODE_REMOTE = "remote";
+    private static final String MODE_LOCAL = "local";    
     
     /**
      * 
@@ -56,6 +57,10 @@
      */
     protected void renderFormWidget(IMarkupWriter writer, IRequestCycle cycle)
     {
+        IAutocompleteModel model = getModel();
+        if (model == null)
+            throw Tapestry.createRequiredParameterException(this, "model");
+                
         renderDelegatePrefix(writer, cycle);
         
         writer.begin("select");
@@ -76,17 +81,32 @@
         
         writer.print(" ");
         
+        if (isLocal()) 
+        {
+            List list = model.getValues("");
+            for (int i=0; i<list.size(); i++) 
+            {
+                Object key = model.getPrimaryKey(list.get(i));
+                writer.begin("option");
+                writer.attribute("value", getDataSqueezer().squeeze(key));
+                writer.print(model.getLabelFor(list.get(i)));
+                writer.end();
+            }
+        }
+        
         writer.end();
         renderDelegateSuffix(writer, cycle);
         
-        ILink link = getDirectService().getLink(true, new DirectServiceParameter(this));
-        
         Map parms = new HashMap();
         parms.put("id", getClientId());
         
         JSONObject json = new JSONObject();
-        json.put("dataUrl", link.getURL() + "&filter=%{searchString}");
-        json.put("mode", MODE_REMOTE);
+        if (!isLocal())
+        {
+            ILink link = getDirectService().getLink(true, new DirectServiceParameter(this));
+            json.put("dataUrl", link.getURL() + "&filter=%{searchString}");
+        }
+        json.put("mode", isLocal() ? MODE_LOCAL : MODE_REMOTE);
         json.put("widgetId", getName());
         json.put("name", getName());
         json.put("searchDelay", getSearchDelay());
@@ -95,9 +115,6 @@
         json.put("forceValidOption", isForceValidOption());
         json.put("disabled", isDisabled());
         
-        IAutocompleteModel model = getModel();
-        if (model == null)
-            throw Tapestry.createRequiredParameterException(this, "model");
         
         Object value = getValue();
         Object key = value != null ? model.getPrimaryKey(value) : null;
@@ -202,6 +219,9 @@
     
     /** Forces select to only allow valid option strings. */
     public abstract boolean isForceValidOption();
+    
+    /** Forces select to work in local mode (no xhr). */
+    public abstract boolean isLocal();    
     
     /** @since 2.2 * */
     public abstract Object getValue();

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.jwc
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.jwc?view=diff&rev=530835&r1=530834&r2=530835
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.jwc (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.jwc Fri Apr 20 08:40:37 2007
@@ -41,6 +41,13 @@
   
   <parameter name="forceValidOption" default-value="true" />
   
+  <parameter name="local">
+    <description>Makes the autocompleter work in local mode.
+        All values provided by the model are rendered as options in the 
+        html and are used for autocomplete.
+    </description>
+  </parameter>
+  
   <parameter name="displayName"/>
   <parameter name="validators"/>
   

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java?view=diff&rev=530835&r1=530834&r2=530835
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java Fri Apr 20 08:40:37 2007
@@ -40,6 +40,7 @@
 import org.apache.tapestry.services.ResponseBuilder;
 import org.apache.tapestry.valid.IValidationDelegate;
 import org.apache.tapestry.valid.ValidatorException;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 /**
@@ -152,8 +153,20 @@
         verify();
     }
     
-    public void test_Render()
-    {
+    @DataProvider(name="renderings")
+    public Object[][] createRenderings() {
+        return new Object[][] {
+            {"<span class=\"prefix\"><select name=\"fred\" autocomplete=\"off\" id=\"fred\" class=\"validation-delegate\"> </select></span>",
+                     Boolean.FALSE},
+            {"<span class=\"prefix\"><select name=\"fred\" autocomplete=\"off\" id=\"fred\" class=\"validation-delegate\"> <option " +
+                     "value=\"1p\">Simple 1</option><option value=\"2p\">Simple 2</option><option value=\"3p\">Simple 3</option></select></span>",
+                     Boolean.TRUE}
+        };
+    }    
+    
+    @Test(dataProvider = "renderings")
+    public void test_Render(String outcome, Boolean local)
+    {           
         IAutocompleteModel model = createModel();
         ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
         DataSqueezer ds = newMock(DataSqueezer.class);
@@ -179,7 +192,7 @@
             "script", script,
             "validatableFieldSupport", vfs, 
             "value", match,
-            "dataSqueezer", ds
+            "dataSqueezer", ds, "local", local
         });
         
         expect(cycle.renderStackPush(component)).andReturn(component);
@@ -210,16 +223,23 @@
         expect(resp.isDynamic()).andReturn(false).anyTimes();
         
         vfs.renderContributions(component, writer, cycle);
-        
-        trainGetLinkCheckIgnoreParameter(engine, cycle, true, dsp, link);
-        
-        trainGetURL(link, "urlstring");
+        if (!local.booleanValue()) 
+        {
+            trainGetLinkCheckIgnoreParameter(engine, cycle, true, dsp, link);        
+            trainGetURL(link, "urlstring");
+        }
+        else 
+        {
+            expect(ds.squeeze(1)).andReturn("1p");
+            expect(ds.squeeze(2)).andReturn("2p");
+            expect(ds.squeeze(3)).andReturn("3p");
+        }
+        // for the default value
+        expect(ds.squeeze(2)).andReturn("2p"); 
         
         PageRenderSupport prs = newPageRenderSupport();
         trainGetPageRenderSupport(cycle, prs);
         
-        expect(ds.squeeze(2)).andReturn("2p");
-        
         script.execute(eq(component), eq(cycle), eq(prs), isA(Map.class));
         
         expect(cycle.renderStackPop()).andReturn(component);
@@ -230,7 +250,7 @@
         
         verify();
         
-        assertBuffer("<span class=\"prefix\"><select name=\"fred\" autocomplete=\"off\" id=\"fred\" class=\"validation-delegate\"> </select></span>");
+        assertBuffer(outcome);
     }
     
     public void test_Render_JSON()