| <!doctype html> | |
| <html> | |
| <head> | |
|   <title>Graph | Navigation</title> | |
| 
 | |
|   <style type="text/css"> | |
|     body { | |
|       font: 10pt sans; | |
|     } | |
|     #mygraph { | |
|       position:relative; | |
|       width: 600px; | |
|       height: 600px; | |
|       border: 1px solid lightgray; | |
|     } | |
|     table.legend_table { | |
|       font-size: 11px; | |
|       border-width:1px; | |
|       border-color:#d3d3d3; | |
|       border-style:solid; | |
|     } | |
|     table.legend_table,td { | |
|       border-width:1px; | |
|       border-color:#d3d3d3; | |
|       border-style:solid; | |
|       padding: 2px; | |
|     } | |
|     div.table_content { | |
|       width:80px; | |
|       text-align:center; | |
|     } | |
|     div.table_description { | |
|       width:100px; | |
|     } | |
| 
 | |
|     #operation { | |
|       font-size:28px; | |
|     } | |
|     #graph-popUp { | |
|       display:none; | |
|       position:absolute; | |
|       top:350px; | |
|       left:170px; | |
|       z-index:299; | |
|       width:250px; | |
|       height:120px; | |
|       background-color: #f9f9f9; | |
|       border-style:solid; | |
|       border-width:3px; | |
|       border-color: #5394ed; | |
|       padding:10px; | |
|       text-align: center; | |
|     } | |
|   </style> | |
|   <script type="text/javascript" src="../../dist/vis.js"></script> | |
|   <link type="text/css" rel="stylesheet" href="../../dist/vis.css"> | |
| 
 | |
|   <script type="text/javascript"> | |
|     var nodes = null; | |
|     var edges = null; | |
|     var graph = null; | |
| 
 | |
|     function draw() { | |
|       nodes = []; | |
|       edges = []; | |
|       var connectionCount = []; | |
| 
 | |
|       // randomly create some nodes and edges | |
|       var nodeCount = 25; | |
|       for (var i = 0; i < nodeCount; i++) { | |
|         nodes.push({ | |
|           id: i, | |
|           label: String(i) | |
|         }); | |
| 
 | |
|         connectionCount[i] = 0; | |
| 
 | |
|         // create edges in a scale-free-graph way | |
|         if (i == 1) { | |
|           var from = i; | |
|           var to = 0; | |
|           edges.push({ | |
|             from: from, | |
|             to: to | |
|           }); | |
|           connectionCount[from]++; | |
|           connectionCount[to]++; | |
|         } | |
|         else if (i > 1) { | |
|           var conn = edges.length * 2; | |
|           var rand = Math.floor(Math.random() * conn); | |
|           var cum = 0; | |
|           var j = 0; | |
|           while (j < connectionCount.length && cum < rand) { | |
|             cum += connectionCount[j]; | |
|             j++; | |
|           } | |
| 
 | |
|           var from = i; | |
|           var to = j; | |
|           edges.push({ | |
|             from: from, | |
|             to: to | |
|           }); | |
|           connectionCount[from]++; | |
|           connectionCount[to]++; | |
|         } | |
|       } | |
| 
 | |
|       // create a graph | |
|       var container = document.getElementById('mygraph'); | |
|       var data = { | |
|         nodes: nodes, | |
|         edges: edges | |
|       }; | |
|       var options = { | |
|         edges: { | |
|           length: 50 | |
|         }, | |
|         stabilize: false, | |
|         dataManipulation: true, | |
|         onAdd: function(data,callback) { | |
|           var span = document.getElementById('operation'); | |
|           var idInput = document.getElementById('node-id'); | |
|           var labelInput = document.getElementById('node-label'); | |
|           var saveButton = document.getElementById('saveButton'); | |
|           var cancelButton = document.getElementById('cancelButton'); | |
|           var div = document.getElementById('graph-popUp'); | |
|           span.innerHTML = "Add Node"; | |
|           idInput.value = data.id; | |
|           labelInput.value = data.label; | |
|           saveButton.onclick = saveData.bind(this,data,callback); | |
|           cancelButton.onclick = clearPopUp.bind(); | |
|           div.style.display = 'block'; | |
|         }, | |
|         onEdit: function(data,callback) { | |
|           var span = document.getElementById('operation'); | |
|           var idInput = document.getElementById('node-id'); | |
|           var labelInput = document.getElementById('node-label'); | |
|           var saveButton = document.getElementById('saveButton'); | |
|           var cancelButton = document.getElementById('cancelButton'); | |
|           var div = document.getElementById('graph-popUp'); | |
|           span.innerHTML = "Edit Node"; | |
|           idInput.value = data.id; | |
|           labelInput.value = data.label; | |
|           saveButton.onclick = saveData.bind(this,data,callback); | |
|           cancelButton.onclick = clearPopUp.bind(); | |
|           div.style.display = 'block'; | |
|         }, | |
|         onConnect: function(data,callback) { | |
|           if (data.from == data.to) { | |
|             var r=confirm("Do you want to connect the node to itself?"); | |
|             if (r==true) { | |
|               callback(data); | |
|             } | |
|           } | |
|           else { | |
|             callback(data); | |
|           } | |
|         } | |
|       }; | |
|       graph = new vis.Graph(container, data, options); | |
| 
 | |
|       // add event listeners | |
|       graph.on('select', function(params) { | |
|         document.getElementById('selection').innerHTML = 'Selection: ' + params.nodes; | |
|       }); | |
| 
 | |
|       graph.on("resize", function(params) {console.log(params.width,params.height)}); | |
| 
 | |
|       function clearPopUp() { | |
|         var saveButton = document.getElementById('saveButton'); | |
|         var cancelButton = document.getElementById('cancelButton'); | |
|         saveButton.onclick = null; | |
|         cancelButton.onclick = null; | |
|         var div = document.getElementById('graph-popUp'); | |
|         div.style.display = 'none'; | |
| 
 | |
|       } | |
| 
 | |
|       function saveData(data,callback) { | |
|         var idInput = document.getElementById('node-id'); | |
|         var labelInput = document.getElementById('node-label'); | |
|         var div = document.getElementById('graph-popUp'); | |
|         data.id = idInput.value; | |
|         data.label = labelInput.value; | |
|         clearPopUp(); | |
|         callback(data); | |
| 
 | |
|       } | |
|     } | |
|   </script> | |
| </head> | |
| 
 | |
| <body onload="draw();"> | |
| <h2>Editing the dataset</h2> | |
| <div style="width: 700px; font-size:14px;"> | |
|   In this example we have enabled the data manipulation setting. If the dataManipulation option is set to true, the edit button will appear. | |
|   If you prefer to have the toolbar visible initially, you can set the initiallyVisible option to true. The exact method is described in the docs. | |
|   <br /><br /> | |
|   The data manipulation allows the user to add nodes, connect them, edit them and delete any selected items. In this example we have created trigger functions | |
|   for the add and edit operations. By settings these trigger functions the user can direct the way the data is manipulated. In this example we have created a simple | |
|   pop-up that allows us to edit some of the properties. | |
| </div> | |
| <br /> | |
| 
 | |
| <div id="graph-popUp"> | |
|   <span id="operation">node</span> <br> | |
|   <table style="margin:auto;"><tr> | |
|     <td>id</td><td><input id="node-id" value="new value"></td> | |
|   </tr> | |
|     <tr> | |
|       <td>label</td><td><input id="node-label" value="new value"> </td> | |
|     </tr></table> | |
|   <input type="button" value="save" id="saveButton"></button> | |
|   <input type="button" value="cancel" id="cancelButton"></button> | |
| </div> | |
| <br /> | |
| <div id="mygraph"></div> | |
| 
 | |
| <p id="selection"></p> | |
| </body> | |
| </html> | |
| 
 |