You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by an...@apache.org on 2007/02/13 19:22:50 UTC

svn commit: r507137 - in /tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry: core.js fx.js

Author: andyhot
Date: Tue Feb 13 10:22:49 2007
New Revision: 507137

URL: http://svn.apache.org/viewvc?view=rev&rev=507137
Log:
JS support for new 'AjaxStatus' component

Modified:
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/fx.js

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js?view=diff&rev=507137&r1=507136&r2=507137
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/core.js Tue Feb 13 10:22:49 2007
@@ -25,8 +25,9 @@
 	version:"4.1.2",
 	scriptInFlight:false, // whether or not javascript is currently being eval'd, default false
 	ScriptFragment:'(?:<script.*?>)((\n|.|\r)*?)(?:<\/script>)', // regexp for script elements
-	
-	/**
+    requestsInFlight:0, // how many ajax requests are currently in progress
+
+    /**
 	 * Function: bind
 	 * 
 	 * Core XHR bind function for tapestry internals. The 
@@ -60,8 +61,9 @@
 			parms.encoding="UTF-8";
 			parms.load=(function(){tapestry.load.apply(this, arguments);});
 		}
-		
-		dojo.io.queueBind(parms);
+
+        tapestry.requestsInFlight++;
+        dojo.io.queueBind(parms);
 	},
 	
 	/**
@@ -75,7 +77,8 @@
 	 * 	<tapestry.bind>
 	 */
 	error:function(type, exception, http, kwArgs){
-		dojo.log.exception("Error received in IO response.", exception);
+        tapestry.requestsInFlight--;
+        dojo.log.exception("Error received in IO response.", exception);
 	},
 	
 	/**
@@ -95,15 +98,16 @@
 	 * 
 	 */
 	load:function(type, data, http, kwArgs){
-		dojo.log.debug("tapestry.load() Response recieved.", data);
-		if (!data) {
+		dojo.log.debug("tapestry.load() Response received.", data);
+        tapestry.requestsInFlight--;
+        if (!data) {
 			dojo.log.warn("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.");
+			dojo.log.warn("No ajax-response elements received.");
 			return; 
 		}
 		
@@ -169,8 +173,9 @@
 	},
 	
 	loadJson:function(type, data, http, kwArgs){
-		dojo.log.debug("tapestry.loadJson() Response recieved.", data);
-	},
+        dojo.log.debug("tapestry.loadJson() Response received.", data);
+        tapestry.requestsInFlight--;
+    },
 	
 	/**
 	 * Function: loadContent
@@ -359,7 +364,16 @@
 		
 		tapestry.bind(url, content, isJson);
 		return false;
-	}
+	},
+
+    /**
+	 * Function: isServingRequests
+	 *
+	 * Utility used to find out if there are any ajax requests in progress.
+	 */
+    isServingRequests:function(){
+	    return (tapestry.requestsInFlight > 0);
+    }
 }
 
 /**

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/fx.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/fx.js?view=diff&rev=507137&r1=507136&r2=507137
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/fx.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/fx.js Tue Feb 13 10:22:49 2007
@@ -1,5 +1,6 @@
 dojo.provide("tapestry.fx");
 
+dojo.require("dojo.logging.Logger");
 dojo.require("tapestry.core");
 
 /**
@@ -15,7 +16,9 @@
     // property: postEffects
     // Contains a reference to all registered post-effects, i.e. effects that are
     // executed when new content arrives through an XHR response.
-    postEffects:{},    
+    postEffects:{},
+    // property: ajaxStatusAction
+    ajaxStatusAction:'loading',
     
     /**
      * Function: attachPreEffect
@@ -76,14 +79,49 @@
         this.preEffects={};
         this.postEffects={};
     },
+
+    /**
+     * Function: attachAjaxStatus
+     * Allows specifying a dom node that will be shown or hidden while ajax requests
+     * are in progress or have finished.
+     * Alternatively, one can specify a custom
+     * function which will get invoked when an ajax request starts or ends - the first
+     * argument to that function will be a boolean corresponding to wheather the status
+     * element should be showing or not.
+     *
+     * Parameters:
+     *  a1 - The dom id to show - hide, or the function to invoke when ajax starts or ends.
+     */
+    attachAjaxStatus:function(a1){
+        dojo.log.debug("Attaching ajax status listener");
+        if (dojo.lang.isString(a1)) {
+            tapestry.fx.ajaxStatusAction =
+                function(bShow){if (bShow) dojo.html.show(a1); else dojo.html.hide(a1);};
+        }
+        else if (dojo.lang.isFunction(a1)) {
+            tapestry.fx.ajaxStatusAction = a1;
+        }
+        else {
+            dojo.log.warn("Argument to tapestry.fx.attachAjaxStatus should be either a string or a function");
+            return;
+        }
+        dojo.event.connectOnce(tapestry, "bind", tapestry.fx._processAjaxStatus);
+        dojo.event.connectOnce(tapestry, "error", tapestry.fx._processAjaxStatus);
+        dojo.event.connectOnce(tapestry, "load", tapestry.fx._processAjaxStatus);
+        dojo.event.connectOnce(tapestry, "loadJson", tapestry.fx._processAjaxStatus);
+    },
+
+    _processAjaxStatus:function(){
+        tapestry.fx.ajaxStatusAction.apply(this, [tapestry.isServingRequests()]);
+    },
     
     _initPreEffects:function(){
-        dojo.debug("Advising tapestry.linkOnClick");
+        dojo.log.debug("Advising tapestry.linkOnClick");
         dojo.event.connectAround(tapestry, "linkOnClick", tapestry.fx, "_applyPreEffects");
     },
     
     _initPostEffects:function(){
-        dojo.debug("Advising tapestry.loadContent");
+        dojo.log.debug("Advising tapestry.loadContent");
         dojo.event.connectAround(tapestry, "loadContent", tapestry.fx, "_applyPostEffects");
     },
     
@@ -91,7 +129,7 @@
         var id = miObj.args[1];        
         var effect = this.preEffects[id];
         if (effect){
-            dojo.debug("Found pre-effect:", effect, id);
+            dojo.log.debug("Found pre-effect:", effect, id);
                        
             var anim = effect.animation();
             
@@ -114,7 +152,7 @@
         var id = miObj.args[0];
         var effect = this.postEffects[id];
         if (effect){
-            dojo.debug("Found post-effect:", effect, id);
+            dojo.log.debug("Found post-effect:", effect, id);
             
             var ret = miObj.proceed();