/* * Ext JS Library 2.0 Copyright(c) 2006-2007, Ext JS, LLC. licensing@extjs.com * * http://extjs.com/license */ /** * @class Ext.form.Action The subclasses of this class provide actions to * perform upon {@link Ext.form.BasicForm Form}s.
*
* Instances of this class are only created by a * {@link Ext.form.BasicForm Form} when the Form needs to perform an * action such as submit or load. The Configuration options listed for * this class are set through the Form's action methods: * {@link Ext.form.BasicForm#submit submit}, * {@link Ext.form.BasicForm#load load} and * {@link Ext.form.BasicForm#doAction doAction}.
*
* The instance of Action which performed the action is passed to the * success and failure callbacks of the Form's action methods ({@link Ext.form.BasicForm#submit submit}, * {@link Ext.form.BasicForm#load load} and * {@link Ext.form.BasicForm#doAction doAction}), and to the * {@link Ext.form.BasicForm#actioncomplete actioncomplete} and * {@link Ext.form.BasicForm#actionfailed actionfailed} event handlers. */ Ext.form.Action = function(form, options) { this.form = form; this.options = options || {}; }; /** * Failure type returned when client side validation of the Form fails thus * aborting a submit action. * * @type {String} * @static */ Ext.form.Action.CLIENT_INVALID = 'client'; /** * Failure type returned when server side validation of the Form fails * indicating that field-specific error messages have been returned in the * response's errors property. * * @type {String} * @static */ Ext.form.Action.SERVER_INVALID = 'server'; /** * Failure type returned when a communication error happens when attempting to * send a request to the remote server. * * @type {String} * @static */ Ext.form.Action.CONNECT_FAILURE = 'connect'; /** * Failure type returned when no field values are returned in the response's * data property. * * @type {String} * @static */ Ext.form.Action.LOAD_FAILURE = 'load'; Ext.form.Action.prototype = { /** * @cfg {String} url The URL that the Action is to invoke. */ /** * @cfg {String} method The HTTP method to use to access the requested URL. * Defaults to the {@link Ext.form.BasicForm}'s method, or if that is * not specified, the underlying DOM form's method. */ /** * @cfg {Mixed} params Extra parameter values to pass. These are added to * the Form's {@link Ext.form.BasicForm#baseParams} and passed to the * specified URL along with the Form's input fields. */ /** * @cfg {Function} success The function to call when a valid success return * packet is recieved. The function is passed the following parameters: * */ /** * @cfg {Function} failure The function to call when a failure packet was * recieved, or when an error ocurred in the Ajax communication. The * function is passed the following parameters: * */ /** * @cfg {Object} scope The scope in which to call the callback functions * (The this reference for the callback functions). */ /** * @cfg {String} waitMsg The message to be displayed by a call to * {@link Ext.MessageBox#wait} during the time the action is being * processed. */ /** * @cfg {String} waitTitle The title to be displayed by a call to * {@link Ext.MessageBox#wait} during the time the action is being * processed. */ /** * The type of action this Action instance performs. Currently only "submit" * and "load" are supported. * * @type {String} */ type : 'default', /** * The type of failure detected. See * {@link #Ext.form.Action-Action.CLIENT_INVALID CLIENT_INVALID}, * {@link #Ext.form.Action-Action.SERVER_INVALID SERVER_INVALID}, * {@link #Ext.form.Action-Action.CONNECT_FAILURE CONNECT_FAILURE}, * {@link #Ext.form.Action-Action.LOAD_FAILURE LOAD_FAILURE} * * @property failureType * @type {String} */ /** * The XMLHttpRequest object used to perform the action. * * @property response * @type {Object} */ /** * The decoded response object containing a boolean * success property and other, * action-specific properties. * * @property result * @type {Object} */ // interface method run : function(options) { }, // interface method success : function(response) { }, // interface method handleResponse : function(response) { }, // default connection failure failure : function(response) { this.response = response; this.failureType = Ext.form.Action.CONNECT_FAILURE; this.form.afterAction(this, false); }, // private processResponse : function(response) { this.response = response; if (!response.responseText) { return true; } this.result = this.handleResponse(response); return this.result; }, // utility functions used internally getUrl : function(appendParams) { var url = this.options.url || this.form.url || this.form.el.dom.action; if (appendParams) { var p = this.getParams(); if (p) { url += (url.indexOf('?') != -1 ? '&' : '?') + p; } } return url; }, // private getMethod : function() { return (this.options.method || this.form.method || this.form.el.dom.method || 'POST').toUpperCase(); }, // private getParams : function() { var bp = this.form.baseParams; var p = this.options.params; if (p) { if (typeof p == "object") { p = Ext.urlEncode(Ext.applyIf(p, bp)); } else if (typeof p == 'string' && bp) { p += '&' + Ext.urlEncode(bp); } } else if (bp) { p = Ext.urlEncode(bp); } return p; }, // private createCallback : function(opts) { var opts = opts || {}; return { success : this.success, failure : this.failure, scope : this, timeout : (opts.timeout * 1000) || (this.form.timeout * 1000), upload : this.form.fileUpload ? this.success : undefined }; } }; /** * @class Ext.form.Action.Submit * @extends Ext.form.Action A class which handles submission of data from * {@link Ext.form.BasicForm Form}s and processes the returned * response.
*
* Instances of this class are only created by a * {@link Ext.form.BasicForm Form} when submitting.
*
* A response packet must contain a boolean * success property, and, * optionally an errors property. * The errors property contains * error messages for invalid fields.
*
* By default, response packets are assumed to be JSON, so a typical * response packet may look like this:
*
* *

 *  {
 *  success: false,
 *  errors: {
 *  clientCode: "Client not found",
 *  portOfLoading: "This field must not be null"
 *  }
 *  }
 * 
* *
*
* Other data may be placed into the response for processing the the * {@link Ext.form.BasicForm}'s callback or event handler methods. The * object decoded from this JSON is available in the {@link #result} * property. */ Ext.form.Action.Submit = function(form, options) { Ext.form.Action.Submit.superclass.constructor.call(this, form, options); }; Ext.extend(Ext.form.Action.Submit, Ext.form.Action, { /** * @cfg {boolean} clientValidation Determines whether a Form's * fields are validated in a final call to * {@link Ext.form.BasicForm#isValid isValid} prior to * submission. Pass false in the Form's submit * options to prevent this. If not defined, pre-submission * field validation is performed. */ type : 'submit', // private run : function() { var o = this.options; var method = this.getMethod(); var isPost = method == 'POST'; if (o.clientValidation === false || this.form.isValid()) { Ext.Ajax.request(Ext.apply(this.createCallback(o), { form : this.form.el.dom, url : this.getUrl(!isPost), method : method, params : isPost ? this.getParams() : null, isUpload : this.form.fileUpload })); } else if (o.clientValidation !== false) { // client validation // failed this.failureType = Ext.form.Action.CLIENT_INVALID; this.form.afterAction(this, false); } }, // private success : function(response) { var result = this.processResponse(response); if (result === true || result.success) { this.form.afterAction(this, true); return; } if (result.errors) { this.form.markInvalid(result.errors); this.failureType = Ext.form.Action.SERVER_INVALID; } this.form.afterAction(this, false); }, // private handleResponse : function(response) { if (this.form.errorReader) { var rs = this.form.errorReader.read(response); var errors = []; if (rs.records) { for (var i = 0, len = rs.records.length; i < len; i++) { var r = rs.records[i]; errors[i] = r.data; } } if (errors.length < 1) { errors = null; } return { success : rs.success, errors : errors }; } return Ext.decode(response.responseText); } }); /** * @class Ext.form.Action.Load * @extends Ext.form.Action A class which handles loading of data from a server * into the Fields of an {@link Ext.form.BasicForm}.
*
* Instances of this class are only created by a * {@link Ext.form.BasicForm Form} when submitting.
*
* A response packet must contain a boolean * success property, and a * data property. The * data property contains the * values of Fields to load. The individual value object for each Field * is passed to the Field's {@link Ext.form.Field#setValue setValue} * method.
*
* By default, response packets are assumed to be JSON, so a typical * response packet may look like this:
*
* *

 *  {
 *  success: true,
 *  data: {
 *  clientName: "Fred. Olsen Lines",
 *  portOfLoading: "FXT",
 *  portOfDischarge: "OSL"
 *  }
 *  }
 * 
* *
*
* Other data may be placed into the response for processing the the * {@link Ext.form.BasicForm Form}'s callback or event handler * methods. The object decoded from this JSON is available in the * {@link #result} property. */ Ext.form.Action.Load = function(form, options) { Ext.form.Action.Load.superclass.constructor.call(this, form, options); this.reader = this.form.reader; }; Ext.extend(Ext.form.Action.Load, Ext.form.Action, { // private type : 'load', // private run : function() { Ext.Ajax.request(Ext.apply(this.createCallback(this.options), { method : this.getMethod(), url : this.getUrl(false), params : this.getParams() })); }, // private success : function(response) { var result = this.processResponse(response); if (result === true || !result.success || !result.data) { this.failureType = Ext.form.Action.LOAD_FAILURE; this.form.afterAction(this, false); return; } this.form.clearInvalid(); this.form.setValues(result.data); this.form.afterAction(this, true); }, // private handleResponse : function(response) { if (this.form.reader) { var rs = this.form.reader.read(response); var data = rs.records && rs.records[0] ? rs.records[0].data : null; return { success : rs.success, data : data }; } return Ext.decode(response.responseText); } }); Ext.form.Action.ACTION_TYPES = { 'load' : Ext.form.Action.Load, 'submit' : Ext.form.Action.Submit };