You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/06/04 23:13:16 UTC

svn commit: r411598 - in /tapestry/tapestry4/trunk/framework/src: java/org/apache/tapestry/dojo/form/ java/org/apache/tapestry/dojo/html/ java/org/apache/tapestry/form/ js/ js/tapestry/ js/tests/

Author: jkuhnert
Date: Sun Jun  4 14:13:15 2006
New Revision: 411598

URL: http://svn.apache.org/viewvc?rev=411598&view=rev
Log:
Syncing form logic work up before attacking too much server code. Added form submission logic, deprecated Tapestry.<foo> form functions
in favor of new dojo packaged tapestry.form functions..Added deprecated warnings for old functions and provided backwayds compatible
versions for Form.js, created new javascript mock testing ability. (not hard) 

Added:
    tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js   (with props)
    tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js   (with props)
Modified:
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/Form.js
    tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
    tapestry/tapestry4/trunk/framework/src/js/build.xml
    tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js
    tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js
    tapestry/tapestry4/trunk/framework/src/js/tapestry/test.js
    tapestry/tapestry4/trunk/framework/src/js/tests/test_debug.js

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/form/Autocompleter.java Sun Jun  4 14:13:15 2006
@@ -84,8 +84,27 @@
         str.append("dataUrl:'").append(link.getURL()).append("&filter=%{searchString}',")
         .append("mode:'remote',")
         .append("widgetId:'").append(getName()).append("', ")
-        .append("name:'").append(getName()).append("'")
-        .append("}");
+        .append("name:'").append(getName()).append("'");
+        
+        IPropertySelectionModel model = getModel();
+        if (model == null)
+            throw Tapestry.createRequiredParameterException(this, "model");
+        
+        int count = model.getOptionCount();
+        Object value = getValue();
+        
+        for (int i = 0; i < count; i++) {
+            Object option = model.getOption(i);
+            
+            if (isEqual(option, value)) {
+                str.append(", comboBoxValue:'").append(model.getValue(i)).append("',")
+                .append("comboBoxSelectionValue:'").append(model.getLabel(i))
+                .append("'");
+                break;
+            }
+        }
+        
+        str.append("}");
         
         parms.put("props", str.toString());
         
@@ -143,6 +162,23 @@
         {
             getForm().getDelegate().record(e);
         }
+    }
+    
+    private boolean isEqual(Object left, Object right)
+    {
+        // Both null, or same object, then are equal
+        
+        if (left == right)
+            return true;
+        
+        // If one is null, the other isn't, then not equal.
+        
+        if (left == null || right == null)
+            return false;
+        
+        // Both non-null; use standard comparison.
+        
+        return left.equals(right);
     }
     
     /** 

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script Sun Jun  4 14:13:15 2006
@@ -28,7 +28,14 @@
         </if>
         <if expression="formEvents">
             <foreach expression="formEvents" key="formEvent">
-                dojo.log.debug("Connecting form event ${formEvent[0]}");
+                dojo.event.connect(dojo.widget.byId("${clientId}"), "${formEvent[0]}", function(e){
+                    dojo.log.debug("Connected to formEvent!");
+                    
+                    <foreach expression="formEvent[1]" key="formName">
+                    tapestry.form.submitAsync("${formName}", "test");
+                    dojo.log.debug("Need to submit to form ${formName}");
+                    </foreach>
+                });
             </foreach>
         </if>
     </initialization>

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/Form.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/Form.js?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/Form.js (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/Form.js Sun Jun  4 14:13:15 2006
@@ -1,4 +1,4 @@
-// Copyright 2005 The Apache Software Foundation
+// Copyright 2006 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.

Modified: tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java (original)
+++ tapestry/tapestry4/trunk/framework/src/java/org/apache/tapestry/form/FormSupportImpl.java Sun Jun  4 14:13:15 2006
@@ -27,9 +27,6 @@
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.HiveMind;
 import org.apache.hivemind.Location;
-import org.apache.hivemind.Resource;
-import org.apache.hivemind.impl.DefaultClassResolver;
-import org.apache.hivemind.util.ClasspathResource;
 import org.apache.hivemind.util.Defense;
 import org.apache.tapestry.IComponent;
 import org.apache.tapestry.IForm;
@@ -76,9 +73,7 @@
      */
 
     public static final String SUBMIT_MODE = "submitmode";
-
-    public static final String SCRIPT = "/org/apache/tapestry/form/Form.js";
-
+    
     /**
      * Attribute set to true when a field has been focused; used to prevent conflicting JavaScript
      * for field focusing from being emitted.
@@ -157,8 +152,6 @@
 
     private final IMarkupWriter _writer;
 
-    private final Resource _script;
-
     private final IValidationDelegate _delegate;
 
     private final PageRenderSupport _pageRenderSupport;
@@ -177,8 +170,6 @@
         _rewinding = cycle.isRewound(form);
         _allocatedIdIndex = 0;
         
-        _script = new ClasspathResource(new DefaultClassResolver(), SCRIPT);
-        
         _pageRenderSupport = TapestryUtils.getOptionalPageRenderSupport(cycle);
     }
 
@@ -195,7 +186,6 @@
         _writer = null;
         _delegate = null;
         _pageRenderSupport = null;
-        _script = null;
     }
 
     /**
@@ -545,9 +535,8 @@
     {
         if (_pageRenderSupport == null)
             return;
-
-        _pageRenderSupport.addExternalScript(_script);
-
+        
+        _pageRenderSupport.addInitializationScript("dojo.require(\"tapestry.form\");");
         _pageRenderSupport.addInitializationScript("Tapestry.register_form('" + formId + "');");
     }
 

Modified: tapestry/tapestry4/trunk/framework/src/js/build.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/build.xml?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/build.xml (original)
+++ tapestry/tapestry4/trunk/framework/src/js/build.xml Sun Jun  4 14:13:15 2006
@@ -78,7 +78,7 @@
 	<!-- Testing												-->
 	<!-- ====================================================== -->
 	
-	<target name="default-run-tests" description="Tests tapestry js package with dojo test utils." >
+	<target name="test" description="Tests tapestry js package with dojo test utils." >
 		 <dojo-test dojosrc="./dojo/" testsrc="tests"/>
 	</target>
 	

Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/__package__.js Sun Jun  4 14:13:15 2006
@@ -2,6 +2,6 @@
 	common: [
 		"tapestry.core","tapestry.event"
 	],
-	browser: ["tapestry.html"]
+	browser: ["tapestry.html","tapestry.form"]
 });
 dojo.provide("tapestry.*");

Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/core.js Sun Jun  4 14:13:15 2006
@@ -47,9 +47,15 @@
 	 */
 	load:function(type, data, http, kwArgs){
 		dojo.log.debug("Response recieved.");
-		
+		if (!data) {
+			dojo.log.err("No data received in response.");
+			return;
+		}
 		var resp=data.getElementsByTagName("ajax-response");
-		if (!resp || resp.length < 1 || !resp[0].childNodes) { dojo.log.warn("No ajax-response elements recieved."); return; }
+		if (!resp || resp.length < 1 || !resp[0].childNodes) {
+			dojo.log.warn("No ajax-response elements recieved.");
+			return; 
+		}
 		
 		var elms=resp[0].childNodes;
 		for (var i=0; i<elms.length; i++) {

Added: tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js?rev=411598&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js (added)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js Sun Jun  4 14:13:15 2006
@@ -0,0 +1,170 @@
+dojo.provide("tapestry.form");
+dojo.provide("Tapestry");
+
+dojo.require("tapestry.core");
+
+tapestry.form={
+	
+	invalidField:function(field, message){
+		if (field.disabled) return;
+		
+    	this.focusField(field);
+    	window.alert(message);
+	},
+	
+	focusField:function(field){
+		if (arguments.length < 1) return;
+		
+		field = dojo.byId(field);
+		if (!field) return;
+		if (field.disabled || field.clientWidth < 1) return;
+		
+        if (typeof field.focus != "undefined") { field.focus(); }
+        
+        if (field.isContentEditable 
+        	|| field.isContentEditable == null
+        	&& typeof field.select != "undefined") {
+        	field.select();
+        }
+	},
+	
+	trimField:function(id){
+		if (arguments.length < 1) return;
+		
+		var elm=dojo.byId(id);
+		if (!elm) return;
+		if ( elem.type != "text" && elem.type != "textarea" 
+			&& elem.type != "password" ) { return; }
+		
+		elem.value = elem.value.replace(/(^\s*|\s*$)/g, "");
+	},
+	
+	requireField:function(fieldId, message){
+		if (arguments.length < 1) return;
+		
+		var elem=dojo.byId(fieldId);
+		if (!elem) return;
+		
+		// Are textbox, textarea, or password fields blank.
+		if ( (elem.type == "text" || elem.type == "textarea" || elem.type == "password") 
+			&& /^\s*$/.test(elem.value) ) {
+			this.invalidField(elem, message);
+			return;
+		}
+		// Does drop-down box have option selected.
+		else if ( (elem.type == "select-one" || elem.type == "select-multiple") 
+				&& elem.selectedIndex == -1 ) {
+			this.invalidField(elem, message);
+		}
+		// Does radio button group (or check box group) have option checked.
+		else if ( elem instanceof Array )  {
+			var checked = false;
+			for (var j = 0; j < elem.length; j++) {
+				if (elem[j].checked) { checked = true; }
+			}
+			if ( !checked ) {	
+				this.invalidField(elem, message);
+				return;
+			}
+		}
+	},
+	
+	submit:function(id, submitName){
+		var form=dojo.byId(id);
+		if (!form) {
+			dojo.raise("Form not found with id " + id);
+			return;
+		}
+		
+		form.submitname.value=submitName;
+		form.submit();
+	},
+	
+	submitAsync:function(id, submitName){
+		var form=dojo.byId(id);
+		if (!form) {
+			dojo.raise("Form not found with id " + id);
+			return;
+		}
+		
+		dojo.io.bind({
+			formNode:form,
+            headers:{"dojo-ajax-request":true},
+            useCache:true,
+            preventCache:true,
+            load: (function(){tapestry.load.apply(this, arguments);}),
+            error: (function(){tapestry.error.apply(this, arguments);}),
+            mimetype: "text/xml",
+            encoding: "UTF-8"
+        });
+	}
+}
+
+// Backwards compatibility functions, to be removed in 4.1.1 js version
+
+// global used to deprecate old event connection methods
+tapestry.form.deprecateConnect=function(){
+	dojo.deprecated("Tapestry.on<event>",
+					"use dojo.event.connect instead",
+					"4.1.1");
+}
+
+// BEGIN old function definitions
+
+Tapestry.default_invalid_field_handler=function(event, field, message){
+	dojo.deprecated("Tapestry.default_invalid_field_handler", 
+					"use tapestry.form.invalidField instead", 
+					"4.1.1");
+	tapestry.form.invalidField(field, message);
+}
+
+Tapestry.find=function(id){
+	dojo.deprecated("Tapestry.find",
+					"use dojo.byId instead",
+					"4.1.1");
+	return dojo.byId(id);
+}
+
+Tapestry.register_form=function(formId){
+	dojo.deprecated("Tapestry.register_form",
+					"use tapestry.form.registerForm instead",
+					"4.1.1");
+}
+
+Tapestry.onpresubmit=tapestry.form.deprecateConnect;
+Tapestry.onsubmit=tapestry.form.deprecateConnect;
+Tapestry.onpostsubmit=tapestry.form.deprecateConnect;
+Tapestry.onreset=tapestry.form.deprecateConnect;
+Tapestry.onrefresh=tapestry.form.deprecateConnect;
+Tapestry.oncancel=tapestry.form.deprecateConnect;
+
+Tapestry.set_focus=function (field){
+	dojo.deprecated("Tapestry.set_focus",
+					"use tapestry.form.focusField instead",
+					"4.1.1");
+	tapestry.form.focusField(field);
+}
+
+Tapestry.trim_field_value = function(fieldId)
+{
+	dojo.deprecated("Tapestry.trim_field_value",
+					"use tapestry.form.trimField instead",
+					"4.1.1");
+	tapestry.form.trimField(fieldId);
+}
+
+Tapestry.require_field = function(event, fieldId, message)
+{
+	dojo.deprecated("Tapestry.require_field",
+					"use tapestry.form.requireField instead",
+					"4.1.1");
+	tapestry.form.requireField(fieldId, message);
+}
+
+Tapestry.submit_form = function(form_id, field_name)
+{
+	dojo.deprecated("Tapestry.submit_form",
+					"use tapestry.form.submit instead",
+					"4.1.1");
+	tapestry.form.submit(form_id, field_name);
+}
\ No newline at end of file

Propchange: tapestry/tapestry4/trunk/framework/src/js/tapestry/form.js
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tapestry/tapestry4/trunk/framework/src/js/tapestry/test.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tapestry/test.js?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tapestry/test.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tapestry/test.js Sun Jun  4 14:13:15 2006
@@ -1,7 +1,39 @@
 dojo.provide("tapestry.test");
 
 if (dj_undef("byId", dj_global)) {
-dojo.byId=function(id) {
-	return document.getElementById(id);
+dojo.byId = function(id, doc){
+	if(id && (typeof id == "string" || id instanceof String)){
+		if(!doc){ doc = document; }
+		return doc.getElementById(id);
+	}
+	return id; // assume it's a node
 }
+}
+
+dojo.debug=function(message){
+	dojo.log.debug(message);
+}
+
+function lastMsgContains(str){
+	if (arguments.length < 1) return false;
+	
+	var last=dojo.logging.logQueueHandler.data.pop();
+	if (!last || !last.message) return false;
+	
+	return last.message.toUpperCase().indexOf(str.toUpperCase()) > -1;
+}
+
+// helper object for logging method calls
+function mock(){
+	this.mockArgs=arguments;
+	this.called=false;
+	
+	this.intercept=function(){
+		this.called=true;
+		jum.assertEquals("mockArgLength", this.mockArgs.length, arguments.length);
+		
+		for (var i=0; i < this.mockArgs.length; i++) {
+			jum.assertEquals("mockArgument", this.mockArgs[i], arguments[i]);
+		}
+	}
 }

Modified: tapestry/tapestry4/trunk/framework/src/js/tests/test_debug.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tests/test_debug.js?rev=411598&r1=411597&r2=411598&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tests/test_debug.js (original)
+++ tapestry/tapestry4/trunk/framework/src/js/tests/test_debug.js Sun Jun  4 14:13:15 2006
@@ -24,4 +24,6 @@
 	dojo.log.warn("Filtered warning");
 	dojo.log.err("Filtered error");
 	jum.assertEquals("logmsgfilteredlength", currLength + 2, dojo.logging.logQueueHandler.data.length);
+	
+	dojo.log.setLevel(dojo.log.getLevel("DEBUG"));
 }

Added: tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js?rev=411598&view=auto
==============================================================================
--- tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js (added)
+++ tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js Sun Jun  4 14:13:15 2006
@@ -0,0 +1,78 @@
+dojo.setModulePrefix("tapestry", "../tapestry");
+
+dojo.require("tapestry.*");
+dojo.require("tapestry.test");
+dojo.require("tapestry.form");
+
+// override to make sure our fake events pass
+dojo.event.browser.isEvent=function() { return true; }
+
+tapestry.form.invalidField=function(field, message){
+}
+
+function test_form_find(){
+	var node = document.createElement("div");
+	node.setAttribute("id", "testid");
+	
+	jum.assertTrue("findwithNode", Tapestry.find(node));
+	jum.assertTrue("findwithId", Tapestry.find("testid"));
+}
+
+function test_last_msg(){
+	jum.assertFalse("lastMessage", lastMsgContains());
+}
+
+function test_form_deprecated(){
+	Tapestry.register_form("null");
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.onpresubmit();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.onsubmit();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.onpostsubmit();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.onreset();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.onrefresh();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+	Tapestry.oncancel();
+	jum.assertTrue("deprecated", lastMsgContains("deprecated"));
+}
+
+function test_form_invalidHandler(){
+	Tapestry.default_invalid_field_handler(null, "yo", "yo");
+	tapestry.form.invalidField("this", "field");
+}
+
+function test_form_requireTextField(){
+	Tapestry.require_field(null, "bs", "invalid");
+	
+	var node = document.createElement("input");
+	node.setAttribute("id", "testid");
+	node.type="text";
+	node.value="";
+	
+	var mockInvalid=new mock(node, "must have value");
+	dojo.event.connect(tapestry.form, "invalidField", mockInvalid, "intercept");
+	
+	tapestry.form.requireField("testid", "must have value");
+	
+	jum.assertTrue("invalidCalled", mockInvalid.called);
+	dojo.event.disconnect(tapestry.form, "invalidField", mockInvalid, "intercept");
+}
+
+function test_form_submit(){
+	
+	var submitCalled=false;
+	var node = document.createElement("form");
+	node.setAttribute("id", "form1");
+	node.submit=function(){
+		submitCalled=true;
+	}
+	node.submitname={value:""};
+	
+	Tapestry.submit_form("form1", "testSubmit");
+	
+	jum.assertTrue("submitCalled", submitCalled);
+	jum.assertEquals("submitName", node.submitname.value, "testSubmit");
+}
\ No newline at end of file

Propchange: tapestry/tapestry4/trunk/framework/src/js/tests/test_form.js
------------------------------------------------------------------------------
    svn:eol-style = native