Don't proxy template, just don't load it until asked for

This commit is contained in:
Nathan Gray 2012-03-14 21:27:23 +00:00
parent e5b4bcfe7f
commit 0aa4c66803
4 changed files with 43 additions and 81 deletions

View File

@ -167,7 +167,7 @@ class etemplate_new extends etemplate_widget_template
egw.langRequire(window, '.json_encode($langRequire).');
egw(window).ready(function() {
var et2 = new etemplate2(document.getElementById("container"), "etemplate_new::ajax_process_content");
et2.load("'.$GLOBALS['egw_info']['server']['webserver_url'].$this->rel_path.'",'.json_encode($data).');
et2.load("'.$this->name.'","'.$GLOBALS['egw_info']['server']['webserver_url'].$this->rel_path.'",'.json_encode($data).');
}, null, true);
</script>
';

View File

@ -664,15 +664,15 @@ var et2_nextmatch = et2_DOMWidget.extend(et2_IResizeable, {
// Load the template
var template = et2_createWidget("template", {"id": _value}, this);
if (!template.proxiedTemplate)
if (!template)
{
this.egw().debug("error", "Error while loading definition template for" +
"nextmatch widget.");
this.egw().debug("error", "Error while loading definition template for " +
"nextmatch widget.",_value);
return;
}
// Fetch the grid element and parse it
var definitionGrid = template.proxiedTemplate.getChildren()[0];
var definitionGrid = template.getChildren()[0];
if (definitionGrid && definitionGrid instanceof et2_grid)
{
this._parseGrid(definitionGrid);

View File

@ -59,10 +59,6 @@ var et2_template = et2_DOMWidget.extend({
init: function() {
this._super.apply(this, arguments);
this.proxiedTemplate = null;
this.isProxied = false;
this.isProxy = false;
this.div = document.createElement("div");
if (this.id != "")
@ -72,85 +68,40 @@ var et2_template = et2_DOMWidget.extend({
var splitted = this.id.split('.');
this.setApiInstance(egw(splitted[0], this._parent.egw().window));
this.createProxy();
}
},
createProxy: function() {
// Check whether a template with the given name already exists and
// is not a proxy.
var tmpl = this.getRoot().getWidgetById(this.id);
if (tmpl instanceof et2_template && tmpl.proxiedTemplate == null &&
tmpl != this)
{
// Detatch the proxied template from the DOM to and set its
// isProxied property to true
tmpl.makeProxied();
// Do not copy the id when cloning as this leads to infinit
// recursion
tmpl.options.id = "";
// Create a clone of the template and add it as child of this
// template (done by passing "this" to the clone function)
this.proxiedTemplate = tmpl.clone(this);
// Reset the id and manually copy the id to the proxied template
tmpl.options.id = this.id;
this.proxiedTemplate.id = tmpl.id;
this.proxiedTemplate.isProxy = true;
// Disallow adding any new node to this template
this.supportedWidgetClasses = [];
}
},
/**
* If the parent node is changed, either the DOM-Node of the proxied template
* or the DOM-Node of this template is connected to the parent DOM-Node.
*/
doLoadingFinished: function() {
// Check whether the parent implements the et2_IDOMNode interface.
if (this._parent && this._parent.implements(et2_IDOMNode)) {
var parentNode = this._parent.getDOMNode(this);
if (parentNode)
// Check to see if XML is known
var xml = null;
var templates = this.getRoot().getInstanceManager().templates;
if(!(xml = templates[this.id]))
{
if (this.proxiedTemplate)
// Check to see if ID is short form
// eg: row instead of app.something.row
for(var key in templates)
{
this.proxiedTemplate.setParentDOMNode(parentNode);
this.proxiedTemplate.loadingFinished();
return false;
}
else if (!this.isProxied && !this.isProxy)
{
this.setParentDOMNode(parentNode);
splitted = key.split('.');
if(splitted[splitted.length-1] == this.id)
{
xml = templates[key];
break;
}
}
}
if(xml !== null && typeof xml !== "undefined")
{
this.egw().debug("info", "Loading template from XML: ", this.id);
this.loadFromXML(xml);
// Don't call this here - premature
//this.loadingFinished();
}
else
{
this.egw().debug("warn", "Unable to find XML for ", this.id);
}
}
return true;
},
makeProxied: function() {
if (!this.isProxied)
{
this.detatchFromDOM();
this.div = null;
this.parentNode = null;
}
this.isProxied = true;
},
getDOMNode: function() {
return this.div;
},
isInTree: function(_sender) {
return this._super(this, !this.isProxied);
}
});
et2_register_widget(et2_template, ["template"]);

View File

@ -72,6 +72,9 @@ function etemplate2(_container, _menuaction)
// Preset the object variable
this.widgetContainer = null;
// 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()});
}
@ -102,6 +105,7 @@ etemplate2.prototype.clear = function()
this.widgetContainer.free();
this.widgetContainer = null;
}
this.templates = {};
}
/**
@ -152,7 +156,7 @@ etemplate2.prototype._createArrayManagers = function(_data)
/**
* Loads the template from the given URL and sets the data object
*/
etemplate2.prototype.load = function(_url, _data)
etemplate2.prototype.load = function(_name, _url, _data)
{
// Create the document fragment into which the HTML will be injected
var frag = document.createDocumentFragment();
@ -161,8 +165,15 @@ etemplate2.prototype.load = function(_url, _data)
// code in the callback function)
et2_loadXMLFromURL(_url, function(_xmldoc) {
// Read the XML structure
this.widgetContainer.loadFromXML(_xmldoc);
// Scan for templates and store them
for(var i = 0; i < _xmldoc.childNodes.length; i++) {
var template = _xmldoc.childNodes[i];
if(template.nodeName.toLowerCase() != "template") continue;
this.templates[template.getAttribute("id")] = template;
}
// Read the XML structure of the requested template
this.widgetContainer.loadFromXML(this.templates[_name]);
// Inform the widget tree that it has been successfully loaded.
this.widgetContainer.loadingFinished();