From: Thierry Parmentelat Date: Tue, 19 Mar 2013 14:36:58 +0000 (+0100) Subject: fewer js source files : manifold.js holds the global manifold object (that maps uuids... X-Git-Tag: myslice-django-0.1-2~73 X-Git-Url: http://git.onelab.eu/?p=unfold.git;a=commitdiff_plain;h=45ea2e7ea4d6240f723cf743b9ad493ad70ceed2 fewer js source files : manifold.js holds the global manifold object (that maps uuids to queries), as well as async and pubsub stuff --- diff --git a/manifold/js/manifold-async.js b/manifold/js/manifold-async.js deleted file mode 100644 index c33185d1..00000000 --- a/manifold/js/manifold-async.js +++ /dev/null @@ -1,174 +0,0 @@ -manifold_async_debug=true; - -// Helper functions for asynchronous requests - -var api_url = '/manifold/api/json/' - -// Executes all async. queries -// input queries are specified as a list of {'query_uuid': , 'id': } -function manifold_async_exec(queries) { - if (manifold_async_debug) console.log('manifold_async_exec length='+ queries.length); - // start spinners - jQuery('.need-spin').spin(); - - // We use js function closure to be able to pass the query (array) to the - // callback function used when data is received - var manifold_async_success_closure = function(query, id) { - return function(data, textStatus) {manifold_async_success(data, query, id);}}; - - // Loop through query array and use ajax to send back queries (to frontend) with json - jQuery.each(queries, function(index, tuple) { - var query=manifold.find_query(tuple.query_uuid); - var hash=query.to_hash(); - if (manifold_async_debug) console.log ("sending POST on " + api_url + " iterating on " + tuple.query_uuid + " -> " + hash); - jQuery.post(api_url, {'query': hash}, manifold_async_success_closure(query, tuple.id)); - }) -} - -function manifold_async_success(data, query, id) { - if (data) { - - if (!!id) { - /* Directly inform the requestor */ - jQuery('#' + id).trigger('results', [data]); - } else { - /* Publish an update announce */ - jQuery.publish("/results/" + query.query_uuid + "/changed", [data, query]); - } - - // Is there a linked query ? - //if ((query.done == 'now') && (query.ts == 'latest')) { - // var new_query = [query_json.replace("latest", "now")]; - // manifold_async_exec(new_query); - //} - } -} - -/* not used -function manifold_async_error(str) { - var out = '

Error

Notice
  • ' + jQuery('
    ').text(str).html() + '
'; - jQuery('#manifold_message').html(out); - //onObjectAvailable('Spinners', function(){ Spinners.get('.loading').remove(); }, this, true); - jQuery('.need-spin').spin(false); -} -*/ - -/* what the hell is this doing here ? -function apply_format(key, value, type, method) { - // type = type, key = - var link = { - 'platform': {'_all': 'platforms'}, - 'src_hostname': {'traceroute': 'agents', '_other': 'hostname'}, - 'dst_hostname': {'traceroute': 'agents', '_other': 'hostname'}, - 'src_ip': {'traceroute': 'agents', '_other': 'ip'}, - 'dst_ip': {'traceroute': 'agents', '_other': 'ip'}, - 'as_name': {'_all': 'as'}, - 'asn': {'_all': 'as'}, - 'city': {'_all': 'cities'}, - 'continent': {'_all': 'continents'}, - 'continent_code': {'_all': 'continents'}, - 'country': {'_all': 'countries'}, - 'country_code': {'_all': 'countries'}, - 'hostname': {'agents': 'agents', 'nodes': 'node', '_other': 'hostname'}, - 'ip': {'agents': 'agents', '_other': 'ip'}, - 'network_hrn': {'_all': 'network'}, - 'region': {'_all': 'regions'}, - 'region_code': {'_all': 'regions'}, - 'slice_hrn': {'_all': 'slice'}, - }; - if (link[type]) { - // creates problems sorting ? - if (link[type]['_all']) { - var urlpart = link[type]['_all']; - } else { - if (link[type][method]) { - var urlpart = link[type][method]; - } else { - if (link[type]['_other']) { - var urlpart = link[type]['_other']; - } else { - return key; - } - } - } - return '' + value + ''; - } else { - return key; - } -} -*/ - -function manifold_html_a(key, value, type) { - if (type == 'network_hrn') { - return "" + value + ''; - } else if (type == 'slice_hrn') { - return "" + value + ''; - } else { - - } -} - -function manifold_html_li(type, value, is_cached) { - var cached = ''; - if (is_cached) - cached='
Cached information from the database
Timestamp: XX/XX/XX XX:XX:XX

Refresh in progress...
'; - if (type == 'slice_hrn') { - return "
  • " + value + cached + "
  • "; - } else if (type == 'network_hrn') { - return "
  • " + value + cached + "
  • "; - } else { - return "
  • " + value + "
  • "; - } -} - - -function manifold_html_ul(data, key, value, type, method, is_cached) { - var out = "
      "; - for (var i = 0; i < data.length; i++) { - out += manifold_html_li(key, apply_format(data[i][key], data[i][value], key, method), is_cached); - //out += manifold_html_li(key, manifold_html_a(data[i][key], data[i][value], key), is_cached); - } - out += "
    "; - - return out; -} - -function manifold_update_template(data) -{ - jQuery.each(data, function(key, value) { - if ((typeof value == 'string') || (typeof value == 'number') || (typeof value == 'boolean')) { - // Simple field - jQuery('#manifold__' + key).html(value); - } else if (value == null) { - jQuery('#manifold__' + key).html("N/A"); - } else { - manifold_update_table('#manifold__' + key, value); - } - }); -} - -//http://stackoverflow.com/questions/5100539/django-csrf-check-failing-with-an-ajax-post-request -//make sure to expose csrf in our outcoming ajax/post requests -$.ajaxSetup({ - beforeSend: function(xhr, settings) { - function getCookie(name) { - var cookieValue = null; - if (document.cookie && document.cookie != '') { - var cookies = document.cookie.split(';'); - for (var i = 0; i < cookies.length; i++) { - var cookie = jQuery.trim(cookies[i]); - // Does this cookie string begin with the name we want? - if (cookie.substring(0, name.length + 1) == (name + '=')) { - cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); - break; - } - } - } - return cookieValue; - } - if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { - // Only send the token to relative URLs i.e. locally. - xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); - } - } -}); diff --git a/manifold/js/manifold-pubsub.js b/manifold/js/manifold-pubsub.js deleted file mode 100644 index 54dba525..00000000 --- a/manifold/js/manifold-pubsub.js +++ /dev/null @@ -1,115 +0,0 @@ -/* getting random error messages with this... -- jordan - wait until query code is fixed -jQuery(document).ready(function() { - // ajax default settings - jQuery.ajaxSetup({ - timeout: 3000, - error:function(x,e){ - if('parsererror'==e) { - alert('Sorry, we ran into a technical problem (parse error). Please try again...'); - } else if('timeout'==e) { - alert('Request timed out. Please try again...'); - } - else if ( "status" in x ) { - if(0 == x.status){ - alert('You are offline! Please check your network.'); - }else if (404 == x.status){ - alert('Sorry, we ran into a technical problem (404). Please try again...'); - }else if(500 == x.status){ - alert('Sorry, we ran into a technical problem (500). Please try again...'); - } - } - else { - alert('Sorry, we ran into a technical problem (unknown error). Please try again...'); - } - } - }); -}); -*/ - -function get_value(value) { - //if(typeof(jQuery(value).attr('value'))!="undefined"){ - if (/.*<\/span>/i.test(value)) { - return jQuery(value).attr('value'); - } else { - return value; - } -} - -/* -From: http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-a-javascript-object - I want to note that the .clone() method in jQuery only clones DOM elements. In order to clone JavaScript objects, you would do: - - // Shallow copy - var newObject = jQuery.extend({}, oldObject); - - // Deep copy - var newObject = jQuery.extend(true, {}, oldObject); - - More information can be found in the jQuery documentation -*/ -function clone_object(obj) { - return jQuery.extend(true, {}, obj); -} - -/* https://gist.github.com/661855 */ -(function($) { - - var o = $({}); - - $.subscribe = function( types, selector, data, fn) { - /* borrowed from jQuery */ - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - /* */ - - /* We use an indirection function that will clone the object passed in - * parameter to the subscribe callback - * - * FIXME currently we only clone query objects which are the only ones - * supported and editable, we might have the same issue with results but - * the page load time will be severely affected... - */ - o.on.apply(o, [types, selector, data, function() { - for(i = 1; i < arguments.length; i++) { - if ( arguments[i].constructor.name == 'Query' ) - arguments[i] = arguments[i].clone(); - } - fn.apply(o, arguments); - }]); - }; - - $.unsubscribe = function() { - o.off.apply(o, arguments); - }; - - $.publish = function() { - o.trigger.apply(o, arguments); - }; - -}(jQuery)); - - -//function executeFunctionByName(functionName, context /*, args */) { -// var args = Array.prototype.slice.call(arguments).splice(2); -// var namespaces = functionName.split("."); -// var func = namespaces.pop(); -// for(var i = 0; i < namespaces.length; i++) { -// context = context[namespaces[i]]; -// } -// return context[func].apply(this, args); -//} diff --git a/manifold/js/manifold-queries.js b/manifold/js/manifold-queries.js deleted file mode 100644 index 1e2fc629..00000000 --- a/manifold/js/manifold-queries.js +++ /dev/null @@ -1,27 +0,0 @@ -function debug_dict (msg, o) { - var keys=[]; - for (var k in o) keys.push(k); - console.log ("debug_dict: " + msg + " Keys : " + keys); -} -function debug_value (msg, value) { - console.log ("debug_value: " + msg + " " + value); -} - -/* manage a set of queries indexed by their id */ -/* next move will be to insert all the manifold functions in this namespace */ -/* xxx add error management */ -var manifold = { - all_queries: {}, - insert_query : function (query) { - manifold.all_queries[query.query_uuid]=query; - }, - find_query : function (query_uuid) { - return manifold.all_queries[query_uuid]; - }, - debug_all_queries : function (msg) { - for (var query_uuid in manifold.all_queries) { - console.log("manifold.debug " + msg + " " + query_uuid + " -> " + manifold.all_queries[query_uuid]); - } - }, -} - diff --git a/manifold/js/manifold.js b/manifold/js/manifold.js new file mode 100644 index 00000000..3589d7ea --- /dev/null +++ b/manifold/js/manifold.js @@ -0,0 +1,150 @@ +// utilities +function debug_dict (msg, o) { + var keys=[]; + for (var k in o) keys.push(k); + console.log ("debug_dict: " + msg + " Keys : " + keys); +} +function debug_value (msg, value) { + console.log ("debug_value: " + msg + " " + value); +} + +/* ------------------------------------------------------------ */ +// this namespace holds functions for globally managing query objects +var manifold = { + + all_queries: {}, + + insert_query : function (query) { + manifold.all_queries[query.query_uuid]=query; + }, + find_query : function (query_uuid) { + return manifold.all_queries[query_uuid]; + }, + debug_all_queries : function (msg) { + for (var query_uuid in manifold.all_queries) { + console.log("manifold.debug " + msg + " " + query_uuid + " -> " + manifold.all_queries[query_uuid]); + } + }, + + // trigger a query asynchroneously + proxy_url : '/manifold/proxy/json/', + + asynchroneous_debug : true, + + // Executes all async. queries + // input queries are specified as a list of {'query_uuid': , 'id': } + asynchroneous_exec : function (query_uuid_domids) { + // start spinners + jQuery('.need-spin').spin(); + + // We use js function closure to be able to pass the query (array) to the + // callback function used when data is received + var success_closure = function(query, id) { + return function(data, textStatus) {manifold.asynchroneous_success(data, query, id);}}; + + // Loop through query array and use ajax to send back query_uuid_domids (to frontend) with json + jQuery.each(query_uuid_domids, function(index, tuple) { + var query=manifold.find_query(tuple.query_uuid); + var hash=query.to_hash(); + if (manifold.asynchroneous_debug) + console.log ("sending POST on " + manifold.proxy_url + " iterating on " + tuple.query_uuid + " -> " + hash); + jQuery.post(manifold.proxy_url, {'query': hash}, success_closure(query, tuple.id)); + }) + }, + + asynchroneous_success : function (data, query, id) { + if (data) { + if (!!id) { + /* Directly inform the requestor */ + jQuery('#' + id).trigger('results', [data]); + } else { + /* Publish an update announce */ + jQuery.publish("/results/" + query.query_uuid + "/changed", [data, query]); + } + + } + }, + +}; // manifold object +/* ------------------------------------------------------------ */ + +// extend jQuery/$ with pubsub capabilities +/* https://gist.github.com/661855 */ +(function($) { + + var o = $({}); + + $.subscribe = function( types, selector, data, fn) { + /* borrowed from jQuery */ + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + /* */ + + /* We use an indirection function that will clone the object passed in + * parameter to the subscribe callback + * + * FIXME currently we only clone query objects which are the only ones + * supported and editable, we might have the same issue with results but + * the page load time will be severely affected... + */ + o.on.apply(o, [types, selector, data, function() { + for(i = 1; i < arguments.length; i++) { + if ( arguments[i].constructor.name == 'Query' ) + arguments[i] = arguments[i].clone(); + } + fn.apply(o, arguments); + }]); + }; + + $.unsubscribe = function() { + o.off.apply(o, arguments); + }; + + $.publish = function() { + o.trigger.apply(o, arguments); + }; + +}(jQuery)); + +/* ------------------------------------------------------------ */ + +//http://stackoverflow.com/questions/5100539/django-csrf-check-failing-with-an-ajax-post-request +//make sure to expose csrf in our outcoming ajax/post requests +$.ajaxSetup({ + beforeSend: function(xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { + // Only send the token to relative URLs i.e. locally. + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } + } +}); + diff --git a/plugins/lists/simplelist.py b/plugins/lists/simplelist.py index a5fc685c..75c35966 100644 --- a/plugins/lists/simplelist.py +++ b/plugins/lists/simplelist.py @@ -20,13 +20,14 @@ class SimpleList (Plugin) : return env def requirements (self): - reqs = { 'js_files' : [ "js/simplelist.js", "js/plugin.js", "js/manifold-query.js", "js/onavail.js", - "js/manifold-pubsub.js", "js/manifold-async.js", "js/manifold-queries.js", - "js/spin.presets.js", "js/spin.min.js", "js/jquery.spin.js", - "js/myslice.js", - ] , - 'css_files': [ "css/simplelist.css" ], - } + reqs = { + 'js_files' : [ "js/simplelist.js", "js/plugin.js", + "js/manifold.js", "js/manifold-query.js", + "js/spin.presets.js", "js/spin.min.js", "js/jquery.spin.js", + "js/myslice.js", + ] , + 'css_files': [ "css/simplelist.css" ], + } if self.with_datatables: reqs['js_files'].append ("js/dataTables.js") reqs['js_files'].append ("js/with-datatables.js") diff --git a/plugins/querycode/querycode.py b/plugins/querycode/querycode.py index 87dc4c65..4a6e6b2b 100644 --- a/plugins/querycode/querycode.py +++ b/plugins/querycode/querycode.py @@ -13,8 +13,8 @@ class QueryCode (Plugin): def requirements (self): return { - 'js_files' : [ "js/querycode.js", "js/plugin.js", "js/manifold-query.js", "js/onavail.js", - "js/manifold-pubsub.js", "js/manifold-async.js", + 'js_files' : [ "js/querycode.js", "js/plugin.js", + "js/manifold.js", "js/manifold-query.js", "js/spin.presets.js", "js/spin.min.js", "js/jquery.spin.js", # Plugins::add_js('/QueryCode/beautyofcode/scripts/shCore.js'); diff --git a/unfold/js/onavail.js b/unfold/js/onavail.js deleted file mode 100644 index 6740503d..00000000 --- a/unfold/js/onavail.js +++ /dev/null @@ -1,18 +0,0 @@ -onavail_debug=false; - -function onFunctionAvailable(sMethod, oCallback, oObject, bScope) { - if (eval('typeof ' + sMethod) == 'function') { - if (onavail_debug) console.log("onFunctionAvailable, running"); - bScope ? oCallback.call(oObject) : oCallback(oObject); - } else { - if (onavail_debug) console.log("onFunctionAvailable, delaying for 50 ms"); - setTimeout(function () {onFunctionAvailable(sMethod, oCallback, oObject, bScope);}, 50); - } -} -function onObjectAvailable(sMethod, oCallback, oObject, bScope) { - if (eval('typeof ' + sMethod) == 'object') { - bScope ? oCallback.call(oObject) : oCallback(oObject); - } else { - setTimeout(function () {onObjectAvailable(sMethod, oCallback, oObject, bScope);}, 50); - } -} diff --git a/unfold/page.py b/unfold/page.py index d0c97271..157e0046 100644 --- a/unfold/page.py +++ b/unfold/page.py @@ -47,7 +47,7 @@ class Page: self._queries = set() self._queue = [] - # the js async methods (see manifold_async_success) + # the js async methods (see manifold.asynchroneous_success) # offer the option to deliver the result to a specific DOM elt # otherwise (i.e. if domid not provided) # it goes through the pubsub using query's uuid