|
|
@ -1,291 +0,0 @@ |
|
|
|
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() |