123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- var util = require("../../util");
- var DataSet = require('../../DataSet');
- var DataView = require('../../DataView');
- var Edge = require("./components/Edge").default;
- class EdgesHandler {
-
- constructor(body, images, groups) {
- this.body = body;
- this.images = images;
- this.groups = groups;
-
- this.body.functions.createEdge = this.create.bind(this);
- this.edgesListeners = {
- add: (event, params) => {this.add(params.items);},
- update: (event, params) => {this.update(params.items);},
- remove: (event, params) => {this.remove(params.items);}
- };
- this.options = {};
- this.defaultOptions = {
- arrows: {
- to: {enabled: false, scaleFactor:1, type: 'arrow'},
- middle: {enabled: false, scaleFactor:1, type: 'arrow'},
- from: {enabled: false, scaleFactor:1, type: 'arrow'}
- },
- arrowStrikethrough: true,
- color: {
- color:'#848484',
- highlight:'#848484',
- hover: '#848484',
- inherit: 'from',
- opacity:1.0
- },
- dashes: false,
- font: {
- color: '#343434',
- size: 14,
- face: 'arial',
- background: 'none',
- strokeWidth: 2,
- strokeColor: '#ffffff',
- align:'horizontal',
- multi: false,
- vadjust: 0,
- bold: {
- mod: 'bold'
- },
- boldital: {
- mod: 'bold italic'
- },
- ital: {
- mod: 'italic'
- },
- mono: {
- mod: '',
- size: 15,
- face: 'courier new',
- vadjust: 2
- }
- },
- hidden: false,
- hoverWidth: 1.5,
- label: undefined,
- labelHighlightBold: true,
- length: undefined,
- physics: true,
- scaling:{
- min: 1,
- max: 15,
- label: {
- enabled: true,
- min: 14,
- max: 30,
- maxVisible: 30,
- drawThreshold: 5
- },
- customScalingFunction: function (min,max,total,value) {
- if (max === min) {
- return 0.5;
- }
- else {
- var scale = 1 / (max - min);
- return Math.max(0,(value - min)*scale);
- }
- }
- },
- selectionWidth: 1.5,
- selfReferenceSize:20,
- shadow:{
- enabled: false,
- color: 'rgba(0,0,0,0.5)',
- size:10,
- x:5,
- y:5
- },
- smooth: {
- enabled: true,
- type: "dynamic",
- forceDirection:'none',
- roundness: 0.5
- },
- title:undefined,
- width: 1,
- value: undefined
- };
- util.deepExtend(this.options, this.defaultOptions);
- this.bindEventListeners();
- }
-
- bindEventListeners() {
-
- this.body.emitter.on("_forceDisableDynamicCurves", (type, emit = true) => {
- if (type === 'dynamic') {
- type = 'continuous';
- }
- let dataChanged = false;
- for (let edgeId in this.body.edges) {
- if (this.body.edges.hasOwnProperty(edgeId)) {
- let edge = this.body.edges[edgeId];
- let edgeData = this.body.data.edges._data[edgeId];
-
-
- if (edgeData !== undefined) {
- let smoothOptions = edgeData.smooth;
- if (smoothOptions !== undefined) {
- if (smoothOptions.enabled === true && smoothOptions.type === 'dynamic') {
- if (type === undefined) {
- edge.setOptions({smooth: false});
- }
- else {
- edge.setOptions({smooth: {type: type}});
- }
- dataChanged = true;
- }
- }
- }
- }
- }
- if (emit === true && dataChanged === true) {
- this.body.emitter.emit("_dataChanged");
- }
- });
-
-
-
-
-
-
-
-
- this.body.emitter.on("_dataUpdated", () => {
- this.reconnectEdges();
- });
-
- this.body.emitter.on("refreshEdges", this.refresh.bind(this));
- this.body.emitter.on("refresh", this.refresh.bind(this));
- this.body.emitter.on("destroy", () => {
- util.forEach(this.edgesListeners, (callback, event) => {
- if (this.body.data.edges)
- this.body.data.edges.off(event, callback);
- });
- delete this.body.functions.createEdge;
- delete this.edgesListeners.add;
- delete this.edgesListeners.update;
- delete this.edgesListeners.remove;
- delete this.edgesListeners;
- });
- }
-
- setOptions(options) {
- if (options !== undefined) {
-
- Edge.parseOptions(this.options, options, true, this.defaultOptions, true);
-
- let dataChanged = false;
- if (options.smooth !== undefined) {
- for (let edgeId in this.body.edges) {
- if (this.body.edges.hasOwnProperty(edgeId)) {
- dataChanged = this.body.edges[edgeId].updateEdgeType() || dataChanged;
- }
- }
- }
-
- if (options.font !== undefined) {
- for (let edgeId in this.body.edges) {
- if (this.body.edges.hasOwnProperty(edgeId)) {
- this.body.edges[edgeId].updateLabelModule();
- }
- }
- }
-
- if (options.hidden !== undefined || options.physics !== undefined || dataChanged === true) {
- this.body.emitter.emit('_dataChanged');
- }
- }
- }
-
- setData(edges, doNotEmit = false) {
- var oldEdgesData = this.body.data.edges;
- if (edges instanceof DataSet || edges instanceof DataView) {
- this.body.data.edges = edges;
- }
- else if (Array.isArray(edges)) {
- this.body.data.edges = new DataSet();
- this.body.data.edges.add(edges);
- }
- else if (!edges) {
- this.body.data.edges = new DataSet();
- }
- else {
- throw new TypeError('Array or DataSet expected');
- }
-
- if (oldEdgesData) {
-
- util.forEach(this.edgesListeners, (callback, event) => {oldEdgesData.off(event, callback);});
- }
-
- this.body.edges = {};
-
- if (this.body.data.edges) {
-
- util.forEach(this.edgesListeners, (callback, event) => {this.body.data.edges.on(event, callback);});
-
- var ids = this.body.data.edges.getIds();
- this.add(ids, true);
- }
- this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
- if (doNotEmit === false) {
- this.body.emitter.emit("_dataChanged");
- }
- }
-
- add(ids, doNotEmit = false) {
- var edges = this.body.edges;
- var edgesData = this.body.data.edges;
- for (let i = 0; i < ids.length; i++) {
- var id = ids[i];
- var oldEdge = edges[id];
- if (oldEdge) {
- oldEdge.disconnect();
- }
- var data = edgesData.get(id, {"showInternalIds" : true});
- edges[id] = this.create(data);
- }
- this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
- if (doNotEmit === false) {
- this.body.emitter.emit("_dataChanged");
- }
- }
-
- update(ids) {
- var edges = this.body.edges;
- var edgesData = this.body.data.edges;
- var dataChanged = false;
- for (var i = 0; i < ids.length; i++) {
- var id = ids[i];
- var data = edgesData.get(id);
- var edge = edges[id];
- if (edge !== undefined) {
-
- edge.disconnect();
- dataChanged = edge.setOptions(data) || dataChanged;
- edge.connect();
- }
- else {
-
- this.body.edges[id] = this.create(data);
- dataChanged = true;
- }
- }
- if (dataChanged === true) {
- this.body.emitter.emit('_adjustEdgesForHierarchicalLayout');
- this.body.emitter.emit("_dataChanged");
- }
- else {
- this.body.emitter.emit("_dataUpdated");
- }
- }
-
- remove(ids, emit = true) {
- if (ids.length === 0) return;
- var edges = this.body.edges;
- util.forEach(ids, (id) => {
- var edge = edges[id];
- if (edge !== undefined) {
- edge.remove();
- }
- });
- if (emit) {
- this.body.emitter.emit("_dataChanged");
- }
- }
-
- refresh() {
- util.forEach(this.body.edges, (edge, edgeId) => {
- let data = this.body.data.edges._data[edgeId];
- if (data !== undefined) {
- edge.setOptions(data);
- }
- });
- }
-
- create(properties) {
- return new Edge(properties, this.body, this.options, this.defaultOptions)
- }
-
- reconnectEdges() {
- var id;
- var nodes = this.body.nodes;
- var edges = this.body.edges;
- for (id in nodes) {
- if (nodes.hasOwnProperty(id)) {
- nodes[id].edges = [];
- }
- }
- for (id in edges) {
- if (edges.hasOwnProperty(id)) {
- var edge = edges[id];
- edge.from = null;
- edge.to = null;
- edge.connect();
- }
- }
- }
-
- getConnectedNodes(edgeId) {
- let nodeList = [];
- if (this.body.edges[edgeId] !== undefined) {
- let edge = this.body.edges[edgeId];
- if (edge.fromId !== undefined) {nodeList.push(edge.fromId);}
- if (edge.toId !== undefined) {nodeList.push(edge.toId);}
- }
- return nodeList;
- }
-
- _updateState() {
- this._addMissingEdges();
- this._removeInvalidEdges();
- }
-
- _removeInvalidEdges() {
-
- let edgesToDelete = [];
- util.forEach(this.body.edges, (edge, id) => {
- let toNode = this.body.nodes[edge.toId];
- let fromNode = this.body.nodes[edge.fromId];
-
- if ((toNode !== undefined && toNode.isCluster === true)
- || (fromNode !== undefined && fromNode.isCluster === true)) {
- return;
- }
- if (toNode === undefined || fromNode === undefined) {
- edgesToDelete.push(id);
- }
- });
- this.remove(edgesToDelete, false);
- }
-
-
- _addMissingEdges() {
- let edges = this.body.edges;
- let edgesData = this.body.data.edges;
- let addIds = [];
- edgesData.forEach((edgeData, edgeId) => {
- let edge = edges[edgeId];
- if(edge===undefined) {
- addIds.push(edgeId);
- }
- });
-
- this.add(addIds,true);
- }
- }
- export default EdgesHandler;
|