From ace95f26b0892b5e0a380afcba86bfb858de6d8a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 27 Jan 2014 21:59:29 +0000 Subject: [PATCH] fixed not expanded onchange attribute, if widget type need to be expanded too, eg. log-viewer in CalDAV or eSync preferences --- etemplate/js/et2_core_common.js | 23 +++++++++++++++-------- etemplate/js/et2_core_widget.js | 20 +++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/etemplate/js/et2_core_common.js b/etemplate/js/et2_core_common.js index 66379451cb..c5b1335e2b 100644 --- a/etemplate/js/et2_core_common.js +++ b/etemplate/js/et2_core_common.js @@ -84,7 +84,7 @@ function et2_form_name(_cname,_name) * Checks whether the given value is of the given type. Strings are converted * into the corresponding type. The (converted) value is returned. All supported * types are listed in the et2_validTypes array. - * + * * @param mixed _val value * @param string _type a valid type eg. "string" or "js" * @param string _attr attribute name @@ -102,7 +102,7 @@ function et2_checkType(_val, _type, _attr, _widget) if(typeof _val != "undefined" && _val) { - egw.debug("warn", "Widget %o: '" + _val + "' was not of specified _type '" + + egw.debug("warn", "Widget %o: '" + _val + "' was not of specified _type '" + _type + (_attr != null ? "' for attribute '" + _attr + "' " : "") + "and is now '" + res + "'",_widget); } @@ -115,6 +115,13 @@ function et2_checkType(_val, _type, _attr, _widget) return _val; } + // we dont check default-value any further, that also fixes type="js" does NOT accept null, + // which happens on expanded values + if (_val === et2_typeDefaults[_type]) + { + return _val; + } + // If the type is boolean, check whether the given value is exactly true or // false. Otherwise check whether the value is the string "true" or "false". if (_type == "boolean") @@ -204,7 +211,7 @@ function et2_checkType(_val, _type, _attr, _widget) } // Case 3: The value is already a valid css pixel value or a percentage - if (typeof _val == "string" && + if (typeof _val == "string" && ((_val.indexOf("px") == _val.length - 2 && !isNaN(_val.split("px")[0])) || (_val.indexOf("%") == _val.length - 1 && !isNaN(_val.split("%")[0])))) { @@ -246,7 +253,7 @@ function et2_checkType(_val, _type, _attr, _widget) } } } - + if (typeof _val == "string") { return _val; // get compiled later in widgets own initAttributes, as widget is not yet initialised @@ -306,7 +313,7 @@ function et2_validateAttrib(_id, _attrib) { if (et2_validTypes.indexOf(_attrib["type"]) < 0) { - egw.debug("error", "Invalid type '" + _attrib["type"] + "' for attribute '" + _id + + egw.debug("error", "Invalid type '" + _attrib["type"] + "' for attribute '" + _id + "' supplied. Valid types are ", et2_validTypes); } } @@ -426,7 +433,7 @@ function et2_csvSplit(_str, _num, _delimiter, _enclosure) // Split the string at the delimiter and join it again, when a enclosure is // found at the beginning/end of a part - var parts = _str.split(_delimiter); + var parts = _str.split(_delimiter); for (var n = 0; typeof parts[n] != "undefined"; n++) { var part = parts[n]; @@ -559,7 +566,7 @@ function et2_activateLinks(_content) */ function et2_insertLinkText(_text, _node, _target) { - if(!_node) + if(!_node) { egw.debug("warn", "et2_insertLinkText called without node", _text, _node, _target); return; @@ -745,7 +752,7 @@ function et2_rangeSubstract(_ar1, _ar2) /** * Call a function specified by it's name (possibly dot separated, eg. "app.myapp.myfunc") - * + * * @param string func dot-separated function name * @param arguments variable number of arguments * @returns {Boolean} diff --git a/etemplate/js/et2_core_widget.js b/etemplate/js/et2_core_widget.js index 873d10ba8a..094d6c4661 100644 --- a/etemplate/js/et2_core_widget.js +++ b/etemplate/js/et2_core_widget.js @@ -660,6 +660,13 @@ var et2_widget = Class.extend( entry = null; } + // if _nodeName / type-attribute contains something to expand (eg. type="@${row}[type]"), + // we need to expand it now as it defines the constructor and by that attributes parsed via parseXMLAttrs! + if (_nodeName.charAt(0) == '@' || _nodeName.indexOf('$') >= 0) + { + _nodeName = attributes["type"] = this.getArrayMgr('content').expandName(_nodeName); + } + // Get the constructor - if the widget is readonly, use the special "_ro" // constructor if it is available var constructor = typeof et2_registry[_nodeName] == "undefined" ? @@ -672,19 +679,6 @@ var et2_widget = Class.extend( // Parse the attributes from the given XML attributes object this.parseXMLAttrs(_node.attributes, attributes, constructor.prototype); - // check if parseXMLAttrs gives a different type attribute eg. type="@${row}[type]" - if (attributes.type && attributes.type != _nodeName) - { - // set _nodeName and constructor accordingly - _nodeName = attributes.type; - constructor = typeof et2_registry[_nodeName] == "undefined" ? - et2_placeholder : et2_registry[_nodeName]; - if (readonly && typeof et2_registry[_nodeName + "_ro"] != "undefined") - { - constructor = et2_registry[_nodeName + "_ro"]; - } - } - // Do an sanity check for the attributes constructor.prototype.generateAttributeSet(attributes);