From: <nat...@us...> - 2013-06-26 20:50:19
|
Author: nathangray Date: Wed Jun 26 22:50:10 2013 New Revision: 42900 URL: http://svn.stylite.de/viewvc/egroupware?rev=42900&view=rev Log: Implement some basic client-side validation (required) Modified: trunk/etemplate/js/et2_core_baseWidget.js trunk/etemplate/js/et2_core_inputWidget.js trunk/etemplate/js/et2_core_interfaces.js trunk/etemplate/js/et2_extension_customfields.js trunk/etemplate/js/et2_widget_button.js trunk/etemplate/js/et2_widget_link.js trunk/etemplate/js/et2_widget_radiobox.js trunk/etemplate/js/et2_widget_selectAccount.js trunk/etemplate/js/et2_widget_tabs.js trunk/etemplate/js/et2_widget_textbox.js trunk/etemplate/js/etemplate2.js Modified: trunk/etemplate/js/et2_core_baseWidget.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_core_baseWidget.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_core_baseWidget.js (original) +++ trunk/etemplate/js/et2_core_baseWidget.js Wed Jun 26 22:50:10 2013 @@ -112,7 +112,7 @@ .addClass("message") .addClass(_type) .addClass(_floating ? "floating" : "") - .text(_text); + .text(_text.valueOf() + ""); // Decide whether to prepend or append the div if (_prepend) @@ -152,10 +152,11 @@ { var surr = this.getSurroundings(); var self = this; + var messageDiv = this._messageDiv; + self._messageDiv = null; var _done = function() { - surr.removeDOMNode(self._messageDiv[0]); - self._messageDiv = null; + surr.removeDOMNode(messageDiv[0]); // Update the surroundings manager if (!_noUpdate) @@ -167,7 +168,7 @@ // Either fade out or directly call the function which removes the div if (_fade) { - this._messageDiv.fadeOut("fast", _done); + messageDiv.fadeOut("fast", _done); } else { Modified: trunk/etemplate/js/et2_core_inputWidget.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_core_inputWidget.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_core_inputWidget.js (original) +++ trunk/etemplate/js/et2_core_inputWidget.js Wed Jun 26 22:50:10 2013 @@ -25,10 +25,10 @@ * * @augments et2_valueWidget */ -var et2_inputWidget = et2_valueWidget.extend(et2_IInput, +var et2_inputWidget = et2_valueWidget.extend([et2_IInput,et2_ISubmitListener], { attributes: { - "required": { + "needed": { "name": "Required", "default": false, "type": "boolean", @@ -124,10 +124,17 @@ }, change: function(_node) { - if (this.onchange) + var messages = []; + var valid = this.isValid(messages); + + // Passing false will clear any set messages + this.set_validation_error(valid ? false : messages); + + if (valid && this.onchange) { return et2_compileLegacyJS(this.onchange, this, _node)(); } + return valid; }, set_value: function(_value) { @@ -218,7 +225,7 @@ this.label = _value; }, - set_required: function(_value) { + set_needed: function(_value) { var node = this.getInputNode(); if (node) { @@ -281,7 +288,34 @@ resetDirty: function() { this._oldValue = this.getValue(); + }, + + isValid: function(messages) { + var ok = true; + + // Check for required + if(this.options.needed && (this.getValue() == null || this.getValue().valueOf() == '')) + { + messages.push(this.egw().lang('input required')); + ok = false; + } + return ok; + }, + + /** + * Called whenever the template gets submitted. We return false if the widget + * is not valid, which cancels the submission. + * + * @param _values contains the values which will be sent to the server. + * Listeners may change these values before they get submitted. + */ + submit: function(_values) { + var messages = []; + var valid = this.isValid(messages); + + // Passing false will clear any set messages + this.set_validation_error(valid ? false : messages); + return valid; } - }); Modified: trunk/etemplate/js/et2_core_interfaces.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_core_interfaces.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_core_interfaces.js (original) +++ trunk/etemplate/js/et2_core_interfaces.js Wed Jun 26 22:50:10 2013 @@ -57,7 +57,23 @@ /** * Causes the dirty flag to be reseted. */ - resetDirty: function() {} + resetDirty: function() {}, + + /** + * Checks the data to see if it is valid, as far as the client side can tell. + * Return true if it's not possible to tell on the client side, because the server + * will have the chance to validate also. + * + * The messages array is to be populated with everything wrong with the data, + * so don't stop checking after the first problem unless it really makes sense + * to ignore other problems. + * + * @param {String[]} messages List of messages explaining the failure(s). + * messages should be fairly short, and already translated. + * + * @return {boolean} True if the value is valid (enough), false to fail + */ + isValid: function(messages) {} }); /** Modified: trunk/etemplate/js/et2_extension_customfields.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_extension_customfields.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_extension_customfields.js (original) +++ trunk/etemplate/js/et2_extension_customfields.js Wed Jun 26 22:50:10 2013 @@ -190,7 +190,7 @@ var attrs = { 'id': id, 'statustext': field.help, - 'required': field.needed, + 'needed': field.needed, 'readonly': this.options.readonly, 'value': this.options.value[this.prefix+field_name] }; @@ -370,6 +370,11 @@ } } }, + + isValid: function() { + // Individual customfields will handle themselves + return true; + }, /** * Adapt provided attributes to match options for widget Modified: trunk/etemplate/js/et2_widget_button.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_button.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_button.js (original) +++ trunk/etemplate/js/et2_widget_button.js Wed Jun 26 22:50:10 2013 @@ -247,6 +247,9 @@ // If "null" is returned, the result is not added to the submitted // array. return null; + }, + isValid: function() { + return true; }, /** Modified: trunk/etemplate/js/et2_widget_link.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_link.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_link.js (original) +++ trunk/etemplate/js/et2_widget_link.js Wed Jun 26 22:50:10 2013 @@ -867,7 +867,7 @@ description: "Array with keys app, id, and optionally title", type: "any" }, - "required": { + "needed": { "ignore": true } }, Modified: trunk/etemplate/js/et2_widget_radiobox.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_radiobox.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_radiobox.js (original) +++ trunk/etemplate/js/et2_widget_radiobox.js Wed Jun 26 22:50:10 2013 @@ -236,7 +236,7 @@ "default": {}, "description": "Options for radio buttons. Should be {value: label, ...}" }, - "required": { + "needed": { "name": "Required", "default": false, "type": "boolean", @@ -258,7 +258,7 @@ this.node = $j(document.createElement("div")) .addClass("et2_vbox") .addClass("et2_box_widget"); - if(this.options.required) + if(this.options.needed) { // This isn't strictly allowed, but it works this.node.attr("required","required"); @@ -298,7 +298,7 @@ ro_true: this.options.ro_true, ro_false: this.options.ro_false, readonly: this.options.readonly, - required: this.options.required + needed: this.options.needed }; var radio = et2_createWidget("radio", attrs, this); } Modified: trunk/etemplate/js/et2_widget_selectAccount.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_selectAccount.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_selectAccount.js (original) +++ trunk/etemplate/js/et2_widget_selectAccount.js Wed Jun 26 22:50:10 2013 @@ -72,7 +72,7 @@ } // If not required, make sure there's an empty label - if(_attrs['rows'] == 1 && !_attrs['empty_label'] && !_attrs['required']) + if(_attrs['rows'] == 1 && !_attrs['empty_label'] && !_attrs['needed']) { _attrs['empty_label'] = 'None'; } Modified: trunk/etemplate/js/et2_widget_tabs.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_tabs.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_tabs.js (original) +++ trunk/etemplate/js/et2_widget_tabs.js Wed Jun 26 22:50:10 2013 @@ -304,6 +304,9 @@ resetDirty: function() { this.value = this.selected_index; + }, + isValid: function(messages) { + return true; } }); et2_register_widget(et2_tabbox, ["tabbox"]); Modified: trunk/etemplate/js/et2_widget_textbox.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/et2_widget_textbox.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/et2_widget_textbox.js (original) +++ trunk/etemplate/js/et2_widget_textbox.js Wed Jun 26 22:50:10 2013 @@ -208,7 +208,7 @@ "size": { "ignore": true }, - "required": { + "needed": { "ignore": true } }, Modified: trunk/etemplate/js/etemplate2.js URL: http://svn.stylite.de/viewvc/egroupware/trunk/etemplate/js/etemplate2.js?rev=42900&r1=42899&r2=42900&view=diff ============================================================================== --- trunk/etemplate/js/etemplate2.js (original) +++ trunk/etemplate/js/etemplate2.js Wed Jun 26 22:50:10 2013 @@ -88,7 +88,7 @@ // List of templates (XML) that are known, but not used. Indexed by id. this.templates = {}; - + // Connect to the window resize event $j(window).resize(this, function(e) {e.data.resize();}); } @@ -115,11 +115,10 @@ { if (this.widgetContainer != null) { -// $j(':input',this.DOMContainer).validator().data("validator").destroy(); this.widgetContainer.free(); this.widgetContainer = null; } - + // Remove self from the index for(name in this.templates) { @@ -262,15 +261,6 @@ etemplate2.prototype.submit = function(button) { - // Validator - /*var valid = true; - var inputs = $j(':input',this.DOMContainer).each(function() { - if(typeof $j(this).data("validator") == "undefined") return true; - valid = valid && $j(this).data("validator").checkValidity(); - return true; - }); - if(!valid) return false;*/ - // Get the form values var values = this.getValues(this.widgetContainer); |