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/10/25 22:50:03 UTC

svn commit: r467756 - in /tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry: form.js form/validation.js widget/AlertDialog.js

Author: jkuhnert
Date: Wed Oct 25 13:50:01 2006
New Revision: 467756

URL: http://svn.apache.org/viewvc?view=rev&rev=467756
Log:
Fixes TAPESTRY-1113. Focus was a little tricky wrt to AlertDialogs being displayed, but a 
somewhat workable solution seems to fix this by invoking the focusField function 
from within the actual Dialog while it is being hidden.

Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form/validation.js
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/widget/AlertDialog.js

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js?view=diff&rev=467756&r1=467755&r2=467756
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js Wed Oct 25 13:50:01 2006
@@ -15,6 +15,9 @@
 	// property: forms
 	// Contains a reference to all registered Tapestry forms in the current document.
 	forms:{}, // registered form references
+	// property: currentFocus 
+	// Reference to form element/element id of field that should currently recieve focus, if any
+	currentFocus:null,
 	
 	/**
 	 * Function: focusField
@@ -29,23 +32,39 @@
 	 *  dojo.html.selectInputText(node).
 	 */
 	focusField:function(field){
-		if (arguments.length < 1) return;
+		if (arguments.length < 1) {return;}
 		
-		field = dojo.widget.byId(field);
-		if(field && !dj_undef("focus", field)){
-			field.focus();
+		var f=dojo.widget.byId(field);
+		if(f && !dj_undef("focus", f)){
+			f.focus();
 			return;
 		} else {
-			field = dojo.byId(field);
+			f = dojo.byId(field);
 		}
 		
-		if (!field) { return; }
+		if (!f) { return; }
+		
+		if(!dj_undef("focus", f)){
+			f.focus();
+			return;
+		}
 		
 		if (field.disabled || field.clientWidth < 1) {
 			return;
 		}
 		
         dojo.html.selectInputText(field);
+	},
+	
+	/**
+	 * Used by AlertDialog to focus the highest priority form field 
+	 * that failed validation. This happens because the field needs to 
+	 * be focused ~after~ the dialog is hidden.
+	 */
+	_focusCurrentField:function(){
+		if(!this.currentFocus){return;}
+		
+		this.focusField(this.currentFocus);
 	},
 	
 	/**

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form/validation.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form/validation.js?view=diff&rev=467756&r1=467755&r2=467756
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form/validation.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form/validation.js Wed Oct 25 13:50:01 2006
@@ -165,9 +165,14 @@
 	summarizeErrors:function(form, results, profile){
 		var merrs=[];
 		var ierrs=[];
+		tapestry.form.currentFocus=null;
+		
 		if (results.hasMissing()){
 			var fields=results.getMissing();
 			for (var i=0; i<fields.length; i++){
+				if(i==0 && !tapestry.form.currentFocus){
+					tapestry.form.currentFocus=fields[i];
+				}
 				if (profile[fields[i]] && profile[fields[i]]["required"]){
 					if (dojo.lang.isArray(profile[fields[i]]["required"])) {
 						for (var z=0; z < profile[fields[i]]["required"].length; z++)
@@ -180,6 +185,9 @@
 		if (results.hasInvalid()){
 			var fields=results.getInvalid();
 			for (var i=0; i<fields.length; i++){
+				if(i==0 && !tapestry.form.currentFocus){
+					tapestry.form.currentFocus=fields[i];
+				}
 				if (profile[fields[i]] && profile[fields[i]]["constraints"]){
 					if (dojo.lang.isArray(profile[fields[i]]["constraints"])) {
 						for (var z=0; z < profile[fields[i]]["constraints"].length; z++)

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/widget/AlertDialog.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/widget/AlertDialog.js?view=diff&rev=467756&r1=467755&r2=467756
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/widget/AlertDialog.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/widget/AlertDialog.js Wed Oct 25 13:50:01 2006
@@ -94,6 +94,7 @@
 			dojo.dom.removeNode(this.okButton);
 			tapestry.widget.AlertDialog.prototype.destroy.call(this);
 			dojo.dom.removeNode(this.bg); 
+			tapestry.form.focusCurrentField();
 		}
 	},
 	"html"