function focusOn(event) {
|
|
var nodeId = event.value;
|
|
network.selectNodes([nodeId]);
|
|
highlightConnections({nodes:[nodeId]})
|
|
network.focusOnNode(nodeId,{animation:false, scale:0.2})
|
|
}
|
|
|
|
function viewAllNeighbours() {
|
|
network.zoomExtent({nodes:connectedNodes, duration:0})
|
|
}
|
|
|
|
function doSteps(amount) {
|
|
network.setOptions({stabilizationIterations:amount})
|
|
network._stabilize()
|
|
}
|
|
|
|
var network;
|
|
var nodes;
|
|
var edges;
|
|
var edgeOpacity = 0.15;
|
|
|
|
function drawAll(dataJSON, file) {
|
|
// create an array with nodes
|
|
nodes = new vis.DataSet(dataJSON.nodes);
|
|
|
|
var totalMass = 0;
|
|
|
|
for (var i = 0; i < dataJSON.nodes.length; i++) {
|
|
totalMass += dataJSON.nodes[i].mass;
|
|
//console.log(dataJSON.nodes[i].mass)
|
|
}
|
|
|
|
var gravityConstant = -20000;
|
|
if (totalMass < 2000) {
|
|
gravityConstant = -2000;
|
|
}
|
|
|
|
var edgeNodeRatio = Math.max(1,dataJSON.edges.length) / Math.max(1,dataJSON.nodes.length);
|
|
var nodeEdgeRatio = Math.max(1,dataJSON.nodes.length) / Math.max(1,dataJSON.edges.length);
|
|
var centralGravity = Math.min(5,Math.max(0.1,edgeNodeRatio));
|
|
opacity = Math.min(1.0,Math.max(0.15,nodeEdgeRatio));
|
|
|
|
// create an array with edges
|
|
edges = new vis.DataSet(dataJSON.edges);
|
|
|
|
// console.log(edgesArray.length,edgesArray)
|
|
|
|
// create a network
|
|
var container = document.getElementById('mynetwork');
|
|
var data = {
|
|
nodes: nodes,
|
|
edges: edges
|
|
};
|
|
|
|
var amountOfNodes = dataJSON.nodes.length;
|
|
var options = {
|
|
stabilize: true,
|
|
stabilizationIterations: 15000,
|
|
smoothCurves: {
|
|
enabled: false,
|
|
dynamic: false
|
|
},
|
|
configurePhysics: false,
|
|
physics: {barnesHut: {gravitationalConstant: gravityConstant, centralGravity: centralGravity, springLength: 100, springConstant: 0.001}},
|
|
//physics: {barnesHut: {gravitationalConstant: 0, centralGravity: 0.0, springConstant: 0}},
|
|
nodes: {
|
|
shape: 'dot',
|
|
radiusMax: amountOfNodes * 0.5,
|
|
fontColor: '#ffffff',
|
|
fontDrawThreshold: 8,
|
|
scaleFontWithValue: true,
|
|
fontSizeMin: 14,
|
|
fontSizeMax: amountOfNodes * 0.25,
|
|
fontSizeMaxVisible: 20,
|
|
fontStrokeWidth: 1, // px
|
|
fontStrokeColor: '#222222'
|
|
},
|
|
edges: {
|
|
opacity: edgeOpacity
|
|
},
|
|
hideEdgesOnDrag: true,
|
|
maxVelocity: 100,
|
|
tooltip: {
|
|
delay: 200,
|
|
fontSize: 12,
|
|
color: {
|
|
background: "#fff"
|
|
}
|
|
}
|
|
};
|
|
network = new vis.Network(container, {nodes:[],edges:[]}, options);
|
|
|
|
network.on("stabilizationIterationsDone", function() {
|
|
this.setFreezeSimulation(true);
|
|
});
|
|
|
|
network.on("stabilized", function() {
|
|
console.log('downloading')
|
|
network.storePositions();
|
|
download(file);
|
|
setTimeout(getNewTask(file),3000);
|
|
})
|
|
|
|
network.setData(data);
|
|
|
|
if (dataJSON.nodes.length < 2) {
|
|
console.log('downloading because few nodes')
|
|
network.storePositions();
|
|
download(file);
|
|
setTimeout(getNewTask(file),3000);
|
|
}
|
|
|
|
//network.on("click", highlightConnections);
|
|
//window.onresize = function () {
|
|
// network.redraw()
|
|
//};
|
|
//network.on("stabilized", function() {
|
|
// network.setOptions({physics: {barnesHut: {gravitationalConstant: 0, centralGravity: 0, springConstant: 0}}});
|
|
// console.log('downlaoding')
|
|
// download();
|
|
// setTimeout(next,2000);
|
|
//});
|
|
|
|
//populateCompanyDropdown();
|
|
}
|
|
// marked is used so we don't do heavy stuff on each click
|
|
var marked = false;
|
|
var connectedNodes = [];
|
|
function highlightConnections(selectedItems) {
|
|
var nodeId;
|
|
var requireUpdate = false;
|
|
|
|
// we get all data from the dataset once to avoid updating multiple times.
|
|
if (selectedItems.nodes.length == 0 && marked === true) {
|
|
connectedNodes = [];
|
|
requireUpdate = true;
|
|
var allNodes = nodes.get({returnType:"Object"});
|
|
// restore on unselect
|
|
for (nodeId in allNodes) {
|
|
allNodes[nodeId].color = undefined;
|
|
if (allNodes[nodeId].oldLabel !== undefined) {
|
|
allNodes[nodeId].label = allNodes[nodeId].oldLabel;
|
|
allNodes[nodeId].oldLabel = undefined;
|
|
}
|
|
}
|
|
marked = false;
|
|
network.setOptions({nodes:{fontSizeMin:14},edges:{opacity:0.15}})
|
|
}
|
|
else if (selectedItems.nodes.length > 0) {
|
|
var allNodes = nodes.get({returnType:"Object"});
|
|
|
|
marked = true;
|
|
requireUpdate = true;
|
|
|
|
var mainNode = selectedItems.nodes[0]; // this is an ID
|
|
connectedNodes = network.getConnectedNodes(mainNode);
|
|
connectedNodes.push(mainNode);
|
|
|
|
for (nodeId in allNodes) {
|
|
allNodes[nodeId].color = 'rgba(150,150,150,0.1)';
|
|
if (allNodes[nodeId].oldLabel === undefined) {
|
|
allNodes[nodeId].oldLabel = allNodes[nodeId].label;
|
|
allNodes[nodeId].label = "";
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < connectedNodes.length; i++) {
|
|
allNodes[connectedNodes[i]].color = undefined;
|
|
if (allNodes[connectedNodes[i]].oldLabel !== undefined) {
|
|
allNodes[connectedNodes[i]].label = allNodes[connectedNodes[i]].oldLabel;
|
|
allNodes[connectedNodes[i]].oldLabel = undefined;
|
|
}
|
|
}
|
|
|
|
network.setOptions({nodes:{fontSizeMin:150},edges:{opacity:0.025}})
|
|
}
|
|
|
|
if (requireUpdate === true) {
|
|
var updateArray = [];
|
|
for (nodeId in allNodes) {
|
|
updateArray.push(allNodes[nodeId]);
|
|
}
|
|
nodes.update(updateArray);
|
|
}
|
|
}
|
|
|
|
function loadJSON(path, success, error) {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.onreadystatechange = function() {
|
|
if (xhr.readyState === 4) {
|
|
if (xhr.status === 200) {
|
|
success(JSON.parse(xhr.responseText), path);
|
|
}
|
|
else {
|
|
error();
|
|
}
|
|
}
|
|
};
|
|
xhr.open("GET", path, true);
|
|
|
|
xhr.send();
|
|
}
|
|
|
|
|
|
function populateDropdown() {
|
|
var nodesAr = nodes.get();
|
|
var nodeIds = [];
|
|
for (var i = 0; i < nodesAr.length;i++) {
|
|
nodeIds.push(nodesAr[i].id);
|
|
}
|
|
nodeIds.sort()
|
|
var dropdown = document.getElementById("companyDropdown");
|
|
var option = document.createElement('option');
|
|
option.text = option.value = 'pick a company to focus on.';
|
|
dropdown.add(option);
|
|
for (i = 0; i < nodeIds.length; i++) {
|
|
option = document.createElement('option');
|
|
option.text = option.value = nodeIds[i];
|
|
dropdown.add(option);
|
|
}
|
|
}
|
|
|
|
function download(path) {
|
|
var file = path.replace("./data/data/","");
|
|
var nodesAr = nodes.get();
|
|
var edgesAr = edges.get();
|
|
var obj = {nodes: nodesAr, edges: edgesAr};
|
|
var json = JSON.stringify(obj);
|
|
var blob = new Blob([json], {type: "text/plain;charset=utf-8"});
|
|
saveAs(blob, "processed_" + file);
|
|
}
|
|
|
|
function startTask(path, success) {
|
|
// if we find the file already processed, we go to the next one
|
|
loadJSON("./data/processedData/processed_" + path,
|
|
function() {
|
|
getNewTask(path);
|
|
},
|
|
function() {
|
|
loadJSON("./data/data/" + path, success, function() {
|
|
console.log("could not find file ", path);
|
|
})
|
|
});
|
|
}
|
|
|
|
function askAgent(to, message) {
|
|
return new Promise(function (resolve, reject) {
|
|
if (typeof message == 'object') {
|
|
message = JSON.stringify(message);
|
|
}
|
|
// create XMLHttpRequest object to send the POST request
|
|
var http = new XMLHttpRequest();
|
|
|
|
// insert the callback function. This is called when the message has been delivered and a response has been received
|
|
http.onreadystatechange = function () {
|
|
if (http.readyState == 4 && http.status == 200) {
|
|
var response = "";
|
|
if (http.responseText.length > 0) {
|
|
response = JSON.parse(http.responseText);
|
|
}
|
|
resolve(response);
|
|
}
|
|
else if (http.readyState == 4) {
|
|
reject(new Error("http.status:" + http.status));
|
|
}
|
|
};
|
|
|
|
// open an asynchronous POST connection
|
|
http.open("POST", to, true);
|
|
// include header so the receiving code knows its a JSON object
|
|
http.setRequestHeader("Content-Type", "text/plain");
|
|
// send
|
|
http.send(message);
|
|
});
|
|
}
|
|
|
|
|
|
function getNewTask(path) {
|
|
var file = undefined;
|
|
if (path !== undefined) {
|
|
file = path.replace("./data/data/", "");
|
|
}
|
|
askAgent("http://127.0.0.1:3000/agents/proxy", {jsonrpc:"2.0",method:"getAssignment", params:{finishedFile:file}}).then(function(reply) {
|
|
console.log(reply, reply.result);
|
|
if (reply.result != 'none') {
|
|
startTask(reply.result, function(data,path) {document.getElementById("FILENAME").innerHTML = path; setTimeout(function() {drawAll(data,path);},200)});
|
|
}
|
|
})
|
|
}
|
|
|
|
getNewTask()
|