orcasvn-react-diagrams 0.1.33 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -837,6 +837,9 @@ var EditorContext = /** @class */ (function () {
837
837
  get: function () {
838
838
  return this._elements;
839
839
  },
840
+ set: function (value) {
841
+ this._elements = value;
842
+ },
840
843
  enumerable: false,
841
844
  configurable: true
842
845
  });
@@ -844,6 +847,9 @@ var EditorContext = /** @class */ (function () {
844
847
  get: function () {
845
848
  return this._links;
846
849
  },
850
+ set: function (value) {
851
+ this._links = value;
852
+ },
847
853
  enumerable: false,
848
854
  configurable: true
849
855
  });
@@ -851,6 +857,9 @@ var EditorContext = /** @class */ (function () {
851
857
  get: function () {
852
858
  return this._texts;
853
859
  },
860
+ set: function (value) {
861
+ this._texts = value;
862
+ },
854
863
  enumerable: false,
855
864
  configurable: true
856
865
  });
@@ -858,6 +867,10 @@ var EditorContext = /** @class */ (function () {
858
867
  return this._elements.find(function (e) { return e.id === elementId; });
859
868
  };
860
869
  EditorContext.prototype.addElement = function (element) {
870
+ //check if element with the same id already exists
871
+ if (this._elements.find(function (e) { return e.id === element.id; })) {
872
+ throw new Error("Element with id ".concat(element.id, " already exists"));
873
+ }
861
874
  this._elements = __spreadArray(__spreadArray([], this._elements, true), [element], false);
862
875
  this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
863
876
  };
@@ -869,6 +882,10 @@ var EditorContext = /** @class */ (function () {
869
882
  return this._links.find(function (l) { return l.id === linkId; });
870
883
  };
871
884
  EditorContext.prototype.addLink = function (link) {
885
+ //check if link with the same id already exists
886
+ if (this._links.find(function (l) { return l.id === link.id; })) {
887
+ throw new Error("Link with id ".concat(link.id, " already exists"));
888
+ }
872
889
  this._links = __spreadArray(__spreadArray([], this._links, true), [link], false);
873
890
  this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
874
891
  };
@@ -880,6 +897,10 @@ var EditorContext = /** @class */ (function () {
880
897
  return this._texts.find(function (t) { return t.id === textId; });
881
898
  };
882
899
  EditorContext.prototype.addText = function (text) {
900
+ //check if text with the same id already exists
901
+ if (this._texts.find(function (t) { return t.id === text.id; })) {
902
+ throw new Error("Text with id ".concat(text.id, " already exists"));
903
+ }
883
904
  this._texts = __spreadArray(__spreadArray([], this._texts, true), [text], false);
884
905
  this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
885
906
  };
@@ -7621,13 +7642,15 @@ var generateSubstitutePosition = function (intersectedPosition, targetPosition,
7621
7642
  };
7622
7643
  }
7623
7644
  else {
7645
+ //Translate to the left of vertex 1
7624
7646
  var leftPosition = {
7625
- x: ele.position.x - translationOffset,
7626
- y: ele.position.y,
7647
+ x: vertex1Position.x - translationOffset,
7648
+ y: vertex1Position.y,
7627
7649
  };
7650
+ //Translate to the right of vertex 2
7628
7651
  var rightPosition = {
7629
- x: ele.position.x + ele.size.width + translationOffset,
7630
- y: ele.position.y,
7652
+ x: vertex2Position.x + translationOffset,
7653
+ y: vertex2Position.y,
7631
7654
  };
7632
7655
  replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition);
7633
7656
  }
@@ -7644,13 +7667,15 @@ var generateSubstitutePosition = function (intersectedPosition, targetPosition,
7644
7667
  };
7645
7668
  }
7646
7669
  else {
7670
+ //Translate to the left of vertex 4
7647
7671
  var leftPosition = {
7648
- x: ele.position.x - translationOffset,
7649
- y: ele.position.y + ele.size.height,
7672
+ x: vertex4Position.x - translationOffset,
7673
+ y: vertex4Position.y,
7650
7674
  };
7675
+ //Translate to the right of vertex 3
7651
7676
  var rightPosition = {
7652
- x: ele.position.x + ele.size.width + translationOffset,
7653
- y: ele.position.y + ele.size.height,
7677
+ x: vertex3Position.x + translationOffset,
7678
+ y: vertex3Position.y,
7654
7679
  };
7655
7680
  replacementPosition = findNearestPosition([leftPosition, rightPosition], targetPosition);
7656
7681
  }
@@ -7667,13 +7692,15 @@ var generateSubstitutePosition = function (intersectedPosition, targetPosition,
7667
7692
  };
7668
7693
  }
7669
7694
  else {
7695
+ //Translate to the top of vertex 1
7670
7696
  var topPosition = {
7671
- x: ele.position.x,
7672
- y: ele.position.y - translationOffset,
7697
+ x: vertex1Position.x,
7698
+ y: vertex1Position.y - translationOffset,
7673
7699
  };
7700
+ //Translate to the bottom of vertex 4
7674
7701
  var bottomPosition = {
7675
- x: ele.position.x,
7676
- y: ele.position.y + ele.size.height + translationOffset,
7702
+ x: vertex4Position.x,
7703
+ y: vertex4Position.y + translationOffset,
7677
7704
  };
7678
7705
  replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition);
7679
7706
  }
@@ -7690,13 +7717,15 @@ var generateSubstitutePosition = function (intersectedPosition, targetPosition,
7690
7717
  };
7691
7718
  }
7692
7719
  else {
7720
+ //Translate to the top of vertex 2
7693
7721
  var topPosition = {
7694
- x: ele.position.x + ele.size.width,
7695
- y: ele.position.y - translationOffset,
7722
+ x: vertex2Position.x,
7723
+ y: vertex2Position.y - translationOffset,
7696
7724
  };
7725
+ //Translate to the bottom of vertex 3
7697
7726
  var bottomPosition = {
7698
- x: ele.position.x + ele.size.width,
7699
- y: ele.position.y + ele.size.height + translationOffset,
7727
+ x: vertex3Position.x,
7728
+ y: vertex3Position.y + translationOffset,
7700
7729
  };
7701
7730
  replacementPosition = findNearestPosition([topPosition, bottomPosition], targetPosition);
7702
7731
  }
@@ -7711,23 +7740,38 @@ var getRelativePosition = function (clientPosition, relativeElement) {
7711
7740
  };
7712
7741
  };
7713
7742
  var getFourVertexesOfBBoxFromElement = function (element) {
7743
+ var absolutePosition = getAbsolutePosition(element);
7714
7744
  var vertex1Position = {
7715
- x: element.position.x,
7716
- y: element.position.y
7745
+ x: absolutePosition.x,
7746
+ y: absolutePosition.y
7717
7747
  };
7718
7748
  var vertex2Position = {
7719
- x: element.position.x + element.size.width,
7720
- y: element.position.y
7749
+ x: absolutePosition.x + element.size.width,
7750
+ y: absolutePosition.y
7721
7751
  };
7722
7752
  var vertex3Position = {
7723
- x: element.position.x + element.size.width,
7724
- y: element.position.y + element.size.height
7753
+ x: absolutePosition.x + element.size.width,
7754
+ y: absolutePosition.y + element.size.height
7725
7755
  };
7726
7756
  var vertex4Position = {
7727
- x: element.position.x,
7728
- y: element.position.y + element.size.height
7757
+ x: absolutePosition.x,
7758
+ y: absolutePosition.y + element.size.height
7729
7759
  };
7730
7760
  return [vertex1Position, vertex2Position, vertex3Position, vertex4Position];
7761
+ };
7762
+ //get absolute position of element
7763
+ var getAbsolutePosition = function (element) {
7764
+ var parentElement = element.parentElement;
7765
+ if (!parentElement) {
7766
+ return __assign({}, element.position);
7767
+ }
7768
+ var absoluteParentElement = getAbsolutePosition(parentElement);
7769
+ var x = element.position.x + absoluteParentElement.x;
7770
+ var y = element.position.y + absoluteParentElement.y;
7771
+ return {
7772
+ x: x,
7773
+ y: y,
7774
+ };
7731
7775
  };
7732
7776
 
7733
7777
  var makerStart = React.createElement("circle", { cx: 10, cy: 10, r: 10, fill: "blue" });
@@ -8059,22 +8103,12 @@ var Element = function (props) {
8059
8103
  var elementRef = React.useRef(null);
8060
8104
  var elementLinkStarted = React.useRef();
8061
8105
  var portsRef = React.useRef(ports);
8062
- React.useEffect(function () {
8063
- console.log('changed props.children', texts === null || texts === void 0 ? void 0 : texts[0].content);
8064
- }, [props.children]);
8065
- React.useEffect(function () {
8066
- return function () {
8067
- var _a;
8068
- console.log('un mount', (_a = texts === null || texts === void 0 ? void 0 : texts[0]) === null || _a === void 0 ? void 0 : _a.content);
8069
- };
8070
- }, []);
8071
8106
  //Listen to manually trigger render event
8072
8107
  React.useEffect(function () {
8073
8108
  var _a;
8074
8109
  var off = (_a = props.onManuallyTriggerRenderPort) === null || _a === void 0 ? void 0 : _a.call(props, function (portId, elementId) {
8075
8110
  if (elementId !== id)
8076
8111
  return;
8077
- console.log('onManuallyTriggerRenderPort', id);
8078
8112
  setPorts(function (prev) { return __spreadArray([], prev, true); });
8079
8113
  });
8080
8114
  return function () {
@@ -8728,6 +8762,59 @@ function useKeyboardCommands(_a) {
8728
8762
  }, [element]);
8729
8763
  }
8730
8764
 
8765
+ //Automatically add points on the link so that the link does not cross elements, default maximum 10 points
8766
+ var automationAddPointsToLink = function (eleLink, elements, limitPoint) {
8767
+ if (!eleLink.targetElement || !eleLink.targetPort) {
8768
+ throw new Error("Target element is not found in element link");
8769
+ }
8770
+ var sourceElement = eleLink.sourceElement, sourcePort = eleLink.sourcePort, targetElement = eleLink.targetElement, targetPort = eleLink.targetPort;
8771
+ var absolutePositionOfSourceEle = getAbsolutePosition(sourceElement);
8772
+ var absolutePositionOfTargetEle = getAbsolutePosition(targetElement);
8773
+ var sourcePosition = {
8774
+ x: absolutePositionOfSourceEle.x + sourcePort.position.x,
8775
+ y: absolutePositionOfSourceEle.y + sourcePort.position.y
8776
+ };
8777
+ var targetPosition = {
8778
+ x: absolutePositionOfTargetEle.x + targetPort.position.x,
8779
+ y: absolutePositionOfTargetEle.y + targetPort.position.y
8780
+ };
8781
+ var fourVertexesOfSourceEleBBox = getFourVertexesOfBBoxFromElement(sourceElement);
8782
+ var fourVertexesOfTargetEleBBox = getFourVertexesOfBBoxFromElement(targetElement);
8783
+ var projectedSourcePositionOnBBox = findNearestProjectedPoint(sourcePosition, [
8784
+ [fourVertexesOfSourceEleBBox[0], fourVertexesOfSourceEleBBox[1]],
8785
+ [fourVertexesOfSourceEleBBox[1], fourVertexesOfSourceEleBBox[2]],
8786
+ [fourVertexesOfSourceEleBBox[2], fourVertexesOfSourceEleBBox[3]],
8787
+ [fourVertexesOfSourceEleBBox[3], fourVertexesOfSourceEleBBox[0]],
8788
+ ]);
8789
+ var projectedTargetPositionOnBBox = findNearestProjectedPoint(targetPosition, [
8790
+ [fourVertexesOfTargetEleBBox[0], fourVertexesOfTargetEleBBox[1]],
8791
+ [fourVertexesOfTargetEleBBox[1], fourVertexesOfTargetEleBBox[2]],
8792
+ [fourVertexesOfTargetEleBBox[2], fourVertexesOfTargetEleBBox[3]],
8793
+ [fourVertexesOfTargetEleBBox[3], fourVertexesOfTargetEleBBox[0]],
8794
+ ]);
8795
+ var numberOfPoints = 0;
8796
+ //create points between the start and end points, to create a line segment that passes through the points without intersecting the elements
8797
+ function generatePositions(sourcePosition, targetPosition, elements) {
8798
+ var firstIntersection = getFirstIntersection(sourcePosition, targetPosition, elements);
8799
+ //If there is no intersection point, then the line connecting the two points does not intersect any element.
8800
+ if (!firstIntersection || limitPoint === numberOfPoints)
8801
+ return [];
8802
+ var nearestIntersection = firstIntersection.nearestIntersection; firstIntersection.intersectionPointsList; var intersectedElement = firstIntersection.element;
8803
+ //Calculate to create a replacement point
8804
+ var replacementPosition = generateSubstitutePosition(nearestIntersection, targetPosition, intersectedElement);
8805
+ //Increases the number of points found by 1
8806
+ numberOfPoints += 1;
8807
+ //Create points with the starting point being the sourcePosition and the ending point being the newly created point
8808
+ var prependedPoints = generatePositions(sourcePosition, replacementPosition, elements);
8809
+ //Create points with the starting point being the new newly created point and the ending point being the targetPosition
8810
+ var appendedPoints = generatePositions(replacementPosition, targetPosition, elements);
8811
+ return __spreadArray(__spreadArray(__spreadArray([], prependedPoints, true), [replacementPosition], false), appendedPoints, true);
8812
+ }
8813
+ var points = generatePositions(projectedSourcePositionOnBBox, projectedTargetPositionOnBBox, elements);
8814
+ eleLink.points = points;
8815
+ return eleLink;
8816
+ };
8817
+
8731
8818
  function convertElementsToTree(elements) {
8732
8819
  //Find child elements in the child elements, that is possible child of element, then return element with child of it.
8733
8820
  function findChildElementsOfNode(elementNodeInTree, possibleChildElements) {
@@ -8738,11 +8825,6 @@ function convertElementsToTree(elements) {
8738
8825
  var foundChildElements = possibleChildElements.filter(function (ele) { var _a; return ((_a = ele.parentElement) === null || _a === void 0 ? void 0 : _a.id) === elementNodeInTree.id; });
8739
8826
  var orphanedElements = possibleChildElements.filter(function (ele) { var _a; return ((_a = ele.parentElement) === null || _a === void 0 ? void 0 : _a.id) !== elementNodeInTree.id; });
8740
8827
  var childElementsWithChild = foundChildElements.map(function (_elementNodeInTree) {
8741
- var relativePosition = {
8742
- x: _elementNodeInTree.position.x - elementNodeInTree.position.x,
8743
- y: _elementNodeInTree.position.y - elementNodeInTree.position.y,
8744
- };
8745
- _elementNodeInTree.relativePosition = relativePosition;
8746
8828
  var newNode = findChildElementsOfNode(_elementNodeInTree, orphanedElements);
8747
8829
  return newNode;
8748
8830
  });
@@ -8752,7 +8834,6 @@ function convertElementsToTree(elements) {
8752
8834
  var parentElms = elements.filter(function (e) { return !e.parentElement; });
8753
8835
  var childElms = elements.filter(function (e) { return e.parentElement; });
8754
8836
  var parsedElementsInTree = parentElms.map(function (ele) {
8755
- ele.relativePosition = ele.position;
8756
8837
  var eleWithChild = findChildElementsOfNode(ele, childElms);
8757
8838
  return eleWithChild;
8758
8839
  });
@@ -8773,10 +8854,9 @@ var Paper = function (props) {
8773
8854
  var paperContainerRef = React.useRef(null);
8774
8855
  var tempLinkRef = React.useRef(tempLink); //Cache tempLink to avoid re-render when tempLink changed
8775
8856
  var elementsRef = React.useRef(elements); //Cache elements to avoid re-render when elements changed
8857
+ var linksRef = React.useRef(links); //Cache links to avoid re-render when links changed
8858
+ var textsRef = React.useRef(texts); //Cache texts to avoid re-render when texts changed
8776
8859
  var size = props.size;
8777
- React.useEffect(function () {
8778
- console.log('Render Paper');
8779
- });
8780
8860
  React.useEffect(function () {
8781
8861
  setElements(props.elements);
8782
8862
  }, [props.elements]);
@@ -8788,17 +8868,27 @@ var Paper = function (props) {
8788
8868
  }, [props.texts]);
8789
8869
  React.useEffect(function () {
8790
8870
  var off = props.onManuallyTriggerRenderElement(function (elementId) {
8791
- console.log('onManuallyTriggerRenderElement');
8792
- setElements(function (prev) { return __spreadArray([], prev, true); });
8871
+ setElements(__spreadArray([], elements, true));
8872
+ if (props.onElementsChanged) {
8873
+ props.onElementsChanged(__spreadArray([], elements, true));
8874
+ }
8793
8875
  });
8794
8876
  return function () {
8795
8877
  off();
8796
8878
  };
8797
- }, [props.onManuallyTriggerRenderElement]);
8879
+ }, [props.onManuallyTriggerRenderElement, props.onElementsChanged, elements]);
8798
8880
  //Cache elements to avoid re-render when elements changed
8799
8881
  React.useEffect(function () {
8800
8882
  elementsRef.current = elements;
8801
8883
  }, [elements]);
8884
+ //Cache links to avoid re-render when links changed
8885
+ React.useEffect(function () {
8886
+ linksRef.current = links;
8887
+ }, [links]);
8888
+ //Cache texts to avoid re-render when texts changed
8889
+ React.useEffect(function () {
8890
+ textsRef.current = texts;
8891
+ }, [texts]);
8802
8892
  useKeyboardCommands({
8803
8893
  element: paperContainerRef.current
8804
8894
  });
@@ -8846,7 +8936,6 @@ var Paper = function (props) {
8846
8936
  var parentChangedCancelers = elementsRef.current.map(function (element) {
8847
8937
  var _a;
8848
8938
  return (_a = element.onParentChanged) === null || _a === void 0 ? void 0 : _a.call(element, function (newPa, oldPa) {
8849
- console.log('onParentChanged');
8850
8939
  updateElementsTree();
8851
8940
  });
8852
8941
  });
@@ -8855,13 +8944,18 @@ var Paper = function (props) {
8855
8944
  var _a;
8856
8945
  return (_a = element.onAddedPort) === null || _a === void 0 ? void 0 : _a.call(element, function (newPort) {
8857
8946
  console.log("A new port has been added to element ".concat(element.id));
8858
- //Set state to re-render component
8859
- setElements(function (prev) { return prev.map(function (ele) {
8947
+ var prevElements = elementsRef.current;
8948
+ var newElements = prevElements.map(function (ele) {
8860
8949
  if (ele.id === element.id) {
8861
8950
  ele.ports = __spreadArray([], (ele.ports || []), true);
8862
8951
  }
8863
8952
  return ele;
8864
- }); });
8953
+ });
8954
+ //Set state to re-render component
8955
+ setElements(newElements);
8956
+ if (props.onElementsChanged) {
8957
+ props.onElementsChanged(newElements);
8958
+ }
8865
8959
  });
8866
8960
  });
8867
8961
  return function () {
@@ -8890,8 +8984,20 @@ var Paper = function (props) {
8890
8984
  if (selectedElement) {
8891
8985
  var deletedChildElements = getDeletedChildElements(selectedElement);
8892
8986
  var deletedElementIds_1 = __spreadArray(__spreadArray([], deletedChildElements, true), [selectedElement], false).map(function (e) { return e.id; });
8893
- setElements(function (prev) { return prev.filter(function (e) { return !deletedElementIds_1.includes(e.id); }); });
8894
- setLinks(function (prevLinks) { return prevLinks.filter(function (l) { return !deletedElementIds_1.includes(l.sourceElement.id) && !deletedElementIds_1.includes(l.targetElement.id); }); });
8987
+ var prevElements = elementsRef.current;
8988
+ var newElements = prevElements.filter(function (e) { return !deletedElementIds_1.includes(e.id); });
8989
+ //Set state to re-render component
8990
+ setElements(newElements);
8991
+ if (props.onElementsChanged) {
8992
+ props.onElementsChanged(newElements);
8993
+ }
8994
+ //Update links
8995
+ var prevLinks = linksRef.current;
8996
+ var newLinks = prevLinks.filter(function (l) { return !deletedElementIds_1.includes(l.sourceElement.id) && !deletedElementIds_1.includes(l.targetElement.id); });
8997
+ setLinks(newLinks);
8998
+ if (props.onLinksChanged) {
8999
+ props.onLinksChanged(newLinks);
9000
+ }
8895
9001
  setSelectedElement(undefined);
8896
9002
  setSelectedElementSVG(null);
8897
9003
  }
@@ -8903,14 +9009,19 @@ var Paper = function (props) {
8903
9009
  return function () {
8904
9010
  listener.off();
8905
9011
  };
8906
- }, [selectedElement]);
9012
+ }, [selectedElement, props.onElementsChanged]);
8907
9013
  //Listen command delete selected for link
8908
9014
  React.useEffect(function () {
8909
9015
  var _a;
8910
9016
  var listener = paperEventEmitter.onCommandDeleteSelectedLink(function () {
8911
9017
  if (selectedLink) {
8912
- setLinks(function (prev) { return prev.filter(function (l) { return l.id !== selectedLink.id; }); });
9018
+ var prevLinks = linksRef.current;
9019
+ var newLinks = prevLinks.filter(function (l) { return l.id !== selectedLink.id; });
9020
+ setLinks(links);
8913
9021
  setSelectedLink(undefined);
9022
+ if (props.onLinksChanged) {
9023
+ props.onLinksChanged(newLinks);
9024
+ }
8914
9025
  }
8915
9026
  });
8916
9027
  //broadcast selected link to parent component
@@ -8920,13 +9031,18 @@ var Paper = function (props) {
8920
9031
  return function () {
8921
9032
  listener.off();
8922
9033
  };
8923
- }, [selectedLink]);
9034
+ }, [selectedLink, props.onLinksChanged]);
8924
9035
  //Listen command delete selected for Text
8925
9036
  React.useEffect(function () {
8926
9037
  var _a;
8927
9038
  var listener = paperEventEmitter.onCommandDeleteSelectedText(function () {
8928
9039
  if (selectedText) {
8929
- setTexts(function (prev) { return prev.filter(function (t) { return t.id !== selectedText.id; }); });
9040
+ var prevTexts = textsRef.current;
9041
+ var newTexts = prevTexts.filter(function (t) { return t.id !== selectedText.id; });
9042
+ setTexts(newTexts);
9043
+ if (props.onTextsChanged) {
9044
+ props.onTextsChanged(newTexts);
9045
+ }
8930
9046
  setSelectedText(undefined);
8931
9047
  }
8932
9048
  });
@@ -8937,58 +9053,7 @@ var Paper = function (props) {
8937
9053
  return function () {
8938
9054
  listener.off();
8939
9055
  };
8940
- }, [selectedText]);
8941
- //Automatically add points on the link so that the link does not cross elements, default maximum 10 points
8942
- var automationAddPointsToLink = React.useCallback(function (eleLink, limitPoint) {
8943
- if (limitPoint === void 0) { limitPoint = 10; }
8944
- if (!eleLink.targetElement) {
8945
- throw new Error("Target element is not found in element link");
8946
- }
8947
- var sourceElement = eleLink.sourceElement, sourcePort = eleLink.sourcePort, targetElement = eleLink.targetElement, targetPort = eleLink.targetPort;
8948
- var sourcePosition = {
8949
- x: sourceElement.position.x + sourcePort.position.x,
8950
- y: sourceElement.position.y + sourcePort.position.y
8951
- };
8952
- var targetPosition = {
8953
- x: targetElement.position.x + targetPort.position.x,
8954
- y: targetElement.position.y + targetPort.position.y
8955
- };
8956
- var fourVertexesOfSourceEleBBox = getFourVertexesOfBBoxFromElement(sourceElement);
8957
- var fourVertexesOfTargetEleBBox = getFourVertexesOfBBoxFromElement(targetElement);
8958
- var projectedSourcePositionOnBBox = findNearestProjectedPoint(sourcePosition, [
8959
- [fourVertexesOfSourceEleBBox[0], fourVertexesOfSourceEleBBox[1]],
8960
- [fourVertexesOfSourceEleBBox[1], fourVertexesOfSourceEleBBox[2]],
8961
- [fourVertexesOfSourceEleBBox[2], fourVertexesOfSourceEleBBox[3]],
8962
- [fourVertexesOfSourceEleBBox[3], fourVertexesOfSourceEleBBox[0]],
8963
- ]);
8964
- var projectedTargetPositionOnBBox = findNearestProjectedPoint(targetPosition, [
8965
- [fourVertexesOfTargetEleBBox[0], fourVertexesOfTargetEleBBox[1]],
8966
- [fourVertexesOfTargetEleBBox[1], fourVertexesOfTargetEleBBox[2]],
8967
- [fourVertexesOfTargetEleBBox[2], fourVertexesOfTargetEleBBox[3]],
8968
- [fourVertexesOfTargetEleBBox[3], fourVertexesOfTargetEleBBox[0]],
8969
- ]);
8970
- var numberOfPoints = 0;
8971
- //create points between the start and end points, to create a line segment that passes through the points without intersecting the elements
8972
- function generatePositions(sourcePosition, targetPosition, elements) {
8973
- var firstIntersection = getFirstIntersection(sourcePosition, targetPosition, elements);
8974
- //If there is no intersection point, then the line connecting the two points does not intersect any element.
8975
- if (!firstIntersection || limitPoint === numberOfPoints)
8976
- return [];
8977
- var nearestIntersection = firstIntersection.nearestIntersection; firstIntersection.intersectionPointsList; var intersectedElement = firstIntersection.element;
8978
- //Calculate to create a replacement point
8979
- var replacementPosition = generateSubstitutePosition(nearestIntersection, targetPosition, intersectedElement);
8980
- //Increases the number of points found by 1
8981
- numberOfPoints += 1;
8982
- //Create points with the starting point being the sourcePosition and the ending point being the newly created point
8983
- var prependedPoints = generatePositions(sourcePosition, replacementPosition, elements);
8984
- //Create points with the starting point being the new newly created point and the ending point being the targetPosition
8985
- var appendedPoints = generatePositions(replacementPosition, targetPosition, elements);
8986
- return __spreadArray(__spreadArray(__spreadArray([], prependedPoints, true), [replacementPosition], false), appendedPoints, true);
8987
- }
8988
- var elements = elementsRef.current;
8989
- var points = generatePositions(projectedSourcePositionOnBBox, projectedTargetPositionOnBBox, elements);
8990
- return __assign(__assign({}, eleLink), { points: points });
8991
- }, []);
9056
+ }, [selectedText, props.onTextsChanged]);
8992
9057
  var handlePaperMouseMove = function (ev) {
8993
9058
  var _a;
8994
9059
  //if there is a temp link, update the temp target point
@@ -9053,17 +9118,22 @@ var Paper = function (props) {
9053
9118
  };
9054
9119
  var handlePathChange = React.useCallback(function (path, id) {
9055
9120
  //Update path of element link, that changed
9056
- setLinks(function (prevLinks) {
9057
- var updatedLinkIndex = prevLinks.findIndex(function (l) { return l.id === id; });
9058
- prevLinks[updatedLinkIndex].path = path;
9059
- return __spreadArray([], prevLinks, true);
9060
- });
9061
- }, []);
9121
+ // const prevLinks = linksRef.current;
9122
+ var updatedLinkIndex = links.findIndex(function (l) { return l.id === id; });
9123
+ links[updatedLinkIndex].path = path;
9124
+ var newLinks = __spreadArray([], links, true);
9125
+ setLinks(newLinks);
9126
+ if (props.onLinksChanged) {
9127
+ props.onLinksChanged(newLinks);
9128
+ }
9129
+ }, [props.onLinksChanged, links]);
9062
9130
  var handlePortMoved = React.useCallback(function (port, elementId, oldPosition, newPosition) {
9131
+ var _a;
9063
9132
  var element = elementsRef.current.find(function (e) { return e.id === elementId; });
9064
9133
  if (element) {
9065
9134
  //set links equals a clone links to re-render links with new position
9066
- setLinks(function (prev) { return prev.map(function (link) {
9135
+ var prevLinks = linksRef.current;
9136
+ var newLinks = prevLinks.map(function (link) {
9067
9137
  var _a, _b;
9068
9138
  if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {
9069
9139
  link.sourcePort.position = newPosition;
@@ -9072,24 +9142,30 @@ var Paper = function (props) {
9072
9142
  link.targetPort.position = newPosition;
9073
9143
  }
9074
9144
  return link;
9075
- }); });
9076
- //Update port position in element, not re-render
9077
- setElements(function (prevElements) {
9078
- var _a;
9079
- var updatedElementIndex = prevElements.findIndex(function (e) { return e.id === elementId; });
9080
- prevElements[updatedElementIndex].ports = (_a = prevElements[updatedElementIndex].ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
9081
- if (p.id === port.id) {
9082
- p.position = newPosition;
9083
- }
9084
- return p;
9085
- });
9086
- return prevElements;
9087
9145
  });
9146
+ setLinks(newLinks);
9147
+ if (props.onLinksChanged) {
9148
+ props.onLinksChanged(newLinks);
9149
+ }
9150
+ var newElements = elementsRef.current;
9151
+ var updatedElementIndex = newElements.findIndex(function (e) { return e.id === elementId; });
9152
+ newElements[updatedElementIndex].ports = (_a = newElements[updatedElementIndex].ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
9153
+ if (p.id === port.id) {
9154
+ p.position = newPosition;
9155
+ }
9156
+ return p;
9157
+ });
9158
+ //Update port position in element, not re-render
9159
+ //To avoid re-render
9160
+ setElements(newElements);
9161
+ if (props.onElementsChanged) {
9162
+ props.onElementsChanged(newElements);
9163
+ }
9088
9164
  if (props.onPortMoved) {
9089
9165
  props.onPortMoved(newPosition, port, element);
9090
9166
  }
9091
9167
  }
9092
- }, [props.onPortMoved]);
9168
+ }, [props.onPortMoved, props.onElementsChanged, props.onLinksChanged]);
9093
9169
  //Handle creating a new element link
9094
9170
  var handlePortMouseDown = React.useCallback(function (ev, port, elementId) {
9095
9171
  var _a;
@@ -9121,10 +9197,11 @@ var Paper = function (props) {
9121
9197
  return null;
9122
9198
  //Automatic bending, if is not defined points
9123
9199
  if (!newElementLink.points || newElementLink.points.length === 0) {
9124
- newElementLink = automationAddPointsToLink(newElementLink, MAX_LINK_KNOT_COUNT);
9200
+ var elements_1 = elementsRef.current;
9201
+ newElementLink = automationAddPointsToLink(newElementLink, elements_1, MAX_LINK_KNOT_COUNT);
9125
9202
  }
9126
9203
  return newElementLink;
9127
- }, [props.onCreatingLink, automationAddPointsToLink]);
9204
+ }, [props.onCreatingLink]);
9128
9205
  var handlePortMouseUp = React.useCallback(function (ev, port, elementId) {
9129
9206
  var _a;
9130
9207
  ev.stopPropagation();
@@ -9137,112 +9214,123 @@ var Paper = function (props) {
9137
9214
  if (tempLinkRef.current) {
9138
9215
  //Check if mouse up point is mouse down point or not
9139
9216
  var isMouseUpOnNotSelf = tempLinkRef.current.sourcePort.id !== port.id || tempLinkRef.current.sourceElement.id !== elementId;
9140
- var newElementLink_1 = null;
9217
+ var newElementLink = null;
9141
9218
  if (isMouseUpOnNotSelf) {
9142
9219
  var _b = tempLinkRef.current, sourcePort = _b.sourcePort, sourceElement = _b.sourceElement;
9143
9220
  var targetElement = elementsRef.current.find(function (e) { return e.id === elementId; });
9144
- newElementLink_1 = createElementLink(sourcePort, sourceElement, port, targetElement);
9221
+ newElementLink = createElementLink(sourcePort, sourceElement, port, targetElement);
9145
9222
  }
9146
- if (newElementLink_1) {
9147
- setLinks(function (prev) { return __spreadArray(__spreadArray([], prev, true), [newElementLink_1], false); });
9148
- paperEventEmitter.emitElementLinkEnded(newElementLink_1);
9223
+ if (newElementLink) {
9224
+ var prevLinks = linksRef.current;
9225
+ var newLinks = __spreadArray(__spreadArray([], prevLinks, true), [newElementLink], false);
9226
+ setLinks(newLinks);
9227
+ if (props.onLinksChanged) {
9228
+ props.onLinksChanged(newLinks);
9229
+ }
9230
+ paperEventEmitter.emitElementLinkEnded(newElementLink);
9149
9231
  }
9150
9232
  else {
9151
9233
  paperEventEmitter.emitElementLinkEnded();
9152
9234
  }
9153
9235
  setTempLink(null);
9154
9236
  }
9155
- }, [paperEventEmitter, createElementLink, props.onPortMouseUp]);
9237
+ }, [paperEventEmitter, createElementLink, props.onPortMouseUp, props.onLinksChanged]);
9156
9238
  var handleLinkLabelMoved = React.useCallback(function (offsetX, offsetY, index, labelType) {
9157
- setLinks(function (prevLinks) {
9158
- var newLinks = __spreadArray([], prevLinks, true);
9159
- var currentLink = newLinks[index];
9160
- switch (labelType) {
9161
- case 'middle': {
9162
- var oldPosition = currentLink.label.position || LINK_LABEL_POSITION_FROM_LINK_MID_POINT;
9163
- var newPosition = {
9164
- x: oldPosition.x + offsetX,
9165
- y: oldPosition.y + offsetY,
9166
- };
9167
- currentLink.label.position = newPosition;
9168
- break;
9169
- }
9170
- case 'source': {
9171
- var oldPosition = currentLink.sourceLabel.position || LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT;
9172
- var newPosition = {
9173
- x: oldPosition.x + offsetX,
9174
- y: oldPosition.y + offsetY,
9175
- };
9176
- currentLink.sourceLabel.position = newPosition;
9177
- break;
9178
- }
9179
- case 'target': {
9180
- var oldPosition = currentLink.targetLabel.position || LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT;
9181
- var newPosition = {
9182
- x: oldPosition.x + offsetX,
9183
- y: oldPosition.y + offsetY,
9184
- };
9185
- currentLink.targetLabel.position = newPosition;
9186
- break;
9187
- }
9239
+ var prevLinks = linksRef.current;
9240
+ var newLinks = __spreadArray([], prevLinks, true);
9241
+ var currentLink = newLinks[index];
9242
+ switch (labelType) {
9243
+ case 'middle': {
9244
+ var oldPosition = currentLink.label.position || LINK_LABEL_POSITION_FROM_LINK_MID_POINT;
9245
+ var newPosition = {
9246
+ x: oldPosition.x + offsetX,
9247
+ y: oldPosition.y + offsetY,
9248
+ };
9249
+ currentLink.label.position = newPosition;
9250
+ break;
9188
9251
  }
9189
- return newLinks;
9190
- });
9191
- }, []);
9252
+ case 'source': {
9253
+ var oldPosition = currentLink.sourceLabel.position || LINK_SOURCE_LABEL_POSITION_FROM_SOURCE_PORT;
9254
+ var newPosition = {
9255
+ x: oldPosition.x + offsetX,
9256
+ y: oldPosition.y + offsetY,
9257
+ };
9258
+ currentLink.sourceLabel.position = newPosition;
9259
+ break;
9260
+ }
9261
+ case 'target': {
9262
+ var oldPosition = currentLink.targetLabel.position || LINK_TARGET_LABEL_POSITION_FROM_TARGET_PORT;
9263
+ var newPosition = {
9264
+ x: oldPosition.x + offsetX,
9265
+ y: oldPosition.y + offsetY,
9266
+ };
9267
+ currentLink.targetLabel.position = newPosition;
9268
+ break;
9269
+ }
9270
+ }
9271
+ setLinks(newLinks);
9272
+ if (props.onLinksChanged) {
9273
+ props.onLinksChanged(newLinks);
9274
+ }
9275
+ }, [props.onLinksChanged]);
9192
9276
  var handleLinkLabelResized = React.useCallback(function (width, height, index, labelType) {
9193
- setLinks(function (prevLinks) {
9194
- var newLinks = __spreadArray([], prevLinks, true);
9195
- var currentLink = newLinks[index];
9196
- switch (labelType) {
9197
- case 'middle': {
9198
- var newSize = {
9199
- width: width,
9200
- height: height,
9201
- };
9202
- currentLink.label.size = newSize;
9203
- break;
9204
- }
9205
- case 'source': {
9206
- var newSize = {
9207
- width: width,
9208
- height: height,
9209
- };
9210
- currentLink.sourceLabel.size = newSize;
9211
- break;
9212
- }
9213
- case 'target': {
9214
- var newSize = {
9215
- width: width,
9216
- height: height,
9217
- };
9218
- currentLink.targetLabel.size = newSize;
9219
- break;
9220
- }
9277
+ var prevLinks = linksRef.current;
9278
+ var newLinks = __spreadArray([], prevLinks, true);
9279
+ var currentLink = newLinks[index];
9280
+ switch (labelType) {
9281
+ case 'middle': {
9282
+ var newSize = {
9283
+ width: width,
9284
+ height: height,
9285
+ };
9286
+ currentLink.label.size = newSize;
9287
+ break;
9221
9288
  }
9222
- return newLinks;
9223
- });
9224
- }, []);
9289
+ case 'source': {
9290
+ var newSize = {
9291
+ width: width,
9292
+ height: height,
9293
+ };
9294
+ currentLink.sourceLabel.size = newSize;
9295
+ break;
9296
+ }
9297
+ case 'target': {
9298
+ var newSize = {
9299
+ width: width,
9300
+ height: height,
9301
+ };
9302
+ currentLink.targetLabel.size = newSize;
9303
+ break;
9304
+ }
9305
+ }
9306
+ setLinks(newLinks);
9307
+ if (props.onLinksChanged) {
9308
+ props.onLinksChanged(newLinks);
9309
+ }
9310
+ }, [props.onLinksChanged]);
9225
9311
  var handleLinkLabelContentChanged = React.useCallback(function (newValue, index, labelType) {
9226
- setLinks(function (prevLinks) {
9227
- var newLinks = __spreadArray([], prevLinks, true);
9228
- var currentLink = newLinks[index];
9229
- switch (labelType) {
9230
- case 'middle': {
9231
- currentLink.label.content = newValue;
9232
- break;
9233
- }
9234
- case 'source': {
9235
- currentLink.sourceLabel.content = newValue;
9236
- break;
9237
- }
9238
- case 'target': {
9239
- currentLink.targetLabel.content = newValue;
9240
- break;
9241
- }
9312
+ var prevLinks = linksRef.current;
9313
+ var newLinks = __spreadArray([], prevLinks, true);
9314
+ var currentLink = newLinks[index];
9315
+ switch (labelType) {
9316
+ case 'middle': {
9317
+ currentLink.label.content = newValue;
9318
+ break;
9242
9319
  }
9243
- return newLinks;
9244
- });
9245
- }, []);
9320
+ case 'source': {
9321
+ currentLink.sourceLabel.content = newValue;
9322
+ break;
9323
+ }
9324
+ case 'target': {
9325
+ currentLink.targetLabel.content = newValue;
9326
+ break;
9327
+ }
9328
+ }
9329
+ setLinks(newLinks);
9330
+ if (props.onLinksChanged) {
9331
+ props.onLinksChanged(newLinks);
9332
+ }
9333
+ }, [props.onLinksChanged]);
9246
9334
  var handleSelectLink = function (link, index) {
9247
9335
  setSelectedLink(link);
9248
9336
  };
@@ -9253,9 +9341,6 @@ var Paper = function (props) {
9253
9341
  var updateElementPosition = function (element, movementX, movementY) {
9254
9342
  element.position.x += movementX;
9255
9343
  element.position.y += movementY;
9256
- if (element.childrenElementsInTree && element.childrenElementsInTree.length > 0) {
9257
- element.childrenElementsInTree = element.childrenElementsInTree.map(function (child) { return updateElementPosition(child, movementX, movementY); });
9258
- }
9259
9344
  return element;
9260
9345
  };
9261
9346
  //use selection frame
@@ -9274,10 +9359,6 @@ var Paper = function (props) {
9274
9359
  return;
9275
9360
  var oldPosition = __assign({}, selectedElement.position);
9276
9361
  var newElementPosition = updateElementPosition(selectedElement, offsetX, offsetY);
9277
- newElementPosition.relativePosition = {
9278
- x: newElementPosition.relativePosition.x + offsetX,
9279
- y: newElementPosition.relativePosition.y + offsetY
9280
- };
9281
9362
  var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9282
9363
  //Set state to re-render UI with new position
9283
9364
  setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
@@ -9294,7 +9375,11 @@ var Paper = function (props) {
9294
9375
  var oldSize = selectedElement.size;
9295
9376
  var newSize = { width: width, height: height };
9296
9377
  elements[indexSelectedElement].size = newSize;
9297
- setElements(__spreadArray([], elements, true));
9378
+ var newElements = __spreadArray([], elements, true);
9379
+ setElements(newElements);
9380
+ if (props.onElementsChanged) {
9381
+ props.onElementsChanged(newElements);
9382
+ }
9298
9383
  if (props.onElementResized) {
9299
9384
  props.onElementResized(newSize, selectedElement, indexSelectedElement);
9300
9385
  }
@@ -9331,18 +9416,20 @@ var Paper = function (props) {
9331
9416
  }, [handleLinkLabelContentChanged]);
9332
9417
  var handleClickLinkDelete = React.useCallback(function (link, index) {
9333
9418
  return function () {
9334
- setLinks(function (prevLinks) {
9335
- var newLinks = __spreadArray([], prevLinks, true);
9336
- newLinks.splice(index, 1);
9337
- return newLinks;
9338
- });
9419
+ var prevLinks = linksRef.current;
9420
+ var newLinks = __spreadArray([], prevLinks, true);
9421
+ newLinks.splice(index, 1);
9422
+ setLinks(newLinks);
9423
+ if (props.onLinksChanged) {
9424
+ props.onLinksChanged(newLinks);
9425
+ }
9339
9426
  };
9340
- }, []);
9427
+ }, [props.onLinksChanged]);
9341
9428
  var handleMouseUpAtLinkedPortPlaceholder = React.useCallback(function (link, position, targetElementId) {
9342
9429
  var targetElement = elementsRef.current.find(function (e) { return e.id === targetElementId; });
9343
9430
  if (!targetElement)
9344
9431
  return;
9345
- console.log("A port could have been created at position ".concat(JSON.stringify(position), " on element ").concat(targetElementId, " by linking from element ").concat(link.sourceElement.id));
9432
+ console.info("A port could have been created at position ".concat(JSON.stringify(position), " on element ").concat(targetElementId, " by linking from element ").concat(link.sourceElement.id));
9346
9433
  if (props.onCreatingPortByLinking) {
9347
9434
  var sourcePort = link.sourcePort, sourceElement = link.sourceElement;
9348
9435
  //Handle create port via onCreatingPortByLinking prop
@@ -9351,11 +9438,16 @@ var Paper = function (props) {
9351
9438
  //Add new port to target element
9352
9439
  targetElement.addPort(targetPort);
9353
9440
  //Create new link with created port, that is returned.
9354
- var newElementLink_2 = createElementLink(sourcePort, sourceElement, targetPort, targetElement);
9441
+ var newElementLink = createElementLink(sourcePort, sourceElement, targetPort, targetElement);
9355
9442
  //Create link and clear some thing, then return
9356
- if (newElementLink_2) {
9357
- setLinks(function (prev) { return __spreadArray(__spreadArray([], prev, true), [newElementLink_2], false); });
9358
- paperEventEmitter.emitElementLinkEnded(newElementLink_2);
9443
+ if (newElementLink) {
9444
+ var prevLinks = linksRef.current;
9445
+ var newLinks = __spreadArray(__spreadArray([], prevLinks, true), [newElementLink], false);
9446
+ setLinks(newLinks);
9447
+ if (props.onLinksChanged) {
9448
+ props.onLinksChanged(newLinks);
9449
+ }
9450
+ paperEventEmitter.emitElementLinkEnded(newElementLink);
9359
9451
  setTempLink(null);
9360
9452
  return;
9361
9453
  }
@@ -9364,21 +9456,24 @@ var Paper = function (props) {
9364
9456
  //Clear tempLink
9365
9457
  setTempLink(null);
9366
9458
  paperEventEmitter.emitElementLinkEnded();
9367
- }, [props.onCreatingPortByLinking, createElementLink, paperEventEmitter]);
9459
+ }, [props.onCreatingPortByLinking, createElementLink, paperEventEmitter, props.onLinksChanged]);
9368
9460
  var handleElementTextChange = React.useCallback(function (elementId, textId, newContent) {
9369
- setElements(function (prevElms) {
9370
- return prevElms.map(function (curEle) {
9371
- //Find changed text of element to update the content for it.
9372
- if (curEle.id === elementId && curEle.texts) {
9373
- var updatedTextId = curEle.texts.findIndex(function (t) { return t.id === textId; });
9374
- if (updatedTextId !== undefined) {
9375
- curEle.texts[updatedTextId].content = newContent;
9376
- }
9461
+ var prevElms = elementsRef.current;
9462
+ var newElements = prevElms.map(function (curEle) {
9463
+ //Find changed text of element to update the content for it.
9464
+ if (curEle.id === elementId && curEle.texts) {
9465
+ var updatedTextId = curEle.texts.findIndex(function (t) { return t.id === textId; });
9466
+ if (updatedTextId !== undefined) {
9467
+ curEle.texts[updatedTextId].content = newContent;
9377
9468
  }
9378
- return curEle;
9379
- });
9469
+ }
9470
+ return curEle;
9380
9471
  });
9381
- }, []);
9472
+ setElements(newElements);
9473
+ if (props.onElementsChanged) {
9474
+ props.onElementsChanged(newElements);
9475
+ }
9476
+ }, [props.onElementsChanged]);
9382
9477
  var handleElementClicked = React.useCallback(function (elementId, e, ref) {
9383
9478
  e.stopPropagation();
9384
9479
  var tempLink = tempLinkRef.current;
@@ -9428,20 +9523,13 @@ var Paper = function (props) {
9428
9523
  }
9429
9524
  }, [props.onElementMouseLeave]);
9430
9525
  var renderElementInTree = React.useCallback(function (element) {
9431
- var _a, _b;
9432
9526
  //use the defined react element or the default Element component
9433
9527
  var ReactElement = element.reactElement || Element$1;
9434
9528
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
9435
- React.createElement(ReactElement, { key: "element-".concat(element.id), id: element.id, height: element.size.height, width: element.size.width, x: (_a = element.relativePosition) === null || _a === void 0 ? void 0 : _a.x, y: (_b = element.relativePosition) === null || _b === void 0 ? void 0 : _b.y, onClick: handleElementClicked, onContextMenu: handleContextMenu, onMouseUp: handleMouseUp, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, container: paperContainerRef.current, renderShape: element.renderShape, cssClass: element.cssClass, texts: element.texts, ports: element.ports, portMoveableAreas: element.portMoveableAreas, portSlideRailSVGClassName: element.portSlideRailSVGClassName, portDirection: element.portDirection, defaultPortSize: element.defaultPortSize, onPortMoved: handlePortMoved, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp,
9529
+ React.createElement(ReactElement, { key: "element-".concat(element.id), id: element.id, height: element.size.height, width: element.size.width, x: element.position.x, y: element.position.y, onClick: handleElementClicked, onContextMenu: handleContextMenu, onMouseUp: handleMouseUp, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, container: paperContainerRef.current, renderShape: element.renderShape, cssClass: element.cssClass, texts: element.texts, ports: element.ports, portMoveableAreas: element.portMoveableAreas, portSlideRailSVGClassName: element.portSlideRailSVGClassName, portDirection: element.portDirection, defaultPortSize: element.defaultPortSize, onPortMoved: handlePortMoved, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp,
9436
9530
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
9437
9531
  onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition }, element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree))));
9438
9532
  }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, handleMouseUp, handleMouseMove, handleMouseLeave]);
9439
- React.useEffect(function () {
9440
- console.log('elementsInTree');
9441
- }, [elementsInTree]);
9442
- React.useEffect(function () {
9443
- console.log('renderElementInTree');
9444
- }, [renderElementInTree]);
9445
9533
  var ElementsInTree = React.useMemo(function () {
9446
9534
  return elementsInTree.map(function (element, index) {
9447
9535
  return renderElementInTree(element);
@@ -9452,18 +9540,19 @@ var Paper = function (props) {
9452
9540
  React.createElement("svg", { tabIndex: 0, width: size.width, height: size.height, ref: paperContainerRef, id: "paper-container", onMouseMove: handlePaperMouseMove, onMouseDown: handleMouseDownOnPaper, onMouseUp: handleMouseUpOnPaper },
9453
9541
  paperContainerRef.current ? ElementsInTree : "",
9454
9542
  links && links.map(function (link, index) {
9455
- var _a, _b, _c, _d;
9543
+ if (!link.targetElement || !link.targetPort)
9544
+ return null;
9456
9545
  return (React.createElement(ElementLink, { key: link.id, id: link.id, path: link.path, sourcePosition: {
9457
- x: link.sourceElement.position.x + link.sourcePort.position.x,
9458
- y: link.sourceElement.position.y + link.sourcePort.position.y
9546
+ x: getAbsolutePosition(link.sourceElement).x + link.sourcePort.position.x,
9547
+ y: getAbsolutePosition(link.sourceElement).y + link.sourcePort.position.y
9459
9548
  }, targetPosition: {
9460
- x: ((_a = link.targetElement) === null || _a === void 0 ? void 0 : _a.position.x) + ((_b = link.targetPort) === null || _b === void 0 ? void 0 : _b.position.x),
9461
- y: ((_c = link.targetElement) === null || _c === void 0 ? void 0 : _c.position.y) + ((_d = link.targetPort) === null || _d === void 0 ? void 0 : _d.position.y)
9549
+ x: getAbsolutePosition(link.targetElement).x + link.targetPort.position.x,
9550
+ y: getAbsolutePosition(link.targetElement).y + link.targetPort.position.y
9462
9551
  }, points: link.points, onPathChanged: handlePathChange, onClickDelete: handleClickLinkDelete(link, index), onSelected: function () { return handleSelectLink(link); }, onDeselected: function () { return handleDeselectLink(); }, container: paperContainerRef.current, markerStart: link.markerStart, markerEnd: link.markerEnd, markerDistanceFromPort: link.markerDistanceFromPort, markerSize: link.markerSize, label: link.label, sourceLabel: link.sourceLabel, targetLabel: link.targetLabel, onLabelMoved: onLabelMoved(index), onLabelResized: onLabelResized(index), onLabelContentChanged: onLabelContentChanged(index) }));
9463
9552
  }),
9464
9553
  (tempLink === null || tempLink === void 0 ? void 0 : tempLink.tempTargetPosition) && React.createElement(ElementLink, { id: tempLink.id, points: tempLink.points, sourcePosition: {
9465
- x: tempLink.sourceElement.position.x + tempLink.sourcePort.position.x,
9466
- y: tempLink.sourceElement.position.y + tempLink.sourcePort.position.y
9554
+ x: getAbsolutePosition(tempLink.sourceElement).x + tempLink.sourcePort.position.x,
9555
+ y: getAbsolutePosition(tempLink.sourceElement).y + tempLink.sourcePort.position.y
9467
9556
  }, targetPosition: tempLink.tempTargetPosition, container: paperContainerRef.current, markerStart: tempLink.markerStart, markerEnd: tempLink.markerEnd, markerDistanceFromPort: tempLink.markerDistanceFromPort, markerSize: tempLink.markerSize }),
9468
9557
  texts.map(function (text, index) { return (React.createElement(Text$1, { key: text.id, id: text.id, x: text.position.x, y: text.position.y, width: text.size.width, height: text.size.height, editable: text.editable, fontSize: text.fontSize, border: text.border, container: paperContainerRef.current, content: text.content, align: text.align, onSelected: function () {
9469
9558
  setSelectedText(text);
@@ -9498,7 +9587,6 @@ var Editor = function (_a) {
9498
9587
  var offs = [];
9499
9588
  if (editorContext) {
9500
9589
  offs.push(editorContext.onEditorContextUpdated(function () {
9501
- console.log("onEditorContextUpdated");
9502
9590
  setEditorStates(editorContext);
9503
9591
  }));
9504
9592
  }
@@ -9542,12 +9630,21 @@ var Editor = function (_a) {
9542
9630
  var handleElementMouseUp = React.useCallback(function (ev, element) {
9543
9631
  editorContext.onElementMouseUpHandler(ev, element);
9544
9632
  }, [editorContext]);
9633
+ var handleElementsChanged = React.useCallback(function (elements) {
9634
+ editorContext.elements = elements;
9635
+ }, [editorContext]);
9545
9636
  var handleLinkSelected = React.useCallback(function (link) {
9546
9637
  editorContext.onLinkSelectedHandler(link);
9547
9638
  }, [editorContext]);
9639
+ var handleLinksChanged = React.useCallback(function (links) {
9640
+ editorContext.links = links;
9641
+ }, [editorContext]);
9548
9642
  var handleTextSelected = React.useCallback(function (text) {
9549
9643
  editorContext.onTextSelectedHandler(text);
9550
9644
  }, [editorContext]);
9645
+ var handleTextsChanged = React.useCallback(function (texts) {
9646
+ editorContext.texts = texts;
9647
+ }, [editorContext]);
9551
9648
  var handleOnCreatingLink = React.useCallback(function (sourcePort, sourceElement, targetPort, targetElement) {
9552
9649
  if (editorContext.onCreatingLinkHandler) {
9553
9650
  return editorContext.onCreatingLinkHandler(sourcePort, sourceElement, targetPort, targetElement);
@@ -9569,7 +9666,7 @@ var Editor = function (_a) {
9569
9666
  var handlePaperMouseUp = React.useCallback(function (position) {
9570
9667
  editorContext.onPaperMouseUpHandler(position);
9571
9668
  }, [editorContext]);
9572
- return (React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseUp: handleElementMouseUp, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onTextSelected: handleTextSelected, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) }));
9669
+ return (React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) }));
9573
9670
  };
9574
9671
 
9575
9672
  exports.CircleRC = Circle;