mirror of
https://github.com/ntop/ntopng.git
synced 2026-04-30 16:09:32 +00:00
168 lines
5 KiB
JavaScript
168 lines
5 KiB
JavaScript
// Wrapper function
|
|
function do_bubble_chart(contanerId,update_url,url_params,refresh) {
|
|
var bubble = new BubbleChart(contanerId,update_url,url_params);
|
|
if (refresh)
|
|
bubble.setInterval(setInterval(function(){bubble.update();}, refresh));
|
|
|
|
// Return new class instance, with
|
|
return bubble;
|
|
}
|
|
|
|
|
|
function BubbleChart(contanerId,update_url,url_params) {
|
|
|
|
// Add object properties like this
|
|
this.contanerId = contanerId;
|
|
this.update_url = update_url;
|
|
this.url_params = url_params;
|
|
this.bubbleInterval;
|
|
|
|
var rsp = create_bubble_chart(contanerId);
|
|
var margin = rsp[0];
|
|
var width = rsp[1];
|
|
var height = rsp[2];
|
|
var svg_bubble = rsp[3];
|
|
var bubble = rsp[4];
|
|
var color = rsp[5];
|
|
|
|
var node;
|
|
|
|
// to run each time data is generated
|
|
this.update = function () {
|
|
|
|
$.ajax({
|
|
type: 'GET',
|
|
url: this.update_url,
|
|
data: this.url_params,
|
|
success: function(content) {
|
|
update_bubble_chart(jQuery.parseJSON(content));
|
|
},
|
|
error: function(content) {
|
|
console.log("error");
|
|
}
|
|
});
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// STREAKER CONNECTION ////////////////////////////////////
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// Needed to draw the pie immediately
|
|
this.update();
|
|
|
|
// var updateInterval = window.setInterval(update, refresh);
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// UPDATE FUNCIONTS ///////////////////////////////////////
|
|
///////////////////////////////////////////////////////////
|
|
this.falshUpdate = function (start,end) {
|
|
svg_bubble.selectAll(".node").style("opacity", start)
|
|
.transition().duration(200).style("opacity", end);
|
|
}
|
|
|
|
function update_bubble_chart(data) {
|
|
// alert("update");
|
|
d3.select("#"+contanerId).selectAll(".node").remove();
|
|
|
|
var node = svg_bubble.selectAll(".node")
|
|
.data(bubble.nodes(classes(data))
|
|
.filter(function(d) { return !d.children; }))
|
|
.enter().append("g")
|
|
.attr("class", "node")
|
|
.attr("transform", function(d) { return "translate(" + ((height/2) + d.x - 70) + "," + ((width/2)- d.y + 50) + ")"; });
|
|
|
|
|
|
node.append("title")
|
|
.text(function(d) { return d.className + ": " + bytesToVolume(d.value) + "\n Double click to show more information about this flows."; });
|
|
|
|
node.append("circle")
|
|
.attr("r", function(d) { return (d.r); })
|
|
.style("fill", function(d) { return color(d.r+d.className); })
|
|
.on("dblclick",function(d) {if(d.url) window.location.href = d.url; });
|
|
|
|
node.append("text")
|
|
.attr("dy", ".3em")
|
|
.style("text-anchor", "middle")
|
|
.text(function(d) { return d.className.substring(0, d.r / 3); })
|
|
.on("dblclick",function(d) {if(d.url) window.location.href = d.url; });
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
// UTILS FUNCTIONS ////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////
|
|
// Returns a flattened hierarchy containing all leaf nodes under the root.
|
|
function classes(root) {
|
|
var classes = [];
|
|
|
|
function recurse(name, node) {
|
|
if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
|
|
else classes.push({packageName: name, className: node.name, value: node.size, aggregation: node.aggregation, key: node.key, url: node.url});
|
|
}
|
|
|
|
recurse(null, root);
|
|
return {children: classes};
|
|
}
|
|
|
|
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
// PUBLIC FUNCIONTS ////////////////////////////////////
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
BubbleChart.prototype.setUrlParams = function(url_params) {
|
|
this.url_params = url_params;
|
|
}
|
|
|
|
BubbleChart.prototype.forceUpdate = function(url_params) {
|
|
this.stopInterval();
|
|
this.falshUpdate(0,1);
|
|
this.update();
|
|
this.startInterval();
|
|
}
|
|
|
|
BubbleChart.prototype.setInterval = function(p_bubbleInterval) {
|
|
this.bubbleInterval = p_bubbleInterval;
|
|
}
|
|
|
|
BubbleChart.prototype.stopInterval = function() {
|
|
//disabled graph interval
|
|
clearInterval(this.bubbleInterval);
|
|
}
|
|
|
|
BubbleChart.prototype.startInterval = function() {
|
|
this.bubbleInterval = setInterval(this.update(), this.refresh)
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// INIT FUNCIONTS ////////////////////////////////////
|
|
///////////////////////////////////////////////////////////
|
|
|
|
function create_bubble_chart(contanerId) {
|
|
|
|
var margin = {top: 1, right: 1, bottom: 6, left: 1},
|
|
width = 600 - margin.left - margin.right,
|
|
height = 400 - margin.top - margin.bottom;
|
|
|
|
var diameter = 320,
|
|
format = d3.format(",d"),
|
|
color = d3.scale.category20c();
|
|
|
|
|
|
var svg_bubble = d3.select("#"+contanerId).append("svg")
|
|
.attr("width", width)
|
|
.attr("height", height)
|
|
.attr("class", "bubble");
|
|
|
|
var bubble = d3.layout.pack()
|
|
.sort(null)
|
|
.size([diameter, diameter])
|
|
.padding(1.5);
|
|
|
|
|
|
d3.select(self.frameElement).style("height", diameter + "px");
|
|
|
|
|
|
return([margin, width, height, svg_bubble, bubble,color]);
|
|
|
|
}
|
|
|