X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/c930e9176a5a85509c5b0230e2bff5c22a591432..refs/heads/old:/src/util/UpdateManager.js?ds=sidebyside diff --git a/src/util/UpdateManager.js b/src/util/UpdateManager.js index 69a03aa5..b33bcaf4 100644 --- a/src/util/UpdateManager.js +++ b/src/util/UpdateManager.js @@ -1,8 +1,8 @@ /*! - * Ext JS Library 3.0.0 - * Copyright(c) 2006-2009 Ext JS, LLC - * licensing@extjs.com - * http://www.extjs.com/license + * Ext JS Library 3.3.1 + * Copyright(c) 2006-2010 Sencha Inc. + * licensing@sencha.com + * http://www.sencha.com/license */ /** * @class Ext.Updater @@ -43,15 +43,15 @@ * @param {Boolean} forceNew (optional) By default the constructor checks to see if the passed element already * has an Updater and if it does it returns the same instance. This will skip that check (useful for extending this class). */ -Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable, +Ext.UpdateManager = Ext.Updater = Ext.extend(Ext.util.Observable, function() { - var BEFOREUPDATE = "beforeupdate", - UPDATE = "update", - FAILURE = "failure"; - - // private - function processSuccess(response){ - var me = this; + var BEFOREUPDATE = "beforeupdate", + UPDATE = "update", + FAILURE = "failure"; + + // private + function processSuccess(response){ + var me = this; me.transaction = null; if (response.argument.form && response.argument.reset) { try { // put in try/catch since some older FF releases had problems with this @@ -66,7 +66,7 @@ function() { updateComplete.call(me, response); } } - + // private function updateComplete(response, type, success){ this.fireEvent(type || UPDATE, this.el, response); @@ -76,385 +76,385 @@ function() { } // private - function processFailure(response){ + function processFailure(response){ updateComplete.call(this, response, FAILURE, !!(this.transaction = null)); } - - return { - constructor: function(el, forceNew){ - var me = this; - el = Ext.get(el); - if(!forceNew && el.updateManager){ - return el.updateManager; - } - /** - * The Element object - * @type Ext.Element - */ - me.el = el; - /** - * Cached url to use for refreshes. Overwritten every time update() is called unless "discardUrl" param is set to true. - * @type String - */ - me.defaultUrl = null; - - me.addEvents( - /** - * @event beforeupdate - * Fired before an update is made, return false from your handler and the update is cancelled. - * @param {Ext.Element} el - * @param {String/Object/Function} url - * @param {String/Object} params - */ - BEFOREUPDATE, - /** - * @event update - * Fired after successful update is made. - * @param {Ext.Element} el - * @param {Object} oResponseObject The response Object - */ - UPDATE, - /** - * @event failure - * Fired on update failure. - * @param {Ext.Element} el - * @param {Object} oResponseObject The response Object - */ - FAILURE - ); - - Ext.apply(me, Ext.Updater.defaults); - /** - * Blank page URL to use with SSL file uploads (defaults to {@link Ext.Updater.defaults#sslBlankUrl}). - * @property sslBlankUrl - * @type String - */ - /** - * Whether to append unique parameter on get request to disable caching (defaults to {@link Ext.Updater.defaults#disableCaching}). - * @property disableCaching - * @type Boolean - */ - /** - * Text for loading indicator (defaults to {@link Ext.Updater.defaults#indicatorText}). - * @property indicatorText - * @type String - */ - /** - * Whether to show indicatorText when loading (defaults to {@link Ext.Updater.defaults#showLoadIndicator}). - * @property showLoadIndicator - * @type String - */ - /** - * Timeout for requests or form posts in seconds (defaults to {@link Ext.Updater.defaults#timeout}). - * @property timeout - * @type Number - */ - /** - * True to process scripts in the output (defaults to {@link Ext.Updater.defaults#loadScripts}). - * @property loadScripts - * @type Boolean - */ - - /** - * Transaction object of the current executing transaction, or null if there is no active transaction. - */ - me.transaction = null; - /** - * Delegate for refresh() prebound to "this", use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments - * @type Function - */ - me.refreshDelegate = me.refresh.createDelegate(me); - /** - * Delegate for update() prebound to "this", use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments - * @type Function - */ - me.updateDelegate = me.update.createDelegate(me); - /** - * Delegate for formUpdate() prebound to "this", use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arguments - * @type Function - */ - me.formUpdateDelegate = (me.formUpdate || function(){}).createDelegate(me); - - /** - * The renderer for this Updater (defaults to {@link Ext.Updater.BasicRenderer}). - */ - me.renderer = me.renderer || me.getDefaultRenderer(); - - Ext.Updater.superclass.constructor.call(me); - }, - - /** - * Sets the content renderer for this Updater. See {@link Ext.Updater.BasicRenderer#render} for more details. - * @param {Object} renderer The object implementing the render() method - */ - setRenderer : function(renderer){ - this.renderer = renderer; - }, - - /** - * Returns the current content renderer for this Updater. See {@link Ext.Updater.BasicRenderer#render} for more details. - * @return {Object} - */ - getRenderer : function(){ - return this.renderer; - }, - - /** - * This is an overrideable method which returns a reference to a default - * renderer class if none is specified when creating the Ext.Updater. - * Defaults to {@link Ext.Updater.BasicRenderer} - */ - getDefaultRenderer: function() { - return new Ext.Updater.BasicRenderer(); - }, - - /** - * Sets the default URL used for updates. - * @param {String/Function} defaultUrl The url or a function to call to get the url - */ - setDefaultUrl : function(defaultUrl){ - this.defaultUrl = defaultUrl; - }, - - /** - * Get the Element this Updater is bound to - * @return {Ext.Element} The element - */ - getEl : function(){ - return this.el; - }, - - /** - * Performs an asynchronous request, updating this element with the response. - * If params are specified it uses POST, otherwise it uses GET.

- * Note: Due to the asynchronous nature of remote server requests, the Element - * will not have been fully updated when the function returns. To post-process the returned - * data, use the callback option, or an update event handler. - * @param {Object} options A config object containing any of the following options: - *

- * For example: -


-	um.update({
-	    url: "your-url.php",
-	    params: {param1: "foo", param2: "bar"}, // or a URL encoded string
-	    callback: yourFunction,
-	    scope: yourObject, //(optional scope)
-	    discardUrl: true,
-	    nocache: true,
-	    text: "Loading...",
-	    timeout: 60,
-	    scripts: false // Save time by avoiding RegExp execution.
-	});
-	
- */ - update : function(url, params, callback, discardUrl){ - var me = this, - cfg, - callerScope; - - if(me.fireEvent(BEFOREUPDATE, me.el, url, params) !== false){ - if(Ext.isObject(url)){ // must be config object - cfg = url; - url = cfg.url; - params = params || cfg.params; - callback = callback || cfg.callback; - discardUrl = discardUrl || cfg.discardUrl; - callerScope = cfg.scope; - if(!Ext.isEmpty(cfg.nocache)){me.disableCaching = cfg.nocache;}; - if(!Ext.isEmpty(cfg.text)){me.indicatorText = '
'+cfg.text+"
";}; - if(!Ext.isEmpty(cfg.scripts)){me.loadScripts = cfg.scripts;}; - if(!Ext.isEmpty(cfg.timeout)){me.timeout = cfg.timeout;}; - } - me.showLoading(); - - if(!discardUrl){ - me.defaultUrl = url; - } - if(Ext.isFunction(url)){ - url = url.call(me); - } - - var o = Ext.apply({}, { - url : url, - params: (Ext.isFunction(params) && callerScope) ? params.createDelegate(callerScope) : params, - success: processSuccess, - failure: processFailure, - scope: me, - callback: undefined, - timeout: (me.timeout*1000), - disableCaching: me.disableCaching, - argument: { - "options": cfg, - "url": url, - "form": null, - "callback": callback, - "scope": callerScope || window, - "params": params - } - }, cfg); - - me.transaction = Ext.Ajax.request(o); - } - }, - - /** - *

Performs an async form post, updating this element with the response. If the form has the attribute - * enctype="multipart/form-data", it assumes it's a file upload. - * Uses this.sslBlankUrl for SSL file uploads to prevent IE security warning.

- *

File uploads are not performed using normal "Ajax" techniques, that is they are not - * performed using XMLHttpRequests. Instead the form is submitted in the standard manner with the - * DOM <form> element temporarily modified to have its - * target set to refer - * to a dynamically generated, hidden <iframe> which is inserted into the document - * but removed after the return data has been gathered.

- *

Be aware that file upload packets, sent with the content type multipart/form-data - * and some server technologies (notably JEE) may require some custom processing in order to - * retrieve parameter names and parameter values from the packet content.

- * @param {String/HTMLElement} form The form Id or form element - * @param {String} url (optional) The url to pass the form to. If omitted the action attribute on the form will be used. - * @param {Boolean} reset (optional) Whether to try to reset the form after the update - * @param {Function} callback (optional) Callback when transaction is complete. The following - * parameters are passed: - */ - formUpdate : function(form, url, reset, callback){ - var me = this; - if(me.fireEvent(BEFOREUPDATE, me.el, form, url) !== false){ - if(Ext.isFunction(url)){ - url = url.call(me); - } - form = Ext.getDom(form) - me.transaction = Ext.Ajax.request({ - form: form, - url:url, - success: processSuccess, - failure: processFailure, - scope: me, - timeout: (me.timeout*1000), - argument: { - "url": url, - "form": form, - "callback": callback, - "reset": reset - } - }); - me.showLoading.defer(1, me); - } - }, - - /** - * Set this element to auto refresh. Can be canceled by calling {@link #stopAutoRefresh}. - * @param {Number} interval How often to update (in seconds). - * @param {String/Object/Function} url (optional) The url for this request, a config object in the same format - * supported by {@link #load}, or a function to call to get the url (defaults to the last used url). Note that while - * the url used in a load call can be reused by this method, other load config options will not be reused and must be - * sepcified as part of a config object passed as this paramter if needed. - * @param {String/Object} params (optional) The parameters to pass as either a url encoded string - * "¶m1=1¶m2=2" or as an object {param1: 1, param2: 2} - * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) - * @param {Boolean} refreshNow (optional) Whether to execute the refresh now, or wait the interval - */ - startAutoRefresh : function(interval, url, params, callback, refreshNow){ - var me = this; - if(refreshNow){ - me.update(url || me.defaultUrl, params, callback, true); - } - if(me.autoRefreshProcId){ - clearInterval(me.autoRefreshProcId); - } - me.autoRefreshProcId = setInterval(me.update.createDelegate(me, [url || me.defaultUrl, params, callback, true]), interval * 1000); - }, - - /** - * Stop auto refresh on this element. - */ - stopAutoRefresh : function(){ - if(this.autoRefreshProcId){ - clearInterval(this.autoRefreshProcId); - delete this.autoRefreshProcId; - } - }, - - /** - * Returns true if the Updater is currently set to auto refresh its content (see {@link #startAutoRefresh}), otherwise false. - */ - isAutoRefreshing : function(){ - return !!this.autoRefreshProcId; - }, - - /** - * Display the element's "loading" state. By default, the element is updated with {@link #indicatorText}. This - * method may be overridden to perform a custom action while this Updater is actively updating its contents. - */ - showLoading : function(){ - if(this.showLoadIndicator){ - this.el.dom.innerHTML = this.indicatorText; - } - }, - - /** - * Aborts the currently executing transaction, if any. - */ - abort : function(){ - if(this.transaction){ - Ext.Ajax.abort(this.transaction); - } - }, - - /** - * Returns true if an update is in progress, otherwise false. - * @return {Boolean} - */ - isUpdating : function(){ - return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false; - }, - - /** - * Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately - * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) - */ - refresh : function(callback){ - if(this.defaultUrl){ - this.update(this.defaultUrl, null, callback, true); - } - } - } + + return { + constructor: function(el, forceNew){ + var me = this; + el = Ext.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + /** + * The Element object + * @type Ext.Element + */ + me.el = el; + /** + * Cached url to use for refreshes. Overwritten every time update() is called unless "discardUrl" param is set to true. + * @type String + */ + me.defaultUrl = null; + + me.addEvents( + /** + * @event beforeupdate + * Fired before an update is made, return false from your handler and the update is cancelled. + * @param {Ext.Element} el + * @param {String/Object/Function} url + * @param {String/Object} params + */ + BEFOREUPDATE, + /** + * @event update + * Fired after successful update is made. + * @param {Ext.Element} el + * @param {Object} oResponseObject The response Object + */ + UPDATE, + /** + * @event failure + * Fired on update failure. + * @param {Ext.Element} el + * @param {Object} oResponseObject The response Object + */ + FAILURE + ); + + Ext.apply(me, Ext.Updater.defaults); + /** + * Blank page URL to use with SSL file uploads (defaults to {@link Ext.Updater.defaults#sslBlankUrl}). + * @property sslBlankUrl + * @type String + */ + /** + * Whether to append unique parameter on get request to disable caching (defaults to {@link Ext.Updater.defaults#disableCaching}). + * @property disableCaching + * @type Boolean + */ + /** + * Text for loading indicator (defaults to {@link Ext.Updater.defaults#indicatorText}). + * @property indicatorText + * @type String + */ + /** + * Whether to show indicatorText when loading (defaults to {@link Ext.Updater.defaults#showLoadIndicator}). + * @property showLoadIndicator + * @type String + */ + /** + * Timeout for requests or form posts in seconds (defaults to {@link Ext.Updater.defaults#timeout}). + * @property timeout + * @type Number + */ + /** + * True to process scripts in the output (defaults to {@link Ext.Updater.defaults#loadScripts}). + * @property loadScripts + * @type Boolean + */ + + /** + * Transaction object of the current executing transaction, or null if there is no active transaction. + */ + me.transaction = null; + /** + * Delegate for refresh() prebound to "this", use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + me.refreshDelegate = me.refresh.createDelegate(me); + /** + * Delegate for update() prebound to "this", use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + me.updateDelegate = me.update.createDelegate(me); + /** + * Delegate for formUpdate() prebound to "this", use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + me.formUpdateDelegate = (me.formUpdate || function(){}).createDelegate(me); + + /** + * The renderer for this Updater (defaults to {@link Ext.Updater.BasicRenderer}). + */ + me.renderer = me.renderer || me.getDefaultRenderer(); + + Ext.Updater.superclass.constructor.call(me); + }, + + /** + * Sets the content renderer for this Updater. See {@link Ext.Updater.BasicRenderer#render} for more details. + * @param {Object} renderer The object implementing the render() method + */ + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + /** + * Returns the current content renderer for this Updater. See {@link Ext.Updater.BasicRenderer#render} for more details. + * @return {Object} + */ + getRenderer : function(){ + return this.renderer; + }, + + /** + * This is an overrideable method which returns a reference to a default + * renderer class if none is specified when creating the Ext.Updater. + * Defaults to {@link Ext.Updater.BasicRenderer} + */ + getDefaultRenderer: function() { + return new Ext.Updater.BasicRenderer(); + }, + + /** + * Sets the default URL used for updates. + * @param {String/Function} defaultUrl The url or a function to call to get the url + */ + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + /** + * Get the Element this Updater is bound to + * @return {Ext.Element} The element + */ + getEl : function(){ + return this.el; + }, + + /** + * Performs an asynchronous request, updating this element with the response. + * If params are specified it uses POST, otherwise it uses GET.

+ * Note: Due to the asynchronous nature of remote server requests, the Element + * will not have been fully updated when the function returns. To post-process the returned + * data, use the callback option, or an update event handler. + * @param {Object} options A config object containing any of the following options: + *

+ * For example: +


+    um.update({
+        url: "your-url.php",
+        params: {param1: "foo", param2: "bar"}, // or a URL encoded string
+        callback: yourFunction,
+        scope: yourObject, //(optional scope)
+        discardUrl: true,
+        nocache: true,
+        text: "Loading...",
+        timeout: 60,
+        scripts: false // Save time by avoiding RegExp execution.
+    });
+    
+ */ + update : function(url, params, callback, discardUrl){ + var me = this, + cfg, + callerScope; + + if(me.fireEvent(BEFOREUPDATE, me.el, url, params) !== false){ + if(Ext.isObject(url)){ // must be config object + cfg = url; + url = cfg.url; + params = params || cfg.params; + callback = callback || cfg.callback; + discardUrl = discardUrl || cfg.discardUrl; + callerScope = cfg.scope; + if(!Ext.isEmpty(cfg.nocache)){me.disableCaching = cfg.nocache;}; + if(!Ext.isEmpty(cfg.text)){me.indicatorText = '
'+cfg.text+"
";}; + if(!Ext.isEmpty(cfg.scripts)){me.loadScripts = cfg.scripts;}; + if(!Ext.isEmpty(cfg.timeout)){me.timeout = cfg.timeout;}; + } + me.showLoading(); + + if(!discardUrl){ + me.defaultUrl = url; + } + if(Ext.isFunction(url)){ + url = url.call(me); + } + + var o = Ext.apply({}, { + url : url, + params: (Ext.isFunction(params) && callerScope) ? params.createDelegate(callerScope) : params, + success: processSuccess, + failure: processFailure, + scope: me, + callback: undefined, + timeout: (me.timeout*1000), + disableCaching: me.disableCaching, + argument: { + "options": cfg, + "url": url, + "form": null, + "callback": callback, + "scope": callerScope || window, + "params": params + } + }, cfg); + + me.transaction = Ext.Ajax.request(o); + } + }, + + /** + *

Performs an asynchronous form post, updating this element with the response. If the form has the attribute + * enctype="multipart/form-data", it assumes it's a file upload. + * Uses this.sslBlankUrl for SSL file uploads to prevent IE security warning.

+ *

File uploads are not performed using normal "Ajax" techniques, that is they are not + * performed using XMLHttpRequests. Instead the form is submitted in the standard manner with the + * DOM <form> element temporarily modified to have its + * target set to refer + * to a dynamically generated, hidden <iframe> which is inserted into the document + * but removed after the return data has been gathered.

+ *

Be aware that file upload packets, sent with the content type multipart/form-data + * and some server technologies (notably JEE) may require some custom processing in order to + * retrieve parameter names and parameter values from the packet content.

+ * @param {String/HTMLElement} form The form Id or form element + * @param {String} url (optional) The url to pass the form to. If omitted the action attribute on the form will be used. + * @param {Boolean} reset (optional) Whether to try to reset the form after the update + * @param {Function} callback (optional) Callback when transaction is complete. The following + * parameters are passed: + */ + formUpdate : function(form, url, reset, callback){ + var me = this; + if(me.fireEvent(BEFOREUPDATE, me.el, form, url) !== false){ + if(Ext.isFunction(url)){ + url = url.call(me); + } + form = Ext.getDom(form); + me.transaction = Ext.Ajax.request({ + form: form, + url:url, + success: processSuccess, + failure: processFailure, + scope: me, + timeout: (me.timeout*1000), + argument: { + "url": url, + "form": form, + "callback": callback, + "reset": reset + } + }); + me.showLoading.defer(1, me); + } + }, + + /** + * Set this element to auto refresh. Can be canceled by calling {@link #stopAutoRefresh}. + * @param {Number} interval How often to update (in seconds). + * @param {String/Object/Function} url (optional) The url for this request, a config object in the same format + * supported by {@link #load}, or a function to call to get the url (defaults to the last used url). Note that while + * the url used in a load call can be reused by this method, other load config options will not be reused and must be + * sepcified as part of a config object passed as this paramter if needed. + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string + * "¶m1=1¶m2=2" or as an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + * @param {Boolean} refreshNow (optional) Whether to execute the refresh now, or wait the interval + */ + startAutoRefresh : function(interval, url, params, callback, refreshNow){ + var me = this; + if(refreshNow){ + me.update(url || me.defaultUrl, params, callback, true); + } + if(me.autoRefreshProcId){ + clearInterval(me.autoRefreshProcId); + } + me.autoRefreshProcId = setInterval(me.update.createDelegate(me, [url || me.defaultUrl, params, callback, true]), interval * 1000); + }, + + /** + * Stop auto refresh on this element. + */ + stopAutoRefresh : function(){ + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + delete this.autoRefreshProcId; + } + }, + + /** + * Returns true if the Updater is currently set to auto refresh its content (see {@link #startAutoRefresh}), otherwise false. + */ + isAutoRefreshing : function(){ + return !!this.autoRefreshProcId; + }, + + /** + * Display the element's "loading" state. By default, the element is updated with {@link #indicatorText}. This + * method may be overridden to perform a custom action while this Updater is actively updating its contents. + */ + showLoading : function(){ + if(this.showLoadIndicator){ + this.el.dom.innerHTML = this.indicatorText; + } + }, + + /** + * Aborts the currently executing transaction, if any. + */ + abort : function(){ + if(this.transaction){ + Ext.Ajax.abort(this.transaction); + } + }, + + /** + * Returns true if an update is in progress, otherwise false. + * @return {Boolean} + */ + isUpdating : function(){ + return this.transaction ? Ext.Ajax.isLoading(this.transaction) : false; + }, + + /** + * Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + */ + refresh : function(callback){ + if(this.defaultUrl){ + this.update(this.defaultUrl, null, callback, true); + } + } + }; }()); /** @@ -466,7 +466,7 @@ Ext.Updater.defaults = { * Timeout for requests or form posts in seconds (defaults to 30 seconds). * @type Number */ - timeout : 30, + timeout : 30, /** * True to append a unique parameter to GET requests to disable caching (defaults to false). * @type Boolean @@ -491,7 +491,7 @@ Ext.Updater.defaults = { * Blank page URL to use with SSL file uploads (defaults to {@link Ext#SSL_SECURE_URL} if set, or "javascript:false"). * @type String */ - sslBlankUrl : (Ext.SSL_SECURE_URL || "javascript:false") + sslBlankUrl : Ext.SSL_SECURE_URL }; @@ -516,21 +516,21 @@ Ext.Updater.updateElement = function(el, url, params, options){ /** * @class Ext.Updater.BasicRenderer - * Default Content renderer. Updates the elements innerHTML with the responseText. + *

This class is a base class implementing a simple render method which updates an element using results from an Ajax request.

+ *

The BasicRenderer updates the element's innerHTML with the responseText. To perform a custom render (i.e. XML or JSON processing), + * create an object with a conforming {@link #render} method and pass it to setRenderer on the Updater.

*/ Ext.Updater.BasicRenderer = function(){}; Ext.Updater.BasicRenderer.prototype = { /** - * This is called when the transaction is completed and it's time to update the element - The BasicRenderer - * updates the elements innerHTML with the responseText - To perform a custom render (i.e. XML or JSON processing), - * create an object with a "render(el, response)" method and pass it to setRenderer on the Updater. + * This method is called when an Ajax response is received, and an Element needs updating. * @param {Ext.Element} el The element being rendered - * @param {Object} response The XMLHttpRequest object + * @param {Object} xhr The XMLHttpRequest object * @param {Updater} updateManager The calling update manager * @param {Function} callback A callback that will need to be called if loadScripts is true on the Updater */ - render : function(el, response, updateManager, callback){ + render : function(el, response, updateManager, callback){ el.update(response.responseText, updateManager.loadScripts, callback); } }; \ No newline at end of file