[silva.ui][Sylvain Viollon] Fix problems related with loading ja...
[email protected] Wed, 25 Sep 2013 15:15:09 +0200
| Newsgroups | gmane.comp.web.zope.silva.cvs |
|---|---|
| Message-ID | <[email protected]> |
author: Sylvain Viollon
date: Wed Sep 25 15:15:05 2013 +0200
revision: 661:bc43574ab5dc in silva.ui
branch:
details: https://hg.infrae.com/silva.ui?cmd=changeset;node=bc43574ab5dc
modified: src/silva/ui/static/js/infrae.js src/silva/ui/static/js/infrae.min.js src/silva/ui/static/js/infrae.views.js src/silva/ui/static/js/infrae.views.min.js src/silva/ui/static/js/smi.js src/silva/ui/static/js/smi.min.js
added:
removed:
log: Fix problems related with loading javascripts on demand and
Fanstatic bundles (each JS of the bundle must be processed
separatly).
diffstat:
src/silva/ui/static/js/infrae.js | 12 +-
src/silva/ui/static/js/infrae.min.js | 2 +-
src/silva/ui/static/js/infrae.views.js | 186 +++++++++++++++++++---------
src/silva/ui/static/js/infrae.views.min.js | 2 +-
src/silva/ui/static/js/smi.js | 7 +-
src/silva/ui/static/js/smi.min.js | 2 +-
6 files changed, 143 insertions(+), 68 deletions(-)
diffs (304 lines):
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/infrae.js
--- a/src/silva/ui/static/js/infrae.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/infrae.js Wed Sep 25 15:15:05 2013 +0200
@@ -119,6 +119,17 @@
};
return result;
},
+ map_concat: function(array, callback, result) {
+ var index, len;
+
+ if (result === undefined) {
+ result = [];
+ };
+ for (index=0, len=array.length; index < len; index++) {
+ result = result.concat(callback(array[index]));
+ };
+ return result;
+ },
lazy_map: function(array, callback, result) {
var index = 0;
var len = array.length;
@@ -159,4 +170,3 @@
infrae.utils = module;
})(infrae, jQuery);
-
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/infrae.min.js
--- a/src/silva/ui/static/js/infrae.min.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/infrae.min.js Wed Sep 25 15:15:05 2013 +0200
@@ -1,1 +1,1 @@
-(function(window){var infrae={};window.infrae=infrae})(window),function(infrae,$){var module={},predicates={};$.extend(predicates,{or:function(){for(var max=arguments.length,index=1;max>index;){if(predicates[arguments[index][0]].apply(this,arguments[index])===!0)return!0;index+=1}return!1},and:function(){for(var max=arguments.length,index=1;max>index;){if(predicates[arguments[index][0]].apply(this,arguments[index])!==!0)return!1;index+=1}return!0},not:function(){return!predicates[arguments[1][0]].apply(this,arguments[1])},equal:function(){for(var value=this[arguments[1]],max=arguments.length,index=2;max>index;){if(arguments[index]==value)return!0;index+=1}return!1},provides:function(){for(var max=arguments.length,index=1;max>index;){if(infrae.interfaces.is_implemented_by(arguments[index],
this))return!0;index+=1}return!1}}),$.extend(module,{test:function(data,conditions){return predicates[conditions[0]].apply(data,conditions)},each:function(array,callback){var index,len;for(i
ndex=0,len=array.length;len>index;index++)callback(array[index])},apply_on_each:function(array,callback){var index,len;for(index=0,len=array.length;len>index;index++)callback.apply(array[index])},map:function(array,callback,result){var index,len;for(void 0===result&&(result=[]),index=0,len=array.length;len>index;index++)result.push(callback(array[index]));return result},lazy_map:function(array,callback,result){var index=0,len=array.length,deferred=$.Deferred();void 0===result&&(result=[]);var work=function(){for(var start=+new Date;len>index;index++)if(result.push(callback(array[index])),+new Date-start>50)return setTimeout(work,50),void 0;deferred.resolve(result)};return work(),deferred.promise()},apply_on_map:function(array,callback,result){var index,len;for(void 0===result&&(result=[])
,index=0,len=array.length;len>index;index++)result.push(callback.apply(array[index]));return result}}),infrae.utils=module}(infrae,jQuery);
\ No newline at end of file
+(function(window){var infrae={};window.infrae=infrae})(window),function(infrae,$){var module={},predicates={};$.extend(predicates,{or:function(){for(var max=arguments.length,index=1;max>index;){if(predicates[arguments[index][0]].apply(this,arguments[index])===!0)return!0;index+=1}return!1},and:function(){for(var max=arguments.length,index=1;max>index;){if(predicates[arguments[index][0]].apply(this,arguments[index])!==!0)return!1;index+=1}return!0},not:function(){return!predicates[arguments[1][0]].apply(this,arguments[1])},equal:function(){for(var value=this[arguments[1]],max=arguments.length,index=2;max>index;){if(arguments[index]==value)return!0;index+=1}return!1},provides:function(){for(var max=arguments.length,index=1;max>index;){if(infrae.interfaces.is_implemented_by(arguments[index],
this))return!0;index+=1}return!1}}),$.extend(module,{test:function(data,conditions){return predicates[conditions[0]].apply(data,conditions)},each:function(array,callback){var index,len;for(i
ndex=0,len=array.length;len>index;index++)callback(array[index])},apply_on_each:function(array,callback){var index,len;for(index=0,len=array.length;len>index;index++)callback.apply(array[index])},map:function(array,callback,result){var index,len;for(void 0===result&&(result=[]),index=0,len=array.length;len>index;index++)result.push(callback(array[index]));return result},map_concat:function(array,callback,result){var index,len;for(void 0===result&&(result=[]),index=0,len=array.length;len>index;index++)result=result.concat(callback(array[index]));return result},lazy_map:function(array,callback,result){var index=0,len=array.length,deferred=$.Deferred();void 0===result&&(result=[]);var work=function(){for(var start=+new Date;len>index;index++)if(result.push(callback(array[index])),+new Date-s
tart>50)return setTimeout(work,50),void 0;deferred.resolve(result)};return work(),deferred.promise()},apply_on_map:function(array,callback,result){var index,len;for(void 0===result&&(result=
[]),index=0,len=array.length;len>index;index++)result.push(callback.apply(array[index]));return result}}),infrae.utils=module}(infrae,jQuery);
\ No newline at end of file
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/infrae.views.js
--- a/src/silva/ui/static/js/infrae.views.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/infrae.views.js Wed Sep 25 15:15:05 2013 +0200
@@ -1,87 +1,151 @@
(function ($, infrae, jsontemplate) {
+ var BUNDLE_RE = /^:bundle:/;
// Disable all ajax caching, for IE 8.
$.ajaxSetup({
cache:false
});
+ var HTMLResourceTracker = function() {
+ var urls = [];
+
+ var analyze_url = function(original) {
+ var parts = original.split('/'),
+ last = parts[parts.length - 1];
+
+ if (last.match(BUNDLE_RE)) {
+ parts.pop();
+
+ var files = last.substr(8).split(';'),
+ prefix = parts.join('/'),
+ result = [],
+ i;
+
+ for (i=0; i < files.length; i++) {
+ result.push({url: [prefix, files[i]].join('/'),
+ file: files[i],
+ prefix: prefix});
+ };
+ return result;
+ };
+ return [{url: original, file: null, prefix: original}];
+ };
+
+ return {
+ register: function(new_url) {
+ var new_urls = analyze_url(new_url),
+ i;
+
+ for (i=0; i < new_urls.length; i++) {
+ if ($.inArray(new_urls[i].url, urls) < 0) {
+ urls.push(new_urls[i].url);
+ };
+ };
+ },
+ validate: function(new_url) {
+ // This can probably be optimized.
+ var new_urls = analyze_url(new_url),
+ missing_urls = {},
+ result = [],
+ i, prefix, files;
+
+ for (i=0; i < new_urls.length; i++) {
+ if ($.inArray(new_urls[i].url, urls) < 0) {
+ prefix = new_urls[i].prefix;
+ if (missing_urls[prefix] === undefined) {
+ missing_urls[prefix] = [];
+ };
+ missing_urls[prefix].push(new_urls[i]);
+ };
+ };
+ for (prefix in missing_urls) {
+ if (missing_urls[prefix].length == 1 && missing_urls[prefix][0].file === null) {
+ result.push(missing_urls[prefix][0].url);
+ } else {
+ files = [];
+ for (i=0; i < missing_urls[prefix].length; i++) {
+ files.push(missing_urls[prefix][i].file);
+ };
+ result.push([prefix, ':bundle:' + files.join(';')].join('/'));
+ };
+ };
+ return result;
+ }
+ };
+ };
+
var module = {
/**
* HTMLResourceManager, load extra JS or CSS at run time.
*/
HTMLResourceManager: function($document) {
var data = {
- css: [],
- js: []
+ css: HTMLResourceTracker(),
+ js: HTMLResourceTracker()
};
var root = $document.get(0);
var head = root.getElementsByTagName('head')[0];
var resources = {
/**
- * Return true if the given Javascript is already loaded.
- * @param script: url of the Javascript file.
+ * Load given JS files.
+ * @param script: list containing urls of the JS files.
*/
- is_js_loaded: function(script) {
- return $.inArray(script, data.js) > -1;
+ load_js: function(scripts) {
+ var urls = infrae.utils.map_concat(scripts, data.js.validate);
+
+ if (urls.length) {
+ return $.when.apply($, infrae.utils.map(urls, function(url) {
+ // We don't use jQuery here, as does strange things with scripts.
+ var script_tag = root.createElement('script'),
+ promise = $.Deferred();
+
+ script_tag.async = 'async';
+ script_tag.type = 'text/javascript';
+ if (script_tag.readyState) {
+ script_tag.onreadystatechange = function () {
+ if (script_tag.readyState == "loaded" ||
+ script_tag.readyState == "complete") {
+ script_tag.onreadystatechange = null;
+ promise.resolve();
+ };
+ };
+ } else {
+ script_tag.onload = function() {
+ promise.resolve();
+ };
+ };
+ script_tag.src = url;
+ head.appendChild(script_tag);
+ data.js.register(url);
+ return promise;
+ }));
+ };
+ return $.Deferred().resolve();
},
/**
- * Return true if the given CSS is already loaded.
- * @param css: url of the CSS file.
+ * Load given CSS files.
+ * @param css: list containing urls of the CSS files.
*/
- is_css_loaded: function(css) {
- return $.inArray(css, data.css) > -1;
- },
- /**
- * Load a given JS file.
- * @param script: url of the JS file.
- */
- load_js: function(script) {
- var done = $.Deferred();
+ load_css: function(csses) {
+ var urls = infrae.utils.map_concat(csses, data.css.validate);
- if (!resources.is_js_loaded(script)) {
- // We don't use jQuery here, as does strange things with scripts.
- var script_tag = root.createElement('script');
+ if (urls.length) {
+ return $.when.apply($, infrae.utils.map(urls, function(url) {
+ // We don't use jQuery here, as does strange things with links.
+ var link_tag = root.createElement('link');
- script_tag.async = 'async';
- script_tag.type = 'text/javascript';
- if (script_tag.readyState) {
- script_tag.onreadystatechange = function () {
- if (script_tag.readyState == "loaded" ||
- script_tag.readyState == "complete") {
- script_tag.onreadystatechange = null;
- done.resolve();
- };
- };
- } else {
- script_tag.onload = function() {
- done.resolve();
- };
- };
- script_tag.src = script;
- head.appendChild(script_tag);
- data.js.push(script);
- return done;
+ link_tag.rel = 'stylesheet';
+ link_tag.type = 'text/css';
+ link_tag.href = url;
+ head.appendChild(link_tag);
+ data.css.register(url);
+ // We should use load event here too.
+ return $.Deferred().resolve();
+ }));
};
- return done.resolve();
- },
- /**
- * Load a given CSS file.
- * @param css: url of the CSS file.
- */
- load_css: function(css) {
- if (!resources.is_css_loaded(css)) {
- // We don't use jQuery here, as does strange things with links.
- var link_tag = root.createElement('link');
-
- link_tag.rel = 'stylesheet';
- link_tag.type = 'text/css';
- link_tag.href = css;
- head.appendChild(link_tag);
-
- data.css.push(css);
- };
+ return $.Deferred().resolve();
}
};
@@ -89,8 +153,8 @@
$('script').each(function () {
var src = $(this).attr('src');
- if (src != undefined && ! resources.is_js_loaded(src)) {
- data.js.push(src);
+ if (src != undefined) {
+ data.js.register(src);
};
});
$('link').each(function () {
@@ -98,8 +162,8 @@
if ($link.attr('rel') == 'stylesheet' && $link.attr('type') == 'text/css') {
var src = $link.attr('href');
- if (src != undefined && !resources.is_css_loaded(src)) {
- data.css.push(src);
+ if (src != undefined) {
+ data.css.register(src);
};
};
});
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/infrae.views.min.js
--- a/src/silva/ui/static/js/infrae.views.min.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/infrae.views.min.js Wed Sep 25 15:15:05 2013 +0200
@@ -1,1 +1,1 @@
-(function($,infrae,jsontemplate){$.ajaxSetup({cache:!1});var module={HTMLResourceManager:function($document){var data={css:[],js:[]},root=$document.get(0),head=root.getElementsByTagName("head")[0],resources={is_js_loaded:function(script){return $.inArray(script,data.js)>-1},is_css_loaded:function(css){return $.inArray(css,data.css)>-1},load_js:function(script){var done=$.Deferred();if(!resources.is_js_loaded(script)){var script_tag=root.createElement("script");return script_tag.async="async",script_tag.type="text/javascript",script_tag.readyState?script_tag.onreadystatechange=function(){("loaded"==script_tag.readyState||"complete"==script_tag.readyState)&&(script_tag.onreadystatechange=null,done.resolve())}:script_tag.onload=function(){done.resolve()},script_tag.src=script,head.appendChil
d(script_tag),data.js.push(script),done}return done.resolve()},load_css:function(css){if(!resources.is_css_loaded(css)){var link_tag=root.createElement("link");link_tag.rel="stylesheet",link
_tag.type="text/css",link_tag.href=css,head.appendChild(link_tag),data.css.push(css)}}};return $document.ready(function(){$("script").each(function(){var src=$(this).attr("src");void 0==src||resources.is_js_loaded(src)||data.js.push(src)}),$("link").each(function(){var $link=$(this);if("stylesheet"==$link.attr("rel")&&"text/css"==$link.attr("type")){var src=$link.attr("href");void 0==src||resources.is_css_loaded(src)||data.css.push(src)}})}),resources}},template_cache={},View=function($content,data,factory,args,reject){var view={$content:$content,data:data};$.extend(view,factory.apply($content,args));var render=function(template){view.template_append||($content.triggerHandler("cleanup-infrae-views"),(view.cleanup||view.iframe)&&$content.one("cleanup-infrae-views",function(){view.cleanup&&
view.cleanup(),view.iframe&&($(window).unbind("resize.infrae-views-iframe"),$(window).unbind("workspace-resize-smi.infrae-views-iframe"),$content.removeClass("iframe-view"))}));var deferred=
$.Deferred(),$context=$content,resolve=function(){void 0!=reject?deferred.rejectWith(view,reject):deferred.resolveWith(view)},finalizer=function(){var done=null;return void 0!=view.render&&(done=view.render($context),done&&done.promise)?(done.promise().done(resolve),void 0):(resolve(),void 0)};if(view.iframe){if(view.template_append)throw{message:"Cannot use iframe and template_append together"};var $iframe=$('<iframe src="">');view.$iframe=$iframe;var resize=function(){var height=$content.innerHeight(),width=$content.innerWidth();view.resize_iframe&&view.resize_iframe(width,height)||($iframe.height(height),$iframe.width(width))};resize(),$(window).bind("resize.infrae-views-iframe",resize),$(window).bind("workspace-resize-smi.infrae-views-iframe",resize),$content.addClass("iframe-view"),$
content.html($iframe);var iframe_window=$iframe.get(0).contentWindow,iframe_document=iframe_window.document;if(view.$window=$(iframe_window),view.$document=$(iframe_document),void 0!==templa
te){view.ready=$.Deferred();var loader=function(){view.ready.resolve(view)};0>template.indexOf("<html")&&0>template.indexOf("<HTML")&&(template="<html><body>"+template+"</body></html>"),iframe_document.write(template),iframe_document.close(),"complete"==iframe_document.readyState?loader():iframe_window.addEventListener?iframe_window.addEventListener("load",loader,!1):iframe_window.attachEvent("onload",loader)}}else void 0!==template&&(view.template_append?($context=$(template),$content.append($context)):$content.html(template));return finalizer(),deferred.promise()};return function(){var template=void 0,jsont_url=view.template_data&&data.jsont_url||view.jsont_url;if(jsont_url)return view.template_nocache||(template=template_cache[jsont_url],void 0===template)?$.ajax({type:"GET",url:jsont_
url}).then(function(payload){var template=new jsontemplate.Template(payload,{});return template_cache[jsont_url]=template,render(template.expand(data))}):render(template.expand(view));var ht
ml_url=view.template_data&&data.html_url||view.html_url;if(html_url)return view.template_nocache||(template=template_cache[html_url],void 0===template)?$.ajax({type:"GET",url:html_url}).then(function(payload){return template_cache[html_url]=payload,render(payload)}):render(template);var jsont=view.template_data&&data.jsont||view.jsont;if(void 0!==jsont)return template=template_cache[jsont],void 0===template&&(template=new jsontemplate.Template(jsont,{}),template_cache[jsont]=template),render(template.expand(view));var html=view.template_data&&data.html||view.html;return void 0!==html?render(html):render()}};$.extend(module,{Registry:function(){var views={},count=0,render_best_view=function($content,data,options){var ifaces=options.ifaces||infrae.interfaces.implemented_by(data),named_views
=views[options.name],to_render=null,args=[$content,data].concat(options.args),reject=options.reject;if(named_views)for(var i=0;ifaces.length>i;i++){var definitions=named_views[ifaces[i]];if(
definitions&&definitions.length){to_render=View($content,data,definitions[0].factory,args,reject);break}}return null!=to_render?to_render():(window.console&&console.log&&console.log("failed view lookup for options",options,"and",data),$.Deferred().reject({status:604}))},render_all_views=function($content,data,options){var named_views=views[options.name];if(void 0==named_views)return[];var ifaces=options.ifaces||infrae.interfaces.implemented_by(data),seen_definitions=[],to_render=[],args=[$content,data].concat(options.args),reject=options.reject;return infrae.utils.each(ifaces,function(iface){var definitions=named_views[iface];definitions&&infrae.utils.each(definitions,function(definition){if(0>$.inArray(definition.__view_uid__,seen_definitions)){if(seen_definitions.push(definition.__view_
uid__),void 0!=definition.available&&!definition.available.apply(definition,args))return;to_render.push([definition.order,View($content,data,definition.factory,args,reject)])}})}),to_render.
sort(function(v1,v2){return v1[0]-v2[0]}),$.each(to_render,function(i,data){data[1]()}),null},render_url=function($content,url,options){return $.ajax({type:"GET",url:url,dataType:"json"}).then(function(data){return render_best_view($content,data,options)})},registry={register:function(definition){void 0==definition.name&&(definition.name="default"),void 0==definition.order&&(definition.order=0),definition.__view_uid__=""+count,count+=1;var add=function(definition,iface){views[definition.name]||(views[definition.name]={}),views[definition.name][iface]||(views[definition.name][iface]=[]),views[definition.name][iface].unshift(definition)};definition.ifaces?infrae.utils.each(definition.ifaces,function(iface){add(definition,iface)}):add(definition,definition.iface||"object")},render:function($
content,options){if(options.name||(options.name="default"),options.data)return render_best_view($content,options.data,options);if(options.every)return render_all_views($content,options.every
,options);if(options.url)return render_url($content,options.url,options);throw{message:"Missing required options"}}};return registry}});var default_registry=module.Registry();$.extend(module,{view:function(definition){default_registry.register(definition)},render:function($content,options){return default_registry.render($content,options)}}),$.fn.render=function(options){return default_registry.render($(this),options)},infrae.views=module})(jQuery,infrae,jsontemplate);
\ No newline at end of file
+(function($,infrae,jsontemplate){var BUNDLE_RE=/^:bundle:/;$.ajaxSetup({cache:!1});var HTMLResourceTracker=function(){var urls=[],analyze_url=function(original){var parts=original.split("/"),last=parts[parts.length-1];if(last.match(BUNDLE_RE)){parts.pop();var i,files=last.substr(8).split(";"),prefix=parts.join("/"),result=[];for(i=0;files.length>i;i++)result.push({url:[prefix,files[i]].join("/"),file:files[i],prefix:prefix});return result}return[{url:original,file:null,prefix:original}]};return{register:function(new_url){var i,new_urls=analyze_url(new_url);for(i=0;new_urls.length>i;i++)0>$.inArray(new_urls[i].url,urls)&&urls.push(new_urls[i].url)},validate:function(new_url){var i,prefix,files,new_urls=analyze_url(new_url),missing_urls={},result=[];for(i=0;new_urls.length>i;i++)0>$.inArray
(new_urls[i].url,urls)&&(prefix=new_urls[i].prefix,void 0===missing_urls[prefix]&&(missing_urls[prefix]=[]),missing_urls[prefix].push(new_urls[i]));for(prefix in missing_urls)if(1==missing_u
rls[prefix].length&&null===missing_urls[prefix][0].file)result.push(missing_urls[prefix][0].url);else{for(files=[],i=0;missing_urls[prefix].length>i;i++)files.push(missing_urls[prefix][i].file);result.push([prefix,":bundle:"+files.join(";")].join("/"))}return result}}},module={HTMLResourceManager:function($document){var data={css:HTMLResourceTracker(),js:HTMLResourceTracker()},root=$document.get(0),head=root.getElementsByTagName("head")[0],resources={load_js:function(scripts){var urls=infrae.utils.map_concat(scripts,data.js.validate);return urls.length?$.when.apply($,infrae.utils.map(urls,function(url){var script_tag=root.createElement("script"),promise=$.Deferred();return script_tag.async="async",script_tag.type="text/javascript",script_tag.readyState?script_tag.onreadystatechange=functi
on(){("loaded"==script_tag.readyState||"complete"==script_tag.readyState)&&(script_tag.onreadystatechange=null,promise.resolve())}:script_tag.onload=function(){promise.resolve()},script_tag.
src=url,head.appendChild(script_tag),data.js.register(url),promise})):$.Deferred().resolve()},load_css:function(csses){var urls=infrae.utils.map_concat(csses,data.css.validate);return urls.length?$.when.apply($,infrae.utils.map(urls,function(url){var link_tag=root.createElement("link");return link_tag.rel="stylesheet",link_tag.type="text/css",link_tag.href=url,head.appendChild(link_tag),data.css.register(url),$.Deferred().resolve()})):$.Deferred().resolve()}};return $document.ready(function(){$("script").each(function(){var src=$(this).attr("src");void 0!=src&&data.js.register(src)}),$("link").each(function(){var $link=$(this);if("stylesheet"==$link.attr("rel")&&"text/css"==$link.attr("type")){var src=$link.attr("href");void 0!=src&&data.css.register(src)}})}),resources}},template_cache={
},View=function($content,data,factory,args,reject){var view={$content:$content,data:data};$.extend(view,factory.apply($content,args));var render=function(template){view.template_append||($co
ntent.triggerHandler("cleanup-infrae-views"),(view.cleanup||view.iframe)&&$content.one("cleanup-infrae-views",function(){view.cleanup&&view.cleanup(),view.iframe&&($(window).unbind("resize.infrae-views-iframe"),$(window).unbind("workspace-resize-smi.infrae-views-iframe"),$content.removeClass("iframe-view"))}));var deferred=$.Deferred(),$context=$content,resolve=function(){void 0!=reject?deferred.rejectWith(view,reject):deferred.resolveWith(view)},finalizer=function(){var done=null;return void 0!=view.render&&(done=view.render($context),done&&done.promise)?(done.promise().done(resolve),void 0):(resolve(),void 0)};if(view.iframe){if(view.template_append)throw{message:"Cannot use iframe and template_append together"};var $iframe=$('<iframe src="">');view.$iframe=$iframe;var resize=function()
{var height=$content.innerHeight(),width=$content.innerWidth();view.resize_iframe&&view.resize_iframe(width,height)||($iframe.height(height),$iframe.width(width))};resize(),$(window).bind("r
esize.infrae-views-iframe",resize),$(window).bind("workspace-resize-smi.infrae-views-iframe",resize),$content.addClass("iframe-view"),$content.html($iframe);var iframe_window=$iframe.get(0).contentWindow,iframe_document=iframe_window.document;if(view.$window=$(iframe_window),view.$document=$(iframe_document),void 0!==template){view.ready=$.Deferred();var loader=function(){view.ready.resolve(view)};0>template.indexOf("<html")&&0>template.indexOf("<HTML")&&(template="<html><body>"+template+"</body></html>"),iframe_document.write(template),iframe_document.close(),"complete"==iframe_document.readyState?loader():iframe_window.addEventListener?iframe_window.addEventListener("load",loader,!1):iframe_window.attachEvent("onload",loader)}}else void 0!==template&&(view.template_append?($context=$(te
mplate),$content.append($context)):$content.html(template));return finalizer(),deferred.promise()};return function(){var template=void 0,jsont_url=view.template_data&&data.jsont_url||view.js
ont_url;if(jsont_url)return view.template_nocache||(template=template_cache[jsont_url],void 0===template)?$.ajax({type:"GET",url:jsont_url}).then(function(payload){var template=new jsontemplate.Template(payload,{});return template_cache[jsont_url]=template,render(template.expand(data))}):render(template.expand(view));var html_url=view.template_data&&data.html_url||view.html_url;if(html_url)return view.template_nocache||(template=template_cache[html_url],void 0===template)?$.ajax({type:"GET",url:html_url}).then(function(payload){return template_cache[html_url]=payload,render(payload)}):render(template);var jsont=view.template_data&&data.jsont||view.jsont;if(void 0!==jsont)return template=template_cache[jsont],void 0===template&&(template=new jsontemplate.Template(jsont,{}),template_cache[j
sont]=template),render(template.expand(view));var html=view.template_data&&data.html||view.html;return void 0!==html?render(html):render()}};$.extend(module,{Registry:function(){var views={}
,count=0,render_best_view=function($content,data,options){var ifaces=options.ifaces||infrae.interfaces.implemented_by(data),named_views=views[options.name],to_render=null,args=[$content,data].concat(options.args),reject=options.reject;if(named_views)for(var i=0;ifaces.length>i;i++){var definitions=named_views[ifaces[i]];if(definitions&&definitions.length){to_render=View($content,data,definitions[0].factory,args,reject);break}}return null!=to_render?to_render():(window.console&&console.log&&console.log("failed view lookup for options",options,"and",data),$.Deferred().reject({status:604}))},render_all_views=function($content,data,options){var named_views=views[options.name];if(void 0==named_views)return[];var ifaces=options.ifaces||infrae.interfaces.implemented_by(data),seen_definitions=[],
to_render=[],args=[$content,data].concat(options.args),reject=options.reject;return infrae.utils.each(ifaces,function(iface){var definitions=named_views[iface];definitions&&infrae.utils.each
(definitions,function(definition){if(0>$.inArray(definition.__view_uid__,seen_definitions)){if(seen_definitions.push(definition.__view_uid__),void 0!=definition.available&&!definition.available.apply(definition,args))return;to_render.push([definition.order,View($content,data,definition.factory,args,reject)])}})}),to_render.sort(function(v1,v2){return v1[0]-v2[0]}),$.each(to_render,function(i,data){data[1]()}),null},render_url=function($content,url,options){return $.ajax({type:"GET",url:url,dataType:"json"}).then(function(data){return render_best_view($content,data,options)})},registry={register:function(definition){void 0==definition.name&&(definition.name="default"),void 0==definition.order&&(definition.order=0),definition.__view_uid__=""+count,count+=1;var add=function(definition,iface)
{views[definition.name]||(views[definition.name]={}),views[definition.name][iface]||(views[definition.name][iface]=[]),views[definition.name][iface].unshift(definition)};definition.ifaces?in
frae.utils.each(definition.ifaces,function(iface){add(definition,iface)}):add(definition,definition.iface||"object")},render:function($content,options){if(options.name||(options.name="default"),options.data)return render_best_view($content,options.data,options);if(options.every)return render_all_views($content,options.every,options);if(options.url)return render_url($content,options.url,options);throw{message:"Missing required options"}}};return registry}});var default_registry=module.Registry();$.extend(module,{view:function(definition){default_registry.register(definition)},render:function($content,options){return default_registry.render($content,options)}}),$.fn.render=function(options){return default_registry.render($(this),options)},infrae.views=module})(jQuery,infrae,jsontemplate);
\ No newline at end of file
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/smi.js
--- a/src/silva/ui/static/js/smi.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/smi.js Wed Sep 25 15:15:05 2013 +0200
@@ -195,12 +195,13 @@
// the callback up until the javascript are loaded.
if (payload.resources.js) {
delayed = delayed.then(function() {
- return $.when.apply(
- $, infrae.utils.map(payload.resources.js, resources.load_js));
+ return resources.load_js(payload.resources.js);
});
};
if (payload.resources.css) {
- infrae.utils.each(payload.resources.css, resources.load_css);
+ delayed = delayed.then(function() {
+ return resources.load_css(payload.resources.css);
+ });
};
};
for (name in plugins) {
diff -r 1cafdf86a301 -r bc43574ab5dc src/silva/ui/static/js/smi.min.js
--- a/src/silva/ui/static/js/smi.min.js Thu Sep 12 14:31:10 2013 +0200
+++ b/src/silva/ui/static/js/smi.min.js Wed Sep 25 15:15:05 2013 +0200
@@ -1,1 +1,1 @@
-(function($,infrae,jsontemplate){var HASH_REGEXP=/#([^!]*)!?(.*)/,Screen=function(default_screen){var api={ifaces:["redirect"],path:"",screen:"",default_screen:function(){var current_default=Screen(default_screen);return current_default.path=api.path,current_default.screen=default_screen,current_default},is_default_screen:function(){return api.screen===default_screen},copy:function(other){api.path=other.path,api.screen=other.screen},equal:function(other){return api.path==other.path&&api.screen==other.screen},open:function(new_path,new_screen){new_path||(new_path=api.path),new_screen||(new_screen=api.screen),document.location.hash=new_screen+"!"+new_path},read:function(hash){var parts=HASH_REGEXP.exec(hash);parts?(api.screen=parts[1],api.path=parts[2]):(api.screen="",api.path=""),api.scree
n.length||(api.screen=default_screen)}};return api};$.fn.SMI=function(options){var smi={objection:null,ready:infrae.deferred.SemaphoreCallbacks(),options:options,opened:Screen("content"),ope
ning:Screen("content"),shortcuts:infrae.keyboard.ShortcutManager(document)},$workspace=$(options.workspace.selector),$workspace_header=$workspace.children(".header"),$workspace_content=$workspace.children(".content");infrae.ui.selection.disable($workspace_header.children(".metadata")),options.theme&&options.theme.background&&$("html").css("background-color",options.theme.background);var name,screen_url=new jsontemplate.Template(options.screen,{}),action_url=new jsontemplate.Template(options.action,{}),content_url=new jsontemplate.Template(options.workspace.url,{}),plugins={},resources=infrae.views.HTMLResourceManager($(document)),default_error_handlers={};for(name in infrae.smi.plugins)plugins[name]=infrae.smi.plugins[name](smi,options);infrae.views.view({iface:"screen",factory:function($
content,data,smi){return{render:function(){$workspace_content.render({data:data.screen,name:"content",args:[smi]}).done(function(){void 0!==data.metadata&&$workspace_header.render({data:data
.metadata,name:"header",args:[smi,content_url,this]})})}}}}),$.extend(smi,{clipboard:infrae.smi.ClipBoardManager(plugins.notifications),get_language:function(){var lang=$("html").attr("lang");return lang||(lang="en"),lang},get_screen_url:function(screen){return screen||(screen=smi.opened),screen_url.expand(screen)},open_screen:function(path,screen){smi.opened.open(path,screen)},open_screen_from_link:function(link){var path=link.attr("href");path&&"#"!=path||(path=smi.opened.path),smi.open_screen(path,link.attr("rel"))}}),$(document).delegate("a.open-screen","click",function(){return smi.open_screen_from_link($(this)),!1}),$.extend(smi,{ajax:{query:function(url,data,error_handlers){var query={};return query.url=url,query.dataType="json",data&&(query.type="POST",query.data=data),$.ajax(quer
y).then(function(payload){var name,delayed=$.Deferred().resolve(),result=$.Deferred();void 0!=payload.resources&&(payload.resources.js&&(delayed=delayed.then(function(){return $.when.apply($
,infrae.utils.map(payload.resources.js,resources.load_js))})),payload.resources.css&&infrae.utils.each(payload.resources.css,resources.load_css));for(name in plugins)void 0!==plugins[name].page&&plugins[name].page(payload);return delayed.done(function(){result.resolve(payload.content)}),result},function(request){if(!smi.options.testing){void 0===error_handlers&&(error_handlers=default_error_handlers);var handler=error_handlers[request.status];void 0===handler&&(handler=error_handlers[500]);var result_handler=handler(request);if(result_handler)return void 0!==result_handler.promise?result_handler:$(document).render({data:result_handler,args:[smi],reject:[request]})}return $.Deferred().reject(request)})},vote:function(callback){if(!smi.objection)return callback();var deferred=smi.objection(
);return deferred||(deferred=$.Deferred(),deferred.resolve()),deferred.done(function(){smi.objection=null}),deferred.then(callback,function(){return $.Deferred(function(deferred){deferred.re
ject({status:417})})})},lock:function(callback){return smi.ready.use(),callback().then(function(){return smi.ready.release(200),{}},function(request){return smi.ready.release(request.status),{}})},create_error_handlers:function(custom_handlers,parent_handlers){var default_handler,code,handlers={};void 0===parent_handlers&&(parent_handlers=default_error_handlers);for(code in parent_handlers)handlers[code]=parent_handlers[code];for(code in custom_handlers)default_handler=parent_handlers[code],void 0===default_handler&&(default_handler=parent_handlers[500]),handlers[code]=custom_handlers[code](default_handler);return handlers},send_to_opened:function(data,error_handlers){return smi.ajax.lock(function(){return smi.ajax.vote(function(){return smi.ajax.query(smi.get_screen_url(smi.opening),data
,error_handlers).then(function(payload){return smi.opened.copy(smi.opening),$(document).render({data:payload,args:[smi]})})}).then(null,function(request){return smi.opening.equal(smi.opened)
||(smi.opening.copy(smi.opened),smi.opening.open()),request})})}},open_action_from_link:function(link){return smi.ajax.lock(function(){return smi.ajax.vote(function(){var action=link.attr("rel"),path=link.attr("href");return path||(path=smi.opened.path),smi.ajax.query(action_url.expand({path:path,action:action}),{path:smi.opened.path,screen:smi.opened.screen}).then(function(payload){return $(document).render({data:payload,args:[smi]})})})})}}),default_error_handlers=function(){var ajax_handler=function(default_handler){return function(request){try{var name,payload=$.parseJSON(request.responseText);for(name in plugins)void 0!==plugins[name].error&&plugins[name].error(payload);return payload.content}catch(e){return default_handler(request)}}};return smi.ajax.create_error_handlers({400:ajax_
handler,401:ajax_handler},options.error_messages)}(),$(document).delegate("a.open-action","click",function(){return smi.open_action_from_link($(this)),!1}),$(document).delegate("a.text-overl
ay","click",function(){return smi.ajax.query($(this).attr("href")).then(function(payload){return $(document).render({data:payload,args:[smi]})}),!1}),$(document).trigger("load-smiplugins",smi);var read_hash=function(hash){var error_handlers=smi.ajax.create_error_handlers({404:function(default_handler){return function(request){return smi.opening.is_default_screen()?default_handler(request):$.Deferred().resolve(smi.opening.default_screen())}}});return read_hash=function(hash){smi.opening.read(hash),smi.opening.equal(smi.opened)||smi.ajax.send_to_opened(void 0,error_handlers)},read_hash(hash)};return $(window).hashchange(function(event,data){read_hash(data.after)}),read_hash(document.location.hash),smi},infrae.smi={plugins:{}}})(jQuery,infrae,jsontemplate);
\ No newline at end of file
+(function($,infrae,jsontemplate){var HASH_REGEXP=/#([^!]*)!?(.*)/,Screen=function(default_screen){var api={ifaces:["redirect"],path:"",screen:"",default_screen:function(){var current_default=Screen(default_screen);return current_default.path=api.path,current_default.screen=default_screen,current_default},is_default_screen:function(){return api.screen===default_screen},copy:function(other){api.path=other.path,api.screen=other.screen},equal:function(other){return api.path==other.path&&api.screen==other.screen},open:function(new_path,new_screen){new_path||(new_path=api.path),new_screen||(new_screen=api.screen),document.location.hash=new_screen+"!"+new_path},read:function(hash){var parts=HASH_REGEXP.exec(hash);parts?(api.screen=parts[1],api.path=parts[2]):(api.screen="",api.path=""),api.scree
n.length||(api.screen=default_screen)}};return api};$.fn.SMI=function(options){var smi={objection:null,ready:infrae.deferred.SemaphoreCallbacks(),options:options,opened:Screen("content"),ope
ning:Screen("content"),shortcuts:infrae.keyboard.ShortcutManager(document)},$workspace=$(options.workspace.selector),$workspace_header=$workspace.children(".header"),$workspace_content=$workspace.children(".content");infrae.ui.selection.disable($workspace_header.children(".metadata")),options.theme&&options.theme.background&&$("html").css("background-color",options.theme.background);var name,screen_url=new jsontemplate.Template(options.screen,{}),action_url=new jsontemplate.Template(options.action,{}),content_url=new jsontemplate.Template(options.workspace.url,{}),plugins={},resources=infrae.views.HTMLResourceManager($(document)),default_error_handlers={};for(name in infrae.smi.plugins)plugins[name]=infrae.smi.plugins[name](smi,options);infrae.views.view({iface:"screen",factory:function($
content,data,smi){return{render:function(){$workspace_content.render({data:data.screen,name:"content",args:[smi]}).done(function(){void 0!==data.metadata&&$workspace_header.render({data:data
.metadata,name:"header",args:[smi,content_url,this]})})}}}}),$.extend(smi,{clipboard:infrae.smi.ClipBoardManager(plugins.notifications),get_language:function(){var lang=$("html").attr("lang");return lang||(lang="en"),lang},get_screen_url:function(screen){return screen||(screen=smi.opened),screen_url.expand(screen)},open_screen:function(path,screen){smi.opened.open(path,screen)},open_screen_from_link:function(link){var path=link.attr("href");path&&"#"!=path||(path=smi.opened.path),smi.open_screen(path,link.attr("rel"))}}),$(document).delegate("a.open-screen","click",function(){return smi.open_screen_from_link($(this)),!1}),$.extend(smi,{ajax:{query:function(url,data,error_handlers){var query={};return query.url=url,query.dataType="json",data&&(query.type="POST",query.data=data),$.ajax(quer
y).then(function(payload){var name,delayed=$.Deferred().resolve(),result=$.Deferred();void 0!=payload.resources&&(payload.resources.js&&(delayed=delayed.then(function(){return resources.load
_js(payload.resources.js)})),payload.resources.css&&(delayed=delayed.then(function(){return resources.load_css(payload.resources.css)})));for(name in plugins)void 0!==plugins[name].page&&plugins[name].page(payload);return delayed.done(function(){result.resolve(payload.content)}),result},function(request){if(!smi.options.testing){void 0===error_handlers&&(error_handlers=default_error_handlers);var handler=error_handlers[request.status];void 0===handler&&(handler=error_handlers[500]);var result_handler=handler(request);if(result_handler)return void 0!==result_handler.promise?result_handler:$(document).render({data:result_handler,args:[smi],reject:[request]})}return $.Deferred().reject(request)})},vote:function(callback){if(!smi.objection)return callback();var deferred=smi.objection();return
deferred||(deferred=$.Deferred(),deferred.resolve()),deferred.done(function(){smi.objection=null}),deferred.then(callback,function(){return $.Deferred(function(deferred){deferred.reject({st
atus:417})})})},lock:function(callback){return smi.ready.use(),callback().then(function(){return smi.ready.release(200),{}},function(request){return smi.ready.release(request.status),{}})},create_error_handlers:function(custom_handlers,parent_handlers){var default_handler,code,handlers={};void 0===parent_handlers&&(parent_handlers=default_error_handlers);for(code in parent_handlers)handlers[code]=parent_handlers[code];for(code in custom_handlers)default_handler=parent_handlers[code],void 0===default_handler&&(default_handler=parent_handlers[500]),handlers[code]=custom_handlers[code](default_handler);return handlers},send_to_opened:function(data,error_handlers){return smi.ajax.lock(function(){return smi.ajax.vote(function(){return smi.ajax.query(smi.get_screen_url(smi.opening),data,error_h
andlers).then(function(payload){return smi.opened.copy(smi.opening),$(document).render({data:payload,args:[smi]})})}).then(null,function(request){return smi.opening.equal(smi.opened)||(smi.o
pening.copy(smi.opened),smi.opening.open()),request})})}},open_action_from_link:function(link){return smi.ajax.lock(function(){return smi.ajax.vote(function(){var action=link.attr("rel"),path=link.attr("href");return path||(path=smi.opened.path),smi.ajax.query(action_url.expand({path:path,action:action}),{path:smi.opened.path,screen:smi.opened.screen}).then(function(payload){return $(document).render({data:payload,args:[smi]})})})})}}),default_error_handlers=function(){var ajax_handler=function(default_handler){return function(request){try{var name,payload=$.parseJSON(request.responseText);for(name in plugins)void 0!==plugins[name].error&&plugins[name].error(payload);return payload.content}catch(e){return default_handler(request)}}};return smi.ajax.create_error_handlers({400:ajax_handler,
401:ajax_handler},options.error_messages)}(),$(document).delegate("a.open-action","click",function(){return smi.open_action_from_link($(this)),!1}),$(document).delegate("a.text-overlay","cli
ck",function(){return smi.ajax.query($(this).attr("href")).then(function(payload){return $(document).render({data:payload,args:[smi]})}),!1}),$(document).trigger("load-smiplugins",smi);var read_hash=function(hash){var error_handlers=smi.ajax.create_error_handlers({404:function(default_handler){return function(request){return smi.opening.is_default_screen()?default_handler(request):$.Deferred().resolve(smi.opening.default_screen())}}});return read_hash=function(hash){smi.opening.read(hash),smi.opening.equal(smi.opened)||smi.ajax.send_to_opened(void 0,error_handlers)},read_hash(hash)};return $(window).hashchange(function(event,data){read_hash(data.after)}),read_hash(document.location.hash),smi},infrae.smi={plugins:{}}})(jQuery,infrae,jsontemplate);
\ No newline at end of file