Browse Source

bug fixes, methods added and options changed to clean up code and to adhere to docs

flowchartTest
Alex de Mulder 10 years ago
parent
commit
cc129694f6
15 changed files with 2745 additions and 2846 deletions
  1. +7
    -2
      dist/vis.css
  2. +2552
    -2603
      dist/vis.js
  3. +1
    -1
      dist/vis.min.css
  4. +3
    -1
      examples/network/01_basic_usage.html
  5. +1
    -0
      examples/network/20_navigation.html
  6. +0
    -44
      lib/network/Network.js
  7. +7
    -2
      lib/network/css/network-tooltip.css
  8. +18
    -26
      lib/network/modules/ConfigurationSystem.js
  9. +77
    -53
      lib/network/modules/InteractionHandler.js
  10. +0
    -6
      lib/network/modules/ManipulationSystem.js
  11. +65
    -62
      lib/network/modules/SelectionHandler.js
  12. +10
    -3
      lib/network/modules/View.js
  13. +1
    -1
      lib/network/modules/components/Edge.js
  14. +1
    -1
      lib/network/modules/components/Node.js
  15. +2
    -41
      lib/network/modules/components/Popup.js

+ 7
- 2
dist/vis.css View File

@ -798,12 +798,17 @@ div.vis-network-tooltip {
padding: 5px;
white-space: nowrap;
font-family: verdana;
font-size:14px;
font-color:#000000;
background-color: #f5f4ed;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
border: 1px solid;
border: 1px solid #808074;
box-shadow: 3px 3px 10px rgba(128, 128, 128, 0.5);
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
}
div.vis-network-configuration {
position:relative;

+ 2552
- 2603
dist/vis.js
File diff suppressed because it is too large
View File


+ 1
- 1
dist/vis.min.css
File diff suppressed because it is too large
View File


+ 3
- 1
examples/network/01_basic_usage.html View File

@ -9,6 +9,7 @@
<style type="text/css">
#mynetwork {
width: 600px;
margin:90px;
height: 400px;
border: 1px solid lightgray;
}
@ -20,7 +21,7 @@
<script type="text/javascript">
// create an array with nodes
var nodes = [
{id: 1, label: 'Node 1', value:3},
{id: 1, label: 'Node 1', value:3, title:'hello world'},
{id: 2, label: 'Node 2', value:1},
{id: 3, label: 'Node 3', value:5},
{id: 4, label: 'Node 4', value:3},
@ -44,6 +45,7 @@
edges: edges
};
var options = {
interaction:{navigationButtons:true}
// edges:{
// shadow:true,
// shape:'dot'

+ 1
- 0
examples/network/20_navigation.html View File

@ -10,6 +10,7 @@
#mynetwork {
width: 600px;
height: 600px;
margin:100px;
border: 1px solid lightgray;
}
table.legend_table {

+ 0
- 44
lib/network/Network.js View File

@ -337,24 +337,6 @@ Network.prototype._updateValueRange = function(obj) {
};
/**
* Scale the network
* @param {Number} scale Scaling factor 1.0 is unscaled
* @private
*/
Network.prototype._setScale = function(scale) {
this.body.view.scale = scale;
};
/**
* Get the current scale of the network
* @return {Number} scale Scaling factor 1.0 is unscaled
* @private
*/
Network.prototype._getScale = function() {
return this.body.view.scale;
};
/**
* Load the XY positions of the nodes into the dataset.
@ -417,24 +399,6 @@ Network.prototype.isActive = function () {
};
/**
* Sets the scale
* @returns {Number}
*/
Network.prototype.setScale = function () {
return this._setScale();
};
/**
* Returns the scale
* @returns {Number}
*/
Network.prototype.getScale = function () {
return this._getScale();
};
/**
* Check if a node is a cluster.
* @param nodeId
@ -450,14 +414,6 @@ Network.prototype.isCluster = function(nodeId) {
}
};
/**
* Returns the scale
* @returns {Number}
*/
Network.prototype.getCenterCoordinates = function () {
return this.DOMtoCanvas({x: 0.5 * this.frame.canvas.clientWidth, y: 0.5 * this.frame.canvas.clientHeight});
};
Network.prototype.getBoundingBox = function(nodeId) {
if (this.body.nodes[nodeId] !== undefined) {

+ 7
- 2
lib/network/css/network-tooltip.css View File

@ -4,10 +4,15 @@ div.vis-network-tooltip {
padding: 5px;
white-space: nowrap;
font-family: verdana;
font-size:14px;
font-color:#000000;
background-color: #f5f4ed;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
border: 1px solid;
border: 1px solid #808074;
box-shadow: 3px 3px 10px rgba(128, 128, 128, 0.5);
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
}

+ 18
- 26
lib/network/modules/ConfigurationSystem.js View File

@ -151,17 +151,8 @@ class ConfigurationSystem {
dragView: true,
zoomView: true,
hoverEnabled: false,
showNavigationIcons: false,
tooltip: {
delay: [300, 0, 1000, 25],
fontColor: ['color','#000000'],
fontSize: [14, 0, 40, 1], // px
fontFace: ['arial', 'verdana', 'tahoma'],
color: {
border: ['color','#666666'],
background: ['color','#FFFFC6']
}
},
navigationButtons: false,
tooltipDelay: [300, 0, 1000, 25],
keyboard: {
enabled: false,
speed: {x: [10, 0, 40, 1], y: [10, 0, 40, 1], zoom: [0.02, 0, 0.1, 0.005]},
@ -260,29 +251,30 @@ class ConfigurationSystem {
util.deepExtend(this.actualOptions.selection, this.network.selectionHandler.selection, true);
util.deepExtend(this.actualOptions.renderer, this.network.renderer.selection, true);
if (this.actualOptions.configurationContainer !== undefined) {
this.container = this.actualOptions.configurationContainer;
}
else {
this.container = this.network.body.container;
}
let config;
if (this.actualOptions.configure instanceof Array) {
this.container = this.network.body.container;
let config = true;
if (typeof this.actualOptions.configure === 'string') {
config = this.actualOptions.configure;
}
else if (this.actualOptions.configure instanceof Array) {
config = this.actualOptions.configure.join();
}
else if (typeof this.actualOptions.configure === 'string') {
config = this.actualOptions.configure;
else if (typeof this.actualOptions.configure === 'object') {
if (this.actualOptions.configure.container !== undefined) {
this.container = this.actualOptions.configure.container;
}
if (this.actualOptions.configure.filter !== undefined) {
config = this.actualOptions.configure.filter;
}
}
else if (typeof this.actualOptions.configure === 'boolean') {
config = this.actualOptions.configure;
}
else {
this._clean();
throw new Error('the option for configure has to be either a string, boolean or an array. Supplied:' + this.options.configure);
return;
if (config === false) {
this._create(config);
}
this._create(config);
}
}

+ 77
- 53
lib/network/modules/InteractionHandler.js View File

@ -1,7 +1,7 @@
let util = require('../../util');
import NavigationHandler from "./components/NavigationHandler"
import Popup from "./components/Popup"
import NavigationHandler from './components/NavigationHandler'
import Popup from './components/Popup'
class InteractionHandler {
constructor(body, canvas, selectionHandler) {
@ -40,16 +40,7 @@ class InteractionHandler {
zoomView: true,
hoverEnabled: false,
navigationButtons: false,
tooltip: {
delay: 300,
fontColor: '#000000',
fontSize: 14, // px
fontFace: 'verdana',
color: {
border: '#666666',
background: '#FFFFC6'
}
},
tooltipDelay: 300,
keyboard: {
enabled: false,
speed: {x: 10, y: 10, zoom: 0.02},
@ -62,7 +53,7 @@ class InteractionHandler {
setOptions(options) {
if (options !== undefined) {
// extend all but the values in fields
let fields = ['keyboard','tooltip'];
let fields = ['keyboard'];
util.selectiveNotDeepExtend(fields,this.options, options);
// merge the keyboard options in.
@ -100,7 +91,7 @@ class InteractionHandler {
* @private
*/
onTouch(event) {
if (new Date().valueOf() - this.touchTime > 100) {
if (new Date().valueOf() - this.touchTime > 50) {
this.drag.pointer = this.getPointer(event.center);
this.drag.pinched = false;
this.pinch.scale = this.body.view.scale;
@ -116,14 +107,9 @@ class InteractionHandler {
onTap(event) {
let pointer = this.getPointer(event.center);
let previouslySelected = this.selectionHandler._getSelectedObjectCount() > 0;
let selected = this.selectionHandler.selectOnPoint(pointer);
if (selected === true || (previouslySelected === true && selected === false)) { // select or unselect
this.body.emitter.emit('select', this.selectionHandler.getSelection());
}
this.checkSelectionChanges(pointer);
this.selectionHandler._generateClickEvent("click",pointer);
this.selectionHandler._generateClickEvent('click',pointer);
}
@ -133,7 +119,7 @@ class InteractionHandler {
*/
onDoubleTap(event) {
let pointer = this.getPointer(event.center);
this.selectionHandler._generateClickEvent("doubleClick",pointer);
this.selectionHandler._generateClickEvent('doubleClick',pointer);
}
@ -145,13 +131,10 @@ class InteractionHandler {
onHold(event) {
let pointer = this.getPointer(event.center);
let selectionChanged = this.selectionHandler.selectAdditionalOnPoint(pointer);
if (selectionChanged === true) { // select or longpress
this.body.emitter.emit('select', this.selectionHandler.getSelection());
}
this.checkSelectionChanges(pointer, true);
this.selectionHandler._generateClickEvent("click",pointer);
this.selectionHandler._generateClickEvent('click',pointer);
this.selectionHandler._generateClickEvent('hold',pointer);
}
@ -161,7 +144,56 @@ class InteractionHandler {
* @private
*/
onRelease(event) {
this.body.emitter.emit("release",event)
if (new Date().valueOf() - this.touchTime > 10) {
let pointer = this.getPointer(event.center);
this.selectionHandler._generateClickEvent('release',pointer);
// to avoid double fireing of this event because we have two hammer instances. (on canvas and on frame)
this.touchTime = new Date().valueOf();
}
}
/**
*
* @param pointer
* @param add
*/
checkSelectionChanges(pointer, add = false) {
let previouslySelectedEdgeCount = this.selectionHandler._getSelectedEdgeCount();
let previouslySelectedNodeCount = this.selectionHandler._getSelectedNodeCount();
let previousSelection = this.selectionHandler.getSelection();
let selected;
if (add === true) {
selected = this.selectionHandler.selectAdditionalOnPoint(pointer);
}
else {
selected = this.selectionHandler.selectOnPoint(pointer);
}
let selectedEdges = this.selectionHandler._getSelectedEdgeCount();
let selectedNodes = this.selectionHandler._getSelectedNodeCount();
if (selectedNodes - previouslySelectedNodeCount > 0) { // node was selected
this.selectionHandler._generateClickEvent('selectNode',pointer);
selected = true;
}
else if (selectedNodes - previouslySelectedNodeCount < 0) { // node was deselected
this.selectionHandler._generateClickEvent('deselectNode',pointer, previousSelection);
selected = true;
}
if (selectedEdges - previouslySelectedEdgeCount > 0) { // node was selected
this.selectionHandler._generateClickEvent('selectEdge',pointer);
selected = true;
}
else if (selectedEdges - previouslySelectedEdgeCount < 0) { // node was deselected
this.selectionHandler._generateClickEvent('deselectEdge',pointer, previousSelection);
selected = true;
}
if (selected === true) { // select or unselect
this.selectionHandler._generateClickEvent('select',pointer);
}
}
@ -185,7 +217,7 @@ class InteractionHandler {
this.drag.translation = util.extend({},this.body.view.translation); // copy the object
this.drag.nodeId = undefined;
this.body.emitter.emit("dragStart", {nodeIds: this.selectionHandler.getSelection().nodes});
this.selectionHandler._generateClickEvent('dragStart',pointer);
if (node !== undefined && this.options.dragNodes === true) {
this.drag.nodeId = node.id;
@ -231,7 +263,7 @@ class InteractionHandler {
}
// remove the focus on node if it is focussed on by the focusOnNode
this.body.emitter.emit("unlockNode");
this.body.emitter.emit('unlockNode');
let pointer = this.getPointer(event.center);
let selection = this.drag.selection;
@ -254,7 +286,7 @@ class InteractionHandler {
});
// start the simulation of the physics
this.body.emitter.emit("startSimulation");
this.body.emitter.emit('startSimulation');
}
else {
// move the network
@ -268,7 +300,7 @@ class InteractionHandler {
let diffY = pointer.y - this.drag.pointer.y;
this.body.view.translation = {x:this.drag.translation.x + diffX, y:this.drag.translation.y + diffY};
this.body.emitter.emit("_redraw");
this.body.emitter.emit('_redraw');
}
}
}
@ -287,13 +319,12 @@ class InteractionHandler {
s.node.options.fixed.x = s.xFixed;
s.node.options.fixed.y = s.yFixed;
});
this.body.emitter.emit("startSimulation");
this.body.emitter.emit('startSimulation');
}
else {
this.body.emitter.emit("_requestRedraw");
this.body.emitter.emit('_requestRedraw');
}
this.body.emitter.emit("dragEnd", {nodeIds: this.selectionHandler.getSelection().nodes});
this.selectionHandler._generateClickEvent('dragEnd',pointer);
}
@ -356,13 +387,13 @@ class InteractionHandler {
this.drag.pointer.y = postScaleDragPointer.y;
}
this.body.emitter.emit("_requestRedraw");
this.body.emitter.emit('_requestRedraw');
if (scaleOld < scale) {
this.body.emitter.emit("zoom", {direction: "+"});
this.body.emitter.emit('zoom', {direction: '+'});
}
else {
this.body.emitter.emit("zoom", {direction: "-"});
this.body.emitter.emit('zoom', {direction: '-'});
}
}
}
@ -446,7 +477,7 @@ class InteractionHandler {
this.popupTimer = undefined;
}
if (!this.drag.dragging) {
this.popupTimer = setTimeout(() => this._checkShowPopup(pointer), this.options.tooltip.delay);
this.popupTimer = setTimeout(() => this._checkShowPopup(pointer), this.options.tooltipDelay);
}
}
@ -480,7 +511,7 @@ class InteractionHandler {
}
}
}
this.body.emitter.emit("_requestRedraw");
this.body.emitter.emit('_requestRedraw');
}
}
@ -506,7 +537,7 @@ class InteractionHandler {
let previousPopupObjId = this.popupObj === undefined ? undefined : this.popupObj.id;
let nodeUnderCursor = false;
let popupType = "node";
let popupType = 'node';
// check if a node is under the cursor.
if (this.popupObj === undefined) {
@ -549,7 +580,7 @@ class InteractionHandler {
if (overlappingEdges.length > 0) {
this.popupObj = edges[overlappingEdges[overlappingEdges.length - 1]];
popupType = "edge";
popupType = 'edge';
}
}
@ -557,7 +588,7 @@ class InteractionHandler {
// show popup message window
if (this.popupObj.id !== previousPopupObjId) {
if (this.popup === undefined) {
this.popup = new Popup(this.frame, this.options.tooltip);
this.popup = new Popup(this.canvas.frame);
}
this.popup.popupTargetType = popupType;
@ -586,14 +617,7 @@ class InteractionHandler {
* @private
*/
_checkHidePopup(pointer) {
let x = this.canvas._XconvertDOMtoCanvas(pointer.x);
let y = this.canvas._YconvertDOMtoCanvas(pointer.y);
let pointerObj = {
left: x,
top: y,
right: x,
bottom: y
};
let pointerObj = this.selectionHandler._pointerToPositionObject(pointer);
let stillOnObj = false;
if (this.popup.popupTargetType === 'node') {

+ 0
- 6
lib/network/modules/ManipulationSystem.js View File

@ -375,9 +375,6 @@ class ManipulationSystem {
// Enable the GUI
this.guiEnabled = true;
// remove override
this.selectionHandler.forceSelectEdges = true;
this._createWrappers();
if (this.editMode === false) {
this._createEditButton();
@ -545,9 +542,6 @@ class ManipulationSystem {
this.manipulationDiv = undefined;
this.editModeDiv = undefined;
this.closeDiv = undefined;
// remove override
this.selectionHandler.forceSelectEdges = false;
}

+ 65
- 62
lib/network/modules/SelectionHandler.js View File

@ -1,12 +1,11 @@
var Node = require("./components/Node");
var util = require('../../util');
let Node = require("./components/Node");
let util = require('../../util');
class SelectionHandler {
constructor(body, canvas) {
this.body = body;
this.canvas = canvas;
this.selectionObj = {nodes: [], edges: []};
this.forceSelectEdges = false;
this.options = {};
this.defaultOptions = {
@ -35,10 +34,10 @@ class SelectionHandler {
* @private
*/
selectOnPoint(pointer) {
var selected = false;
let selected = false;
if (this.options.select === true) {
this.unselectAll();
var obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);;
let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);;
if (obj !== undefined) {
selected = this.selectObject(obj);
}
@ -48,9 +47,9 @@ class SelectionHandler {
}
selectAdditionalOnPoint(pointer) {
var selectionChanged = false;
let selectionChanged = false;
if (this.options.select === true) {
var obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);;
let obj = this.getNodeAt(pointer) || this.getEdgeAt(pointer);;
if (obj !== undefined) {
selectionChanged = true;
@ -67,19 +66,23 @@ class SelectionHandler {
return selectionChanged;
}
_generateClickEvent(eventType,pointer) {
var properties = this.getSelection();
_generateClickEvent(eventType, pointer, oldSelection) {
let properties = this.getSelection();
properties['pointer'] = {
DOM: {x: pointer.x, y: pointer.y},
canvas: this.canvas.DOMtoCanvas(pointer)
}
if (oldSelection !== undefined) {
properties['previousSelection'] = oldSelection;
}
this.body.emitter.emit(eventType, properties);
}
selectObject(obj) {
selectObject(obj, highlightEdges = this.options.selectConnectedEdges) {
if (obj !== undefined) {
if (obj instanceof Node) {
if (this.options.selectConnectedEdges === true || this.forceSelectEdges === true) {
if (highlightEdges === true) {
this._selectConnectedEdges(obj);
}
}
@ -106,8 +109,8 @@ class SelectionHandler {
* @private
*/
_getAllNodesOverlappingWith(object) {
var overlappingNodes = [];
var nodes = this.body.nodes;
let overlappingNodes = [];
let nodes = this.body.nodes;
for (let i = 0; i < this.body.nodeIndices.length; i++) {
let nodeId = this.body.nodeIndices[i];
if (nodes[nodeId].isOverlappingWith(object)) {
@ -126,7 +129,7 @@ class SelectionHandler {
* @private
*/
_pointerToPositionObject(pointer) {
var canvasPos = this.canvas.DOMtoCanvas(pointer);
let canvasPos = this.canvas.DOMtoCanvas(pointer);
return {
left: canvasPos.x - 1,
top: canvasPos.y + 1,
@ -145,8 +148,8 @@ class SelectionHandler {
*/
getNodeAt(pointer) {
// we first check if this is an navigation controls element
var positionObject = this._pointerToPositionObject(pointer);
var overlappingNodes = this._getAllNodesOverlappingWith(positionObject);
let positionObject = this._pointerToPositionObject(pointer);
let overlappingNodes = this._getAllNodesOverlappingWith(positionObject);
// if there are overlapping nodes, select the last one, this is the
// one which is drawn on top of the others
@ -166,7 +169,7 @@ class SelectionHandler {
* @private
*/
_getEdgesOverlappingWith(object, overlappingEdges) {
var edges = this.body.edges;
let edges = this.body.edges;
for (let i = 0; i < this.body.edgeIndices.length; i++) {
let edgeId = this.body.edgeIndices[i];
if (edges[edgeId].isOverlappingWith(object)) {
@ -183,7 +186,7 @@ class SelectionHandler {
* @private
*/
_getAllEdgesOverlappingWith(object) {
var overlappingEdges = [];
let overlappingEdges = [];
this._getEdgesOverlappingWith(object,overlappingEdges);
return overlappingEdges;
}
@ -198,8 +201,8 @@ class SelectionHandler {
* @private
*/
getEdgeAt(pointer) {
var positionObject = this._pointerToPositionObject(pointer);
var overlappingEdges = this._getAllEdgesOverlappingWith(positionObject);
let positionObject = this._pointerToPositionObject(pointer);
let overlappingEdges = this._getAllEdgesOverlappingWith(positionObject);
if (overlappingEdges.length > 0) {
return this.body.edges[overlappingEdges[overlappingEdges.length - 1]];
@ -262,12 +265,12 @@ class SelectionHandler {
* @private
*/
unselectAll() {
for(var nodeId in this.selectionObj.nodes) {
for(let nodeId in this.selectionObj.nodes) {
if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
this.selectionObj.nodes[nodeId].unselect();
}
}
for(var edgeId in this.selectionObj.edges) {
for(let edgeId in this.selectionObj.edges) {
if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
this.selectionObj.edges[edgeId].unselect();
}
@ -284,8 +287,8 @@ class SelectionHandler {
* @private
*/
_getSelectedNodeCount() {
var count = 0;
for (var nodeId in this.selectionObj.nodes) {
let count = 0;
for (let nodeId in this.selectionObj.nodes) {
if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
count += 1;
}
@ -300,7 +303,7 @@ class SelectionHandler {
* @private
*/
_getSelectedNode() {
for (var nodeId in this.selectionObj.nodes) {
for (let nodeId in this.selectionObj.nodes) {
if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
return this.selectionObj.nodes[nodeId];
}
@ -315,7 +318,7 @@ class SelectionHandler {
* @private
*/
_getSelectedEdge() {
for (var edgeId in this.selectionObj.edges) {
for (let edgeId in this.selectionObj.edges) {
if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
return this.selectionObj.edges[edgeId];
}
@ -331,8 +334,8 @@ class SelectionHandler {
* @private
*/
_getSelectedEdgeCount() {
var count = 0;
for (var edgeId in this.selectionObj.edges) {
let count = 0;
for (let edgeId in this.selectionObj.edges) {
if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
count += 1;
}
@ -348,13 +351,13 @@ class SelectionHandler {
* @private
*/
_getSelectedObjectCount() {
var count = 0;
for(var nodeId in this.selectionObj.nodes) {
let count = 0;
for(let nodeId in this.selectionObj.nodes) {
if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
count += 1;
}
}
for(var edgeId in this.selectionObj.edges) {
for(let edgeId in this.selectionObj.edges) {
if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
count += 1;
}
@ -369,12 +372,12 @@ class SelectionHandler {
* @private
*/
_selectionIsEmpty() {
for(var nodeId in this.selectionObj.nodes) {
for(let nodeId in this.selectionObj.nodes) {
if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
return false;
}
}
for(var edgeId in this.selectionObj.edges) {
for(let edgeId in this.selectionObj.edges) {
if(this.selectionObj.edges.hasOwnProperty(edgeId)) {
return false;
}
@ -390,7 +393,7 @@ class SelectionHandler {
* @private
*/
_clusterInSelection() {
for(var nodeId in this.selectionObj.nodes) {
for(let nodeId in this.selectionObj.nodes) {
if(this.selectionObj.nodes.hasOwnProperty(nodeId)) {
if (this.selectionObj.nodes[nodeId].clusterSize > 1) {
return true;
@ -407,8 +410,8 @@ class SelectionHandler {
* @private
*/
_selectConnectedEdges(node) {
for (var i = 0; i < node.edges.length; i++) {
var edge = node.edges[i];
for (let i = 0; i < node.edges.length; i++) {
let edge = node.edges[i];
edge.select();
this._addToSelection(edge);
}
@ -421,8 +424,8 @@ class SelectionHandler {
* @private
*/
_hoverConnectedEdges(node) {
for (var i = 0; i < node.edges.length; i++) {
var edge = node.edges[i];
for (let i = 0; i < node.edges.length; i++) {
let edge = node.edges[i];
edge.hover = true;
this._addToHover(edge);
}
@ -436,8 +439,8 @@ class SelectionHandler {
* @private
*/
_unselectConnectedEdges(node) {
for (var i = 0; i < node.edges.length; i++) {
var edge = node.edges[i];
for (let i = 0; i < node.edges.length; i++) {
let edge = node.edges[i];
edge.unselect();
this._removeFromSelection(edge);
}
@ -491,8 +494,8 @@ class SelectionHandler {
* @return {{nodes: Array.<String>, edges: Array.<String>}} selection
*/
getSelection() {
var nodeIds = this.getSelectedNodes();
var edgeIds = this.getSelectedEdges();
let nodeIds = this.getSelectedNodes();
let edgeIds = this.getSelectedEdges();
return {nodes:nodeIds, edges:edgeIds};
}
@ -503,9 +506,9 @@ class SelectionHandler {
* selected nodes.
*/
getSelectedNodes() {
var idArray = [];
let idArray = [];
if (this.options.select === true) {
for (var nodeId in this.selectionObj.nodes) {
for (let nodeId in this.selectionObj.nodes) {
if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
idArray.push(nodeId);
}
@ -521,9 +524,9 @@ class SelectionHandler {
* selected nodes.
*/
getSelectedEdges() {
var idArray = [];
let idArray = [];
if (this.options.select === true) {
for (var edgeId in this.selectionObj.edges) {
for (let edgeId in this.selectionObj.edges) {
if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
idArray.push(edgeId);
}
@ -539,25 +542,25 @@ class SelectionHandler {
* selected nodes.
* @param {boolean} [highlightEdges]
*/
selectNodes(selection, highlightEdges) {
var i, iMax, id;
selectNodes(selection, highlightEdges = true) {
let i, id;
if (!selection || (selection.length === undefined))
throw 'Selection must be an array with ids';
// first unselect any selected node
this.unselectAll(true);
this.unselectAll();
for (i = 0, iMax = selection.length; i < iMax; i++) {
for (i = 0; i < selection.length; i++) {
id = selection[i];
var node = this.body.nodes[id];
let node = this.body.nodes[id];
if (!node) {
throw new RangeError('Node with id "' + id + '" not found');
}
this._selectObject(node,true,true,highlightEdges,true);
this.selectObject(node,highlightEdges);
}
this.redraw();
this.body.emitter.emit('_requestRedraw');
}
@ -567,24 +570,24 @@ class SelectionHandler {
* selected nodes.
*/
selectEdges(selection) {
var i, iMax, id;
let i, id;
if (!selection || (selection.length === undefined))
throw 'Selection must be an array with ids';
// first unselect any selected node
this.unselectAll(true);
// first unselect any selected objects
this.unselectAll();
for (i = 0, iMax = selection.length; i < iMax; i++) {
for (i = 0; i < selection.length; i++) {
id = selection[i];
var edge = this.body.edges[id];
let edge = this.body.edges[id];
if (!edge) {
throw new RangeError('Edge with id "' + id + '" not found');
}
this._selectObject(edge,true,true,false,true);
this.selectObject(edge);
}
this.redraw();
this.body.emitter.emit('_requestRedraw');
}
/**
@ -592,14 +595,14 @@ class SelectionHandler {
* @private
*/
updateSelection() {
for (var nodeId in this.selectionObj.nodes) {
for (let nodeId in this.selectionObj.nodes) {
if (this.selectionObj.nodes.hasOwnProperty(nodeId)) {
if (!this.body.nodes.hasOwnProperty(nodeId)) {
delete this.selectionObj.nodes[nodeId];
}
}
}
for (var edgeId in this.selectionObj.edges) {
for (let edgeId in this.selectionObj.edges) {
if (this.selectionObj.edges.hasOwnProperty(edgeId)) {
if (!this.body.edges.hasOwnProperty(edgeId)) {
delete this.selectionObj.edges[edgeId];

+ 10
- 3
lib/network/modules/View.js View File

@ -29,7 +29,6 @@ class View {
}
// zoomExtent
/**
* Find the center position of the network
* @private
@ -93,9 +92,8 @@ class View {
/**
* This function zooms out to fit all data on screen based on amount of nodes
* @param {Object}
* @param {Object} Options
* @param {Boolean} [initialZoom] | zoom based on fitted formula or range, true = fitted, default = false;
* @param {Boolean} [disableStart] | If true, start is not called.
*/
zoomExtent(options = {nodes:[]}, initialZoom = false) {
var range;
@ -323,6 +321,15 @@ class View {
};
getScale() {
return this.body.view.scale;
}
getPosition() {
return {x:this.body.view.translation.x, y:this.body.view.translation.y};
}
}
export default View;

+ 1
- 1
lib/network/modules/components/Edge.js View File

@ -262,7 +262,7 @@ class Edge {
* has been set.
*/
getTitle() {
return typeof this.title === "function" ? this.title() : this.title;
return this.title;
}

+ 1
- 1
lib/network/modules/components/Node.js View File

@ -298,7 +298,7 @@ class Node {
* has been set.
*/
getTitle() {
return typeof this.options.title === "function" ? this.options.title() : this.options.title;
return this.options.title;
}

+ 2
- 41
lib/network/modules/components/Popup.js View File

@ -8,56 +8,17 @@
* backgroundColor, etc.
*/
class Popup {
constructor(container, x, y, text, style) {
if (container) {
this.container = container;
}
else {
this.container = document.body;
}
// x, y and text are optional, see if a style object was passed in their place
if (style === undefined) {
if (typeof x === "object") {
style = x;
x = undefined;
} else if (typeof text === "object") {
style = text;
text = undefined;
} else {
// for backwards compatibility, in case clients other than Network are creating Popup directly
style = {
fontColor: 'black',
fontSize: 14, // px
fontFace: 'verdana',
color: {
border: '#666',
background: '#FFFFC6'
}
}
}
}
constructor(container) {
this.container = container;
this.x = 0;
this.y = 0;
this.padding = 5;
this.hidden = false;
if (x !== undefined && y !== undefined) {
this.setPosition(x, y);
}
if (text !== undefined) {
this.setText(text);
}
// create the frame
this.frame = document.createElement('div');
this.frame.className = 'vis-network-tooltip';
this.frame.style.color = style.fontColor;
this.frame.style.backgroundColor = style.color.background;
this.frame.style.borderColor = style.color.border;
this.frame.style.fontSize = style.fontSize + 'px';
this.frame.style.fontFamily = style.fontFace;
this.container.appendChild(this.frame);
}

Loading…
Cancel
Save