orcasvn-react-diagrams 0.1.67 → 0.1.72

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.
Files changed (37) hide show
  1. package/dist/cjs/index.js +637 -453
  2. package/dist/cjs/types/components/paper.d.ts +7 -3
  3. package/dist/cjs/types/mocks/diamondElement.d.ts +1 -1
  4. package/dist/cjs/types/mocks/editorContextTriggerRenderElements.d.ts +2 -0
  5. package/dist/cjs/types/mocks/rectangularFrameElement.d.ts +1 -1
  6. package/dist/cjs/types/models/IEditorContext.d.ts +5 -1
  7. package/dist/cjs/types/models/IElement.d.ts +5 -0
  8. package/dist/cjs/types/models/IElementLink.d.ts +1 -0
  9. package/dist/cjs/types/models/IElementLinkProps.d.ts +5 -2
  10. package/dist/cjs/types/models/IElementProps.d.ts +10 -22
  11. package/dist/cjs/types/models/IPort.d.ts +1 -0
  12. package/dist/cjs/types/models/IText.d.ts +1 -0
  13. package/dist/cjs/types/models/implementations/EditorContext.d.ts +5 -1
  14. package/dist/cjs/types/models/implementations/Element.d.ts +6 -1
  15. package/dist/cjs/types/models/implementations/ElementLink.d.ts +2 -1
  16. package/dist/cjs/types/models/implementations/Port.d.ts +2 -1
  17. package/dist/cjs/types/models/implementations/Text.d.ts +2 -1
  18. package/dist/esm/index.js +637 -453
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/types/components/paper.d.ts +7 -3
  21. package/dist/esm/types/mocks/diamondElement.d.ts +1 -1
  22. package/dist/esm/types/mocks/editorContextTriggerRenderElements.d.ts +2 -0
  23. package/dist/esm/types/mocks/rectangularFrameElement.d.ts +1 -1
  24. package/dist/esm/types/models/IEditorContext.d.ts +5 -1
  25. package/dist/esm/types/models/IElement.d.ts +5 -0
  26. package/dist/esm/types/models/IElementLink.d.ts +1 -0
  27. package/dist/esm/types/models/IElementLinkProps.d.ts +5 -2
  28. package/dist/esm/types/models/IElementProps.d.ts +10 -22
  29. package/dist/esm/types/models/IPort.d.ts +1 -0
  30. package/dist/esm/types/models/IText.d.ts +1 -0
  31. package/dist/esm/types/models/implementations/EditorContext.d.ts +5 -1
  32. package/dist/esm/types/models/implementations/Element.d.ts +6 -1
  33. package/dist/esm/types/models/implementations/ElementLink.d.ts +2 -1
  34. package/dist/esm/types/models/implementations/Port.d.ts +2 -1
  35. package/dist/esm/types/models/implementations/Text.d.ts +2 -1
  36. package/dist/index.d.ts +44 -27
  37. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -484,7 +484,8 @@ function generateUniqueId() {
484
484
  }
485
485
 
486
486
  var Element$2 = /** @class */ (function () {
487
- function Element(id, x, y, width, height, selectable, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
487
+ function Element(id, x, y, width, height, selectable, removable, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
488
+ if (removable === void 0) { removable = true; }
488
489
  if (portMovealeAreas === void 0) { portMovealeAreas = []; }
489
490
  this.positionAnchor = exports.PositioningAnchor.TopLeft;
490
491
  this._childrenElements = [];
@@ -498,6 +499,7 @@ var Element$2 = /** @class */ (function () {
498
499
  this._position = { x: x, y: y };
499
500
  this._size = { width: width, height: height };
500
501
  this.selectable = selectable === undefined ? true : selectable;
502
+ this.removable = removable;
501
503
  this.cssClass = cssClass;
502
504
  this.renderShape = renderShape;
503
505
  this.texts = texts;
@@ -607,7 +609,7 @@ var Element$2 = /** @class */ (function () {
607
609
  };
608
610
  Element.prototype.addPort = function (newPort) {
609
611
  if (this.ports) {
610
- this.ports.push(newPort);
612
+ this.ports = __spreadArray(__spreadArray([], this.ports, true), [newPort], false);
611
613
  }
612
614
  else {
613
615
  this.ports = [newPort];
@@ -629,7 +631,7 @@ var Element$2 = /** @class */ (function () {
629
631
  if (index === -1) {
630
632
  throw new Error("Port with id ".concat(id, " is not found"));
631
633
  }
632
- this.ports.splice(index, 1);
634
+ this.ports = this.ports.filter(function (p) { return p.id !== id; });
633
635
  this._eventEmitter.emit('deletedPort', id);
634
636
  };
635
637
  Element.prototype.onDeletedPort = function (callback) {
@@ -645,6 +647,41 @@ var Element$2 = /** @class */ (function () {
645
647
  return undefined;
646
648
  return this.ports.find(function (p) { return p.id === id; });
647
649
  };
650
+ Element.prototype.addText = function (newText) {
651
+ if (this.texts) {
652
+ this.texts.push(newText);
653
+ }
654
+ else {
655
+ this.texts = [newText];
656
+ }
657
+ this._eventEmitter.emit('addedText', newText);
658
+ };
659
+ Element.prototype.onAddedText = function (callback) {
660
+ var _this = this;
661
+ this._eventEmitter.on('addedText', callback);
662
+ var canceller = function () {
663
+ _this._eventEmitter.off('addedText', callback);
664
+ };
665
+ return canceller;
666
+ };
667
+ Element.prototype.deleteText = function (id) {
668
+ if (!this.texts)
669
+ return;
670
+ var index = this.texts.findIndex(function (t) { return t.id === id; });
671
+ if (index === -1) {
672
+ throw new Error("Text with id ".concat(id, " is not found"));
673
+ }
674
+ this.texts.splice(index, 1);
675
+ this._eventEmitter.emit('deletedText', id);
676
+ };
677
+ Element.prototype.onDeletedText = function (callback) {
678
+ var _this = this;
679
+ this._eventEmitter.on('deletedText', callback);
680
+ var canceller = function () {
681
+ _this._eventEmitter.off('deletedText', callback);
682
+ };
683
+ return canceller;
684
+ };
648
685
  return Element;
649
686
  }());
650
687
 
@@ -697,7 +734,8 @@ var CustomShape = React.forwardRef(function (props, ref) {
697
734
  });
698
735
 
699
736
  var Port$1 = /** @class */ (function () {
700
- function Port(id, x, y, label, shapeRenderer, width, height) {
737
+ function Port(id, x, y, label, shapeRenderer, width, height, removable) {
738
+ if (removable === void 0) { removable = true; }
701
739
  var _this = this;
702
740
  //internal properties
703
741
  this._eventEmitter = new EventEmitter();
@@ -720,6 +758,7 @@ var Port$1 = /** @class */ (function () {
720
758
  props.children));
721
759
  });
722
760
  }
761
+ this.removable = removable;
723
762
  }
724
763
  Object.defineProperty(Port.prototype, "id", {
725
764
  get: function () {
@@ -733,7 +772,8 @@ var Port$1 = /** @class */ (function () {
733
772
 
734
773
  var ElementLink$1 = /** @class */ (function () {
735
774
  // constructor(id: string | null, sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);
736
- function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
775
+ function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel, removable) {
776
+ if (removable === void 0) { removable = true; }
737
777
  this.id = id || generateUniqueId();
738
778
  this.sourceElement = sourceElement;
739
779
  this.sourcePort = sourcePort;
@@ -766,12 +806,14 @@ var ElementLink$1 = /** @class */ (function () {
766
806
  this.sourceLabel = sourceLabel;
767
807
  if (targetLabel)
768
808
  this.targetLabel = targetLabel;
809
+ this.removable = removable;
769
810
  }
770
811
  return ElementLink;
771
812
  }());
772
813
 
773
814
  var Text$2 = /** @class */ (function () {
774
- function Text(id, content, width, height, editable, selectable, x, y, align, fontSize, border, style) {
815
+ function Text(id, content, width, height, editable, selectable, removable, x, y, align, fontSize, border, style) {
816
+ if (removable === void 0) { removable = true; }
775
817
  this._id = id || generateUniqueId();
776
818
  this.content = content;
777
819
  this.align = align;
@@ -781,6 +823,7 @@ var Text$2 = /** @class */ (function () {
781
823
  this.style = style;
782
824
  this.editable = editable;
783
825
  this.selectable = selectable;
826
+ this.removable = removable;
784
827
  if (selectable === undefined) {
785
828
  this.selectable = true; // Default to true if not specified
786
829
  }
@@ -799,6 +842,7 @@ var Text$2 = /** @class */ (function () {
799
842
  }());
800
843
 
801
844
  var EVENT_MANUALLY_RENDER_ELEMENT = 'manuallyRenderElement';
845
+ var EVENT_MANUALLY_RENDER_ELEMENTS = 'manuallyRenderElements';
802
846
  var EVENT_MANUALLY_RENDER_PORT = 'manuallyRenderPort';
803
847
  var EVENT_EDITOR_CONTEXT_UPDATED = 'editorContextUpdated';
804
848
  var EVENT_PAPER_CLICKED = 'paperClicked';
@@ -1088,6 +1132,13 @@ var EditorContext = /** @class */ (function () {
1088
1132
  EditorContext.prototype.manuallyTriggerRenderElementHandler = function (callback) {
1089
1133
  return this.addEventListener(EVENT_MANUALLY_RENDER_ELEMENT, callback);
1090
1134
  };
1135
+ EditorContext.prototype.triggerRenderElements = function () {
1136
+ this._eventEmitter.emit(EVENT_MANUALLY_RENDER_ELEMENTS);
1137
+ };
1138
+ /** @internal */
1139
+ EditorContext.prototype.manuallyTriggerRenderElementsHandler = function (callback) {
1140
+ return this.addEventListener(EVENT_MANUALLY_RENDER_ELEMENTS, callback);
1141
+ };
1091
1142
  EditorContext.prototype.triggerRenderPort = function (portId, elementId) {
1092
1143
  this._eventEmitter.emit(EVENT_MANUALLY_RENDER_PORT, portId, elementId);
1093
1144
  };
@@ -7446,10 +7497,10 @@ var getAbsolutePosition = function (element) {
7446
7497
  x: element.position.x,
7447
7498
  y: element.position.y,
7448
7499
  };
7449
- if (element.positionAnchor === exports.PositioningAnchor.Center) {
7450
- elemenetPositionWithTopLeftAnchor.x -= element.size.width / 2;
7451
- elemenetPositionWithTopLeftAnchor.y -= element.size.height / 2;
7452
- }
7500
+ // if (element.positionAnchor === PositioningAnchor.Center) {
7501
+ // elemenetPositionWithTopLeftAnchor.x -= element.size.width / 2;
7502
+ // elemenetPositionWithTopLeftAnchor.y -= element.size.height / 2;
7503
+ // }
7453
7504
  if (!parentElement) {
7454
7505
  return __assign({}, elemenetPositionWithTopLeftAnchor);
7455
7506
  }
@@ -7479,10 +7530,10 @@ var transformAbsPositionToElementRelativePosition = function (position, element)
7479
7530
  x: position.x - absoluteParentElement.x,
7480
7531
  y: position.y - absoluteParentElement.y,
7481
7532
  };
7482
- if (element.positionAnchor === exports.PositioningAnchor.Center) {
7483
- result.x += element.size.width / 2;
7484
- result.y += element.size.height / 2;
7485
- }
7533
+ // if (element.positionAnchor === PositioningAnchor.Center) {
7534
+ // result.x += element.size.width / 2;
7535
+ // result.y += element.size.height / 2;
7536
+ // }
7486
7537
  return result;
7487
7538
  };
7488
7539
  var transformAbsPositionToRelativePositionInsideElement = function (absolutePosition, parentAbsolutePosition) {
@@ -7891,7 +7942,10 @@ var SelectionFrame = function (props) {
7891
7942
  }
7892
7943
  return (React.createElement(React.Fragment, null,
7893
7944
  PropDragDropHandlerElement && React.createElement(PropDragDropHandlerElement, { dragging: draggingRect, onMouseDown: addRectHandleMouseDown }),
7894
- React.createElement("rect", { vectorEffect: "non-scaling-stroke", x: leftX, y: topY, width: width, height: height, fill: 'none', stroke: 'blue', strokeWidth: propStrokeWidth || 5, cursor: draggingRect ? 'grabbing' : 'grab', onMouseDown: addRectHandleMouseDown, onMouseUp: propOnMouseUp }),
7945
+ React.createElement("rect", { vectorEffect: "non-scaling-stroke", x: leftX, y: topY, width: width, height: height, fill: 'none', stroke: 'blue', strokeWidth: propStrokeWidth || 5, cursor: draggingRect ? 'grabbing' : 'grab', onMouseDown: addRectHandleMouseDown, onMouseUp: function (ev) {
7946
+ propOnMouseUp === null || propOnMouseUp === void 0 ? void 0 : propOnMouseUp(ev);
7947
+ setDraggingRect(false);
7948
+ } }),
7895
7949
  propResizability.enabled ?
7896
7950
  (React.createElement("circle", { cursor: 'se-resize', cx: leftX + width, cy: topY + height, r: r, fill: 'blue', stroke: 'blue', onMouseDown: circleHandleMouseDown })) : null));
7897
7951
  };
@@ -7899,10 +7953,7 @@ var SelectionFrame = function (props) {
7899
7953
  var useSelectionFrame = function (props) {
7900
7954
  React.useEffect(function () {
7901
7955
  //log selection frame rendering
7902
- if (props.targetSVGElement) {
7903
- console.debug('Rendering SelectionFrame for targetSVGElement:', props.targetSVGElement);
7904
- }
7905
- else {
7956
+ if (!props.targetSVGElement) {
7906
7957
  console.warn('No targetSVGElement provided for SelectionFrame.');
7907
7958
  }
7908
7959
  if (props.targetSVGElement && props.container) {
@@ -8464,7 +8515,9 @@ function CloseIcon(_a) {
8464
8515
  // const makerEnd = <path d="M0 0 L 20 10 L0 20 Z" fill="blue"></path>//<path d="M0 0 L 10 5 L0 10 Z"></path>
8465
8516
  var IElementLink = function (_a) {
8466
8517
  var _b, _c;
8467
- var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, onPointsChanged = _a.onPointsChanged, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8518
+ var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePositionX = _a.sourcePositionX, sourcePositionY = _a.sourcePositionY, targetPositionX = _a.targetPositionX, targetPositionY = _a.targetPositionY, removable = _a.removable,
8519
+ //TODO: get rid of this
8520
+ onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, onPointsChanged = _a.onPointsChanged, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8468
8521
  var _g = React.useState(path), pathStr = _g[0], setPathStr = _g[1];
8469
8522
  var _h = React.useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
8470
8523
  var _j = React.useState(false), isDragging = _j[0], setIsDragging = _j[1];
@@ -8481,6 +8534,7 @@ var IElementLink = function (_a) {
8481
8534
  var isFirstRender = React.useRef(true);
8482
8535
  var onPointsChangedRef = React.useRef();
8483
8536
  var draggingPointIndexRef = React.useRef(); // Ref to store the index of the point being dragged. No need to store it in state, as it is only used during the drag operation.
8537
+ var timeFromMouseDownToUpRef = React.useRef(0);
8484
8538
  var angleMarkerStart = '0';
8485
8539
  var angleMarkerEnd = '0';
8486
8540
  var markerStartPosition;
@@ -8503,7 +8557,7 @@ var IElementLink = function (_a) {
8503
8557
  return function () {
8504
8558
  paperClickListener.off();
8505
8559
  };
8506
- }, []);
8560
+ }, [onPaperClicked, onDeselected]);
8507
8561
  // Reset selected label when an element is selected
8508
8562
  React.useEffect(function () {
8509
8563
  var elementSelectedListener = onElementSelected(function () {
@@ -8516,34 +8570,32 @@ var IElementLink = function (_a) {
8516
8570
  return function () {
8517
8571
  elementSelectedListener.off();
8518
8572
  };
8519
- }, []);
8573
+ }, [onElementSelected, onDeselected]);
8520
8574
  // Store onPointsChanged in a ref to avoid unnecessary re-renders
8521
8575
  React.useEffect(function () {
8522
8576
  onPointsChangedRef.current = onPointsChanged;
8523
8577
  }, [onPointsChanged]);
8524
8578
  // Notify parent component when points change
8525
8579
  React.useEffect(function () {
8526
- var _a;
8527
8580
  if (isFirstRender.current) {
8528
8581
  isFirstRender.current = false;
8529
8582
  return;
8530
8583
  }
8531
- (_a = onPointsChangedRef.current) === null || _a === void 0 ? void 0 : _a.call(onPointsChangedRef, points, id);
8532
- }, [JSON.stringify(points)]);
8584
+ }, []);
8533
8585
  React.useLayoutEffect(function () {
8534
- var pointsList = __spreadArray(__spreadArray([sourcePosition], points, true), [targetPosition], false);
8586
+ var pointsList = __spreadArray(__spreadArray([{ x: sourcePositionX, y: sourcePositionY }], points, true), [{ x: targetPositionX, y: targetPositionY }], false);
8535
8587
  var _pathStr = createSmoothPathString(pointsList, undefined, false);
8536
8588
  setPathStr(_pathStr);
8537
- }, [sourcePosition, points, targetPosition]);
8589
+ }, [sourcePositionX, sourcePositionY, points, targetPositionX, targetPositionY]);
8538
8590
  React.useEffect(function () {
8539
8591
  if (!pathStr)
8540
8592
  return;
8541
8593
  onPathChanged === null || onPathChanged === void 0 ? void 0 : onPathChanged(pathStr, id);
8542
- }, [pathStr, id]);
8543
- var addMovingPoint = function (mouseDownedOnPaperPos, points) {
8594
+ }, [pathStr, id, onPathChanged]);
8595
+ var addMovingPoint = React.useCallback(function (mouseDownedOnPaperPos, points) {
8544
8596
  //Position of the new point on the path
8545
8597
  var paperPosition = mouseDownedOnPaperPos;
8546
- var newPoints = addPointToList(paperPosition, __spreadArray(__spreadArray([sourcePosition], points, true), [targetPosition], false), pathRef.current);
8598
+ var newPoints = addPointToList(paperPosition, __spreadArray(__spreadArray([{ x: sourcePositionX, y: sourcePositionY }], points, true), [{ x: targetPositionX, y: targetPositionY }], false), pathRef.current);
8547
8599
  var pointsWithoutStartEndPoint = newPoints.slice(1, newPoints.length - 1);
8548
8600
  var addedIndex = pointsWithoutStartEndPoint.findIndex(function (p) { return p.x === paperPosition.x && p.y === paperPosition.y; });
8549
8601
  var leftPointIndex = addedIndex - 1;
@@ -8589,12 +8641,13 @@ var IElementLink = function (_a) {
8589
8641
  draggingPointIndex: _draggingPointIndex,
8590
8642
  points: pointsWithoutStartEndPoint,
8591
8643
  };
8592
- };
8644
+ }, [sourcePositionX, sourcePositionY, targetPositionX, targetPositionY]);
8593
8645
  React.useEffect(function () {
8594
8646
  //handle when creating and moving point
8595
8647
  var handleMouseMove = function (ev) {
8596
8648
  var mouseEvent = ev;
8597
8649
  if (isDragging && container) {
8650
+ console.info('Mouse move on link');
8598
8651
  var paperPosition_1 = windowsPositionToPaperPosition({
8599
8652
  x: mouseEvent.clientX,
8600
8653
  y: mouseEvent.clientY
@@ -8614,8 +8667,13 @@ var IElementLink = function (_a) {
8614
8667
  }
8615
8668
  };
8616
8669
  var mouseUp = function () {
8670
+ console.info('Mouse up on link');
8617
8671
  draggingPointIndexRef.current = undefined;
8618
8672
  setIsDragging(false);
8673
+ //trigger onPointsChanged
8674
+ if (onPointsChangedRef.current) {
8675
+ onPointsChangedRef.current(points, id);
8676
+ }
8619
8677
  };
8620
8678
  container === null || container === void 0 ? void 0 : container.addEventListener('mousemove', handleMouseMove);
8621
8679
  container === null || container === void 0 ? void 0 : container.addEventListener('mouseup', mouseUp);
@@ -8623,9 +8681,14 @@ var IElementLink = function (_a) {
8623
8681
  container === null || container === void 0 ? void 0 : container.removeEventListener('mousemove', handleMouseMove);
8624
8682
  container === null || container === void 0 ? void 0 : container.removeEventListener('mouseup', mouseUp);
8625
8683
  };
8626
- }, [container, isDragging, zoom, points]);
8684
+ }, [container, isDragging, zoom, points, id, addMovingPoint]);
8685
+ React.useEffect(function () {
8686
+ console.info("Container changed in link", id);
8687
+ }, [addMovingPoint]);
8627
8688
  var handleMouseDownOnPath = function (ev) {
8628
8689
  ev.preventDefault();
8690
+ console.info('Mouse down on link');
8691
+ timeFromMouseDownToUpRef.current = Date.now();
8629
8692
  //add point if click on path
8630
8693
  setIsDragging(true);
8631
8694
  };
@@ -8639,11 +8702,11 @@ var IElementLink = function (_a) {
8639
8702
  onLabelMoved(newPosition.x, newPosition.y, 'middle');
8640
8703
  break;
8641
8704
  case sourceLabelRef.current:
8642
- newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, sourcePosition);
8705
+ newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, { x: sourcePositionX, y: sourcePositionY });
8643
8706
  onLabelMoved(newPosition.x, newPosition.y, 'source');
8644
8707
  break;
8645
8708
  case targetLabelRef.current:
8646
- newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, targetPosition);
8709
+ newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, { x: targetPositionX, y: targetPositionY });
8647
8710
  onLabelMoved(newPosition.x, newPosition.y, 'target');
8648
8711
  break;
8649
8712
  }
@@ -8675,6 +8738,11 @@ var IElementLink = function (_a) {
8675
8738
  }
8676
8739
  };
8677
8740
  var handleClickPath = function () {
8741
+ if (Date.now() - timeFromMouseDownToUpRef.current > 400) {
8742
+ //Prevent click event when dragging
8743
+ return;
8744
+ }
8745
+ console.info('Click link', id);
8678
8746
  setIsSelectedLink(true);
8679
8747
  onSelected === null || onSelected === void 0 ? void 0 : onSelected();
8680
8748
  };
@@ -8717,22 +8785,22 @@ var IElementLink = function (_a) {
8717
8785
  if ((_b = pathRef.current) === null || _b === void 0 ? void 0 : _b.getAttribute('d')) {
8718
8786
  if (markerStart) {
8719
8787
  markerStartPosition = pathRef.current.getPointAtLength(markerDistanceFromPort);
8720
- angleMarkerStart = calculateAngleWithOx(sourcePosition, markerStartPosition);
8788
+ angleMarkerStart = calculateAngleWithOx({ x: sourcePositionX, y: sourcePositionY }, markerStartPosition);
8721
8789
  }
8722
8790
  if (markerEnd) {
8723
8791
  markerEndPosition = pathRef.current.getPointAtLength(pathRef.current.getTotalLength() - markerDistanceFromPort);
8724
- angleMarkerEnd = calculateAngleWithOx(markerEndPosition, targetPosition);
8792
+ angleMarkerEnd = calculateAngleWithOx(markerEndPosition, { x: targetPositionX, y: targetPositionY });
8725
8793
  }
8726
8794
  centerPathPosition = (_c = pathRef.current) === null || _c === void 0 ? void 0 : _c.getPointAtLength(pathRef.current.getTotalLength() / 2);
8727
8795
  }
8728
8796
  return (React.createElement("g", null,
8729
8797
  React.createElement("path", { ref: pathRef, d: pathStr, className: isSelectedLink ? CSS_CLASS_LINK_SELECTED : '', fill: "none", stroke: stroke || LINK_DEFAULT_COLOR, strokeWidth: strokeWidth }),
8730
8798
  React.createElement("path", { d: pathStr, fill: "none", stroke: 'transparent', strokeWidth: LINK_CLICKABLE_STROKE_WIDTH, onClick: handleClickPath, onMouseDown: handleMouseDownOnPath }),
8731
- isSelectedLink && centerPathPosition && React.createElement("svg", { x: centerPathPosition.x - 10, y: centerPathPosition.y - 10 },
8799
+ removable !== false && isSelectedLink && centerPathPosition && React.createElement("svg", { x: centerPathPosition.x - 10, y: centerPathPosition.y - 10 },
8732
8800
  React.createElement(CloseIcon, { onClick: onClickDelete })),
8733
8801
  label && renderLabel(label, 'middle', centerPathPosition),
8734
- sourceLabel && renderLabel(sourceLabel, 'source', sourcePosition),
8735
- targetLabel && renderLabel(targetLabel, 'target', targetPosition),
8802
+ sourceLabel && renderLabel(sourceLabel, 'source', { x: sourcePositionX, y: sourcePositionY }),
8803
+ targetLabel && renderLabel(targetLabel, 'target', { x: targetPositionX, y: targetPositionY }),
8736
8804
  markerStartPosition && React.createElement("g", { transform: "rotate(".concat(angleMarkerStart, ")"), style: { transformOrigin: 'center', transformBox: 'content-box' } },
8737
8805
  React.createElement("svg", { x: markerStartPosition.x - markerSize / 2, y: markerStartPosition.y - markerSize / 2, width: markerSize, height: markerSize }, markerStart)),
8738
8806
  markerEndPosition && React.createElement("g", { transform: "rotate(".concat(angleMarkerEnd, ")"), style: { transformOrigin: 'center', transformBox: 'content-box' } },
@@ -8789,58 +8857,41 @@ var ElementWrapper = React.forwardRef(function (_a, ref) {
8789
8857
  });
8790
8858
 
8791
8859
  var Element = React.forwardRef(function (props, forwardedRef) {
8792
- var id = props.id, x = props.x, y = props.y, width = props.width, height = props.height, cssClass = props.cssClass, portPlaceholderShape = props.portPlaceholderShape, children = props.children, container = props.container, parentAbsolutePosition = props.parentAbsolutePosition, textsPlaceHolderFlexStyle = props.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition = props.textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName = props.textsPlaceHolderClassName, texts = props.texts, portSlideRailSVGClassName = props.portSlideRailSVGClassName, portMoveableAreas = props.portMoveableAreas, portDirection = props.portDirection, defaultPortSize = props.defaultPortSize, onClick = props.onClick, onContextMenu = props.onContextMenu, renderShape = props.renderShape; props.onMoved; var onPortMoved = props.onPortMoved; props.onResized; var onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp, onMouseMove = props.onMouseMove, onMouseLeave = props.onMouseLeave, onMouseUp = props.onMouseUp, onMouseDown = props.onMouseDown, onMouseUpAtLinkedPortPlaceholder = props.onMouseUpAtLinkedPortPlaceholder, onTextUpdated = props.onTextUpdated, onPortContextMenu = props.onPortContextMenu, onPortsChanged = props.onPortsChanged, onManuallyTriggerRenderPort = props.onManuallyTriggerRenderPort;
8793
- var propPorts = props.ports;
8794
- var _a = React.useState(), selectedPort = _a[0], setSelectedPort = _a[1];
8795
- var _b = React.useState(), hoveredPort = _b[0], setHoveredPort = _b[1];
8796
- var _c = React.useState((propPorts === null || propPorts === void 0 ? void 0 : propPorts.map(function (p) {
8797
- var portState = __assign(__assign({}, p), { ref: React.createRef() });
8798
- return portState;
8799
- })) || []), ports = _c[0], setPorts = _c[1];
8800
- var _d = React.useState(false), someElementLinkStarted = _d[0], setSomeElementLinkStarted = _d[1];
8801
- var _e = React.useState(), potentialPortPosition = _e[0], setPotentialPortPosition = _e[1];
8802
8860
  var _paperEventEmitterContext = React.useContext(paperEventEmitterContext);
8861
+ // const elementObj = props.element;
8862
+ var beingSelected = props.beingSelected, portPlaceholderShape = props.portPlaceholderShape, children = props.children, container = props.container, onMouseUp = props.onMouseUp, onMouseDown = props.onMouseDown, onMouseLeave = props.onMouseLeave, onMouseMove = props.onMouseMove, onMoving = props.onMoving, onMoved = props.onMoved, onResized = props.onResized, onPortMoved = props.onPortMoved, onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp, onClick = props.onClick, onContextMenu = props.onContextMenu, onPortContextMenu = props.onPortContextMenu, onMouseUpAtLinkedPortPlaceholder = props.onMouseUpAtLinkedPortPlaceholder, onManuallyTriggerRenderPort = props.onManuallyTriggerRenderPort, draggingByDefault = props.draggingByDefault, parentDOM = props.parentDOM;
8863
+ var _a = props.element, id = _a.id, cssClass = _a.cssClass, textsPlaceHolderClassName = _a.textsPlaceHolderClassName, portSlideRailSVGClassName = _a.portSlideRailSVGClassName, portMoveableAreas = _a.portMoveableAreas, portDirection = _a.portDirection, defaultPortSize = _a.defaultPortSize, textsPlaceHolderFlexStyle = _a.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition = _a.textsPlaceHolderFlexboxPosition, resizability = _a.resizability, renderShape = _a.renderShape;
8864
+ var propPorts = props.element.ports;
8865
+ //state for position
8866
+ var _b = React.useState(__assign({}, props.element.position)), position = _b[0], setPosition = _b[1];
8867
+ //state for size
8868
+ var _c = React.useState(__assign({}, props.element.size)), size = _c[0], setSize = _c[1];
8869
+ var _d = React.useState(), selectedPort = _d[0], setSelectedPort = _d[1];
8870
+ var _e = React.useState(), hoveredPort = _e[0], setHoveredPort = _e[1];
8871
+ var _f = React.useState([]), ports = _f[0], setPorts = _f[1];
8872
+ var _g = React.useState(props.element.texts || []), texts = _g[0], setTexts = _g[1];
8873
+ var _h = React.useState(false), someElementLinkStarted = _h[0], setSomeElementLinkStarted = _h[1];
8874
+ var _j = React.useState(), potentialPortPosition = _j[0], setPotentialPortPosition = _j[1];
8875
+ //Zoom
8803
8876
  var zoom = useZoomContext().zoom;
8877
+ var zoomRef = React.useRef(zoom);
8804
8878
  var elementRef = React.useRef(null);
8805
8879
  React.useImperativeHandle(forwardedRef, function () { return elementRef.current; });
8806
8880
  var elementLinkStarted = React.useRef();
8807
- var portsRef = React.useRef(ports);
8808
- var getElementAbsPosition = React.useCallback(function () {
8809
- var position = {
8810
- x: x,
8811
- y: y,
8812
- };
8813
- if (parentAbsolutePosition) {
8814
- position.x += parentAbsolutePosition.x;
8815
- position.y += parentAbsolutePosition.y;
8816
- }
8817
- return position;
8818
- }, [x, y, parentAbsolutePosition]);
8819
- var elementAbsPosition = React.useMemo(function () { return getElementAbsPosition(); }, [getElementAbsPosition]);
8820
- //Listen to manually trigger render event
8821
- React.useEffect(function () {
8822
- var off = onManuallyTriggerRenderPort === null || onManuallyTriggerRenderPort === void 0 ? void 0 : onManuallyTriggerRenderPort(function (portId, elementId) {
8823
- if (elementId !== id)
8824
- return;
8825
- logger.info('onManuallyTriggerRenderPort', id);
8826
- setPorts(function (prev) { return __spreadArray([], prev, true); });
8827
- });
8828
- return function () {
8829
- off === null || off === void 0 ? void 0 : off();
8830
- };
8831
- }, [id, onManuallyTriggerRenderPort]);
8881
+ var portsRef = React.useRef([]);
8832
8882
  //Normalize port position
8833
8883
  var normalizePortPosition = React.useCallback(function (tempNewPosition) {
8834
- var newPosition = correctPortPositionInElement(tempNewPosition, width, height, portMoveableAreas, portSlideRailSVGClassName, elementRef.current || undefined);
8884
+ var newPosition = correctPortPositionInElement(tempNewPosition, size.width, size.height, portMoveableAreas, portSlideRailSVGClassName, elementRef.current || undefined);
8835
8885
  return newPosition || tempNewPosition;
8836
- }, [width, height, portMoveableAreas, portSlideRailSVGClassName]);
8837
- //Listen a new port is created, after add new port to ports state
8838
- React.useEffect(function () {
8886
+ }, [size.width, size.height, portMoveableAreas, portSlideRailSVGClassName]);
8887
+ //set port ref when ports state is changed
8888
+ React.useLayoutEffect(function () {
8889
+ portsRef.current = ports;
8890
+ }, [ports]);
8891
+ //Handle ports state when propPorts is changed
8892
+ var handlePortsState = React.useCallback(function (newPorts) {
8839
8893
  setPorts(function (prev) {
8840
- var _a;
8841
- if (propPorts === undefined)
8842
- return [];
8843
- var newState = (_a = propPorts.map(function (p, index) {
8894
+ var newState = newPorts === null || newPorts === void 0 ? void 0 : newPorts.map(function (p, index) {
8844
8895
  var prevPortState = prev.find(function (_p) { return _p.id === p.id; });
8845
8896
  var newPortState;
8846
8897
  //If port is existed, keep the ref of the port
@@ -8853,45 +8904,85 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8853
8904
  //Handle the case new port is created and the ref of the port is not defined
8854
8905
  if (!newPortState.ref) {
8855
8906
  var newPosition = normalizePortPosition(newPortState.position);
8856
- onPortMoved === null || onPortMoved === void 0 ? void 0 : onPortMoved(p, id, newPortState.position, newPosition);
8857
- _paperEventEmitterContext.emitPortMoved(p, id, newPortState.position, newPosition);
8907
+ // onPortMoved?.(p, id, newPortState.position, newPosition)
8908
+ // _paperEventEmitterContext.emitPortMoved(p, id, newPortState.position, newPosition)
8858
8909
  newPortState.position = newPosition;
8859
8910
  newPortState.ref = React.createRef();
8860
8911
  }
8861
8912
  return newPortState;
8862
- })) !== null && _a !== void 0 ? _a : [];
8913
+ });
8863
8914
  return newState;
8864
8915
  });
8865
- }, [_paperEventEmitterContext, normalizePortPosition, id, onPortMoved, propPorts]);
8866
- //Update portsRef when ports changed
8867
- React.useEffect(function () {
8868
- portsRef.current = ports;
8869
- }, [ports]);
8870
- //Normalize port position when element is resized
8916
+ }, [normalizePortPosition]);
8917
+ var getParentAbsolutePosition = React.useCallback(function () {
8918
+ return props.element.parentElement ? getAbsolutePosition(props.element.parentElement) : undefined;
8919
+ }, [props.element.parentElement]);
8920
+ var getElementAbsPosition = React.useCallback(function () {
8921
+ var newPosition = {
8922
+ x: position.x,
8923
+ y: position.y,
8924
+ };
8925
+ var parentAbsolutePosition = getParentAbsolutePosition();
8926
+ if (parentAbsolutePosition) {
8927
+ newPosition.x += parentAbsolutePosition.x;
8928
+ newPosition.y += parentAbsolutePosition.y;
8929
+ }
8930
+ return newPosition;
8931
+ }, [position, getParentAbsolutePosition]);
8932
+ var elementAbsPosition = React.useMemo(function () { return getElementAbsPosition(); }, [getElementAbsPosition]);
8933
+ //update element position
8934
+ var updateElementPosition = React.useCallback(function (newPosition) {
8935
+ setPosition({ x: newPosition.x, y: newPosition.y });
8936
+ props.element.position = { x: newPosition.x, y: newPosition.y };
8937
+ }, [props.element]);
8938
+ //update element size
8939
+ var updateElementSize = React.useCallback(function (newSize) {
8940
+ setSize({ width: newSize.width, height: newSize.height });
8941
+ props.element.size = { width: newSize.width, height: newSize.height };
8942
+ }, [props.element]);
8943
+ //Listen to manually trigger render event
8871
8944
  React.useEffect(function () {
8872
- var newPorts = portsRef.current.map(function (port) {
8873
- var newPosition = normalizePortPosition(port.position);
8874
- onPortMoved === null || onPortMoved === void 0 ? void 0 : onPortMoved(port, id, port.position, newPosition);
8875
- _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition);
8876
- port.position = newPosition;
8877
- return port;
8945
+ var off = onManuallyTriggerRenderPort === null || onManuallyTriggerRenderPort === void 0 ? void 0 : onManuallyTriggerRenderPort(function (portId, elementId) {
8946
+ if (elementId !== id)
8947
+ return;
8948
+ logger.info('onManuallyTriggerRenderPort', id);
8949
+ handlePortsState(portsRef.current);
8878
8950
  });
8879
- setPorts(newPorts);
8880
- }, [width, height, _paperEventEmitterContext, id, onPortsChanged, normalizePortPosition, onPortMoved]);
8951
+ return function () {
8952
+ off === null || off === void 0 ? void 0 : off();
8953
+ };
8954
+ }, [id, onManuallyTriggerRenderPort, handlePortsState, props.element]);
8955
+ //Initialize ports state
8956
+ React.useEffect(function () {
8957
+ handlePortsState(propPorts || []);
8958
+ }, [handlePortsState, propPorts]);
8959
+ // const normalizePortsPosition = useCallback(() => {
8960
+ // const newPorts = portsRef.current.map(port => {
8961
+ // const newPosition = normalizePortPosition(port.position);
8962
+ // port.position = newPosition;
8963
+ // return port;
8964
+ // });
8965
+ // return newPorts;
8966
+ // }, [normalizePortPosition]);
8967
+ // //Normalize port position when element is resized
8968
+ // useEffect(() => {
8969
+ // //const newPorts = normalizePortsPosition();
8970
+ // //handlePortsState(newPorts);
8971
+ // }, [size, _paperEventEmitterContext, id, normalizePortPosition, onPortMoved, normalizePortsPosition, handlePortsState]);
8881
8972
  //Listen trigger of Delete key, handle delete port is selected
8882
8973
  React.useEffect(function () {
8883
8974
  var listener = _paperEventEmitterContext.onCommandDeleteSelectedPort(function () {
8884
- if (selectedPort) {
8975
+ if (selectedPort && selectedPort.removable !== false) {
8885
8976
  var newPorts = portsRef.current.filter(function (p) { return p.id !== selectedPort.id; });
8886
- setPorts(newPorts);
8977
+ handlePortsState(newPorts);
8887
8978
  setSelectedPort(undefined);
8888
- onPortsChanged === null || onPortsChanged === void 0 ? void 0 : onPortsChanged(newPorts, id);
8979
+ //onPortsChanged?.(newPorts, id)
8889
8980
  }
8890
8981
  });
8891
8982
  return function () {
8892
8983
  listener.off();
8893
8984
  };
8894
- }, [_paperEventEmitterContext, id, onPortsChanged, selectedPort]);
8985
+ }, [_paperEventEmitterContext, id, selectedPort, handlePortsState, props.element.ports]);
8895
8986
  React.useEffect(function () {
8896
8987
  //Listener onMouseDown event on #paper-container
8897
8988
  var eventListener = _paperEventEmitterContext.onPaperClicked(function (ev) {
@@ -8904,26 +8995,38 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8904
8995
  React.useEffect(function () {
8905
8996
  //listen element resize to update position of the ports by element size.
8906
8997
  var eleResizeListener = _paperEventEmitterContext.onElementResized(id, function () {
8907
- var isChanged = false;
8998
+ //let isChanged = false;
8908
8999
  var newPorts = portsRef.current.map(function (port) {
8909
9000
  var newPosition = normalizePortPosition({ x: port.position.x, y: port.position.y });
8910
9001
  //Check port moved
8911
9002
  if (port.position.x !== newPosition.x || port.position.y !== newPosition.y) {
8912
- isChanged = true;
9003
+ //isChanged = true;
8913
9004
  _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition);
8914
9005
  }
8915
9006
  port.position = newPosition;
8916
9007
  return port;
8917
9008
  });
8918
- setPorts(newPorts);
8919
- if (isChanged) {
8920
- onPortsChanged === null || onPortsChanged === void 0 ? void 0 : onPortsChanged(newPorts, id);
8921
- }
9009
+ handlePortsState(newPorts);
9010
+ // if (isChanged) {
9011
+ // onPortsChanged?.(newPorts, id);
9012
+ // }
8922
9013
  });
8923
9014
  return function () {
8924
9015
  eleResizeListener.off();
8925
9016
  };
8926
- }, [_paperEventEmitterContext, id, onPortsChanged, onPortMoved, normalizePortPosition, width, height, portMoveableAreas, portSlideRailSVGClassName]);
9017
+ }, [_paperEventEmitterContext, id, normalizePortPosition, size, portMoveableAreas, portSlideRailSVGClassName, handlePortsState, props.element.ports]);
9018
+ //list to port added
9019
+ React.useEffect(function () {
9020
+ var _a, _b;
9021
+ //Listen a new port added, then re-render the element component
9022
+ var off = (_b = (_a = props.element).onAddedPort) === null || _b === void 0 ? void 0 : _b.call(_a, function (newPort) {
9023
+ logger.info("A new port has been added to element ".concat(id));
9024
+ handlePortsState(props.element.ports || []);
9025
+ });
9026
+ return function () {
9027
+ off === null || off === void 0 ? void 0 : off();
9028
+ };
9029
+ }, [handlePortsState, id, props.element]);
8927
9030
  //Listen creating element link started, ended.
8928
9031
  React.useEffect(function () {
8929
9032
  var elementStartedListener = _paperEventEmitterContext.onElementLinkStarted(function (tempLink) {
@@ -8973,30 +9076,30 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8973
9076
  var handleSelectedPort = React.useCallback(function (portId, e) {
8974
9077
  e.stopPropagation();
8975
9078
  logger.debug('Port selected', portId, e);
8976
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9079
+ var port = ports.find(function (p) { return p.id === portId; });
8977
9080
  if (!port)
8978
9081
  return;
8979
9082
  setSelectedPort(port);
8980
9083
  _paperEventEmitterContext.emitPortSelected(port, id);
8981
- }, [id, _paperEventEmitterContext]);
9084
+ }, [ports, id, _paperEventEmitterContext]);
8982
9085
  //Calculate the position of the 4 vertices of a rectangle relative to element
8983
9086
  var calculateSlideRailRectSVGPositions = React.useCallback(function (slideRailSVG) {
8984
9087
  var coordinates = getRectangleCorners(slideRailSVG);
8985
9088
  var ownerSVG = slideRailSVG.ownerSVGElement;
8986
9089
  var rotationAngle = getElementRotationInfo(ownerSVG);
8987
9090
  if (rotationAngle !== 0) {
8988
- var rotationCenterX = width / 2;
8989
- var rotationCenterY = height / 2;
9091
+ var rotationCenterX = size.width / 2;
9092
+ var rotationCenterY = size.height / 2;
8990
9093
  coordinates = getRotatedRectangleCoordinates(coordinates, rotationCenterX, rotationCenterY, rotationAngle);
8991
9094
  }
8992
9095
  return coordinates;
8993
- }, [width, height]);
9096
+ }, [size]);
8994
9097
  var getSlideRailSVG = React.useCallback(function (portSlideRailSVGClassName) {
8995
9098
  var _a;
8996
9099
  var slideRailSVG = (_a = elementRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(".".concat(portSlideRailSVGClassName));
8997
9100
  return slideRailSVG;
8998
9101
  }, []);
8999
- var handlePortMove = function (newX, newY) {
9102
+ var handlePortMove = React.useCallback(function (newX, newY) {
9000
9103
  if (!selectedPort)
9001
9104
  return;
9002
9105
  var oldPosition = __assign({}, selectedPort.position);
@@ -9008,13 +9111,14 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9008
9111
  var newPosition = normalizePortPosition(tempNewPosition);
9009
9112
  if (newPosition) {
9010
9113
  selectedPort.position = newPosition;
9011
- onPortMoved === null || onPortMoved === void 0 ? void 0 : onPortMoved(selectedPort, id, oldPosition, newPosition);
9012
- setPorts(__spreadArray([], portsRef.current, true));
9114
+ //onPortMoved?.(selectedPort, id, oldPosition, newPosition)
9115
+ handlePortsState(portsRef.current);
9013
9116
  if (_paperEventEmitterContext.emitter.listenerCount(EVENT_NAME.PORT_MOVED) > 0) {
9014
9117
  _paperEventEmitterContext.emitPortMoved(selectedPort, id, oldPosition, newPosition);
9015
9118
  }
9119
+ onPortMoved === null || onPortMoved === void 0 ? void 0 : onPortMoved(selectedPort, id, oldPosition, newPosition);
9016
9120
  }
9017
- };
9121
+ }, [selectedPort, elementAbsPosition, normalizePortPosition, _paperEventEmitterContext, id, onPortMoved, handlePortsState]);
9018
9122
  //Handle when mouse down on port
9019
9123
  var handlePortMouseDown = React.useCallback(function (portId, e) {
9020
9124
  e.stopPropagation();
@@ -9025,7 +9129,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9025
9129
  return;
9026
9130
  _paperEventEmitterContext.emitPortMouseDown(e, port, id);
9027
9131
  onPortMouseDown === null || onPortMouseDown === void 0 ? void 0 : onPortMouseDown(e, port, id);
9028
- }, [id, onPortMouseDown, _paperEventEmitterContext]);
9132
+ }, [id, _paperEventEmitterContext, onPortMouseDown]);
9029
9133
  //Handle when mouse up on port
9030
9134
  var handlePortMouseUp = React.useCallback(function (portId, e) {
9031
9135
  e.stopPropagation();
@@ -9038,50 +9142,44 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9038
9142
  if (potentialPortPosition) {
9039
9143
  setPotentialPortPosition(undefined);
9040
9144
  }
9041
- }, [id, onPortMouseUp, _paperEventEmitterContext, potentialPortPosition]);
9145
+ }, [_paperEventEmitterContext, id, onPortMouseUp, potentialPortPosition]);
9042
9146
  //Update state when label of port is moved
9043
9147
  var handlePortLabelMoved = React.useCallback(function (newX, newY, portId) {
9044
- setPorts(function (prevPorts) {
9045
- return prevPorts.map(function (p) {
9046
- if (p.id === portId && p.label) {
9047
- var newLabel = Object.assign(Object.create(Object.getPrototypeOf(p.label)), p.label);
9048
- var newPosition = {
9049
- x: newX,
9050
- y: newY
9051
- };
9052
- newLabel.position = newPosition;
9053
- p.label = newLabel;
9054
- }
9055
- return p;
9056
- });
9057
- });
9058
- }, []);
9148
+ handlePortsState(portsRef.current.map(function (p) {
9149
+ if (p.id === portId && p.label) {
9150
+ var newLabel = Object.assign(Object.create(Object.getPrototypeOf(p.label)), p.label);
9151
+ var newPosition = {
9152
+ x: newX,
9153
+ y: newY
9154
+ };
9155
+ newLabel.position = newPosition;
9156
+ p.label = newLabel;
9157
+ }
9158
+ return p;
9159
+ }));
9160
+ }, [handlePortsState]);
9059
9161
  //Update state when label of port is resized
9060
9162
  var handlePortLabelResized = React.useCallback(function (width, height, portId) {
9061
- setPorts(function (prevPorts) {
9062
- return prevPorts.map(function (p) {
9063
- if (p.id === portId && p.label) {
9064
- p.label.size = {
9065
- width: width,
9066
- height: height
9067
- };
9068
- }
9069
- return p;
9070
- });
9071
- });
9072
- }, []);
9163
+ handlePortsState(portsRef.current.map(function (p) {
9164
+ if (p.id === portId && p.label) {
9165
+ p.label.size = {
9166
+ width: width,
9167
+ height: height
9168
+ };
9169
+ }
9170
+ return p;
9171
+ }));
9172
+ }, [handlePortsState]);
9073
9173
  //Update state when label of port is changed content
9074
9174
  var handlePortLabelContentChanged = React.useCallback(function (ev, newValue, portId) {
9075
- setPorts(function (prevPorts) {
9076
- return prevPorts.map(function (p) {
9077
- if (p.id === portId && p.label) {
9078
- p.label.content = newValue;
9079
- }
9080
- return p;
9081
- });
9082
- });
9083
- }, []);
9084
- function handleElementMouseMove(ev) {
9175
+ handlePortsState(portsRef.current.map(function (p) {
9176
+ if (p.id === portId && p.label) {
9177
+ p.label.content = newValue;
9178
+ }
9179
+ return p;
9180
+ }));
9181
+ }, [handlePortsState]);
9182
+ var handleElementMouseMove = React.useCallback(function (ev) {
9085
9183
  //ev.stopPropagation(); //Can't use stopPropagation here, because do not create tempLink
9086
9184
  onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(ev, id);
9087
9185
  if (someElementLinkStarted && elementRef.current) {
@@ -9108,19 +9206,19 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9108
9206
  setPotentialPortPosition(undefined);
9109
9207
  }
9110
9208
  }
9111
- }
9112
- function handleElementMouseLeave(ev) {
9209
+ }, [onMouseMove, id, someElementLinkStarted, container, zoom, getElementAbsPosition, normalizePortPosition, hoveredPort]);
9210
+ var handleElementMouseLeave = React.useCallback(function (ev) {
9113
9211
  ev.stopPropagation();
9114
9212
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(ev, id);
9115
9213
  if (someElementLinkStarted) { //If an element link is being created, clear the placeholder when the mouse leaves the element.
9116
9214
  setPotentialPortPosition(undefined);
9117
9215
  }
9118
- }
9119
- var handleElementMouseDown = function (ev) {
9216
+ }, [onMouseLeave, id, someElementLinkStarted]);
9217
+ var handleElementMouseDown = React.useCallback(function (ev) {
9120
9218
  ev.stopPropagation();
9121
9219
  onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(ev, id);
9122
- };
9123
- var handleElementMouseUp = function (ev) {
9220
+ }, [onMouseDown, id]);
9221
+ var handleElementMouseUp = React.useCallback(function (ev) {
9124
9222
  ev.stopPropagation();
9125
9223
  onMouseUp === null || onMouseUp === void 0 ? void 0 : onMouseUp(ev, id);
9126
9224
  //If an element link is being created, trigger onMouseUpAtLinkedPortPlaceholder when the mouse up the element.
@@ -9129,16 +9227,16 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9129
9227
  onMouseUpAtLinkedPortPlaceholder === null || onMouseUpAtLinkedPortPlaceholder === void 0 ? void 0 : onMouseUpAtLinkedPortPlaceholder(newElementLink, potentialPortPosition, id);
9130
9228
  elementLinkStarted.current = undefined;
9131
9229
  }
9132
- };
9230
+ }, [potentialPortPosition, elementLinkStarted, onMouseUpAtLinkedPortPlaceholder, id]);
9133
9231
  //Handle when mouse move on port
9134
9232
  var handlePortMouseMove = React.useCallback(function (portId) {
9135
9233
  if (someElementLinkStarted) {
9136
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9234
+ var port = ports.find(function (p) { return p.id === portId; });
9137
9235
  if (!port)
9138
9236
  return;
9139
9237
  setHoveredPort(port);
9140
9238
  }
9141
- }, [someElementLinkStarted]);
9239
+ }, [someElementLinkStarted, ports]);
9142
9240
  //Handle when mouse leave on port
9143
9241
  var handlePortMouseLeave = React.useCallback(function () {
9144
9242
  if (someElementLinkStarted)
@@ -9147,11 +9245,11 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9147
9245
  //Handle when context menu is opened on port
9148
9246
  var handlePortContextMenu = React.useCallback(function (portId, e) {
9149
9247
  e.preventDefault();
9150
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9248
+ var port = ports.find(function (p) { return p.id === portId; });
9151
9249
  if (!port)
9152
9250
  return;
9153
9251
  onPortContextMenu === null || onPortContextMenu === void 0 ? void 0 : onPortContextMenu(port, id, e);
9154
- }, [onPortContextMenu, id]);
9252
+ }, [ports, onPortContextMenu, id]);
9155
9253
  //Get rotate angle of port by port direction is defined.
9156
9254
  var rotatePort = React.useCallback(function (x, y) {
9157
9255
  // logger.info('calculating port rotation', x, y)
@@ -9166,8 +9264,8 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9166
9264
  switch (portDirection) {
9167
9265
  case exports.SubObjectDirection.Radial:
9168
9266
  var center = {
9169
- x: width / 2,
9170
- y: height / 2
9267
+ x: size.width / 2,
9268
+ y: size.height / 2
9171
9269
  };
9172
9270
  rotationAngle = calculateAngleWithOx(normalizedPosition, center);
9173
9271
  break;
@@ -9192,46 +9290,149 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9192
9290
  break;
9193
9291
  }
9194
9292
  return rotationAngle;
9195
- }, [width, height, portSlideRailSVGClassName, portDirection, getSlideRailSVG, normalizePortPosition, calculateSlideRailRectSVGPositions]);
9196
- var renderedShape = React.useMemo(function () {
9197
- if (renderShape)
9198
- return renderShape(props);
9199
- return null;
9200
- }, [props, renderShape]);
9293
+ }, [size.width, size.height, portSlideRailSVGClassName, portDirection, getSlideRailSVG, normalizePortPosition, calculateSlideRailRectSVGPositions]);
9294
+ // const prevElms = elementsRef.current;
9295
+ var handleTextChanged = React.useCallback(function (textId, content) {
9296
+ var textToUpdate = texts === null || texts === void 0 ? void 0 : texts.find(function (t) { return t.id === textId; });
9297
+ if (!textToUpdate)
9298
+ return;
9299
+ textToUpdate.content = content;
9300
+ setTexts(__spreadArray([], texts, true));
9301
+ }, [texts]);
9302
+ // const renderedShape = useMemo(() => {
9303
+ // if (renderShape) return renderShape(props);
9304
+ // return null;
9305
+ // }, [props, size, position, renderShape])
9306
+ var adjustElementPositionOnParentPortArea = React.useCallback(function (toBeAdjustedPosition, isAbsolutePosition) {
9307
+ if (isAbsolutePosition === void 0) { isAbsolutePosition = false; }
9308
+ if (props.element.moveAsPortOnParent && props.element.parentElement && parentDOM) {
9309
+ var newRelativePosition = {
9310
+ x: toBeAdjustedPosition.x,
9311
+ y: toBeAdjustedPosition.y
9312
+ };
9313
+ if (isAbsolutePosition) {
9314
+ newRelativePosition = transformAbsPositionToElementRelativePosition(toBeAdjustedPosition, props.element);
9315
+ }
9316
+ return correctPortPositionInElement(newRelativePosition, props.element.size.width, props.element.size.height, props.element.parentElement.portMoveableAreas, props.element.parentElement.portSlideRailSVGClassName, parentDOM);
9317
+ }
9318
+ return toBeAdjustedPosition;
9319
+ }, [props.element, parentDOM]);
9320
+ //update absolute position of element and absolute position of children elements
9321
+ // const updateElementPosition = (element: IElementInTreeState, x: number, y: number, isRelativePosition?: boolean): IElementInTreeState => {
9322
+ // if (isRelativePosition) {
9323
+ // element.position.x = x;
9324
+ // element.position.y = y;
9325
+ // } else {
9326
+ // const relativePosition = transformAbsPositionToElementRelativePosition({ x, y }, element)
9327
+ // element.position.x = relativePosition.x;
9328
+ // element.position.y = relativePosition.y;
9329
+ // }
9330
+ // return element;
9331
+ // }
9201
9332
  //Re-render port again after rendered to automation rotate port
9202
9333
  //Because elementRef.current equals null in first render so automation rotate port is incorrect.
9203
9334
  //TODO: check if this is still needed -> Still needed
9204
9335
  // useLayoutEffect(() => {
9205
9336
  // if (elementRef.current) {
9206
- // setPorts(prev => [...prev])
9337
+ // handlePortsState(portsRef.current);
9207
9338
  // }
9208
- // }, [])
9209
- //log element render
9210
- logger.debug('Rendering Element', id, x, y, width, height, cssClass, portPlaceholderShape, children, container, parentAbsolutePosition, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, ports, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize);
9211
- return (React.createElement(React.Fragment, null,
9212
- React.createElement(ElementWrapper, { ref: elementRef, x: x, y: y, cssClass: cssClass, onClick: function (e) { return onClick ? onClick(id, e, elementRef.current) : true; }, onMouseMove: handleElementMouseMove, onMouseLeave: handleElementMouseLeave, onMouseDown: handleElementMouseDown, onMouseUp: handleElementMouseUp, onContextMenu: function (e) { return onContextMenu ? onContextMenu(id, e, elementRef.current) : true; } },
9213
- renderedShape,
9214
- potentialPortPosition && (portPlaceholderShape
9215
- ? React.createElement("svg", { x: potentialPortPosition.x, y: potentialPortPosition.y }, portPlaceholderShape)
9216
- : React.createElement("rect", { x: potentialPortPosition.x - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2, y: potentialPortPosition.y - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2, width: PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH, height: PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH, rx: PORT_PLACEHOLDER_DEFAULT_SIZE, ry: PORT_PLACEHOLDER_DEFAULT_SIZE, stroke: PORT_PLACEHOLDER_DEFAULT_STROKE, fill: "none", strokeWidth: 3 })), ports === null || ports === void 0 ? void 0 :
9217
- ports.map(function (p, index) {
9218
- var _a, _b, _c, _d, _e, _f, _g, _h;
9219
- return React.createElement(Port, { key: p.id, ref: p.ref, id: p.id, x: p.position.x, y: p.position.y, parentAbsolutePosition: elementAbsPosition, width: (_c = (_b = (_a = p.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : defaultPortSize) !== null && _c !== void 0 ? _c : PORT_DEFAULT_SIZE, height: (_f = (_e = (_d = p.size) === null || _d === void 0 ? void 0 : _d.height) !== null && _e !== void 0 ? _e : defaultPortSize) !== null && _f !== void 0 ? _f : PORT_DEFAULT_SIZE, container: container, calculateRotationAngle: rotatePort, label: p.label, onPortLabelMoved: handlePortLabelMoved, onPortLabelResized: handlePortLabelResized, onPortLabelContentChanged: handlePortLabelContentChanged, onSelected: handleSelectedPort, onMouseDown: handlePortMouseDown, onMouseUp: handlePortMouseUp, onMouseMove: handlePortMouseMove, onMouseLeave: handlePortMouseLeave, onContextMenu: handlePortContextMenu, renderShape: p.renderShape },
9220
- selectedPort && selectedPort.id === p.id && (hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.id) !== p.id &&
9221
- (React.createElement(SelectionFrame, { container: container, targetSVGElement: ((_g = selectedPort === null || selectedPort === void 0 ? void 0 : selectedPort.ref) === null || _g === void 0 ? void 0 : _g.current) || undefined, resizability: {
9222
- enabled: false,
9223
- keepRatio: false
9224
- }, objectX: elementAbsPosition.x + selectedPort.position.x, objectY: elementAbsPosition.y + selectedPort.position.y, onMove: handlePortMove, zoom: zoom })),
9225
- hoveredPort && hoveredPort.id === p.id && (React.createElement(SelectionFrame, { container: container, targetSVGElement: ((_h = hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.ref) === null || _h === void 0 ? void 0 : _h.current) || undefined, resizability: {
9339
+ // }, [handlePortsState])
9340
+ //cache render ports
9341
+ var renderedPorts = React.useMemo(function () {
9342
+ return ports === null || ports === void 0 ? void 0 : ports.map(function (p, index) {
9343
+ var _a, _b, _c, _d, _e, _f, _g, _h;
9344
+ return React.createElement(Port, { key: p.id, ref: p.ref, id: p.id, x: p.position.x, y: p.position.y, parentAbsolutePosition: elementAbsPosition, width: (_c = (_b = (_a = p.size) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : defaultPortSize) !== null && _c !== void 0 ? _c : PORT_DEFAULT_SIZE, height: (_f = (_e = (_d = p.size) === null || _d === void 0 ? void 0 : _d.height) !== null && _e !== void 0 ? _e : defaultPortSize) !== null && _f !== void 0 ? _f : PORT_DEFAULT_SIZE, container: container, calculateRotationAngle: rotatePort, label: p.label, onPortLabelMoved: handlePortLabelMoved, onPortLabelResized: handlePortLabelResized, onPortLabelContentChanged: handlePortLabelContentChanged, onSelected: handleSelectedPort, onMouseDown: handlePortMouseDown, onMouseUp: handlePortMouseUp, onMouseMove: handlePortMouseMove, onMouseLeave: handlePortMouseLeave, onContextMenu: handlePortContextMenu, renderShape: p.renderShape },
9345
+ selectedPort && selectedPort.id === p.id && (hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.id) !== p.id &&
9346
+ (React.createElement(SelectionFrame, { container: container, targetSVGElement: ((_g = p.ref) === null || _g === void 0 ? void 0 : _g.current) || undefined, resizability: {
9226
9347
  enabled: false,
9227
9348
  keepRatio: false
9228
- }, zoom: zoom })));
9229
- }), texts === null || texts === void 0 ? void 0 :
9230
- texts.map(function (t, index) {
9231
- var _a, _b;
9232
- return React.createElement(Text$1, { id: t.id, key: index, content: t.content, x: ((_a = t.position) === null || _a === void 0 ? void 0 : _a.x) || 0, y: ((_b = t.position) === null || _b === void 0 ? void 0 : _b.y) || 0, width: t.size.width, height: t.size.height, editable: t.editable, selectable: t.selectable, align: t.align, fontSize: t.fontSize, border: t.border, container: container, style: t.style, parentAbsolutePosition: elementAbsPosition, onContentChanged: function (ev, newContent) { return onTextUpdated === null || onTextUpdated === void 0 ? void 0 : onTextUpdated(id, t.id, newContent); } });
9233
- }),
9234
- children)));
9349
+ }, objectX: elementAbsPosition.x + selectedPort.position.x, objectY: elementAbsPosition.y + selectedPort.position.y, onMove: handlePortMove, zoom: zoom })),
9350
+ hoveredPort && hoveredPort.id === p.id && (React.createElement(SelectionFrame, { container: container, targetSVGElement: ((_h = hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.ref) === null || _h === void 0 ? void 0 : _h.current) || undefined, resizability: {
9351
+ enabled: false,
9352
+ keepRatio: false
9353
+ }, zoom: zoom })));
9354
+ });
9355
+ }, [ports, elementAbsPosition, defaultPortSize, container, rotatePort, handlePortLabelMoved, handlePortLabelResized, handlePortLabelContentChanged, handleSelectedPort, handlePortMouseDown, handlePortMouseUp, handlePortMouseMove, handlePortMouseLeave, handlePortContextMenu, selectedPort, hoveredPort, handlePortMove, zoom]);
9356
+ //cache render texts
9357
+ var renderedTexts = React.useMemo(function () {
9358
+ return texts === null || texts === void 0 ? void 0 : texts.map(function (t, index) {
9359
+ var _a, _b;
9360
+ return React.createElement(Text$1, { id: t.id, key: index, content: t.content, x: ((_a = t.position) === null || _a === void 0 ? void 0 : _a.x) || 0, y: ((_b = t.position) === null || _b === void 0 ? void 0 : _b.y) || 0, width: t.size.width, height: t.size.height, editable: t.editable, selectable: t.selectable, align: t.align, fontSize: t.fontSize, border: t.border, container: container, style: t.style, parentAbsolutePosition: elementAbsPosition, onContentChanged: function (ev, newContent) { return handleTextChanged(t.id, newContent); } });
9361
+ });
9362
+ }, [id, texts, container, elementAbsPosition, handleTextChanged]);
9363
+ //log element render
9364
+ logger.debug('Rendering Element', id, position.x, position.y, size.width, size.height, cssClass, portPlaceholderShape, children, container, getParentAbsolutePosition(), textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, ports, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize);
9365
+ return (React.createElement(ElementWrapper, { key: "ElementWrapper", ref: elementRef, x: position.x, y: position.y, cssClass: cssClass, onClick: function (e) { return onClick ? onClick(id, e, elementRef.current) : true; }, onMouseMove: handleElementMouseMove, onMouseLeave: handleElementMouseLeave, onMouseDown: handleElementMouseDown, onMouseUp: handleElementMouseUp, onContextMenu: function (e) { return onContextMenu ? onContextMenu(id, e, elementRef.current) : true; } }, renderShape === null || renderShape === void 0 ? void 0 :
9366
+ renderShape(props),
9367
+ !!container && !!beingSelected &&
9368
+ React.createElement(SelectionFrame, { key: id, container: container, targetSVGElement: elementRef.current || undefined, resizability: resizability || {
9369
+ enabled: true,
9370
+ keepRatio: true
9371
+ }, objectX: elementAbsPosition === null || elementAbsPosition === void 0 ? void 0 : elementAbsPosition.x, objectY: elementAbsPosition === null || elementAbsPosition === void 0 ? void 0 : elementAbsPosition.y, width: size.width, height: size.height, zoom: zoom, draggingByDefault: draggingByDefault,
9372
+ //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9373
+ onMouseDown: function (ev) {
9374
+ windowsPositionToPaperPosition({
9375
+ x: ev.clientX,
9376
+ y: ev.clientY
9377
+ }, container, zoomRef.current);
9378
+ onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(ev, id);
9379
+ }, onMouseUp: function (ev) {
9380
+ windowsPositionToPaperPosition({
9381
+ x: ev.clientX,
9382
+ y: ev.clientY
9383
+ }, container, zoomRef.current);
9384
+ onMouseUp === null || onMouseUp === void 0 ? void 0 : onMouseUp(ev, id);
9385
+ }, onMove: function (newX, newY) {
9386
+ var _a;
9387
+ var oldPosition = __assign({}, position);
9388
+ // Relative position to the paper container
9389
+ var paperPosition = {
9390
+ x: newX,
9391
+ y: newY
9392
+ };
9393
+ //Call onElementMoving to check if the element should be moved or not
9394
+ if (onMoving) {
9395
+ var _b = (_a = onMoving(props.element, paperPosition)) !== null && _a !== void 0 ? _a : {}, horizontalAllowed = _b.horizontalAllowed, verticalAllowed = _b.verticalAllowed;
9396
+ //If both horizontalAllowed and verticalAllowed are false, do not move the element
9397
+ if (!horizontalAllowed && !verticalAllowed) {
9398
+ return;
9399
+ }
9400
+ //If horizontalAllowed is false, keep the old x position
9401
+ if (!horizontalAllowed) {
9402
+ paperPosition.x = oldPosition.x;
9403
+ }
9404
+ //If verticalAllowed is false, keep the old y position
9405
+ if (!verticalAllowed) {
9406
+ paperPosition.y = oldPosition.y;
9407
+ }
9408
+ }
9409
+ logger.info("Element ".concat(props.element.id, " is dragging to position ").concat(JSON.stringify(paperPosition)));
9410
+ //Adjust position of element if it should move as a port on parent port area
9411
+ if (props.element.moveAsPortOnParent && props.element.parentElement) {
9412
+ paperPosition = adjustElementPositionOnParentPortArea(paperPosition, true);
9413
+ updateElementPosition(paperPosition);
9414
+ }
9415
+ else {
9416
+ var relativePosition = transformAbsPositionToElementRelativePosition(paperPosition, props.element);
9417
+ updateElementPosition(relativePosition);
9418
+ }
9419
+ //let newElementPosition = updateElementPosition(props.element, newPosition.x, newPosition.y, true)
9420
+ logger.info("Element ".concat(props.element.id, " is moving to relative position ").concat(JSON.stringify(props.element.position)));
9421
+ onMoved === null || onMoved === void 0 ? void 0 : onMoved(props.element, oldPosition, paperPosition);
9422
+ }, onResize: function (width, height) {
9423
+ var oldSize = size;
9424
+ var newSize = { width: width, height: height };
9425
+ updateElementSize(newSize);
9426
+ if (onResized) {
9427
+ onResized(props.element, oldSize, newSize);
9428
+ }
9429
+ } }),
9430
+ potentialPortPosition && (portPlaceholderShape
9431
+ ? React.createElement("svg", { x: potentialPortPosition.x, y: potentialPortPosition.y }, portPlaceholderShape)
9432
+ : React.createElement("rect", { x: potentialPortPosition.x - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2, y: potentialPortPosition.y - PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH / 2, width: PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH, height: PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH, rx: PORT_PLACEHOLDER_DEFAULT_SIZE, ry: PORT_PLACEHOLDER_DEFAULT_SIZE, stroke: PORT_PLACEHOLDER_DEFAULT_STROKE, fill: "none", strokeWidth: 3 })),
9433
+ renderedPorts,
9434
+ renderedTexts,
9435
+ children));
9235
9436
  });
9236
9437
  var Element$1 = React.memo(Element);
9237
9438
 
@@ -9478,36 +9679,34 @@ function convertElementsToTree(elements) {
9478
9679
  return parsedElementsInTree;
9479
9680
  }
9480
9681
  var Paper = function (props) {
9481
- var _a, _b;
9482
- var _c = React.useState({ elements: [], elementsInTree: [] }), elementsState = _c[0], setElementsState = _c[1];
9682
+ var _a = React.useState({ elements: [], elementsInTree: [] }), elementsState = _a[0], setElementsState = _a[1];
9483
9683
  // const [elements, setElements] = React.useState<IElementState[]>([]);
9484
9684
  // const [elementsInTree, setElementsInTree] = React.useState<IElementInTreeState[]>([]);
9485
- var _d = React.useState(), selectedElement = _d[0], setSelectedElement = _d[1];
9486
- var _e = React.useState(false), autoEnabledDraggingSelectedElement = _e[0], setAutoEnabledDraggingSelectedElement = _e[1];
9487
- var _f = React.useState([]), links = _f[0], setLinks = _f[1];
9488
- var _g = React.useState(), selectedLink = _g[0], setSelectedLink = _g[1];
9489
- var _h = React.useState(null), tempLink = _h[0], setTempLink = _h[1];
9490
- var _j = React.useState([]), texts = _j[0], setTexts = _j[1];
9491
- var _k = React.useState(), selectedText = _k[0], setSelectedText = _k[1];
9492
- var _l = React.useState(null), selectedElementSVG = _l[0], setSelectedElementSVG = _l[1];
9493
- var _m = React.useState(false), mouseDownedOnPaper = _m[0], setMouseDownedOnPaper = _m[1];
9685
+ var _b = React.useState(), selectedElement = _b[0], setSelectedElement = _b[1];
9686
+ var _c = React.useState(false), autoEnabledDraggingSelectedElement = _c[0], setAutoEnabledDraggingSelectedElement = _c[1];
9687
+ var _d = React.useState([]), links = _d[0], setLinks = _d[1];
9688
+ var _e = React.useState(), selectedLink = _e[0], setSelectedLink = _e[1];
9689
+ var _f = React.useState(null), tempLink = _f[0], setTempLink = _f[1];
9690
+ var _g = React.useState([]), texts = _g[0], setTexts = _g[1];
9691
+ var _h = React.useState(), selectedText = _h[0], setSelectedText = _h[1];
9692
+ var _j = React.useState(null), selectedElementSVG = _j[0], setSelectedElementSVG = _j[1];
9693
+ var _k = React.useState(false), mouseDownedOnPaper = _k[0], setMouseDownedOnPaper = _k[1];
9494
9694
  var paperEventEmitter = React.useContext(paperEventEmitterContext);
9495
9695
  var zoom = useZoomContext().zoom;
9496
9696
  var zoomRef = React.useRef(zoom);
9497
9697
  var paperContainerRef = React.useRef(null);
9498
9698
  var tempLinkRef = React.useRef(tempLink); //Cache tempLink to avoid re-render when tempLink changed
9499
- var elementsRef = React.useRef([]); //Cache elements to avoid re-render when elements changed
9699
+ //const elementsRef = useRef<IElementState[]>([]); //Cache elements to avoid re-render when elements changed
9500
9700
  var linksRef = React.useRef(links); //Cache links to avoid re-render when links changed
9501
9701
  var textsRef = React.useRef(texts); //Cache texts to avoid re-render when texts changed
9502
9702
  var size = props.size;
9503
- var selectedElementAbsPosition = React.useMemo(function () { return selectedElement ? getAbsolutePosition(selectedElement) : null; }, [selectedElement, (_a = selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.position) === null || _a === void 0 ? void 0 : _a.x, (_b = selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.position) === null || _b === void 0 ? void 0 : _b.y, selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size]);
9504
9703
  var onPortMoved = props.onPortMoved, onPortSelected = props.onPortSelected, onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp,
9505
9704
  //onPortsChanged,
9506
- onPortContextMenu = props.onPortContextMenu, onElementSelected = props.onElementSelected, onElementsChanged = props.onElementsChanged, onElementResized = props.onElementResized, onElementContextMenu = props.onElementContextMenu, onElementMouseUp = props.onElementMouseUp, onElementMouseDown = props.onElementMouseDown, onElementMouseMove = props.onElementMouseMove, onElementMoved = props.onElementMoved, onElementMouseLeave = props.onElementMouseLeave, onElementDeleted = props.onElementDeleted, onLinksChanged = props.onLinksChanged, onLinkSelected = props.onLinkSelected, onTextSelected = props.onTextSelected, onTextsChanged = props.onTextsChanged, manuallyTriggerRenderElementHandler = props.manuallyTriggerRenderElementHandler, manuallyTriggerRenderPortHandler = props.manuallyTriggerRenderPortHandler, onCreatingPortByLinking = props.onCreatingPortByLinking, onCreatingLink = props.onCreatingLink, onElementMoving = props.onElementMoving, manuallySelectElementHandler = props.manuallySelectElementHandler, manuallyTriggerDraggingElementHandler = props.manuallyTriggerDraggingElementHandler, manuallyTriggerStartedLinkingHandler = props.manuallyTriggerStartedLinkingHandler;
9705
+ onPortContextMenu = props.onPortContextMenu, onElementSelected = props.onElementSelected, onElementsChanged = props.onElementsChanged, onElementResized = props.onElementResized, onElementContextMenu = props.onElementContextMenu, onElementMouseUp = props.onElementMouseUp, onElementMouseDown = props.onElementMouseDown, onElementMouseMove = props.onElementMouseMove, onElementMoved = props.onElementMoved, onElementMouseLeave = props.onElementMouseLeave, onElementDeleted = props.onElementDeleted, onLinksChanged = props.onLinksChanged, onLinkSelected = props.onLinkSelected, onTextSelected = props.onTextSelected, onTextsChanged = props.onTextsChanged, manuallyTriggerRenderElementsHandler = props.manuallyTriggerRenderElementsHandler, manuallyTriggerRenderElementHandler = props.manuallyTriggerRenderElementHandler, manuallyTriggerRenderPortHandler = props.manuallyTriggerRenderPortHandler, onCreatingPortByLinking = props.onCreatingPortByLinking, onCreatingLink = props.onCreatingLink, onElementMoving = props.onElementMoving, manuallySelectElementHandler = props.manuallySelectElementHandler, manuallyTriggerDraggingElementHandler = props.manuallyTriggerDraggingElementHandler, manuallyTriggerStartedLinkingHandler = props.manuallyTriggerStartedLinkingHandler;
9507
9706
  var handleElementsState = React.useCallback(function (elements) {
9508
9707
  var elementsInTree = convertElementsToTree(elements);
9509
9708
  setElementsState({ elements: __spreadArray([], elements, true), elementsInTree: elementsInTree });
9510
- elementsRef.current = __spreadArray([], elements, true);
9709
+ // elementsRef.current = [...elements];
9511
9710
  }, []);
9512
9711
  var rerenderWhenAnyElementChanged = React.useCallback(function () {
9513
9712
  setElementsState(function (prev) { return ({ elements: __spreadArray([], prev.elements, true), elementsInTree: __spreadArray([], prev.elementsInTree, true) }); });
@@ -9525,37 +9724,57 @@ var Paper = function (props) {
9525
9724
  setTexts(__spreadArray([], props.texts, true));
9526
9725
  }, [props.texts]);
9527
9726
  React.useEffect(function () {
9528
- var off = manuallyTriggerRenderElementHandler(function (elementId) {
9529
- rerenderWhenAnyElementChanged();
9530
- //setElementsState(prevElementsState => ({ ...prevElementsState }));
9531
- // if (onElementsChanged) {
9532
- // onElementsChanged(newElements)
9533
- // }
9727
+ var off = manuallyTriggerRenderElementsHandler(function () {
9728
+ elementsState.elements.forEach(function (element) {
9729
+ element.version = (element.version || 0) + 1;
9730
+ });
9731
+ handleElementsState(elementsState.elements);
9534
9732
  });
9535
9733
  return function () {
9536
9734
  off();
9537
9735
  };
9538
- }, [manuallyTriggerRenderElementHandler, rerenderWhenAnyElementChanged]);
9736
+ }, [elementsState.elements, handleElementsState, manuallyTriggerRenderElementsHandler]);
9539
9737
  React.useEffect(function () {
9540
- var offs = [];
9541
- offs.push(manuallySelectElementHandler === null || manuallySelectElementHandler === void 0 ? void 0 : manuallySelectElementHandler(function (element) {
9542
- setSelectedElement(element || undefined);
9543
- if (element) {
9544
- onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9545
- }
9546
- }));
9547
- offs.push(manuallyTriggerDraggingElementHandler === null || manuallyTriggerDraggingElementHandler === void 0 ? void 0 : manuallyTriggerDraggingElementHandler(function (element) {
9548
- setSelectedElement(element);
9549
- onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9550
- setAutoEnabledDraggingSelectedElement(true);
9551
- }));
9738
+ var off = manuallyTriggerRenderElementHandler(function (elementId) {
9739
+ //find the element
9740
+ var element = elementsState.elements.find(function (elm) { return elm.id === elementId; });
9741
+ if (!element)
9742
+ return;
9743
+ element.version = (element.version || 0) + 1;
9744
+ handleElementsState(elementsState.elements);
9745
+ });
9552
9746
  return function () {
9553
- offs.forEach(function (off) { return off(); });
9747
+ off();
9554
9748
  };
9555
- }, [manuallySelectElementHandler, manuallyTriggerDraggingElementHandler, onElementSelected]);
9749
+ }, [elementsState.elements, handleElementsState, manuallyTriggerRenderElementHandler, onElementsChanged, rerenderWhenAnyElementChanged]);
9750
+ React.useEffect(function () {
9751
+ if (manuallySelectElementHandler) {
9752
+ var off_1 = manuallySelectElementHandler(function (element) {
9753
+ setSelectedElement(element || undefined);
9754
+ if (element) {
9755
+ onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9756
+ }
9757
+ });
9758
+ return function () {
9759
+ off_1();
9760
+ };
9761
+ }
9762
+ }, [manuallySelectElementHandler, onElementSelected]);
9763
+ React.useEffect(function () {
9764
+ if (manuallyTriggerDraggingElementHandler) {
9765
+ var off_2 = manuallyTriggerDraggingElementHandler(function (element) {
9766
+ setSelectedElement(element);
9767
+ onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9768
+ setAutoEnabledDraggingSelectedElement(true);
9769
+ });
9770
+ return function () {
9771
+ off_2();
9772
+ };
9773
+ }
9774
+ }, [elementsState.elements, manuallyTriggerDraggingElementHandler, onElementSelected]);
9556
9775
  React.useEffect(function () {
9557
9776
  if (manuallyTriggerStartedLinkingHandler) {
9558
- var off_1 = manuallyTriggerStartedLinkingHandler(function (sourceElement, sourcePort) {
9777
+ var off_3 = manuallyTriggerStartedLinkingHandler(function (sourceElement, sourcePort) {
9559
9778
  var newLink = {
9560
9779
  id: generateUniqueId(),
9561
9780
  points: [],
@@ -9566,7 +9785,7 @@ var Paper = function (props) {
9566
9785
  paperEventEmitter.emitElementLinkStarted(newLink);
9567
9786
  });
9568
9787
  return function () {
9569
- off_1();
9788
+ off_3();
9570
9789
  };
9571
9790
  }
9572
9791
  }, [manuallyTriggerStartedLinkingHandler, paperEventEmitter]);
@@ -9614,7 +9833,7 @@ var Paper = function (props) {
9614
9833
  setSelectedElementSVG(null);
9615
9834
  setSelectedLink(undefined);
9616
9835
  //broadcast selected port to parent component
9617
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
9836
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9618
9837
  if (element) {
9619
9838
  onPortSelected === null || onPortSelected === void 0 ? void 0 : onPortSelected(port, element);
9620
9839
  }
@@ -9622,36 +9841,44 @@ var Paper = function (props) {
9622
9841
  return function () {
9623
9842
  portSelectedListener.off();
9624
9843
  };
9625
- }, [paperEventEmitter, onPortSelected]);
9844
+ }, [paperEventEmitter, onPortSelected, elementsState]);
9626
9845
  React.useEffect(function () {
9627
9846
  //Listen parent of elements changed, then update elements tree
9628
- var parentChangedCancelers = elementsRef.current.map(function (element) {
9847
+ var parentChangedCancelers = elementsState.elements.map(function (element) {
9629
9848
  var _a;
9630
9849
  return (_a = element.onParentChanged) === null || _a === void 0 ? void 0 : _a.call(element, function (newPa, oldPa) {
9631
9850
  logger.info('onParentChanged');
9632
- handleElementsState(elementsRef.current);
9851
+ handleElementsState(elementsState.elements);
9633
9852
  });
9634
9853
  });
9635
- //Listen a new port added, then re-render the element component
9636
- var addedPortCancelers = elementsRef.current.map(function (element) {
9854
+ return function () {
9855
+ parentChangedCancelers.forEach(function (canceller) { return canceller === null || canceller === void 0 ? void 0 : canceller(); });
9856
+ };
9857
+ }, [handleElementsState, rerenderWhenAnyElementChanged, elementsState]);
9858
+ React.useEffect(function () {
9859
+ //Listen a new text added, then re-render the element component
9860
+ //TODO: to be moved to Element component
9861
+ var addedTextCancelers = elementsState.elements.map(function (element) {
9637
9862
  var _a;
9638
- return (_a = element.onAddedPort) === null || _a === void 0 ? void 0 : _a.call(element, function (newPort) {
9639
- logger.info("A new port has been added to element ".concat(element.id));
9640
- elementsRef.current.forEach(function (ele) {
9641
- if (ele.id === element.id) {
9642
- ele.ports = __spreadArray([], (ele.ports || []), true);
9643
- }
9644
- });
9645
- //Set state to re-render component
9646
- // setElements(newElements)
9863
+ return (_a = element.onAddedText) === null || _a === void 0 ? void 0 : _a.call(element, function (newText) {
9864
+ logger.info("A new text has been added to element ".concat(element.id));
9865
+ rerenderWhenAnyElementChanged();
9866
+ });
9867
+ });
9868
+ // Listen a text deleted, then re-render the element component
9869
+ //TODO: to be moved to Element component
9870
+ var deletedTextCancelers = elementsState.elements.map(function (element) {
9871
+ var _a;
9872
+ return (_a = element.onDeletedText) === null || _a === void 0 ? void 0 : _a.call(element, function (deletedTextId) {
9873
+ logger.info("A text has been deleted from element ".concat(element.id));
9647
9874
  rerenderWhenAnyElementChanged();
9648
9875
  });
9649
9876
  });
9650
9877
  return function () {
9651
- parentChangedCancelers.forEach(function (canceller) { return canceller === null || canceller === void 0 ? void 0 : canceller(); });
9652
- addedPortCancelers.forEach(function (canceller) { return canceller(); });
9878
+ addedTextCancelers.forEach(function (canceller) { return canceller(); });
9879
+ deletedTextCancelers.forEach(function (canceller) { return canceller(); });
9653
9880
  };
9654
- }, [handleElementsState, rerenderWhenAnyElementChanged]);
9881
+ }, [elementsState.elements, onElementsChanged, rerenderWhenAnyElementChanged]);
9655
9882
  // //Update elements tree when length of elements change
9656
9883
  // useEffect(() => {
9657
9884
  // updateElementsTree();
@@ -9669,11 +9896,11 @@ var Paper = function (props) {
9669
9896
  //Listen command delete selected for element
9670
9897
  React.useEffect(function () {
9671
9898
  var listener = paperEventEmitter.onCommandDeleteSelectedElement(function () {
9672
- if (selectedElement) {
9899
+ if (selectedElement && selectedElement.removable !== false) {
9673
9900
  selectedElement.parentElement = undefined; //Remove parent element to avoid memory leak. This will remove the element from the parent element's childrenElements array.
9674
9901
  var deletedChildElements = getChildOfElement(selectedElement);
9675
9902
  var deletedElementIds_1 = __spreadArray(__spreadArray([], deletedChildElements, true), [selectedElement], false).map(function (e) { return e.id; });
9676
- var prevElements = elementsRef.current;
9903
+ var prevElements = elementsState.elements;
9677
9904
  var newElements = prevElements.filter(function (e) { return !deletedElementIds_1.includes(e.id); });
9678
9905
  onElementDeleted === null || onElementDeleted === void 0 ? void 0 : onElementDeleted(selectedElement);
9679
9906
  //Set state to re-render component
@@ -9699,14 +9926,20 @@ var Paper = function (props) {
9699
9926
  return function () {
9700
9927
  listener.off();
9701
9928
  };
9702
- }, [selectedElement, onElementSelected, onElementsChanged, onLinksChanged, getChildOfElement, paperEventEmitter, onElementDeleted, handleElementsState]);
9929
+ }, [selectedElement, elementsState, onElementSelected, onElementsChanged, onLinksChanged, getChildOfElement, paperEventEmitter, onElementDeleted, handleElementsState]);
9930
+ var removeElementLink = React.useCallback(function (elementLink) {
9931
+ if (elementLink.removable === false)
9932
+ return linksRef.current;
9933
+ var prevLinks = linksRef.current;
9934
+ var newLinks = prevLinks.filter(function (l) { return l.id !== elementLink.id; });
9935
+ return newLinks;
9936
+ }, []);
9703
9937
  //Listen command delete selected for link
9704
9938
  React.useEffect(function () {
9705
9939
  var listener = paperEventEmitter.onCommandDeleteSelectedLink(function () {
9706
9940
  if (selectedLink) {
9707
- var prevLinks = linksRef.current;
9708
- var newLinks = prevLinks.filter(function (l) { return l.id !== selectedLink.id; });
9709
- setLinks(links);
9941
+ var newLinks = removeElementLink(selectedLink);
9942
+ setLinks(newLinks);
9710
9943
  setSelectedLink(undefined);
9711
9944
  if (onLinksChanged) {
9712
9945
  onLinksChanged(newLinks);
@@ -9720,11 +9953,11 @@ var Paper = function (props) {
9720
9953
  return function () {
9721
9954
  listener.off();
9722
9955
  };
9723
- }, [selectedLink, onLinksChanged, onLinkSelected, links, paperEventEmitter]);
9956
+ }, [selectedLink, onLinksChanged, onLinkSelected, paperEventEmitter, removeElementLink]);
9724
9957
  //Listen command delete selected for Text
9725
9958
  React.useEffect(function () {
9726
9959
  var listener = paperEventEmitter.onCommandDeleteSelectedText(function () {
9727
- if (selectedText) {
9960
+ if (selectedText && selectedText.removable !== false) {
9728
9961
  var prevTexts = textsRef.current;
9729
9962
  var newTexts = prevTexts.filter(function (t) { return t.id !== selectedText.id; });
9730
9963
  setTexts(newTexts);
@@ -9813,33 +10046,59 @@ var Paper = function (props) {
9813
10046
  y: yPosOnPaper
9814
10047
  });
9815
10048
  };
9816
- var handlePathChange = React.useCallback(function (path, id) {
9817
- //Update path of element link, that changed
9818
- // const prevLinks = linksRef.current;
9819
- var updatedLinkIndex = links.findIndex(function (l) { return l.id === id; });
9820
- links[updatedLinkIndex].path = path;
9821
- var newLinks = __spreadArray([], links, true);
10049
+ var handleElementMoved = React.useCallback(function (element, oldPosition, paperPosition) {
10050
+ // Start updating the position of links connected to the selected element
10051
+ var childElements = getChildOfElement(element);
10052
+ var elementIds = __spreadArray(__spreadArray([], childElements.map(function (e) { return e.id; }), true), [element.id], false);
10053
+ var offsetX = element.position.x - oldPosition.x;
10054
+ var offsetY = element.position.y - oldPosition.y;
10055
+ // Update position of all points of links that are connected to the selected element
10056
+ var newLinks = linksRef.current.map(function (link) {
10057
+ var isUpdate = elementIds.includes(link.sourceElement.id) && elementIds.includes(link.targetElement.id);
10058
+ if (link.points && isUpdate) {
10059
+ link.points.forEach(function (p) {
10060
+ p.x += offsetX;
10061
+ p.y += offsetY;
10062
+ });
10063
+ }
10064
+ return link;
10065
+ });
9822
10066
  setLinks(newLinks);
9823
- if (onLinksChanged) {
9824
- onLinksChanged(newLinks);
10067
+ // onLinksChanged?.(newLinks);
10068
+ // End updating the position of links connected to the selected element
10069
+ if (onElementMoved) {
10070
+ onElementMoved(element.position, element, paperPosition);
9825
10071
  }
9826
- }, [onLinksChanged, links]);
9827
- var handlePointsOfLinkChange = React.useCallback(function (points, linkId) {
9828
- var newLinks = __spreadArray([], linksRef.current, true);
9829
- var updatedLinkIndex = newLinks.findIndex(function (l) { return l.id === linkId; });
9830
- newLinks[updatedLinkIndex].points = points;
9831
- setLinks(newLinks);
9832
- if (onLinksChanged) {
9833
- onLinksChanged(newLinks);
10072
+ paperEventEmitter.emitElementMoved(element, oldPosition, element.position);
10073
+ setMouseDownedOnPaper(false);
10074
+ }, [getChildOfElement, onElementMoved, paperEventEmitter]);
10075
+ var handleElementResized = React.useCallback(function (element, oldSize, newSize) {
10076
+ if (onElementResized) {
10077
+ onElementResized(newSize, element);
9834
10078
  }
9835
- }, [onLinksChanged]);
10079
+ paperEventEmitter.emitElementResized(element, oldSize, newSize);
10080
+ setMouseDownedOnPaper(false);
10081
+ }, [paperEventEmitter, onElementResized]);
10082
+ // const handlePathChange = useCallback((path: string, id: string) => {
10083
+ // //Update path of element link, that changed
10084
+ // //const prevLinks = linksRef.current;
10085
+ // const updatedLink = linksRef.current.find(l => l.id === id)
10086
+ // if (updatedLink) {
10087
+ // updatedLink.path = path;
10088
+ // }
10089
+ // }, [])
10090
+ //TODO: to be cleaned
10091
+ var handlePointsOfLinkChange = React.useCallback(function (points, linkId) {
10092
+ var updatedLinkIndex = linksRef.current.findIndex(function (l) { return l.id === linkId; });
10093
+ linksRef.current[updatedLinkIndex].points = points;
10094
+ }, []);
9836
10095
  var handlePortMoved = React.useCallback(function (port, elementId, oldPosition, newPosition) {
9837
10096
  var _a;
9838
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10097
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9839
10098
  if (element) {
9840
10099
  //set links equals a clone links to re-render links with new position
9841
10100
  var prevLinks = linksRef.current;
9842
- var newLinks = prevLinks.map(function (link) {
10101
+ prevLinks.map(function (link) {
9843
10102
  var _a, _b;
9844
10103
  if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {
9845
10104
  link.sourcePort.position = newPosition;
@@ -9861,9 +10120,9 @@ var Paper = function (props) {
9861
10120
  return link;
9862
10121
  });
9863
10122
  });
9864
- if (onLinksChanged) {
9865
- onLinksChanged(newLinks);
9866
- }
10123
+ // if (onLinksChanged) {
10124
+ // onLinksChanged(newLinks)
10125
+ // }
9867
10126
  //const newElements = elementsRef.current;
9868
10127
  // newElements[updatedElementIndex].ports = newElements[updatedElementIndex].ports?.map(p => {
9869
10128
  // if (p.id === port.id) {
@@ -9875,7 +10134,7 @@ var Paper = function (props) {
9875
10134
  //To avoid re-render
9876
10135
  // setElements(prev => {
9877
10136
  // const newElements = [...prev]
9878
- var updatedElement = elementsRef.current.find(function (e) { return e.id === elementId; });
10137
+ var updatedElement = elementsState.elements.find(function (e) { return e.id === elementId; });
9879
10138
  if (updatedElement) {
9880
10139
  updatedElement.ports = (_a = updatedElement.ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
9881
10140
  if (p.id === port.id) {
@@ -9891,16 +10150,32 @@ var Paper = function (props) {
9891
10150
  onPortMoved(newPosition, port, element);
9892
10151
  }
9893
10152
  }
9894
- }, [onPortMoved, onLinksChanged, rerenderWhenAnyElementChanged]);
10153
+ }, [onPortMoved, elementsState, rerenderWhenAnyElementChanged]);
10154
+ React.useEffect(function () {
10155
+ //on port manually trigger render
10156
+ var off = manuallyTriggerRenderPortHandler(function (portId, elementId) {
10157
+ var _a;
10158
+ //find the element
10159
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10160
+ //find the port
10161
+ var port = (_a = element === null || element === void 0 ? void 0 : element.ports) === null || _a === void 0 ? void 0 : _a.find(function (p) { return p.id === portId; });
10162
+ if (!element || !port)
10163
+ return;
10164
+ //rerender links connected to the port
10165
+ handlePortMoved(port, elementId, __assign({}, port.position), __assign({}, port.position));
10166
+ });
10167
+ return function () {
10168
+ off();
10169
+ };
10170
+ }, [manuallyTriggerRenderPortHandler, handlePortMoved, elementsState]);
9895
10171
  //Handle creating a new element link
9896
10172
  var handlePortMouseDown = React.useCallback(function (ev, port, elementId) {
9897
10173
  ev.stopPropagation();
9898
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10174
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9899
10175
  var paperPosition = windowsPositionToPaperPosition({
9900
10176
  x: ev.clientX,
9901
10177
  y: ev.clientY
9902
10178
  }, paperContainerRef.current, zoomRef.current);
9903
- console.log(paperPosition);
9904
10179
  //broadcast port mouse down to parent component
9905
10180
  if (element) {
9906
10181
  onPortMouseDown === null || onPortMouseDown === void 0 ? void 0 : onPortMouseDown(port, element, paperPosition);
@@ -9916,7 +10191,7 @@ var Paper = function (props) {
9916
10191
  setTempLink(newLink);
9917
10192
  paperEventEmitter.emitElementLinkStarted(newLink);
9918
10193
  }
9919
- }, [paperEventEmitter, onPortMouseDown]);
10194
+ }, [paperEventEmitter, elementsState, onPortMouseDown]);
9920
10195
  var createElementLink = React.useCallback(function (sourcePort, sourceElement, targetPort, targetElement) {
9921
10196
  //if no onCreatingLink prop, no link will be created
9922
10197
  if (!onCreatingLink) {
@@ -9927,14 +10202,14 @@ var Paper = function (props) {
9927
10202
  return null;
9928
10203
  //Automatic bending, if is not defined points
9929
10204
  if (!newElementLink.points || newElementLink.points.length === 0) {
9930
- var elements = elementsRef.current;
10205
+ var elements = elementsState.elements;
9931
10206
  newElementLink = automationAddPointsToLink(newElementLink, elements, MAX_LINK_KNOT_COUNT);
9932
10207
  }
9933
10208
  return newElementLink;
9934
- }, [onCreatingLink]);
10209
+ }, [onCreatingLink, elementsState]);
9935
10210
  var handlePortMouseUp = React.useCallback(function (ev, port, elementId) {
9936
10211
  ev.stopPropagation();
9937
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10212
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9938
10213
  var paperPosition = windowsPositionToPaperPosition({
9939
10214
  x: ev.clientX,
9940
10215
  y: ev.clientY
@@ -9950,7 +10225,7 @@ var Paper = function (props) {
9950
10225
  var newElementLink = null;
9951
10226
  if (isMouseUpOnNotSelf) {
9952
10227
  var _a = tempLinkRef.current, sourcePort = _a.sourcePort, sourceElement = _a.sourceElement;
9953
- var targetElement = elementsRef.current.find(function (e) { return e.id === elementId; });
10228
+ var targetElement = elementsState.elements.find(function (e) { return e.id === elementId; });
9954
10229
  newElementLink = createElementLink(sourcePort, sourceElement, port, targetElement);
9955
10230
  }
9956
10231
  if (newElementLink) {
@@ -9967,7 +10242,7 @@ var Paper = function (props) {
9967
10242
  }
9968
10243
  setTempLink(null);
9969
10244
  }
9970
- }, [paperEventEmitter, createElementLink, onPortMouseUp, onLinksChanged]);
10245
+ }, [paperEventEmitter, elementsState, createElementLink, onPortMouseUp, onLinksChanged]);
9971
10246
  // const handlePortsChanged = useCallback((ports: IPort[], elementId: string) => {
9972
10247
  // const element = elementsRef.current.find(e => e.id === elementId);
9973
10248
  // if (element) {
@@ -10066,19 +10341,6 @@ var Paper = function (props) {
10066
10341
  var handleDeselectLink = function (link, index) {
10067
10342
  setSelectedLink(undefined);
10068
10343
  };
10069
- //update absolute position of element and absolute position of children elements
10070
- var updateElementPosition = function (element, x, y, isRelativePosition) {
10071
- if (isRelativePosition) {
10072
- element.position.x = x;
10073
- element.position.y = y;
10074
- }
10075
- else {
10076
- var relativePosition = transformAbsPositionToElementRelativePosition({ x: x, y: y }, element);
10077
- element.position.x = relativePosition.x;
10078
- element.position.y = relativePosition.y;
10079
- }
10080
- return element;
10081
- };
10082
10344
  /*
10083
10345
  Cache to avoid re-initializing the function when the component re-renders to
10084
10346
  avoid causing the components using it to re-render unnecessarily
@@ -10108,17 +10370,16 @@ var Paper = function (props) {
10108
10370
  }, [handleLinkLabelContentChanged]);
10109
10371
  var handleClickLinkDelete = React.useCallback(function (link, index) {
10110
10372
  return function () {
10111
- var prevLinks = linksRef.current;
10112
- var newLinks = __spreadArray([], prevLinks, true);
10113
- newLinks.splice(index, 1);
10373
+ var newLinks = removeElementLink(link);
10114
10374
  setLinks(newLinks);
10375
+ setSelectedLink(undefined);
10115
10376
  if (onLinksChanged) {
10116
10377
  onLinksChanged(newLinks);
10117
10378
  }
10118
10379
  };
10119
- }, [onLinksChanged]);
10380
+ }, [onLinksChanged, removeElementLink]);
10120
10381
  var handleMouseUpAtLinkedPortPlaceholder = React.useCallback(function (link, position, targetElementId) {
10121
- var targetElement = elementsRef.current.find(function (e) { return e.id === targetElementId; });
10382
+ var targetElement = elementsState.elements.find(function (e) { return e.id === targetElementId; });
10122
10383
  if (!targetElement)
10123
10384
  return;
10124
10385
  logger.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));
@@ -10148,20 +10409,20 @@ var Paper = function (props) {
10148
10409
  //Clear tempLink
10149
10410
  setTempLink(null);
10150
10411
  paperEventEmitter.emitElementLinkEnded();
10151
- }, [onCreatingPortByLinking, createElementLink, paperEventEmitter, onLinksChanged]);
10152
- var handleElementTextChange = React.useCallback(function (elementId, textId, newContent) {
10153
- // const prevElms = elementsRef.current;
10154
- elementsRef.current.forEach(function (curEle) {
10155
- //Find changed text of element to update the content for it.
10156
- if (curEle.id === elementId && curEle.texts) {
10157
- var updatedTextId = curEle.texts.findIndex(function (t) { return t.id === textId; });
10158
- if (updatedTextId !== undefined) {
10159
- curEle.texts[updatedTextId].content = newContent;
10160
- }
10161
- }
10162
- });
10163
- rerenderWhenAnyElementChanged();
10164
- }, [rerenderWhenAnyElementChanged]);
10412
+ }, [onCreatingPortByLinking, elementsState, createElementLink, paperEventEmitter, onLinksChanged]);
10413
+ // const handleElementTextChange = useCallback((elementId: string, textId: string, newContent: string) => {
10414
+ // // const prevElms = elementsRef.current;
10415
+ // elementsState.elements.forEach(curEle => {
10416
+ // //Find changed text of element to update the content for it.
10417
+ // if (curEle.id === elementId && curEle.texts) {
10418
+ // const updatedTextId = curEle.texts.findIndex(t => t.id === textId)
10419
+ // if (updatedTextId !== undefined) {
10420
+ // curEle.texts[updatedTextId].content = newContent;
10421
+ // }
10422
+ // }
10423
+ // })
10424
+ // rerenderWhenAnyElementChanged();
10425
+ // }, [rerenderWhenAnyElementChanged, elementsState])
10165
10426
  var handleElementClicked = React.useCallback(function (elementId, e, ref) {
10166
10427
  e.stopPropagation();
10167
10428
  var tempLink = tempLinkRef.current;
@@ -10171,7 +10432,7 @@ var Paper = function (props) {
10171
10432
  paperEventEmitter.emitElementLinkEnded();
10172
10433
  }
10173
10434
  else {
10174
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10435
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10175
10436
  // Select the element only if it is selectable
10176
10437
  if (element && element.selectable) {
10177
10438
  setSelectedElementSVG(ref);
@@ -10181,24 +10442,24 @@ var Paper = function (props) {
10181
10442
  }
10182
10443
  }
10183
10444
  setMouseDownedOnPaper(false);
10184
- }, [paperEventEmitter]);
10445
+ }, [paperEventEmitter, elementsState.elements]);
10185
10446
  var handlePortContextMenu = React.useCallback(function (port, elementId, e) {
10186
10447
  e.preventDefault();
10187
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10448
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10188
10449
  if (element) {
10189
10450
  onPortContextMenu === null || onPortContextMenu === void 0 ? void 0 : onPortContextMenu(port, element, e);
10190
10451
  }
10191
- }, [onPortContextMenu]);
10452
+ }, [onPortContextMenu, elementsState]);
10192
10453
  var handleContextMenu = React.useCallback(function (elementId, e, ref) {
10193
10454
  e.preventDefault();
10194
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10455
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10195
10456
  if (element) {
10196
10457
  handleElementClicked(elementId, e, ref);
10197
10458
  onElementContextMenu === null || onElementContextMenu === void 0 ? void 0 : onElementContextMenu(element, e);
10198
10459
  }
10199
- }, [onElementContextMenu, handleElementClicked]);
10460
+ }, [onElementContextMenu, handleElementClicked, elementsState]);
10200
10461
  var handleMouseUp = React.useCallback(function (ev, elementId) {
10201
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10462
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10202
10463
  var paperPosition = windowsPositionToPaperPosition({
10203
10464
  x: ev.clientX,
10204
10465
  y: ev.clientY
@@ -10206,9 +10467,9 @@ var Paper = function (props) {
10206
10467
  if (element) {
10207
10468
  onElementMouseUp === null || onElementMouseUp === void 0 ? void 0 : onElementMouseUp(ev, element, paperPosition);
10208
10469
  }
10209
- }, [onElementMouseUp]);
10470
+ }, [onElementMouseUp, elementsState]);
10210
10471
  var handleMouseDown = React.useCallback(function (ev, elementId) {
10211
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10472
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10212
10473
  var paperPosition = windowsPositionToPaperPosition({
10213
10474
  x: ev.clientX,
10214
10475
  y: ev.clientY
@@ -10216,9 +10477,9 @@ var Paper = function (props) {
10216
10477
  if (element) {
10217
10478
  onElementMouseDown === null || onElementMouseDown === void 0 ? void 0 : onElementMouseDown(ev, element, paperPosition);
10218
10479
  }
10219
- }, [onElementMouseDown]);
10480
+ }, [onElementMouseDown, elementsState]);
10220
10481
  var handleMouseMove = React.useCallback(function (ev, elementId) {
10221
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10482
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10222
10483
  var paperPosition = windowsPositionToPaperPosition({
10223
10484
  x: ev.clientX,
10224
10485
  y: ev.clientY
@@ -10226,9 +10487,9 @@ var Paper = function (props) {
10226
10487
  if (element) {
10227
10488
  onElementMouseMove === null || onElementMouseMove === void 0 ? void 0 : onElementMouseMove(ev, element, paperPosition);
10228
10489
  }
10229
- }, [onElementMouseMove]);
10490
+ }, [onElementMouseMove, elementsState]);
10230
10491
  var handleMouseLeave = React.useCallback(function (ev, elementId) {
10231
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10492
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10232
10493
  var paperPosition = windowsPositionToPaperPosition({
10233
10494
  x: ev.clientX,
10234
10495
  y: ev.clientY
@@ -10236,109 +10497,38 @@ var Paper = function (props) {
10236
10497
  if (element) {
10237
10498
  onElementMouseLeave === null || onElementMouseLeave === void 0 ? void 0 : onElementMouseLeave(ev, element, paperPosition);
10238
10499
  }
10239
- }, [onElementMouseLeave]);
10500
+ }, [onElementMouseLeave, elementsState]);
10240
10501
  var renderElementInTree = React.useCallback(function (element) {
10502
+ var _a;
10241
10503
  logger.info("Rendering element tree for element ".concat(element.id));
10242
10504
  //use the defined react element or the default Element component
10243
10505
  var ReactElement = element.reactElement || Element$1;
10244
10506
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
10245
- React.createElement(ReactElement, { key: "element-".concat(element.id), id: element.id, ref: function (refDOM) { return element.DOM = refDOM; }, height: element.size.height, width: element.size.width, x: element.positionAnchor === exports.PositioningAnchor.Center ? element.position.x - element.size.width / 2 : element.position.x, y: element.positionAnchor === exports.PositioningAnchor.Center ? element.position.y - element.size.height / 2 : element.position.y, selectable: element.selectable, onClick: handleElementClicked, onContextMenu: handleContextMenu, onMouseUp: handleMouseUp, onMouseDown: handleMouseDown, 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,
10507
+ React.createElement(ReactElement, { key: "element-".concat(element.id, "-").concat(element.version), element: element,
10508
+ //id={element.id}
10509
+ //ref={(refDOM) => element.DOM = refDOM}
10510
+ //height={element.size.height}
10511
+ //width={element.size.width}
10512
+ //x={element.positionAnchor === PositioningAnchor.Center ? element.position.x - element.size.width / 2 : element.position.x}
10513
+ //y={element.positionAnchor === PositioningAnchor.Center ? element.position.y - element.size.height / 2 : element.position.y}
10514
+ //selectable={element.selectable}
10515
+ onClick: handleElementClicked, onContextMenu: handleContextMenu, onMouseUp: handleMouseUp, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, onMoving: onElementMoving, onMoved: handleElementMoved, onResized: handleElementResized, container: paperContainerRef.current,
10516
+ // renderShape={element.renderShape}
10517
+ // cssClass={element.cssClass}
10518
+ // texts={element.texts}
10519
+ // ports={element.ports}
10520
+ // portMoveableAreas={element.portMoveableAreas}
10521
+ // portSlideRailSVGClassName={element.portSlideRailSVGClassName}
10522
+ // portDirection={element.portDirection}
10523
+ // defaultPortSize={element.defaultPortSize}
10524
+ onPortMoved: handlePortMoved, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp,
10246
10525
  // onPortsChanged={handlePortsChanged}
10247
10526
  onPortContextMenu: handlePortContextMenu,
10248
10527
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
10249
- onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: manuallyTriggerRenderPortHandler, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined },
10250
- element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree),
10251
- !!paperContainerRef.current && !!selectedElement && selectedElement.id === element.id &&
10252
- React.createElement(SelectionFrame, { key: selectedElement.id, container: paperContainerRef.current, targetSVGElement: selectedElementSVG || undefined, resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
10253
- enabled: true,
10254
- keepRatio: true
10255
- }, objectX: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x, objectY: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.y, width: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.width, height: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.height, zoom: zoom, draggingByDefault: autoEnabledDraggingSelectedElement,
10256
- //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
10257
- onMouseDown: function (ev) {
10258
- if (selectedElement) {
10259
- var paperPosition = windowsPositionToPaperPosition({
10260
- x: ev.clientX,
10261
- y: ev.clientY
10262
- }, paperContainerRef.current, zoomRef.current);
10263
- onElementMouseDown === null || onElementMouseDown === void 0 ? void 0 : onElementMouseDown(ev, selectedElement, paperPosition);
10264
- }
10265
- }, onMouseUp: function (ev) {
10266
- if (selectedElement) {
10267
- var paperPosition = windowsPositionToPaperPosition({
10268
- x: ev.clientX,
10269
- y: ev.clientY
10270
- }, paperContainerRef.current, zoomRef.current);
10271
- onElementMouseUp === null || onElementMouseUp === void 0 ? void 0 : onElementMouseUp(ev, selectedElement, paperPosition);
10272
- }
10273
- }, onMove: function (newX, newY) {
10274
- if (!selectedElement)
10275
- return;
10276
- var oldPosition = __assign({}, selectedElement.position);
10277
- // Relative position to the paper container
10278
- var paperPosition = {
10279
- x: newX,
10280
- y: newY
10281
- };
10282
- //Call onElementMoving to check if the element should be moved or not
10283
- if (onElementMoving) {
10284
- var isSkip = onElementMoving(selectedElement, paperPosition);
10285
- if (!isSkip) {
10286
- return;
10287
- }
10288
- }
10289
- logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(paperPosition)));
10290
- //Adjust position of element if it should move as a port on parent port area
10291
- if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
10292
- paperPosition = adjustElementPositionOnParentPortArea(selectedElement, paperPosition, true);
10293
- updateElementPosition(selectedElement, paperPosition.x, paperPosition.y, true);
10294
- }
10295
- else {
10296
- updateElementPosition(selectedElement, paperPosition.x, paperPosition.y, false);
10297
- }
10298
- //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
10299
- var indexSelectedElement = elementsRef.current.findIndex(function (e) { return e.id === selectedElement.id; });
10300
- logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
10301
- // Start updating the position of links connected to the selected element
10302
- var childElements = getChildOfElement(selectedElement);
10303
- var elementIds = __spreadArray(__spreadArray([], childElements.map(function (e) { return e.id; }), true), [selectedElement.id], false);
10304
- var offsetX = selectedElement.position.x - oldPosition.x;
10305
- var offsetY = selectedElement.position.y - oldPosition.y;
10306
- // Update position of all points of links that are connected to the selected element
10307
- var newLinks = linksRef.current.map(function (link) {
10308
- var isUpdate = elementIds.includes(link.sourceElement.id) && elementIds.includes(link.targetElement.id);
10309
- if (link.points && isUpdate) {
10310
- link.points.forEach(function (p) {
10311
- p.x += offsetX;
10312
- p.y += offsetY;
10313
- });
10314
- }
10315
- return link;
10316
- });
10317
- onLinksChanged === null || onLinksChanged === void 0 ? void 0 : onLinksChanged(newLinks);
10318
- // End updating the position of links connected to the selected element
10319
- //Set state to re-render UI with new position
10320
- rerenderWhenAnyElementChanged();
10321
- if (onElementMoved) {
10322
- console.log('onElementMoved', selectedElement.position, paperPosition);
10323
- onElementMoved(selectedElement.position, selectedElement, indexSelectedElement, paperPosition);
10324
- }
10325
- paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
10326
- setMouseDownedOnPaper(false);
10327
- }, onResize: function (width, height) {
10328
- if (!selectedElement)
10329
- return;
10330
- var indexSelectedElement = elementsRef.current.findIndex(function (e) { return e.id === selectedElement.id; });
10331
- var oldSize = selectedElement.size;
10332
- var newSize = { width: width, height: height };
10333
- elementsRef.current[indexSelectedElement].size = newSize;
10334
- rerenderWhenAnyElementChanged();
10335
- if (onElementResized) {
10336
- onElementResized(newSize, selectedElement, indexSelectedElement);
10337
- }
10338
- paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
10339
- setMouseDownedOnPaper(false);
10340
- } }))));
10341
- }, [manuallyTriggerRenderPortHandler, handleElementClicked, handleContextMenu, handleMouseUp, handleMouseDown, handleMouseMove, handleMouseLeave, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handlePortContextMenu, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, selectedElement, selectedElementSVG, selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x, selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.y, zoom, autoEnabledDraggingSelectedElement, getChildOfElement, paperEventEmitter, onElementResized, onElementMoved, onElementMouseDown, onElementMouseUp, onLinksChanged, onElementMoving, rerenderWhenAnyElementChanged]);
10528
+ onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder,
10529
+ // onTextUpdated={handleElementTextChange}
10530
+ onManuallyTriggerRenderPort: manuallyTriggerRenderPortHandler, parentDOM: (_a = element.parentElementInTree) === null || _a === void 0 ? void 0 : _a.DOM, beingSelected: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id) === element.id, draggingByDefault: autoEnabledDraggingSelectedElement && (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id) === element.id }, element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree))));
10531
+ }, [handleElementClicked, handleContextMenu, handleMouseUp, handleMouseDown, handleMouseMove, handleMouseLeave, onElementMoving, handleElementMoved, handleElementResized, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handlePortContextMenu, handleMouseUpAtLinkedPortPlaceholder, manuallyTriggerRenderPortHandler, selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.id, autoEnabledDraggingSelectedElement]);
10342
10532
  var ElementsInTree = React.useMemo(function () {
10343
10533
  return elementsState.elementsInTree.map(function (element, index) {
10344
10534
  return renderElementInTree(element);
@@ -10351,18 +10541,11 @@ var Paper = function (props) {
10351
10541
  links && links.map(function (link, index) {
10352
10542
  if (!link.targetElement || !link.targetPort)
10353
10543
  return null;
10354
- return (React.createElement(ElementLink, { key: link.id, id: link.id, path: link.path, sourcePosition: {
10355
- x: getAbsolutePosition(link.sourceElement).x + link.sourcePort.position.x,
10356
- y: getAbsolutePosition(link.sourceElement).y + link.sourcePort.position.y
10357
- }, targetPosition: {
10358
- x: getAbsolutePosition(link.targetElement).x + link.targetPort.position.x,
10359
- y: getAbsolutePosition(link.targetElement).y + link.targetPort.position.y
10360
- }, points: link.points, onPathChanged: handlePathChange, onPointsChanged: handlePointsOfLinkChange, 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) }));
10544
+ return (React.createElement(ElementLink, { key: link.id, id: link.id, path: link.path, sourcePositionX: getAbsolutePosition(link.sourceElement).x + link.sourcePort.position.x, sourcePositionY: getAbsolutePosition(link.sourceElement).y + link.sourcePort.position.y, targetPositionX: getAbsolutePosition(link.targetElement).x + link.targetPort.position.x, targetPositionY: getAbsolutePosition(link.targetElement).y + link.targetPort.position.y, points: link.points,
10545
+ //onPathChanged={handlePathChange}
10546
+ onPointsChanged: handlePointsOfLinkChange, 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) }));
10361
10547
  }),
10362
- (tempLink === null || tempLink === void 0 ? void 0 : tempLink.tempTargetPosition) && React.createElement(ElementLink, { id: tempLink.id, points: tempLink.points, sourcePosition: {
10363
- x: getAbsolutePosition(tempLink.sourceElement).x + tempLink.sourcePort.position.x,
10364
- y: getAbsolutePosition(tempLink.sourceElement).y + tempLink.sourcePort.position.y
10365
- }, targetPosition: tempLink.tempTargetPosition, container: paperContainerRef.current, markerStart: tempLink.markerStart, markerEnd: tempLink.markerEnd, markerDistanceFromPort: tempLink.markerDistanceFromPort, markerSize: tempLink.markerSize }),
10548
+ (tempLink === null || tempLink === void 0 ? void 0 : tempLink.tempTargetPosition) && React.createElement(ElementLink, { id: tempLink.id, points: tempLink.points, sourcePositionX: getAbsolutePosition(tempLink.sourceElement).x + tempLink.sourcePort.position.x, sourcePositionY: getAbsolutePosition(tempLink.sourceElement).y + tempLink.sourcePort.position.y, targetPositionX: tempLink.tempTargetPosition.x, targetPositionY: tempLink.tempTargetPosition.y, container: paperContainerRef.current, markerStart: tempLink.markerStart, markerEnd: tempLink.markerEnd, markerDistanceFromPort: tempLink.markerDistanceFromPort, markerSize: tempLink.markerSize }),
10366
10549
  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, selectable: text.selectable, fontSize: text.fontSize, border: text.border, container: paperContainerRef.current, content: text.content, align: text.align, onSelected: function () {
10367
10550
  setSelectedText(text);
10368
10551
  } })); })),
@@ -10471,7 +10654,7 @@ var Editor = function (_a) {
10471
10654
  if (editorContext.onElementMovingHandler) {
10472
10655
  return editorContext.onElementMovingHandler(element, newPaperPosition);
10473
10656
  }
10474
- return true;
10657
+ return { horizontalAllowed: true, verticalAllowed: true };
10475
10658
  }, [editorContext]);
10476
10659
  var handleOnCreatingPortByLinking = React.useCallback(function (sourceElement, sourcePort, targetElement, position) {
10477
10660
  if (editorContext.onCreatingPortByLinkingHandler) {
@@ -10489,13 +10672,14 @@ var Editor = function (_a) {
10489
10672
  editorContext.onPaperMouseUpHandler(position);
10490
10673
  }, [editorContext]);
10491
10674
  var handleElementRemoved = React.useCallback(function (element) {
10492
- editorContext.onElementRemovedHandler(element.id);
10675
+ var _a;
10676
+ editorContext.onElementRemovedHandler(element.id, (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.id);
10493
10677
  }, [editorContext]);
10494
10678
  return (React.createElement(EditorConfigurationContextProvider, { value: editorContext.configuration },
10495
10679
  React.createElement(ZoomContextProvider, null,
10496
10680
  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,
10497
10681
  //onPortsChanged={handlePortsChanged}
10498
- onPortContextMenu: handlePortContextMenu, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementDeleted: handleElementRemoved, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onElementMoving: handleOnElementMoving, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, manuallyTriggerRenderElementHandler: editorContext.manuallyTriggerRenderElementHandler.bind(editorContext), manuallyTriggerRenderPortHandler: editorContext.manuallyTriggerRenderPortHandler.bind(editorContext), manuallySelectElementHandler: editorContext.manuallySelectElementHandler.bind(editorContext), manuallyTriggerDraggingElementHandler: editorContext.manuallyTriggerDraggingElementHandler.bind(editorContext), manuallyTriggerStartedLinkingHandler: editorContext.manuallyTriggerStartedLinkingHandler.bind(editorContext) }))));
10682
+ onPortContextMenu: handlePortContextMenu, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementDeleted: handleElementRemoved, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onElementMoving: handleOnElementMoving, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, manuallyTriggerRenderElementsHandler: editorContext.manuallyTriggerRenderElementsHandler.bind(editorContext), manuallyTriggerRenderElementHandler: editorContext.manuallyTriggerRenderElementHandler.bind(editorContext), manuallyTriggerRenderPortHandler: editorContext.manuallyTriggerRenderPortHandler.bind(editorContext), manuallySelectElementHandler: editorContext.manuallySelectElementHandler.bind(editorContext), manuallyTriggerDraggingElementHandler: editorContext.manuallyTriggerDraggingElementHandler.bind(editorContext), manuallyTriggerStartedLinkingHandler: editorContext.manuallyTriggerStartedLinkingHandler.bind(editorContext) }))));
10499
10683
  };
10500
10684
 
10501
10685
  exports.CircleRC = Circle;