From b6440c94e0213514fee41d0906645f7657ba881f Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Thu, 7 Mar 2013 15:05:26 +0100 Subject: [PATCH] pour manifold-async.js in the mix --- engine/static/js/manifold-async.js | 237 +++++++++++++++++++++++++++++ plugins/simplelist.py | 4 +- 2 files changed, 239 insertions(+), 2 deletions(-) create mode 100644 engine/static/js/manifold-async.js diff --git a/engine/static/js/manifold-async.js b/engine/static/js/manifold-async.js new file mode 100644 index 00000000..83a97a72 --- /dev/null +++ b/engine/static/js/manifold-async.js @@ -0,0 +1,237 @@ +// Helper functions for asynchronous requests + +var api_url = '/manifold/api/json/' +var api_render_url = '/manifold/render/json' + +function manifold_array_size(obj) { + var size = 0, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) size++; + } + return size; +}; + +// Executes all async. queries contained in manifold_async_query_array, which is +// an array of hash (action, method, ts, filter, fields) +// +function manifold_async_exec(arr) +{ + + // start spinners + //onObjectAvailable('Spinners', function(){ Spinners.create('.loading').play(); }, this, true); + jQuery('.loading').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_wrapper = function(query, id) { + return function(data, textStatus) { + manifold_async_success(data, query, id); + }; + }; + + // Loop through query array and issue XML/RPC queries + jQuery.each(arr, function(index, elt) { + // we do rendering by default + jQuery.post(api_url, {'query': elt.query.to_hash()}, manifold_async_success_wrapper(elt.query, elt.id)); + }) +} + +function manifold_async_exec_render(arr) +{ + + // start spinners + //onObjectAvailable('Spinners', function(){ Spinners.create('.loading').play(); }, this, true); + jQuery('.loading').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_wrapper = function(query, id) { + return function(data, textStatus) { + manifold_async_success(data, query, id); + }; + }; + + // Loop through query array and issue XML/RPC queries + jQuery.each(arr, function(index, elt) { + // we do rendering by default + jQuery.post(api_render_url, {'query': elt.query.to_hash()}, manifold_async_success_wrapper(elt.query, elt.id)); + }) +} + +function manifold_async_render(data, query) +{ + // 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_render_success_wrapper = function(query) { + return function(data, textStatus) { + manifold_async_render_success(data, query); + }; + }; + + jQuery.post(api_render_url, {'data': data, 'query': query.to_hash()}, manifold_async_render_success_wrapper(data, query)); +} + +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('.loading').spin(); +} + +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 = ""; + + return out; +} + +function manifold_async_render_list(data, method, is_cached) { + // we suppose we only have one column, or we need more precisions + var col = []; + if (manifold_array_size(data[0]) == 1) { + for (var k in data[0]) { + key = k; + value = k; + } + } else { + for (var k in data[0]) { + if (k.substr(-4) == '_hrn') { + key = k; + } else { + value = k; + } + } + } + var out = manifold_html_ul(data, key, value, key, method, is_cached); + var element = '#manifold__list__' + key + '__' + value; + jQuery(element).html(out); + // FIXME spinners + //onObjectAvailable('Spinners', function(){ Spinners.get(element).remove(); }, this, true); + jQuery('.loading').spin(); +} + + + +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); + } + }); +} + +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.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); + //} + } +} + +function __old__manifold_async_render_success(data, query) { + if (data) { + + // We loop through all the fields to update the corresponding + // locations in the page + if (typeof(data[0].error) != 'undefined') { + manifold_async_error(data[0].error); + } + + /* Publish an update announce */ + jQuery.publish("/rendering/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); + } + } +} diff --git a/plugins/simplelist.py b/plugins/simplelist.py index 431dce39..815170ec 100644 --- a/plugins/simplelist.py +++ b/plugins/simplelist.py @@ -14,8 +14,8 @@ class SimpleList (Plugin) : def template_file (self): return "simplelist.html" def requirements (self): - reqs = { 'js_files' : [ "js/plugin.js", "js/query.js", - "js/manifold-pubsub.js", "js/simplelist.js" ], + reqs = { 'js_files' : [ "js/simplelist.js", "js/plugin.js", "js/query.js", + "js/manifold-pubsub.js", "js/manifold-async.js", ] , 'css_files': [ "css/simplelist.css" ], } if self.with_datatables: -- 2.43.0