vis.js is a dynamic, browser-based visualization library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
5.2 KiB

  1. /**
  2. * Created by Alex on 3/4/2015.
  3. */
  4. var util = require("../../util");
  5. var DataSet = require('../../DataSet');
  6. var DataView = require('../../DataView');
  7. var Edge = require("./components/edges/EdgeMain");
  8. class EdgesHandler {
  9. constructor(body, images, groups) {
  10. this.body = body;
  11. this.images = images;
  12. this.groups = groups;
  13. // create the edge API in the body container
  14. this.body.functions.createEdge = this.create.bind(this);
  15. this.edgesListeners = {
  16. 'add': (event, params) => {this.add(params.items);},
  17. 'update': (event, params) => {this.update(params.items);},
  18. 'remove': (event, params) => {this.remove(params.items);}
  19. };
  20. this.options = {};
  21. this.defaultOptions = {
  22. customScalingFunction: function (min,max,total,value) {
  23. if (max == min) {
  24. return 0.5;
  25. }
  26. else {
  27. var scale = 1 / (max - min);
  28. return Math.max(0,(value - min)*scale);
  29. }
  30. },
  31. style: {
  32. widthMin: 1, //
  33. widthMax: 15,//
  34. width: 1,
  35. widthSelectionMultiplier: 2,
  36. hoverWidth: 1.5,
  37. type: 'line',
  38. color: {
  39. color:'#848484',
  40. highlight:'#848484',
  41. hover: '#848484',
  42. inherit: {
  43. enabled: true,
  44. source: 'from', // from / true
  45. useGradients: false // release in 4.0
  46. }
  47. },
  48. opacity:1.0
  49. },
  50. value:1,
  51. label: undefined,
  52. labelStyle: {
  53. fontColor: '#343434',
  54. fontSize: 14, // px
  55. fontFace: 'arial',
  56. fontFill: 'white',
  57. fontStrokeWidth: 0, // px
  58. fontStrokeColor: 'white',
  59. labelAlignment:'horizontal'
  60. },
  61. length: undefined,
  62. arrowScaleFactor: 1,
  63. dash: {
  64. length: 10,
  65. gap: 5,
  66. altLength: undefined
  67. },
  68. smooth: {
  69. enabled: true,
  70. dynamic: true,
  71. type: "continuous",
  72. roundness: 0.5
  73. },
  74. hidden: false,
  75. physics: true
  76. };
  77. util.extend(this.options, this.defaultOptions);
  78. }
  79. setOptions(options) {
  80. }
  81. /**
  82. * Load edges by reading the data table
  83. * @param {Array | DataSet | DataView} edges The data containing the edges.
  84. * @private
  85. * @private
  86. */
  87. setData(edges) {
  88. var oldEdgesData = this.body.data.edges;
  89. if (edges instanceof DataSet || edges instanceof DataView) {
  90. this.body.data.edges = edges;
  91. }
  92. else if (Array.isArray(edges)) {
  93. this.body.data.edges = new DataSet();
  94. this.body.data.edges.add(edges);
  95. }
  96. else if (!edges) {
  97. this.body.data.edges = new DataSet();
  98. }
  99. else {
  100. throw new TypeError('Array or DataSet expected');
  101. }
  102. // TODO: is this null or undefined or false?
  103. if (oldEdgesData) {
  104. // unsubscribe from old dataset
  105. util.forEach(this.edgesListeners, (callback, event) => {oldEdgesData.off(event, callback);});
  106. }
  107. // remove drawn edges
  108. this.body.edges = {};
  109. // TODO: is this null or undefined or false?
  110. if (this.body.data.edges) {
  111. // subscribe to new dataset
  112. util.forEach(this.edgesListeners, (callback, event) => {this.body.data.edges.on(event, callback);});
  113. // draw all new nodes
  114. var ids = this.body.data.edges.getIds();
  115. this.add(ids);
  116. }
  117. this.body.emitter.emit("_dataChanged");
  118. }
  119. /**
  120. * Add edges
  121. * @param {Number[] | String[]} ids
  122. * @private
  123. */
  124. add(ids) {
  125. var edges = this.body.edges;
  126. var edgesData = this.body.data.edges;
  127. for (let i = 0; i < ids.length; i++) {
  128. var id = ids[i];
  129. var oldEdge = edges[id];
  130. if (oldEdge) {
  131. oldEdge.disconnect();
  132. }
  133. var data = edgesData.get(id, {"showInternalIds" : true});
  134. edges[id] = this.create(data);
  135. }
  136. this.body.emitter.emit("_dataChanged");
  137. }
  138. /**
  139. * Update existing edges, or create them when not yet existing
  140. * @param {Number[] | String[]} ids
  141. * @private
  142. */
  143. update(ids) {
  144. var edges = this.body.edges;
  145. var edgesData = this.body.data.edges;
  146. var dataChanged = false;
  147. for (var i = 0; i < ids.length; i++) {
  148. var id = ids[i];
  149. var data = edgesData.get(id);
  150. var edge = edges[id];
  151. if (edge === null) {
  152. // update edge
  153. edge.disconnect();
  154. edge.setOptions(data);
  155. edge.connect();
  156. }
  157. else {
  158. // create edge
  159. this.body.edges[id] = this.create(data);
  160. dataChanged = true;
  161. }
  162. }
  163. if (dataChanged === true) {
  164. this.body.emitter.emit("_dataChanged");
  165. }
  166. else {
  167. this.body.emitter.emit("_dataUpdated");
  168. }
  169. }
  170. /**
  171. * Remove existing edges. Non existing ids will be ignored
  172. * @param {Number[] | String[]} ids
  173. * @private
  174. */
  175. remove(ids) {
  176. var edges = this.body.edges;
  177. for (var i = 0; i < ids.length; i++) {
  178. var id = ids[i];
  179. var edge = edges[id];
  180. if (edge !== undefined) {
  181. if (edge.via != null) {
  182. delete this.body.supportNodes[edge.via.id];
  183. }
  184. edge.disconnect();
  185. delete edges[id];
  186. }
  187. }
  188. this.body.emitter.emit("_dataChanged");
  189. }
  190. create(properties) {
  191. return new Edge(properties, this.body, this.options)
  192. }
  193. }
  194. export default EdgesHandler;