orcasvn-react-diagrams 0.1.66 → 0.1.71

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 (35) hide show
  1. package/dist/cjs/index.js +675 -510
  2. package/dist/cjs/types/components/paper.d.ts +6 -4
  3. package/dist/cjs/types/mocks/diamondElement.d.ts +1 -1
  4. package/dist/cjs/types/mocks/rectangularFrameElement.d.ts +1 -1
  5. package/dist/cjs/types/models/IEditorContext.d.ts +4 -1
  6. package/dist/cjs/types/models/IElement.d.ts +5 -0
  7. package/dist/cjs/types/models/IElementLink.d.ts +1 -0
  8. package/dist/cjs/types/models/IElementLinkProps.d.ts +5 -2
  9. package/dist/cjs/types/models/IElementProps.d.ts +10 -22
  10. package/dist/cjs/types/models/IPort.d.ts +1 -0
  11. package/dist/cjs/types/models/IText.d.ts +1 -0
  12. package/dist/cjs/types/models/implementations/EditorContext.d.ts +4 -1
  13. package/dist/cjs/types/models/implementations/Element.d.ts +6 -1
  14. package/dist/cjs/types/models/implementations/ElementLink.d.ts +2 -1
  15. package/dist/cjs/types/models/implementations/Port.d.ts +2 -1
  16. package/dist/cjs/types/models/implementations/Text.d.ts +2 -1
  17. package/dist/esm/index.js +675 -510
  18. package/dist/esm/index.js.map +1 -1
  19. package/dist/esm/types/components/paper.d.ts +6 -4
  20. package/dist/esm/types/mocks/diamondElement.d.ts +1 -1
  21. package/dist/esm/types/mocks/rectangularFrameElement.d.ts +1 -1
  22. package/dist/esm/types/models/IEditorContext.d.ts +4 -1
  23. package/dist/esm/types/models/IElement.d.ts +5 -0
  24. package/dist/esm/types/models/IElementLink.d.ts +1 -0
  25. package/dist/esm/types/models/IElementLinkProps.d.ts +5 -2
  26. package/dist/esm/types/models/IElementProps.d.ts +10 -22
  27. package/dist/esm/types/models/IPort.d.ts +1 -0
  28. package/dist/esm/types/models/IText.d.ts +1 -0
  29. package/dist/esm/types/models/implementations/EditorContext.d.ts +4 -1
  30. package/dist/esm/types/models/implementations/Element.d.ts +6 -1
  31. package/dist/esm/types/models/implementations/ElementLink.d.ts +2 -1
  32. package/dist/esm/types/models/implementations/Port.d.ts +2 -1
  33. package/dist/esm/types/models/implementations/Text.d.ts +2 -1
  34. package/dist/index.d.ts +42 -27
  35. 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
  }
@@ -7446,10 +7489,10 @@ var getAbsolutePosition = function (element) {
7446
7489
  x: element.position.x,
7447
7490
  y: element.position.y,
7448
7491
  };
7449
- if (element.positionAnchor === exports.PositioningAnchor.Center) {
7450
- elemenetPositionWithTopLeftAnchor.x -= element.size.width / 2;
7451
- elemenetPositionWithTopLeftAnchor.y -= element.size.height / 2;
7452
- }
7492
+ // if (element.positionAnchor === PositioningAnchor.Center) {
7493
+ // elemenetPositionWithTopLeftAnchor.x -= element.size.width / 2;
7494
+ // elemenetPositionWithTopLeftAnchor.y -= element.size.height / 2;
7495
+ // }
7453
7496
  if (!parentElement) {
7454
7497
  return __assign({}, elemenetPositionWithTopLeftAnchor);
7455
7498
  }
@@ -7479,10 +7522,10 @@ var transformAbsPositionToElementRelativePosition = function (position, element)
7479
7522
  x: position.x - absoluteParentElement.x,
7480
7523
  y: position.y - absoluteParentElement.y,
7481
7524
  };
7482
- if (element.positionAnchor === exports.PositioningAnchor.Center) {
7483
- result.x += element.size.width / 2;
7484
- result.y += element.size.height / 2;
7485
- }
7525
+ // if (element.positionAnchor === PositioningAnchor.Center) {
7526
+ // result.x += element.size.width / 2;
7527
+ // result.y += element.size.height / 2;
7528
+ // }
7486
7529
  return result;
7487
7530
  };
7488
7531
  var transformAbsPositionToRelativePositionInsideElement = function (absolutePosition, parentAbsolutePosition) {
@@ -7891,7 +7934,10 @@ var SelectionFrame = function (props) {
7891
7934
  }
7892
7935
  return (React.createElement(React.Fragment, null,
7893
7936
  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 }),
7937
+ 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) {
7938
+ propOnMouseUp === null || propOnMouseUp === void 0 ? void 0 : propOnMouseUp(ev);
7939
+ setDraggingRect(false);
7940
+ } }),
7895
7941
  propResizability.enabled ?
7896
7942
  (React.createElement("circle", { cursor: 'se-resize', cx: leftX + width, cy: topY + height, r: r, fill: 'blue', stroke: 'blue', onMouseDown: circleHandleMouseDown })) : null));
7897
7943
  };
@@ -7899,10 +7945,7 @@ var SelectionFrame = function (props) {
7899
7945
  var useSelectionFrame = function (props) {
7900
7946
  React.useEffect(function () {
7901
7947
  //log selection frame rendering
7902
- if (props.targetSVGElement) {
7903
- console.debug('Rendering SelectionFrame for targetSVGElement:', props.targetSVGElement);
7904
- }
7905
- else {
7948
+ if (!props.targetSVGElement) {
7906
7949
  console.warn('No targetSVGElement provided for SelectionFrame.');
7907
7950
  }
7908
7951
  if (props.targetSVGElement && props.container) {
@@ -8464,7 +8507,9 @@ function CloseIcon(_a) {
8464
8507
  // 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
8508
  var IElementLink = function (_a) {
8466
8509
  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;
8510
+ 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,
8511
+ //TODO: get rid of this
8512
+ 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
8513
  var _g = React.useState(path), pathStr = _g[0], setPathStr = _g[1];
8469
8514
  var _h = React.useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
8470
8515
  var _j = React.useState(false), isDragging = _j[0], setIsDragging = _j[1];
@@ -8481,6 +8526,7 @@ var IElementLink = function (_a) {
8481
8526
  var isFirstRender = React.useRef(true);
8482
8527
  var onPointsChangedRef = React.useRef();
8483
8528
  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.
8529
+ var timeFromMouseDownToUpRef = React.useRef(0);
8484
8530
  var angleMarkerStart = '0';
8485
8531
  var angleMarkerEnd = '0';
8486
8532
  var markerStartPosition;
@@ -8503,7 +8549,7 @@ var IElementLink = function (_a) {
8503
8549
  return function () {
8504
8550
  paperClickListener.off();
8505
8551
  };
8506
- }, []);
8552
+ }, [onPaperClicked, onDeselected]);
8507
8553
  // Reset selected label when an element is selected
8508
8554
  React.useEffect(function () {
8509
8555
  var elementSelectedListener = onElementSelected(function () {
@@ -8516,34 +8562,32 @@ var IElementLink = function (_a) {
8516
8562
  return function () {
8517
8563
  elementSelectedListener.off();
8518
8564
  };
8519
- }, []);
8565
+ }, [onElementSelected, onDeselected]);
8520
8566
  // Store onPointsChanged in a ref to avoid unnecessary re-renders
8521
8567
  React.useEffect(function () {
8522
8568
  onPointsChangedRef.current = onPointsChanged;
8523
8569
  }, [onPointsChanged]);
8524
8570
  // Notify parent component when points change
8525
8571
  React.useEffect(function () {
8526
- var _a;
8527
8572
  if (isFirstRender.current) {
8528
8573
  isFirstRender.current = false;
8529
8574
  return;
8530
8575
  }
8531
- (_a = onPointsChangedRef.current) === null || _a === void 0 ? void 0 : _a.call(onPointsChangedRef, points, id);
8532
- }, [JSON.stringify(points)]);
8576
+ }, []);
8533
8577
  React.useLayoutEffect(function () {
8534
- var pointsList = __spreadArray(__spreadArray([sourcePosition], points, true), [targetPosition], false);
8578
+ var pointsList = __spreadArray(__spreadArray([{ x: sourcePositionX, y: sourcePositionY }], points, true), [{ x: targetPositionX, y: targetPositionY }], false);
8535
8579
  var _pathStr = createSmoothPathString(pointsList, undefined, false);
8536
8580
  setPathStr(_pathStr);
8537
- }, [sourcePosition, points, targetPosition]);
8581
+ }, [sourcePositionX, sourcePositionY, points, targetPositionX, targetPositionY]);
8538
8582
  React.useEffect(function () {
8539
8583
  if (!pathStr)
8540
8584
  return;
8541
8585
  onPathChanged === null || onPathChanged === void 0 ? void 0 : onPathChanged(pathStr, id);
8542
- }, [pathStr, id]);
8543
- var addMovingPoint = function (mouseDownedOnPaperPos, points) {
8586
+ }, [pathStr, id, onPathChanged]);
8587
+ var addMovingPoint = React.useCallback(function (mouseDownedOnPaperPos, points) {
8544
8588
  //Position of the new point on the path
8545
8589
  var paperPosition = mouseDownedOnPaperPos;
8546
- var newPoints = addPointToList(paperPosition, __spreadArray(__spreadArray([sourcePosition], points, true), [targetPosition], false), pathRef.current);
8590
+ var newPoints = addPointToList(paperPosition, __spreadArray(__spreadArray([{ x: sourcePositionX, y: sourcePositionY }], points, true), [{ x: targetPositionX, y: targetPositionY }], false), pathRef.current);
8547
8591
  var pointsWithoutStartEndPoint = newPoints.slice(1, newPoints.length - 1);
8548
8592
  var addedIndex = pointsWithoutStartEndPoint.findIndex(function (p) { return p.x === paperPosition.x && p.y === paperPosition.y; });
8549
8593
  var leftPointIndex = addedIndex - 1;
@@ -8589,12 +8633,13 @@ var IElementLink = function (_a) {
8589
8633
  draggingPointIndex: _draggingPointIndex,
8590
8634
  points: pointsWithoutStartEndPoint,
8591
8635
  };
8592
- };
8636
+ }, [sourcePositionX, sourcePositionY, targetPositionX, targetPositionY]);
8593
8637
  React.useEffect(function () {
8594
8638
  //handle when creating and moving point
8595
8639
  var handleMouseMove = function (ev) {
8596
8640
  var mouseEvent = ev;
8597
8641
  if (isDragging && container) {
8642
+ console.info('Mouse move on link');
8598
8643
  var paperPosition_1 = windowsPositionToPaperPosition({
8599
8644
  x: mouseEvent.clientX,
8600
8645
  y: mouseEvent.clientY
@@ -8614,8 +8659,13 @@ var IElementLink = function (_a) {
8614
8659
  }
8615
8660
  };
8616
8661
  var mouseUp = function () {
8662
+ console.info('Mouse up on link');
8617
8663
  draggingPointIndexRef.current = undefined;
8618
8664
  setIsDragging(false);
8665
+ //trigger onPointsChanged
8666
+ if (onPointsChangedRef.current) {
8667
+ onPointsChangedRef.current(points, id);
8668
+ }
8619
8669
  };
8620
8670
  container === null || container === void 0 ? void 0 : container.addEventListener('mousemove', handleMouseMove);
8621
8671
  container === null || container === void 0 ? void 0 : container.addEventListener('mouseup', mouseUp);
@@ -8623,9 +8673,14 @@ var IElementLink = function (_a) {
8623
8673
  container === null || container === void 0 ? void 0 : container.removeEventListener('mousemove', handleMouseMove);
8624
8674
  container === null || container === void 0 ? void 0 : container.removeEventListener('mouseup', mouseUp);
8625
8675
  };
8626
- }, [container, isDragging, zoom, points]);
8676
+ }, [container, isDragging, zoom, points, id, addMovingPoint]);
8677
+ React.useEffect(function () {
8678
+ console.info("Container changed in link", id);
8679
+ }, [addMovingPoint]);
8627
8680
  var handleMouseDownOnPath = function (ev) {
8628
8681
  ev.preventDefault();
8682
+ console.info('Mouse down on link');
8683
+ timeFromMouseDownToUpRef.current = Date.now();
8629
8684
  //add point if click on path
8630
8685
  setIsDragging(true);
8631
8686
  };
@@ -8639,11 +8694,11 @@ var IElementLink = function (_a) {
8639
8694
  onLabelMoved(newPosition.x, newPosition.y, 'middle');
8640
8695
  break;
8641
8696
  case sourceLabelRef.current:
8642
- newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, sourcePosition);
8697
+ newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, { x: sourcePositionX, y: sourcePositionY });
8643
8698
  onLabelMoved(newPosition.x, newPosition.y, 'source');
8644
8699
  break;
8645
8700
  case targetLabelRef.current:
8646
- newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, targetPosition);
8701
+ newPosition = transformAbsPositionToRelativePositionInsideElement({ x: newX, y: newY }, { x: targetPositionX, y: targetPositionY });
8647
8702
  onLabelMoved(newPosition.x, newPosition.y, 'target');
8648
8703
  break;
8649
8704
  }
@@ -8675,6 +8730,11 @@ var IElementLink = function (_a) {
8675
8730
  }
8676
8731
  };
8677
8732
  var handleClickPath = function () {
8733
+ if (Date.now() - timeFromMouseDownToUpRef.current > 400) {
8734
+ //Prevent click event when dragging
8735
+ return;
8736
+ }
8737
+ console.info('Click link', id);
8678
8738
  setIsSelectedLink(true);
8679
8739
  onSelected === null || onSelected === void 0 ? void 0 : onSelected();
8680
8740
  };
@@ -8717,22 +8777,22 @@ var IElementLink = function (_a) {
8717
8777
  if ((_b = pathRef.current) === null || _b === void 0 ? void 0 : _b.getAttribute('d')) {
8718
8778
  if (markerStart) {
8719
8779
  markerStartPosition = pathRef.current.getPointAtLength(markerDistanceFromPort);
8720
- angleMarkerStart = calculateAngleWithOx(sourcePosition, markerStartPosition);
8780
+ angleMarkerStart = calculateAngleWithOx({ x: sourcePositionX, y: sourcePositionY }, markerStartPosition);
8721
8781
  }
8722
8782
  if (markerEnd) {
8723
8783
  markerEndPosition = pathRef.current.getPointAtLength(pathRef.current.getTotalLength() - markerDistanceFromPort);
8724
- angleMarkerEnd = calculateAngleWithOx(markerEndPosition, targetPosition);
8784
+ angleMarkerEnd = calculateAngleWithOx(markerEndPosition, { x: targetPositionX, y: targetPositionY });
8725
8785
  }
8726
8786
  centerPathPosition = (_c = pathRef.current) === null || _c === void 0 ? void 0 : _c.getPointAtLength(pathRef.current.getTotalLength() / 2);
8727
8787
  }
8728
8788
  return (React.createElement("g", null,
8729
8789
  React.createElement("path", { ref: pathRef, d: pathStr, className: isSelectedLink ? CSS_CLASS_LINK_SELECTED : '', fill: "none", stroke: stroke || LINK_DEFAULT_COLOR, strokeWidth: strokeWidth }),
8730
8790
  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 },
8791
+ removable !== false && isSelectedLink && centerPathPosition && React.createElement("svg", { x: centerPathPosition.x - 10, y: centerPathPosition.y - 10 },
8732
8792
  React.createElement(CloseIcon, { onClick: onClickDelete })),
8733
8793
  label && renderLabel(label, 'middle', centerPathPosition),
8734
- sourceLabel && renderLabel(sourceLabel, 'source', sourcePosition),
8735
- targetLabel && renderLabel(targetLabel, 'target', targetPosition),
8794
+ sourceLabel && renderLabel(sourceLabel, 'source', { x: sourcePositionX, y: sourcePositionY }),
8795
+ targetLabel && renderLabel(targetLabel, 'target', { x: targetPositionX, y: targetPositionY }),
8736
8796
  markerStartPosition && React.createElement("g", { transform: "rotate(".concat(angleMarkerStart, ")"), style: { transformOrigin: 'center', transformBox: 'content-box' } },
8737
8797
  React.createElement("svg", { x: markerStartPosition.x - markerSize / 2, y: markerStartPosition.y - markerSize / 2, width: markerSize, height: markerSize }, markerStart)),
8738
8798
  markerEndPosition && React.createElement("g", { transform: "rotate(".concat(angleMarkerEnd, ")"), style: { transformOrigin: 'center', transformBox: 'content-box' } },
@@ -8789,58 +8849,41 @@ var ElementWrapper = React.forwardRef(function (_a, ref) {
8789
8849
  });
8790
8850
 
8791
8851
  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
8852
  var _paperEventEmitterContext = React.useContext(paperEventEmitterContext);
8853
+ // const elementObj = props.element;
8854
+ 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;
8855
+ 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;
8856
+ var propPorts = props.element.ports;
8857
+ //state for position
8858
+ var _b = React.useState(__assign({}, props.element.position)), position = _b[0], setPosition = _b[1];
8859
+ //state for size
8860
+ var _c = React.useState(__assign({}, props.element.size)), size = _c[0], setSize = _c[1];
8861
+ var _d = React.useState(), selectedPort = _d[0], setSelectedPort = _d[1];
8862
+ var _e = React.useState(), hoveredPort = _e[0], setHoveredPort = _e[1];
8863
+ var _f = React.useState([]), ports = _f[0], setPorts = _f[1];
8864
+ var _g = React.useState(props.element.texts || []), texts = _g[0], setTexts = _g[1];
8865
+ var _h = React.useState(false), someElementLinkStarted = _h[0], setSomeElementLinkStarted = _h[1];
8866
+ var _j = React.useState(), potentialPortPosition = _j[0], setPotentialPortPosition = _j[1];
8867
+ //Zoom
8803
8868
  var zoom = useZoomContext().zoom;
8869
+ var zoomRef = React.useRef(zoom);
8804
8870
  var elementRef = React.useRef(null);
8805
8871
  React.useImperativeHandle(forwardedRef, function () { return elementRef.current; });
8806
8872
  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]);
8873
+ var portsRef = React.useRef([]);
8832
8874
  //Normalize port position
8833
8875
  var normalizePortPosition = React.useCallback(function (tempNewPosition) {
8834
- var newPosition = correctPortPositionInElement(tempNewPosition, width, height, portMoveableAreas, portSlideRailSVGClassName, elementRef.current || undefined);
8876
+ var newPosition = correctPortPositionInElement(tempNewPosition, size.width, size.height, portMoveableAreas, portSlideRailSVGClassName, elementRef.current || undefined);
8835
8877
  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 () {
8878
+ }, [size.width, size.height, portMoveableAreas, portSlideRailSVGClassName]);
8879
+ //set port ref when ports state is changed
8880
+ React.useLayoutEffect(function () {
8881
+ portsRef.current = ports;
8882
+ }, [ports]);
8883
+ //Handle ports state when propPorts is changed
8884
+ var handlePortsState = React.useCallback(function (newPorts) {
8839
8885
  setPorts(function (prev) {
8840
- var _a;
8841
- if (propPorts === undefined)
8842
- return [];
8843
- var newState = (_a = propPorts.map(function (p, index) {
8886
+ var newState = newPorts === null || newPorts === void 0 ? void 0 : newPorts.map(function (p, index) {
8844
8887
  var prevPortState = prev.find(function (_p) { return _p.id === p.id; });
8845
8888
  var newPortState;
8846
8889
  //If port is existed, keep the ref of the port
@@ -8853,45 +8896,85 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8853
8896
  //Handle the case new port is created and the ref of the port is not defined
8854
8897
  if (!newPortState.ref) {
8855
8898
  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);
8899
+ // onPortMoved?.(p, id, newPortState.position, newPosition)
8900
+ // _paperEventEmitterContext.emitPortMoved(p, id, newPortState.position, newPosition)
8858
8901
  newPortState.position = newPosition;
8859
8902
  newPortState.ref = React.createRef();
8860
8903
  }
8861
8904
  return newPortState;
8862
- })) !== null && _a !== void 0 ? _a : [];
8905
+ });
8863
8906
  return newState;
8864
8907
  });
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
8908
+ }, [normalizePortPosition]);
8909
+ var getParentAbsolutePosition = React.useCallback(function () {
8910
+ return props.element.parentElement ? getAbsolutePosition(props.element.parentElement) : undefined;
8911
+ }, [props.element.parentElement]);
8912
+ var getElementAbsPosition = React.useCallback(function () {
8913
+ var newPosition = {
8914
+ x: position.x,
8915
+ y: position.y,
8916
+ };
8917
+ var parentAbsolutePosition = getParentAbsolutePosition();
8918
+ if (parentAbsolutePosition) {
8919
+ newPosition.x += parentAbsolutePosition.x;
8920
+ newPosition.y += parentAbsolutePosition.y;
8921
+ }
8922
+ return newPosition;
8923
+ }, [position, getParentAbsolutePosition]);
8924
+ var elementAbsPosition = React.useMemo(function () { return getElementAbsPosition(); }, [getElementAbsPosition]);
8925
+ //update element position
8926
+ var updateElementPosition = React.useCallback(function (newPosition) {
8927
+ setPosition({ x: newPosition.x, y: newPosition.y });
8928
+ props.element.position = { x: newPosition.x, y: newPosition.y };
8929
+ }, [props.element]);
8930
+ //update element size
8931
+ var updateElementSize = React.useCallback(function (newSize) {
8932
+ setSize({ width: newSize.width, height: newSize.height });
8933
+ props.element.size = { width: newSize.width, height: newSize.height };
8934
+ }, [props.element]);
8935
+ //Listen to manually trigger render event
8871
8936
  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;
8937
+ var off = onManuallyTriggerRenderPort === null || onManuallyTriggerRenderPort === void 0 ? void 0 : onManuallyTriggerRenderPort(function (portId, elementId) {
8938
+ if (elementId !== id)
8939
+ return;
8940
+ logger.info('onManuallyTriggerRenderPort', id);
8941
+ handlePortsState(portsRef.current);
8878
8942
  });
8879
- setPorts(newPorts);
8880
- }, [width, height, _paperEventEmitterContext, id, onPortsChanged, normalizePortPosition, onPortMoved]);
8943
+ return function () {
8944
+ off === null || off === void 0 ? void 0 : off();
8945
+ };
8946
+ }, [id, onManuallyTriggerRenderPort, handlePortsState, props.element]);
8947
+ //Initialize ports state
8948
+ React.useEffect(function () {
8949
+ handlePortsState(propPorts || []);
8950
+ }, [handlePortsState, propPorts]);
8951
+ // const normalizePortsPosition = useCallback(() => {
8952
+ // const newPorts = portsRef.current.map(port => {
8953
+ // const newPosition = normalizePortPosition(port.position);
8954
+ // port.position = newPosition;
8955
+ // return port;
8956
+ // });
8957
+ // return newPorts;
8958
+ // }, [normalizePortPosition]);
8959
+ // //Normalize port position when element is resized
8960
+ // useEffect(() => {
8961
+ // //const newPorts = normalizePortsPosition();
8962
+ // //handlePortsState(newPorts);
8963
+ // }, [size, _paperEventEmitterContext, id, normalizePortPosition, onPortMoved, normalizePortsPosition, handlePortsState]);
8881
8964
  //Listen trigger of Delete key, handle delete port is selected
8882
8965
  React.useEffect(function () {
8883
8966
  var listener = _paperEventEmitterContext.onCommandDeleteSelectedPort(function () {
8884
- if (selectedPort) {
8967
+ if (selectedPort && selectedPort.removable !== false) {
8885
8968
  var newPorts = portsRef.current.filter(function (p) { return p.id !== selectedPort.id; });
8886
- setPorts(newPorts);
8969
+ handlePortsState(newPorts);
8887
8970
  setSelectedPort(undefined);
8888
- onPortsChanged === null || onPortsChanged === void 0 ? void 0 : onPortsChanged(newPorts, id);
8971
+ //onPortsChanged?.(newPorts, id)
8889
8972
  }
8890
8973
  });
8891
8974
  return function () {
8892
8975
  listener.off();
8893
8976
  };
8894
- }, [_paperEventEmitterContext, id, onPortsChanged, selectedPort]);
8977
+ }, [_paperEventEmitterContext, id, selectedPort, handlePortsState, props.element.ports]);
8895
8978
  React.useEffect(function () {
8896
8979
  //Listener onMouseDown event on #paper-container
8897
8980
  var eventListener = _paperEventEmitterContext.onPaperClicked(function (ev) {
@@ -8904,26 +8987,38 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8904
8987
  React.useEffect(function () {
8905
8988
  //listen element resize to update position of the ports by element size.
8906
8989
  var eleResizeListener = _paperEventEmitterContext.onElementResized(id, function () {
8907
- var isChanged = false;
8990
+ //let isChanged = false;
8908
8991
  var newPorts = portsRef.current.map(function (port) {
8909
8992
  var newPosition = normalizePortPosition({ x: port.position.x, y: port.position.y });
8910
8993
  //Check port moved
8911
8994
  if (port.position.x !== newPosition.x || port.position.y !== newPosition.y) {
8912
- isChanged = true;
8995
+ //isChanged = true;
8913
8996
  _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition);
8914
8997
  }
8915
8998
  port.position = newPosition;
8916
8999
  return port;
8917
9000
  });
8918
- setPorts(newPorts);
8919
- if (isChanged) {
8920
- onPortsChanged === null || onPortsChanged === void 0 ? void 0 : onPortsChanged(newPorts, id);
8921
- }
9001
+ handlePortsState(newPorts);
9002
+ // if (isChanged) {
9003
+ // onPortsChanged?.(newPorts, id);
9004
+ // }
8922
9005
  });
8923
9006
  return function () {
8924
9007
  eleResizeListener.off();
8925
9008
  };
8926
- }, [_paperEventEmitterContext, id, onPortsChanged, onPortMoved, normalizePortPosition, width, height, portMoveableAreas, portSlideRailSVGClassName]);
9009
+ }, [_paperEventEmitterContext, id, normalizePortPosition, size, portMoveableAreas, portSlideRailSVGClassName, handlePortsState, props.element.ports]);
9010
+ //list to port added
9011
+ React.useEffect(function () {
9012
+ var _a, _b;
9013
+ //Listen a new port added, then re-render the element component
9014
+ var off = (_b = (_a = props.element).onAddedPort) === null || _b === void 0 ? void 0 : _b.call(_a, function (newPort) {
9015
+ logger.info("A new port has been added to element ".concat(id));
9016
+ handlePortsState(props.element.ports || []);
9017
+ });
9018
+ return function () {
9019
+ off === null || off === void 0 ? void 0 : off();
9020
+ };
9021
+ }, [handlePortsState, id, props.element]);
8927
9022
  //Listen creating element link started, ended.
8928
9023
  React.useEffect(function () {
8929
9024
  var elementStartedListener = _paperEventEmitterContext.onElementLinkStarted(function (tempLink) {
@@ -8973,30 +9068,30 @@ var Element = React.forwardRef(function (props, forwardedRef) {
8973
9068
  var handleSelectedPort = React.useCallback(function (portId, e) {
8974
9069
  e.stopPropagation();
8975
9070
  logger.debug('Port selected', portId, e);
8976
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9071
+ var port = ports.find(function (p) { return p.id === portId; });
8977
9072
  if (!port)
8978
9073
  return;
8979
9074
  setSelectedPort(port);
8980
9075
  _paperEventEmitterContext.emitPortSelected(port, id);
8981
- }, [id, _paperEventEmitterContext]);
9076
+ }, [ports, id, _paperEventEmitterContext]);
8982
9077
  //Calculate the position of the 4 vertices of a rectangle relative to element
8983
9078
  var calculateSlideRailRectSVGPositions = React.useCallback(function (slideRailSVG) {
8984
9079
  var coordinates = getRectangleCorners(slideRailSVG);
8985
9080
  var ownerSVG = slideRailSVG.ownerSVGElement;
8986
9081
  var rotationAngle = getElementRotationInfo(ownerSVG);
8987
9082
  if (rotationAngle !== 0) {
8988
- var rotationCenterX = width / 2;
8989
- var rotationCenterY = height / 2;
9083
+ var rotationCenterX = size.width / 2;
9084
+ var rotationCenterY = size.height / 2;
8990
9085
  coordinates = getRotatedRectangleCoordinates(coordinates, rotationCenterX, rotationCenterY, rotationAngle);
8991
9086
  }
8992
9087
  return coordinates;
8993
- }, [width, height]);
9088
+ }, [size]);
8994
9089
  var getSlideRailSVG = React.useCallback(function (portSlideRailSVGClassName) {
8995
9090
  var _a;
8996
9091
  var slideRailSVG = (_a = elementRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(".".concat(portSlideRailSVGClassName));
8997
9092
  return slideRailSVG;
8998
9093
  }, []);
8999
- var handlePortMove = function (newX, newY) {
9094
+ var handlePortMove = React.useCallback(function (newX, newY) {
9000
9095
  if (!selectedPort)
9001
9096
  return;
9002
9097
  var oldPosition = __assign({}, selectedPort.position);
@@ -9008,11 +9103,14 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9008
9103
  var newPosition = normalizePortPosition(tempNewPosition);
9009
9104
  if (newPosition) {
9010
9105
  selectedPort.position = newPosition;
9106
+ //onPortMoved?.(selectedPort, id, oldPosition, newPosition)
9107
+ handlePortsState(portsRef.current);
9108
+ if (_paperEventEmitterContext.emitter.listenerCount(EVENT_NAME.PORT_MOVED) > 0) {
9109
+ _paperEventEmitterContext.emitPortMoved(selectedPort, id, oldPosition, newPosition);
9110
+ }
9011
9111
  onPortMoved === null || onPortMoved === void 0 ? void 0 : onPortMoved(selectedPort, id, oldPosition, newPosition);
9012
- setPorts(__spreadArray([], portsRef.current, true));
9013
- _paperEventEmitterContext.emitPortMoved(selectedPort, id, oldPosition, newPosition);
9014
9112
  }
9015
- };
9113
+ }, [selectedPort, elementAbsPosition, normalizePortPosition, _paperEventEmitterContext, id, onPortMoved, handlePortsState]);
9016
9114
  //Handle when mouse down on port
9017
9115
  var handlePortMouseDown = React.useCallback(function (portId, e) {
9018
9116
  e.stopPropagation();
@@ -9023,7 +9121,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9023
9121
  return;
9024
9122
  _paperEventEmitterContext.emitPortMouseDown(e, port, id);
9025
9123
  onPortMouseDown === null || onPortMouseDown === void 0 ? void 0 : onPortMouseDown(e, port, id);
9026
- }, [id, onPortMouseDown, _paperEventEmitterContext]);
9124
+ }, [id, _paperEventEmitterContext, onPortMouseDown]);
9027
9125
  //Handle when mouse up on port
9028
9126
  var handlePortMouseUp = React.useCallback(function (portId, e) {
9029
9127
  e.stopPropagation();
@@ -9036,50 +9134,44 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9036
9134
  if (potentialPortPosition) {
9037
9135
  setPotentialPortPosition(undefined);
9038
9136
  }
9039
- }, [id, onPortMouseUp, _paperEventEmitterContext, potentialPortPosition]);
9137
+ }, [_paperEventEmitterContext, id, onPortMouseUp, potentialPortPosition]);
9040
9138
  //Update state when label of port is moved
9041
9139
  var handlePortLabelMoved = React.useCallback(function (newX, newY, portId) {
9042
- setPorts(function (prevPorts) {
9043
- return prevPorts.map(function (p) {
9044
- if (p.id === portId && p.label) {
9045
- var newLabel = Object.assign(Object.create(Object.getPrototypeOf(p.label)), p.label);
9046
- var newPosition = {
9047
- x: newX,
9048
- y: newY
9049
- };
9050
- newLabel.position = newPosition;
9051
- p.label = newLabel;
9052
- }
9053
- return p;
9054
- });
9055
- });
9056
- }, []);
9140
+ handlePortsState(portsRef.current.map(function (p) {
9141
+ if (p.id === portId && p.label) {
9142
+ var newLabel = Object.assign(Object.create(Object.getPrototypeOf(p.label)), p.label);
9143
+ var newPosition = {
9144
+ x: newX,
9145
+ y: newY
9146
+ };
9147
+ newLabel.position = newPosition;
9148
+ p.label = newLabel;
9149
+ }
9150
+ return p;
9151
+ }));
9152
+ }, [handlePortsState]);
9057
9153
  //Update state when label of port is resized
9058
9154
  var handlePortLabelResized = React.useCallback(function (width, height, portId) {
9059
- setPorts(function (prevPorts) {
9060
- return prevPorts.map(function (p) {
9061
- if (p.id === portId && p.label) {
9062
- p.label.size = {
9063
- width: width,
9064
- height: height
9065
- };
9066
- }
9067
- return p;
9068
- });
9069
- });
9070
- }, []);
9155
+ handlePortsState(portsRef.current.map(function (p) {
9156
+ if (p.id === portId && p.label) {
9157
+ p.label.size = {
9158
+ width: width,
9159
+ height: height
9160
+ };
9161
+ }
9162
+ return p;
9163
+ }));
9164
+ }, [handlePortsState]);
9071
9165
  //Update state when label of port is changed content
9072
9166
  var handlePortLabelContentChanged = React.useCallback(function (ev, newValue, portId) {
9073
- setPorts(function (prevPorts) {
9074
- return prevPorts.map(function (p) {
9075
- if (p.id === portId && p.label) {
9076
- p.label.content = newValue;
9077
- }
9078
- return p;
9079
- });
9080
- });
9081
- }, []);
9082
- function handleElementMouseMove(ev) {
9167
+ handlePortsState(portsRef.current.map(function (p) {
9168
+ if (p.id === portId && p.label) {
9169
+ p.label.content = newValue;
9170
+ }
9171
+ return p;
9172
+ }));
9173
+ }, [handlePortsState]);
9174
+ var handleElementMouseMove = React.useCallback(function (ev) {
9083
9175
  //ev.stopPropagation(); //Can't use stopPropagation here, because do not create tempLink
9084
9176
  onMouseMove === null || onMouseMove === void 0 ? void 0 : onMouseMove(ev, id);
9085
9177
  if (someElementLinkStarted && elementRef.current) {
@@ -9106,19 +9198,19 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9106
9198
  setPotentialPortPosition(undefined);
9107
9199
  }
9108
9200
  }
9109
- }
9110
- function handleElementMouseLeave(ev) {
9201
+ }, [onMouseMove, id, someElementLinkStarted, container, zoom, getElementAbsPosition, normalizePortPosition, hoveredPort]);
9202
+ var handleElementMouseLeave = React.useCallback(function (ev) {
9111
9203
  ev.stopPropagation();
9112
9204
  onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(ev, id);
9113
9205
  if (someElementLinkStarted) { //If an element link is being created, clear the placeholder when the mouse leaves the element.
9114
9206
  setPotentialPortPosition(undefined);
9115
9207
  }
9116
- }
9117
- var handleElementMouseDown = function (ev) {
9208
+ }, [onMouseLeave, id, someElementLinkStarted]);
9209
+ var handleElementMouseDown = React.useCallback(function (ev) {
9118
9210
  ev.stopPropagation();
9119
9211
  onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(ev, id);
9120
- };
9121
- var handleElementMouseUp = function (ev) {
9212
+ }, [onMouseDown, id]);
9213
+ var handleElementMouseUp = React.useCallback(function (ev) {
9122
9214
  ev.stopPropagation();
9123
9215
  onMouseUp === null || onMouseUp === void 0 ? void 0 : onMouseUp(ev, id);
9124
9216
  //If an element link is being created, trigger onMouseUpAtLinkedPortPlaceholder when the mouse up the element.
@@ -9127,16 +9219,16 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9127
9219
  onMouseUpAtLinkedPortPlaceholder === null || onMouseUpAtLinkedPortPlaceholder === void 0 ? void 0 : onMouseUpAtLinkedPortPlaceholder(newElementLink, potentialPortPosition, id);
9128
9220
  elementLinkStarted.current = undefined;
9129
9221
  }
9130
- };
9222
+ }, [potentialPortPosition, elementLinkStarted, onMouseUpAtLinkedPortPlaceholder, id]);
9131
9223
  //Handle when mouse move on port
9132
9224
  var handlePortMouseMove = React.useCallback(function (portId) {
9133
9225
  if (someElementLinkStarted) {
9134
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9226
+ var port = ports.find(function (p) { return p.id === portId; });
9135
9227
  if (!port)
9136
9228
  return;
9137
9229
  setHoveredPort(port);
9138
9230
  }
9139
- }, [someElementLinkStarted]);
9231
+ }, [someElementLinkStarted, ports]);
9140
9232
  //Handle when mouse leave on port
9141
9233
  var handlePortMouseLeave = React.useCallback(function () {
9142
9234
  if (someElementLinkStarted)
@@ -9145,11 +9237,11 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9145
9237
  //Handle when context menu is opened on port
9146
9238
  var handlePortContextMenu = React.useCallback(function (portId, e) {
9147
9239
  e.preventDefault();
9148
- var port = portsRef.current.find(function (p) { return p.id === portId; });
9240
+ var port = ports.find(function (p) { return p.id === portId; });
9149
9241
  if (!port)
9150
9242
  return;
9151
9243
  onPortContextMenu === null || onPortContextMenu === void 0 ? void 0 : onPortContextMenu(port, id, e);
9152
- }, [onPortContextMenu, id]);
9244
+ }, [ports, onPortContextMenu, id]);
9153
9245
  //Get rotate angle of port by port direction is defined.
9154
9246
  var rotatePort = React.useCallback(function (x, y) {
9155
9247
  // logger.info('calculating port rotation', x, y)
@@ -9164,8 +9256,8 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9164
9256
  switch (portDirection) {
9165
9257
  case exports.SubObjectDirection.Radial:
9166
9258
  var center = {
9167
- x: width / 2,
9168
- y: height / 2
9259
+ x: size.width / 2,
9260
+ y: size.height / 2
9169
9261
  };
9170
9262
  rotationAngle = calculateAngleWithOx(normalizedPosition, center);
9171
9263
  break;
@@ -9190,46 +9282,149 @@ var Element = React.forwardRef(function (props, forwardedRef) {
9190
9282
  break;
9191
9283
  }
9192
9284
  return rotationAngle;
9193
- }, [width, height, portSlideRailSVGClassName, portDirection, getSlideRailSVG, normalizePortPosition, calculateSlideRailRectSVGPositions]);
9194
- var renderedShape = React.useMemo(function () {
9195
- if (renderShape)
9196
- return renderShape(props);
9197
- return null;
9198
- }, [props, renderShape]);
9285
+ }, [size.width, size.height, portSlideRailSVGClassName, portDirection, getSlideRailSVG, normalizePortPosition, calculateSlideRailRectSVGPositions]);
9286
+ // const prevElms = elementsRef.current;
9287
+ var handleTextChanged = React.useCallback(function (textId, content) {
9288
+ var textToUpdate = texts === null || texts === void 0 ? void 0 : texts.find(function (t) { return t.id === textId; });
9289
+ if (!textToUpdate)
9290
+ return;
9291
+ textToUpdate.content = content;
9292
+ setTexts(__spreadArray([], texts, true));
9293
+ }, [texts]);
9294
+ // const renderedShape = useMemo(() => {
9295
+ // if (renderShape) return renderShape(props);
9296
+ // return null;
9297
+ // }, [props, size, position, renderShape])
9298
+ var adjustElementPositionOnParentPortArea = React.useCallback(function (toBeAdjustedPosition, isAbsolutePosition) {
9299
+ if (isAbsolutePosition === void 0) { isAbsolutePosition = false; }
9300
+ if (props.element.moveAsPortOnParent && props.element.parentElement && parentDOM) {
9301
+ var newRelativePosition = {
9302
+ x: toBeAdjustedPosition.x,
9303
+ y: toBeAdjustedPosition.y
9304
+ };
9305
+ if (isAbsolutePosition) {
9306
+ newRelativePosition = transformAbsPositionToElementRelativePosition(toBeAdjustedPosition, props.element);
9307
+ }
9308
+ return correctPortPositionInElement(newRelativePosition, props.element.size.width, props.element.size.height, props.element.parentElement.portMoveableAreas, props.element.parentElement.portSlideRailSVGClassName, parentDOM);
9309
+ }
9310
+ return toBeAdjustedPosition;
9311
+ }, [props.element, parentDOM]);
9312
+ //update absolute position of element and absolute position of children elements
9313
+ // const updateElementPosition = (element: IElementInTreeState, x: number, y: number, isRelativePosition?: boolean): IElementInTreeState => {
9314
+ // if (isRelativePosition) {
9315
+ // element.position.x = x;
9316
+ // element.position.y = y;
9317
+ // } else {
9318
+ // const relativePosition = transformAbsPositionToElementRelativePosition({ x, y }, element)
9319
+ // element.position.x = relativePosition.x;
9320
+ // element.position.y = relativePosition.y;
9321
+ // }
9322
+ // return element;
9323
+ // }
9199
9324
  //Re-render port again after rendered to automation rotate port
9200
9325
  //Because elementRef.current equals null in first render so automation rotate port is incorrect.
9201
9326
  //TODO: check if this is still needed -> Still needed
9202
- React.useLayoutEffect(function () {
9203
- if (elementRef.current) {
9204
- setPorts(function (prev) { return __spreadArray([], prev, true); });
9205
- }
9206
- }, []);
9207
- //log element render
9208
- logger.debug('Rendering Element', id, x, y, width, height, cssClass, portPlaceholderShape, children, container, parentAbsolutePosition, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, ports, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize);
9209
- return (React.createElement(React.Fragment, null,
9210
- 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; } },
9211
- renderedShape,
9212
- potentialPortPosition && (portPlaceholderShape
9213
- ? React.createElement("svg", { x: potentialPortPosition.x, y: potentialPortPosition.y }, portPlaceholderShape)
9214
- : 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 :
9215
- ports.map(function (p, index) {
9216
- var _a, _b, _c, _d, _e, _f, _g, _h;
9217
- 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 },
9218
- selectedPort && selectedPort.id === p.id && (hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.id) !== p.id &&
9219
- (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: {
9220
- enabled: false,
9221
- keepRatio: false
9222
- }, objectX: elementAbsPosition.x + selectedPort.position.x, objectY: elementAbsPosition.y + selectedPort.position.y, onMove: handlePortMove, zoom: zoom })),
9223
- 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: {
9327
+ // useLayoutEffect(() => {
9328
+ // if (elementRef.current) {
9329
+ // handlePortsState(portsRef.current);
9330
+ // }
9331
+ // }, [handlePortsState])
9332
+ //cache render ports
9333
+ var renderedPorts = React.useMemo(function () {
9334
+ return ports === null || ports === void 0 ? void 0 : ports.map(function (p, index) {
9335
+ var _a, _b, _c, _d, _e, _f, _g, _h;
9336
+ 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 },
9337
+ selectedPort && selectedPort.id === p.id && (hoveredPort === null || hoveredPort === void 0 ? void 0 : hoveredPort.id) !== p.id &&
9338
+ (React.createElement(SelectionFrame, { container: container, targetSVGElement: ((_g = p.ref) === null || _g === void 0 ? void 0 : _g.current) || undefined, resizability: {
9224
9339
  enabled: false,
9225
9340
  keepRatio: false
9226
- }, zoom: zoom })));
9227
- }), texts === null || texts === void 0 ? void 0 :
9228
- texts.map(function (t, index) {
9229
- var _a, _b;
9230
- 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); } });
9231
- }),
9232
- children)));
9341
+ }, objectX: elementAbsPosition.x + selectedPort.position.x, objectY: elementAbsPosition.y + selectedPort.position.y, onMove: handlePortMove, zoom: zoom })),
9342
+ 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: {
9343
+ enabled: false,
9344
+ keepRatio: false
9345
+ }, zoom: zoom })));
9346
+ });
9347
+ }, [ports, elementAbsPosition, defaultPortSize, container, rotatePort, handlePortLabelMoved, handlePortLabelResized, handlePortLabelContentChanged, handleSelectedPort, handlePortMouseDown, handlePortMouseUp, handlePortMouseMove, handlePortMouseLeave, handlePortContextMenu, selectedPort, hoveredPort, handlePortMove, zoom]);
9348
+ //cache render texts
9349
+ var renderedTexts = React.useMemo(function () {
9350
+ return texts === null || texts === void 0 ? void 0 : texts.map(function (t, index) {
9351
+ var _a, _b;
9352
+ 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); } });
9353
+ });
9354
+ }, [id, texts, container, elementAbsPosition, handleTextChanged]);
9355
+ //log element render
9356
+ 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);
9357
+ 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 :
9358
+ renderShape(props),
9359
+ !!container && !!beingSelected &&
9360
+ React.createElement(SelectionFrame, { key: id, container: container, targetSVGElement: elementRef.current || undefined, resizability: resizability || {
9361
+ enabled: true,
9362
+ keepRatio: true
9363
+ }, 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,
9364
+ //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9365
+ onMouseDown: function (ev) {
9366
+ windowsPositionToPaperPosition({
9367
+ x: ev.clientX,
9368
+ y: ev.clientY
9369
+ }, container, zoomRef.current);
9370
+ onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(ev, id);
9371
+ }, onMouseUp: function (ev) {
9372
+ windowsPositionToPaperPosition({
9373
+ x: ev.clientX,
9374
+ y: ev.clientY
9375
+ }, container, zoomRef.current);
9376
+ onMouseUp === null || onMouseUp === void 0 ? void 0 : onMouseUp(ev, id);
9377
+ }, onMove: function (newX, newY) {
9378
+ var _a;
9379
+ var oldPosition = __assign({}, position);
9380
+ // Relative position to the paper container
9381
+ var paperPosition = {
9382
+ x: newX,
9383
+ y: newY
9384
+ };
9385
+ //Call onElementMoving to check if the element should be moved or not
9386
+ if (onMoving) {
9387
+ var _b = (_a = onMoving(props.element, paperPosition)) !== null && _a !== void 0 ? _a : {}, horizontalAllowed = _b.horizontalAllowed, verticalAllowed = _b.verticalAllowed;
9388
+ //If both horizontalAllowed and verticalAllowed are false, do not move the element
9389
+ if (!horizontalAllowed && !verticalAllowed) {
9390
+ return;
9391
+ }
9392
+ //If horizontalAllowed is false, keep the old x position
9393
+ if (!horizontalAllowed) {
9394
+ paperPosition.x = oldPosition.x;
9395
+ }
9396
+ //If verticalAllowed is false, keep the old y position
9397
+ if (!verticalAllowed) {
9398
+ paperPosition.y = oldPosition.y;
9399
+ }
9400
+ }
9401
+ logger.info("Element ".concat(props.element.id, " is dragging to position ").concat(JSON.stringify(paperPosition)));
9402
+ //Adjust position of element if it should move as a port on parent port area
9403
+ if (props.element.moveAsPortOnParent && props.element.parentElement) {
9404
+ paperPosition = adjustElementPositionOnParentPortArea(paperPosition, true);
9405
+ updateElementPosition(paperPosition);
9406
+ }
9407
+ else {
9408
+ var relativePosition = transformAbsPositionToElementRelativePosition(paperPosition, props.element);
9409
+ updateElementPosition(relativePosition);
9410
+ }
9411
+ //let newElementPosition = updateElementPosition(props.element, newPosition.x, newPosition.y, true)
9412
+ logger.info("Element ".concat(props.element.id, " is moving to relative position ").concat(JSON.stringify(props.element.position)));
9413
+ onMoved === null || onMoved === void 0 ? void 0 : onMoved(props.element, oldPosition, paperPosition);
9414
+ }, onResize: function (width, height) {
9415
+ var oldSize = size;
9416
+ var newSize = { width: width, height: height };
9417
+ updateElementSize(newSize);
9418
+ if (onResized) {
9419
+ onResized(props.element, oldSize, newSize);
9420
+ }
9421
+ } }),
9422
+ potentialPortPosition && (portPlaceholderShape
9423
+ ? React.createElement("svg", { x: potentialPortPosition.x, y: potentialPortPosition.y }, portPlaceholderShape)
9424
+ : 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 })),
9425
+ renderedPorts,
9426
+ renderedTexts,
9427
+ children));
9233
9428
  });
9234
9429
  var Element$1 = React.memo(Element);
9235
9430
 
@@ -9476,35 +9671,44 @@ function convertElementsToTree(elements) {
9476
9671
  return parsedElementsInTree;
9477
9672
  }
9478
9673
  var Paper = function (props) {
9479
- var _a, _b;
9480
- var _c = React.useState([]), elements = _c[0], setElements = _c[1];
9481
- var _d = React.useState([]), elementsInTree = _d[0], setElementsInTree = _d[1];
9482
- var _e = React.useState(), selectedElement = _e[0], setSelectedElement = _e[1];
9483
- var _f = React.useState(false), autoEnabledDraggingSelectedElement = _f[0], setAutoEnabledDraggingSelectedElement = _f[1];
9484
- var _g = React.useState([]), links = _g[0], setLinks = _g[1];
9485
- var _h = React.useState(), selectedLink = _h[0], setSelectedLink = _h[1];
9486
- var _j = React.useState(null), tempLink = _j[0], setTempLink = _j[1];
9487
- var _k = React.useState([]), texts = _k[0], setTexts = _k[1];
9488
- var _l = React.useState(), selectedText = _l[0], setSelectedText = _l[1];
9489
- var _m = React.useState(null), selectedElementSVG = _m[0], setSelectedElementSVG = _m[1];
9490
- var _o = React.useState(false), mouseDownedOnPaper = _o[0], setMouseDownedOnPaper = _o[1];
9674
+ var _a = React.useState({ elements: [], elementsInTree: [] }), elementsState = _a[0], setElementsState = _a[1];
9675
+ // const [elements, setElements] = React.useState<IElementState[]>([]);
9676
+ // const [elementsInTree, setElementsInTree] = React.useState<IElementInTreeState[]>([]);
9677
+ var _b = React.useState(), selectedElement = _b[0], setSelectedElement = _b[1];
9678
+ var _c = React.useState(false), autoEnabledDraggingSelectedElement = _c[0], setAutoEnabledDraggingSelectedElement = _c[1];
9679
+ var _d = React.useState([]), links = _d[0], setLinks = _d[1];
9680
+ var _e = React.useState(), selectedLink = _e[0], setSelectedLink = _e[1];
9681
+ var _f = React.useState(null), tempLink = _f[0], setTempLink = _f[1];
9682
+ var _g = React.useState([]), texts = _g[0], setTexts = _g[1];
9683
+ var _h = React.useState(), selectedText = _h[0], setSelectedText = _h[1];
9684
+ var _j = React.useState(null), selectedElementSVG = _j[0], setSelectedElementSVG = _j[1];
9685
+ var _k = React.useState(false), mouseDownedOnPaper = _k[0], setMouseDownedOnPaper = _k[1];
9491
9686
  var paperEventEmitter = React.useContext(paperEventEmitterContext);
9492
9687
  var zoom = useZoomContext().zoom;
9493
9688
  var zoomRef = React.useRef(zoom);
9494
9689
  var paperContainerRef = React.useRef(null);
9495
9690
  var tempLinkRef = React.useRef(tempLink); //Cache tempLink to avoid re-render when tempLink changed
9496
- var elementsRef = React.useRef(elements); //Cache elements to avoid re-render when elements changed
9691
+ var elementsRef = React.useRef([]); //Cache elements to avoid re-render when elements changed
9497
9692
  var linksRef = React.useRef(links); //Cache links to avoid re-render when links changed
9498
9693
  var textsRef = React.useRef(texts); //Cache texts to avoid re-render when texts changed
9499
9694
  var size = props.size;
9500
- 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]);
9501
- var onPortMoved = props.onPortMoved, onPortSelected = props.onPortSelected, onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp, onPortsChanged = props.onPortsChanged, 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;
9695
+ var onPortMoved = props.onPortMoved, onPortSelected = props.onPortSelected, onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp,
9696
+ //onPortsChanged,
9697
+ 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;
9698
+ var handleElementsState = React.useCallback(function (elements) {
9699
+ var elementsInTree = convertElementsToTree(elements);
9700
+ setElementsState({ elements: __spreadArray([], elements, true), elementsInTree: elementsInTree });
9701
+ // elementsRef.current = [...elements];
9702
+ }, []);
9703
+ var rerenderWhenAnyElementChanged = React.useCallback(function () {
9704
+ setElementsState(function (prev) { return ({ elements: __spreadArray([], prev.elements, true), elementsInTree: __spreadArray([], prev.elementsInTree, true) }); });
9705
+ }, []);
9502
9706
  React.useEffect(function () {
9503
9707
  zoomRef.current = zoom;
9504
9708
  }, [zoom]);
9505
9709
  React.useEffect(function () {
9506
- setElements(__spreadArray([], props.elements, true));
9507
- }, [props.elements]);
9710
+ handleElementsState(props.elements);
9711
+ }, [handleElementsState, props.elements]);
9508
9712
  React.useEffect(function () {
9509
9713
  setLinks(__spreadArray([], props.links || [], true));
9510
9714
  }, [props.links]);
@@ -9513,36 +9717,45 @@ var Paper = function (props) {
9513
9717
  }, [props.texts]);
9514
9718
  React.useEffect(function () {
9515
9719
  var off = manuallyTriggerRenderElementHandler(function (elementId) {
9516
- var newElements = __spreadArray([], elements, true);
9517
- setElements(newElements);
9518
- if (onElementsChanged) {
9519
- onElementsChanged(newElements);
9520
- }
9720
+ //find the element
9721
+ var element = elementsState.elements.find(function (elm) { return elm.id === elementId; });
9722
+ if (!element)
9723
+ return;
9724
+ element.version = (element.version || 0) + 1;
9725
+ handleElementsState(elementsState.elements);
9521
9726
  });
9522
9727
  return function () {
9523
9728
  off();
9524
9729
  };
9525
- }, [manuallyTriggerRenderElementHandler, onElementsChanged, elements, selectedElement]);
9730
+ }, [elementsState.elements, handleElementsState, manuallyTriggerRenderElementHandler, onElementsChanged, rerenderWhenAnyElementChanged]);
9526
9731
  React.useEffect(function () {
9527
- var offs = [];
9528
- offs.push(manuallySelectElementHandler === null || manuallySelectElementHandler === void 0 ? void 0 : manuallySelectElementHandler(function (element) {
9529
- setSelectedElement(element || undefined);
9530
- if (element) {
9732
+ if (manuallySelectElementHandler) {
9733
+ var off_1 = manuallySelectElementHandler(function (element) {
9734
+ setSelectedElement(element || undefined);
9735
+ if (element) {
9736
+ onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9737
+ }
9738
+ });
9739
+ return function () {
9740
+ off_1();
9741
+ };
9742
+ }
9743
+ }, [manuallySelectElementHandler, onElementSelected]);
9744
+ React.useEffect(function () {
9745
+ if (manuallyTriggerDraggingElementHandler) {
9746
+ var off_2 = manuallyTriggerDraggingElementHandler(function (element) {
9747
+ setSelectedElement(element);
9531
9748
  onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9532
- }
9533
- }));
9534
- offs.push(manuallyTriggerDraggingElementHandler === null || manuallyTriggerDraggingElementHandler === void 0 ? void 0 : manuallyTriggerDraggingElementHandler(function (element) {
9535
- setSelectedElement(element);
9536
- onElementSelected === null || onElementSelected === void 0 ? void 0 : onElementSelected(element);
9537
- setAutoEnabledDraggingSelectedElement(true);
9538
- }));
9539
- return function () {
9540
- offs.forEach(function (off) { return off(); });
9541
- };
9542
- }, [manuallySelectElementHandler, manuallyTriggerDraggingElementHandler, onElementSelected]);
9749
+ setAutoEnabledDraggingSelectedElement(true);
9750
+ });
9751
+ return function () {
9752
+ off_2();
9753
+ };
9754
+ }
9755
+ }, [elementsState.elements, manuallyTriggerDraggingElementHandler, onElementSelected]);
9543
9756
  React.useEffect(function () {
9544
9757
  if (manuallyTriggerStartedLinkingHandler) {
9545
- var off_1 = manuallyTriggerStartedLinkingHandler(function (sourceElement, sourcePort) {
9758
+ var off_3 = manuallyTriggerStartedLinkingHandler(function (sourceElement, sourcePort) {
9546
9759
  var newLink = {
9547
9760
  id: generateUniqueId(),
9548
9761
  points: [],
@@ -9553,19 +9766,19 @@ var Paper = function (props) {
9553
9766
  paperEventEmitter.emitElementLinkStarted(newLink);
9554
9767
  });
9555
9768
  return function () {
9556
- off_1();
9769
+ off_3();
9557
9770
  };
9558
9771
  }
9559
9772
  }, [manuallyTriggerStartedLinkingHandler, paperEventEmitter]);
9560
- var updateElementsTree = React.useCallback(function () {
9561
- var parsedElementsInTree = convertElementsToTree(elements);
9562
- setElementsInTree(parsedElementsInTree);
9563
- }, [elements]);
9564
- //Cache elements to avoid re-render when elements changed
9565
- React.useEffect(function () {
9566
- elementsRef.current = elements;
9567
- updateElementsTree();
9568
- }, [elements, updateElementsTree]);
9773
+ // const updateElementsTree = useCallback(() => {
9774
+ // const parsedElementsInTree = convertElementsToTree(element)
9775
+ // setElementsInTree(parsedElementsInTree)
9776
+ // }, [elements])
9777
+ // //Cache elements to avoid re-render when elements changed
9778
+ // useEffect(() => {
9779
+ // elementsRef.current = elements;
9780
+ // updateElementsTree();
9781
+ // }, [elements, updateElementsTree])
9569
9782
  //Cache links to avoid re-render when links changed
9570
9783
  React.useEffect(function () {
9571
9784
  linksRef.current = links;
@@ -9601,7 +9814,7 @@ var Paper = function (props) {
9601
9814
  setSelectedElementSVG(null);
9602
9815
  setSelectedLink(undefined);
9603
9816
  //broadcast selected port to parent component
9604
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
9817
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9605
9818
  if (element) {
9606
9819
  onPortSelected === null || onPortSelected === void 0 ? void 0 : onPortSelected(port, element);
9607
9820
  }
@@ -9609,40 +9822,44 @@ var Paper = function (props) {
9609
9822
  return function () {
9610
9823
  portSelectedListener.off();
9611
9824
  };
9612
- }, [paperEventEmitter, onPortSelected]);
9825
+ }, [paperEventEmitter, onPortSelected, elementsState]);
9613
9826
  React.useEffect(function () {
9614
9827
  //Listen parent of elements changed, then update elements tree
9615
- var parentChangedCancelers = elementsRef.current.map(function (element) {
9828
+ var parentChangedCancelers = elementsState.elements.map(function (element) {
9616
9829
  var _a;
9617
9830
  return (_a = element.onParentChanged) === null || _a === void 0 ? void 0 : _a.call(element, function (newPa, oldPa) {
9618
9831
  logger.info('onParentChanged');
9619
- updateElementsTree();
9832
+ handleElementsState(elementsState.elements);
9620
9833
  });
9621
9834
  });
9622
- //Listen a new port added, then re-render the element component
9623
- var addedPortCancelers = elementsRef.current.map(function (element) {
9835
+ return function () {
9836
+ parentChangedCancelers.forEach(function (canceller) { return canceller === null || canceller === void 0 ? void 0 : canceller(); });
9837
+ };
9838
+ }, [handleElementsState, rerenderWhenAnyElementChanged, elementsState]);
9839
+ React.useEffect(function () {
9840
+ //Listen a new text added, then re-render the element component
9841
+ //TODO: to be moved to Element component
9842
+ var addedTextCancelers = elementsRef.current.map(function (element) {
9624
9843
  var _a;
9625
- return (_a = element.onAddedPort) === null || _a === void 0 ? void 0 : _a.call(element, function (newPort) {
9626
- logger.info("A new port has been added to element ".concat(element.id));
9627
- var prevElements = elementsRef.current;
9628
- var newElements = prevElements.map(function (ele) {
9629
- if (ele.id === element.id) {
9630
- ele.ports = __spreadArray([], (ele.ports || []), true);
9631
- }
9632
- return ele;
9633
- });
9634
- //Set state to re-render component
9635
- setElements(newElements);
9636
- if (onElementsChanged) {
9637
- onElementsChanged(newElements);
9638
- }
9844
+ return (_a = element.onAddedText) === null || _a === void 0 ? void 0 : _a.call(element, function (newText) {
9845
+ logger.info("A new text has been added to element ".concat(element.id));
9846
+ rerenderWhenAnyElementChanged();
9847
+ });
9848
+ });
9849
+ // Listen a text deleted, then re-render the element component
9850
+ //TODO: to be moved to Element component
9851
+ var deletedTextCancelers = elementsRef.current.map(function (element) {
9852
+ var _a;
9853
+ return (_a = element.onDeletedText) === null || _a === void 0 ? void 0 : _a.call(element, function (deletedTextId) {
9854
+ logger.info("A text has been deleted from element ".concat(element.id));
9855
+ rerenderWhenAnyElementChanged();
9639
9856
  });
9640
9857
  });
9641
9858
  return function () {
9642
- parentChangedCancelers.forEach(function (canceller) { return canceller === null || canceller === void 0 ? void 0 : canceller(); });
9643
- addedPortCancelers.forEach(function (canceller) { return canceller(); });
9859
+ addedTextCancelers.forEach(function (canceller) { return canceller(); });
9860
+ deletedTextCancelers.forEach(function (canceller) { return canceller(); });
9644
9861
  };
9645
- }, [updateElementsTree, onElementsChanged]);
9862
+ }, [elementsState.elements, onElementsChanged, rerenderWhenAnyElementChanged]);
9646
9863
  // //Update elements tree when length of elements change
9647
9864
  // useEffect(() => {
9648
9865
  // updateElementsTree();
@@ -9660,15 +9877,15 @@ var Paper = function (props) {
9660
9877
  //Listen command delete selected for element
9661
9878
  React.useEffect(function () {
9662
9879
  var listener = paperEventEmitter.onCommandDeleteSelectedElement(function () {
9663
- if (selectedElement) {
9880
+ if (selectedElement && selectedElement.removable !== false) {
9664
9881
  selectedElement.parentElement = undefined; //Remove parent element to avoid memory leak. This will remove the element from the parent element's childrenElements array.
9665
9882
  var deletedChildElements = getChildOfElement(selectedElement);
9666
9883
  var deletedElementIds_1 = __spreadArray(__spreadArray([], deletedChildElements, true), [selectedElement], false).map(function (e) { return e.id; });
9667
- var prevElements = elementsRef.current;
9884
+ var prevElements = elementsState.elements;
9668
9885
  var newElements = prevElements.filter(function (e) { return !deletedElementIds_1.includes(e.id); });
9669
9886
  onElementDeleted === null || onElementDeleted === void 0 ? void 0 : onElementDeleted(selectedElement);
9670
9887
  //Set state to re-render component
9671
- setElements(newElements);
9888
+ handleElementsState(newElements);
9672
9889
  if (onElementsChanged) {
9673
9890
  onElementsChanged(newElements);
9674
9891
  }
@@ -9690,14 +9907,20 @@ var Paper = function (props) {
9690
9907
  return function () {
9691
9908
  listener.off();
9692
9909
  };
9693
- }, [selectedElement, onElementSelected, onElementsChanged, onLinksChanged, getChildOfElement, paperEventEmitter, onElementDeleted]);
9910
+ }, [selectedElement, elementsState, onElementSelected, onElementsChanged, onLinksChanged, getChildOfElement, paperEventEmitter, onElementDeleted, handleElementsState]);
9911
+ var removeElementLink = React.useCallback(function (elementLink) {
9912
+ if (elementLink.removable === false)
9913
+ return linksRef.current;
9914
+ var prevLinks = linksRef.current;
9915
+ var newLinks = prevLinks.filter(function (l) { return l.id !== elementLink.id; });
9916
+ return newLinks;
9917
+ }, []);
9694
9918
  //Listen command delete selected for link
9695
9919
  React.useEffect(function () {
9696
9920
  var listener = paperEventEmitter.onCommandDeleteSelectedLink(function () {
9697
9921
  if (selectedLink) {
9698
- var prevLinks = linksRef.current;
9699
- var newLinks = prevLinks.filter(function (l) { return l.id !== selectedLink.id; });
9700
- setLinks(links);
9922
+ var newLinks = removeElementLink(selectedLink);
9923
+ setLinks(newLinks);
9701
9924
  setSelectedLink(undefined);
9702
9925
  if (onLinksChanged) {
9703
9926
  onLinksChanged(newLinks);
@@ -9711,11 +9934,11 @@ var Paper = function (props) {
9711
9934
  return function () {
9712
9935
  listener.off();
9713
9936
  };
9714
- }, [selectedLink, onLinksChanged, onLinkSelected, links, paperEventEmitter]);
9937
+ }, [selectedLink, onLinksChanged, onLinkSelected, paperEventEmitter, removeElementLink]);
9715
9938
  //Listen command delete selected for Text
9716
9939
  React.useEffect(function () {
9717
9940
  var listener = paperEventEmitter.onCommandDeleteSelectedText(function () {
9718
- if (selectedText) {
9941
+ if (selectedText && selectedText.removable !== false) {
9719
9942
  var prevTexts = textsRef.current;
9720
9943
  var newTexts = prevTexts.filter(function (t) { return t.id !== selectedText.id; });
9721
9944
  setTexts(newTexts);
@@ -9804,32 +10027,59 @@ var Paper = function (props) {
9804
10027
  y: yPosOnPaper
9805
10028
  });
9806
10029
  };
9807
- var handlePathChange = React.useCallback(function (path, id) {
9808
- //Update path of element link, that changed
9809
- // const prevLinks = linksRef.current;
9810
- var updatedLinkIndex = links.findIndex(function (l) { return l.id === id; });
9811
- links[updatedLinkIndex].path = path;
9812
- var newLinks = __spreadArray([], links, true);
10030
+ var handleElementMoved = React.useCallback(function (element, oldPosition, paperPosition) {
10031
+ // Start updating the position of links connected to the selected element
10032
+ var childElements = getChildOfElement(element);
10033
+ var elementIds = __spreadArray(__spreadArray([], childElements.map(function (e) { return e.id; }), true), [element.id], false);
10034
+ var offsetX = element.position.x - oldPosition.x;
10035
+ var offsetY = element.position.y - oldPosition.y;
10036
+ // Update position of all points of links that are connected to the selected element
10037
+ var newLinks = linksRef.current.map(function (link) {
10038
+ var isUpdate = elementIds.includes(link.sourceElement.id) && elementIds.includes(link.targetElement.id);
10039
+ if (link.points && isUpdate) {
10040
+ link.points.forEach(function (p) {
10041
+ p.x += offsetX;
10042
+ p.y += offsetY;
10043
+ });
10044
+ }
10045
+ return link;
10046
+ });
9813
10047
  setLinks(newLinks);
9814
- if (onLinksChanged) {
9815
- onLinksChanged(newLinks);
10048
+ // onLinksChanged?.(newLinks);
10049
+ // End updating the position of links connected to the selected element
10050
+ if (onElementMoved) {
10051
+ onElementMoved(element.position, element, paperPosition);
9816
10052
  }
9817
- }, [onLinksChanged, links]);
9818
- var handlePointsOfLinkChange = React.useCallback(function (points, linkId) {
9819
- var newLinks = __spreadArray([], linksRef.current, true);
9820
- var updatedLinkIndex = newLinks.findIndex(function (l) { return l.id === linkId; });
9821
- newLinks[updatedLinkIndex].points = points;
9822
- setLinks(newLinks);
9823
- if (onLinksChanged) {
9824
- onLinksChanged(newLinks);
10053
+ paperEventEmitter.emitElementMoved(element, oldPosition, element.position);
10054
+ setMouseDownedOnPaper(false);
10055
+ }, [getChildOfElement, onElementMoved, paperEventEmitter]);
10056
+ var handleElementResized = React.useCallback(function (element, oldSize, newSize) {
10057
+ if (onElementResized) {
10058
+ onElementResized(newSize, element);
9825
10059
  }
9826
- }, [onLinksChanged]);
10060
+ paperEventEmitter.emitElementResized(element, oldSize, newSize);
10061
+ setMouseDownedOnPaper(false);
10062
+ }, [paperEventEmitter, onElementResized]);
10063
+ // const handlePathChange = useCallback((path: string, id: string) => {
10064
+ // //Update path of element link, that changed
10065
+ // //const prevLinks = linksRef.current;
10066
+ // const updatedLink = linksRef.current.find(l => l.id === id)
10067
+ // if (updatedLink) {
10068
+ // updatedLink.path = path;
10069
+ // }
10070
+ // }, [])
10071
+ //TODO: to be cleaned
10072
+ var handlePointsOfLinkChange = React.useCallback(function (points, linkId) {
10073
+ var updatedLinkIndex = linksRef.current.findIndex(function (l) { return l.id === linkId; });
10074
+ linksRef.current[updatedLinkIndex].points = points;
10075
+ }, []);
9827
10076
  var handlePortMoved = React.useCallback(function (port, elementId, oldPosition, newPosition) {
9828
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10077
+ var _a;
10078
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9829
10079
  if (element) {
9830
10080
  //set links equals a clone links to re-render links with new position
9831
10081
  var prevLinks = linksRef.current;
9832
- var newLinks = prevLinks.map(function (link) {
10082
+ prevLinks.map(function (link) {
9833
10083
  var _a, _b;
9834
10084
  if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {
9835
10085
  link.sourcePort.position = newPosition;
@@ -9851,10 +10101,10 @@ var Paper = function (props) {
9851
10101
  return link;
9852
10102
  });
9853
10103
  });
9854
- if (onLinksChanged) {
9855
- onLinksChanged(newLinks);
9856
- }
9857
- var newElements = elementsRef.current;
10104
+ // if (onLinksChanged) {
10105
+ // onLinksChanged(newLinks)
10106
+ // }
10107
+ //const newElements = elementsRef.current;
9858
10108
  // newElements[updatedElementIndex].ports = newElements[updatedElementIndex].ports?.map(p => {
9859
10109
  // if (p.id === port.id) {
9860
10110
  // p.position = newPosition
@@ -9863,37 +10113,50 @@ var Paper = function (props) {
9863
10113
  // })
9864
10114
  //Update port position in element, not re-render
9865
10115
  //To avoid re-render
9866
- setElements(function (prev) {
9867
- var _a;
9868
- var newElements = __spreadArray([], prev, true);
9869
- var updatedElement = newElements.find(function (e) { return e.id === elementId; });
9870
- if (updatedElement) {
9871
- updatedElement.ports = (_a = updatedElement.ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
9872
- if (p.id === port.id) {
9873
- p.position = newPosition;
9874
- }
9875
- return p;
9876
- });
9877
- }
9878
- return newElements;
9879
- });
9880
- if (onElementsChanged) {
9881
- onElementsChanged(newElements);
10116
+ // setElements(prev => {
10117
+ // const newElements = [...prev]
10118
+ var updatedElement = elementsState.elements.find(function (e) { return e.id === elementId; });
10119
+ if (updatedElement) {
10120
+ updatedElement.ports = (_a = updatedElement.ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
10121
+ if (p.id === port.id) {
10122
+ p.position = newPosition;
10123
+ }
10124
+ return p;
10125
+ });
9882
10126
  }
10127
+ rerenderWhenAnyElementChanged();
10128
+ // return newElements
10129
+ // });
9883
10130
  if (onPortMoved) {
9884
10131
  onPortMoved(newPosition, port, element);
9885
10132
  }
9886
10133
  }
9887
- }, [onPortMoved, onElementsChanged, onLinksChanged]);
10134
+ }, [onPortMoved, elementsState, rerenderWhenAnyElementChanged]);
10135
+ React.useEffect(function () {
10136
+ //on port manually trigger render
10137
+ var off = manuallyTriggerRenderPortHandler(function (portId, elementId) {
10138
+ var _a;
10139
+ //find the element
10140
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10141
+ //find the port
10142
+ 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; });
10143
+ if (!element || !port)
10144
+ return;
10145
+ //rerender links connected to the port
10146
+ handlePortMoved(port, elementId, __assign({}, port.position), __assign({}, port.position));
10147
+ });
10148
+ return function () {
10149
+ off();
10150
+ };
10151
+ }, [manuallyTriggerRenderPortHandler, handlePortMoved, elementsState]);
9888
10152
  //Handle creating a new element link
9889
10153
  var handlePortMouseDown = React.useCallback(function (ev, port, elementId) {
9890
10154
  ev.stopPropagation();
9891
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10155
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9892
10156
  var paperPosition = windowsPositionToPaperPosition({
9893
10157
  x: ev.clientX,
9894
10158
  y: ev.clientY
9895
10159
  }, paperContainerRef.current, zoomRef.current);
9896
- console.log(paperPosition);
9897
10160
  //broadcast port mouse down to parent component
9898
10161
  if (element) {
9899
10162
  onPortMouseDown === null || onPortMouseDown === void 0 ? void 0 : onPortMouseDown(port, element, paperPosition);
@@ -9909,7 +10172,7 @@ var Paper = function (props) {
9909
10172
  setTempLink(newLink);
9910
10173
  paperEventEmitter.emitElementLinkStarted(newLink);
9911
10174
  }
9912
- }, [paperEventEmitter, onPortMouseDown]);
10175
+ }, [paperEventEmitter, elementsState, onPortMouseDown]);
9913
10176
  var createElementLink = React.useCallback(function (sourcePort, sourceElement, targetPort, targetElement) {
9914
10177
  //if no onCreatingLink prop, no link will be created
9915
10178
  if (!onCreatingLink) {
@@ -9920,14 +10183,14 @@ var Paper = function (props) {
9920
10183
  return null;
9921
10184
  //Automatic bending, if is not defined points
9922
10185
  if (!newElementLink.points || newElementLink.points.length === 0) {
9923
- var elements_1 = elementsRef.current;
9924
- newElementLink = automationAddPointsToLink(newElementLink, elements_1, MAX_LINK_KNOT_COUNT);
10186
+ var elements = elementsState.elements;
10187
+ newElementLink = automationAddPointsToLink(newElementLink, elements, MAX_LINK_KNOT_COUNT);
9925
10188
  }
9926
10189
  return newElementLink;
9927
- }, [onCreatingLink]);
10190
+ }, [onCreatingLink, elementsState]);
9928
10191
  var handlePortMouseUp = React.useCallback(function (ev, port, elementId) {
9929
10192
  ev.stopPropagation();
9930
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10193
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
9931
10194
  var paperPosition = windowsPositionToPaperPosition({
9932
10195
  x: ev.clientX,
9933
10196
  y: ev.clientY
@@ -9943,7 +10206,7 @@ var Paper = function (props) {
9943
10206
  var newElementLink = null;
9944
10207
  if (isMouseUpOnNotSelf) {
9945
10208
  var _a = tempLinkRef.current, sourcePort = _a.sourcePort, sourceElement = _a.sourceElement;
9946
- var targetElement = elementsRef.current.find(function (e) { return e.id === elementId; });
10209
+ var targetElement = elementsState.elements.find(function (e) { return e.id === elementId; });
9947
10210
  newElementLink = createElementLink(sourcePort, sourceElement, port, targetElement);
9948
10211
  }
9949
10212
  if (newElementLink) {
@@ -9960,14 +10223,14 @@ var Paper = function (props) {
9960
10223
  }
9961
10224
  setTempLink(null);
9962
10225
  }
9963
- }, [paperEventEmitter, createElementLink, onPortMouseUp, onLinksChanged]);
9964
- var handlePortsChanged = React.useCallback(function (ports, elementId) {
9965
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
9966
- if (element) {
9967
- //broadcast ports changed to parent component
9968
- onPortsChanged(ports, element);
9969
- }
9970
- }, [onPortsChanged]);
10226
+ }, [paperEventEmitter, elementsState, createElementLink, onPortMouseUp, onLinksChanged]);
10227
+ // const handlePortsChanged = useCallback((ports: IPort[], elementId: string) => {
10228
+ // const element = elementsRef.current.find(e => e.id === elementId);
10229
+ // if (element) {
10230
+ // //broadcast ports changed to parent component
10231
+ // onPortsChanged(ports, element);
10232
+ // }
10233
+ // }, [onPortsChanged])
9971
10234
  var handleLinkLabelMoved = React.useCallback(function (newX, newY, index, labelType) {
9972
10235
  var prevLinks = linksRef.current;
9973
10236
  var newLinks = __spreadArray([], prevLinks, true);
@@ -10059,19 +10322,6 @@ var Paper = function (props) {
10059
10322
  var handleDeselectLink = function (link, index) {
10060
10323
  setSelectedLink(undefined);
10061
10324
  };
10062
- //update absolute position of element and absolute position of children elements
10063
- var updateElementPosition = function (element, x, y, isRelativePosition) {
10064
- if (isRelativePosition) {
10065
- element.position.x = x;
10066
- element.position.y = y;
10067
- }
10068
- else {
10069
- var relativePosition = transformAbsPositionToElementRelativePosition({ x: x, y: y }, element);
10070
- element.position.x = relativePosition.x;
10071
- element.position.y = relativePosition.y;
10072
- }
10073
- return element;
10074
- };
10075
10325
  /*
10076
10326
  Cache to avoid re-initializing the function when the component re-renders to
10077
10327
  avoid causing the components using it to re-render unnecessarily
@@ -10101,17 +10351,16 @@ var Paper = function (props) {
10101
10351
  }, [handleLinkLabelContentChanged]);
10102
10352
  var handleClickLinkDelete = React.useCallback(function (link, index) {
10103
10353
  return function () {
10104
- var prevLinks = linksRef.current;
10105
- var newLinks = __spreadArray([], prevLinks, true);
10106
- newLinks.splice(index, 1);
10354
+ var newLinks = removeElementLink(link);
10107
10355
  setLinks(newLinks);
10356
+ setSelectedLink(undefined);
10108
10357
  if (onLinksChanged) {
10109
10358
  onLinksChanged(newLinks);
10110
10359
  }
10111
10360
  };
10112
- }, [onLinksChanged]);
10361
+ }, [onLinksChanged, removeElementLink]);
10113
10362
  var handleMouseUpAtLinkedPortPlaceholder = React.useCallback(function (link, position, targetElementId) {
10114
- var targetElement = elementsRef.current.find(function (e) { return e.id === targetElementId; });
10363
+ var targetElement = elementsState.elements.find(function (e) { return e.id === targetElementId; });
10115
10364
  if (!targetElement)
10116
10365
  return;
10117
10366
  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));
@@ -10141,24 +10390,20 @@ var Paper = function (props) {
10141
10390
  //Clear tempLink
10142
10391
  setTempLink(null);
10143
10392
  paperEventEmitter.emitElementLinkEnded();
10144
- }, [onCreatingPortByLinking, createElementLink, paperEventEmitter, onLinksChanged]);
10145
- var handleElementTextChange = React.useCallback(function (elementId, textId, newContent) {
10146
- var prevElms = elementsRef.current;
10147
- var newElements = prevElms.map(function (curEle) {
10148
- //Find changed text of element to update the content for it.
10149
- if (curEle.id === elementId && curEle.texts) {
10150
- var updatedTextId = curEle.texts.findIndex(function (t) { return t.id === textId; });
10151
- if (updatedTextId !== undefined) {
10152
- curEle.texts[updatedTextId].content = newContent;
10153
- }
10154
- }
10155
- return curEle;
10156
- });
10157
- setElements(newElements);
10158
- if (onElementsChanged) {
10159
- onElementsChanged(newElements);
10160
- }
10161
- }, [onElementsChanged]);
10393
+ }, [onCreatingPortByLinking, elementsState, createElementLink, paperEventEmitter, onLinksChanged]);
10394
+ // const handleElementTextChange = useCallback((elementId: string, textId: string, newContent: string) => {
10395
+ // // const prevElms = elementsRef.current;
10396
+ // elementsState.elements.forEach(curEle => {
10397
+ // //Find changed text of element to update the content for it.
10398
+ // if (curEle.id === elementId && curEle.texts) {
10399
+ // const updatedTextId = curEle.texts.findIndex(t => t.id === textId)
10400
+ // if (updatedTextId !== undefined) {
10401
+ // curEle.texts[updatedTextId].content = newContent;
10402
+ // }
10403
+ // }
10404
+ // })
10405
+ // rerenderWhenAnyElementChanged();
10406
+ // }, [rerenderWhenAnyElementChanged, elementsState])
10162
10407
  var handleElementClicked = React.useCallback(function (elementId, e, ref) {
10163
10408
  e.stopPropagation();
10164
10409
  var tempLink = tempLinkRef.current;
@@ -10168,7 +10413,7 @@ var Paper = function (props) {
10168
10413
  paperEventEmitter.emitElementLinkEnded();
10169
10414
  }
10170
10415
  else {
10171
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10416
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10172
10417
  // Select the element only if it is selectable
10173
10418
  if (element && element.selectable) {
10174
10419
  setSelectedElementSVG(ref);
@@ -10178,24 +10423,24 @@ var Paper = function (props) {
10178
10423
  }
10179
10424
  }
10180
10425
  setMouseDownedOnPaper(false);
10181
- }, [paperEventEmitter]);
10426
+ }, [paperEventEmitter, elementsState.elements]);
10182
10427
  var handlePortContextMenu = React.useCallback(function (port, elementId, e) {
10183
10428
  e.preventDefault();
10184
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10429
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10185
10430
  if (element) {
10186
10431
  onPortContextMenu === null || onPortContextMenu === void 0 ? void 0 : onPortContextMenu(port, element, e);
10187
10432
  }
10188
- }, [onPortContextMenu]);
10433
+ }, [onPortContextMenu, elementsState]);
10189
10434
  var handleContextMenu = React.useCallback(function (elementId, e, ref) {
10190
10435
  e.preventDefault();
10191
- var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10436
+ var element = elementsState.elements.find(function (e) { return e.id === elementId; });
10192
10437
  if (element) {
10193
10438
  handleElementClicked(elementId, e, ref);
10194
10439
  onElementContextMenu === null || onElementContextMenu === void 0 ? void 0 : onElementContextMenu(element, e);
10195
10440
  }
10196
- }, [onElementContextMenu, handleElementClicked]);
10441
+ }, [onElementContextMenu, handleElementClicked, elementsState]);
10197
10442
  var handleMouseUp = React.useCallback(function (ev, elementId) {
10198
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10443
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10199
10444
  var paperPosition = windowsPositionToPaperPosition({
10200
10445
  x: ev.clientX,
10201
10446
  y: ev.clientY
@@ -10203,9 +10448,9 @@ var Paper = function (props) {
10203
10448
  if (element) {
10204
10449
  onElementMouseUp === null || onElementMouseUp === void 0 ? void 0 : onElementMouseUp(ev, element, paperPosition);
10205
10450
  }
10206
- }, [onElementMouseUp]);
10451
+ }, [onElementMouseUp, elementsState]);
10207
10452
  var handleMouseDown = React.useCallback(function (ev, elementId) {
10208
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10453
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10209
10454
  var paperPosition = windowsPositionToPaperPosition({
10210
10455
  x: ev.clientX,
10211
10456
  y: ev.clientY
@@ -10213,9 +10458,9 @@ var Paper = function (props) {
10213
10458
  if (element) {
10214
10459
  onElementMouseDown === null || onElementMouseDown === void 0 ? void 0 : onElementMouseDown(ev, element, paperPosition);
10215
10460
  }
10216
- }, [onElementMouseDown]);
10461
+ }, [onElementMouseDown, elementsState]);
10217
10462
  var handleMouseMove = React.useCallback(function (ev, elementId) {
10218
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10463
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10219
10464
  var paperPosition = windowsPositionToPaperPosition({
10220
10465
  x: ev.clientX,
10221
10466
  y: ev.clientY
@@ -10223,9 +10468,9 @@ var Paper = function (props) {
10223
10468
  if (element) {
10224
10469
  onElementMouseMove === null || onElementMouseMove === void 0 ? void 0 : onElementMouseMove(ev, element, paperPosition);
10225
10470
  }
10226
- }, [onElementMouseMove]);
10471
+ }, [onElementMouseMove, elementsState]);
10227
10472
  var handleMouseLeave = React.useCallback(function (ev, elementId) {
10228
- var element = elementsRef.current.find(function (ele) { return ele.id === elementId; });
10473
+ var element = elementsState.elements.find(function (ele) { return ele.id === elementId; });
10229
10474
  var paperPosition = windowsPositionToPaperPosition({
10230
10475
  x: ev.clientX,
10231
10476
  y: ev.clientY
@@ -10233,116 +10478,43 @@ var Paper = function (props) {
10233
10478
  if (element) {
10234
10479
  onElementMouseLeave === null || onElementMouseLeave === void 0 ? void 0 : onElementMouseLeave(ev, element, paperPosition);
10235
10480
  }
10236
- }, [onElementMouseLeave]);
10481
+ }, [onElementMouseLeave, elementsState]);
10237
10482
  var renderElementInTree = React.useCallback(function (element) {
10483
+ var _a;
10238
10484
  logger.info("Rendering element tree for element ".concat(element.id));
10239
10485
  //use the defined react element or the default Element component
10240
10486
  var ReactElement = element.reactElement || Element$1;
10241
10487
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
10242
- 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, onPortsChanged: handlePortsChanged, onPortContextMenu: handlePortContextMenu,
10488
+ React.createElement(ReactElement, { key: "element-".concat(element.id, "-").concat(element.version), element: element,
10489
+ //id={element.id}
10490
+ //ref={(refDOM) => element.DOM = refDOM}
10491
+ //height={element.size.height}
10492
+ //width={element.size.width}
10493
+ //x={element.positionAnchor === PositioningAnchor.Center ? element.position.x - element.size.width / 2 : element.position.x}
10494
+ //y={element.positionAnchor === PositioningAnchor.Center ? element.position.y - element.size.height / 2 : element.position.y}
10495
+ //selectable={element.selectable}
10496
+ onClick: handleElementClicked, onContextMenu: handleContextMenu, onMouseUp: handleMouseUp, onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseLeave: handleMouseLeave, onMoving: onElementMoving, onMoved: handleElementMoved, onResized: handleElementResized, container: paperContainerRef.current,
10497
+ // renderShape={element.renderShape}
10498
+ // cssClass={element.cssClass}
10499
+ // texts={element.texts}
10500
+ // ports={element.ports}
10501
+ // portMoveableAreas={element.portMoveableAreas}
10502
+ // portSlideRailSVGClassName={element.portSlideRailSVGClassName}
10503
+ // portDirection={element.portDirection}
10504
+ // defaultPortSize={element.defaultPortSize}
10505
+ onPortMoved: handlePortMoved, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp,
10506
+ // onPortsChanged={handlePortsChanged}
10507
+ onPortContextMenu: handlePortContextMenu,
10243
10508
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
10244
- onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: manuallyTriggerRenderPortHandler, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined },
10245
- element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree),
10246
- !!paperContainerRef.current && !!selectedElement && selectedElement.id === element.id &&
10247
- React.createElement(SelectionFrame, { key: selectedElement.id, container: paperContainerRef.current, targetSVGElement: selectedElementSVG || undefined, resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
10248
- enabled: true,
10249
- keepRatio: true
10250
- }, 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,
10251
- //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
10252
- onMouseDown: function (ev) {
10253
- if (selectedElement) {
10254
- var paperPosition = windowsPositionToPaperPosition({
10255
- x: ev.clientX,
10256
- y: ev.clientY
10257
- }, paperContainerRef.current, zoomRef.current);
10258
- onElementMouseDown === null || onElementMouseDown === void 0 ? void 0 : onElementMouseDown(ev, selectedElement, paperPosition);
10259
- }
10260
- }, onMouseUp: function (ev) {
10261
- if (selectedElement) {
10262
- var paperPosition = windowsPositionToPaperPosition({
10263
- x: ev.clientX,
10264
- y: ev.clientY
10265
- }, paperContainerRef.current, zoomRef.current);
10266
- onElementMouseUp === null || onElementMouseUp === void 0 ? void 0 : onElementMouseUp(ev, selectedElement, paperPosition);
10267
- }
10268
- }, onMove: function (newX, newY) {
10269
- if (!selectedElement)
10270
- return;
10271
- var oldPosition = __assign({}, selectedElement.position);
10272
- // Relative position to the paper container
10273
- var paperPosition = {
10274
- x: newX,
10275
- y: newY
10276
- };
10277
- //Call onElementMoving to check if the element should be moved or not
10278
- if (onElementMoving) {
10279
- var isSkip = onElementMoving(selectedElement, paperPosition);
10280
- if (!isSkip) {
10281
- return;
10282
- }
10283
- }
10284
- logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(paperPosition)));
10285
- //Adjust position of element if it should move as a port on parent port area
10286
- if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
10287
- paperPosition = adjustElementPositionOnParentPortArea(selectedElement, paperPosition, true);
10288
- updateElementPosition(selectedElement, paperPosition.x, paperPosition.y, true);
10289
- }
10290
- else {
10291
- updateElementPosition(selectedElement, paperPosition.x, paperPosition.y, false);
10292
- }
10293
- //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
10294
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
10295
- logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
10296
- // Start updating the position of links connected to the selected element
10297
- var childElements = getChildOfElement(selectedElement);
10298
- var elementIds = __spreadArray(__spreadArray([], childElements.map(function (e) { return e.id; }), true), [selectedElement.id], false);
10299
- var offsetX = selectedElement.position.x - oldPosition.x;
10300
- var offsetY = selectedElement.position.y - oldPosition.y;
10301
- // Update position of all points of links that are connected to the selected element
10302
- var newLinks = linksRef.current.map(function (link) {
10303
- var isUpdate = elementIds.includes(link.sourceElement.id) && elementIds.includes(link.targetElement.id);
10304
- if (link.points && isUpdate) {
10305
- link.points.forEach(function (p) {
10306
- p.x += offsetX;
10307
- p.y += offsetY;
10308
- });
10309
- }
10310
- return link;
10311
- });
10312
- onLinksChanged === null || onLinksChanged === void 0 ? void 0 : onLinksChanged(newLinks);
10313
- // End updating the position of links connected to the selected element
10314
- //Set state to re-render UI with new position
10315
- setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
10316
- if (onElementMoved) {
10317
- console.log('onElementMoved', selectedElement.position, paperPosition);
10318
- onElementMoved(selectedElement.position, selectedElement, indexSelectedElement, paperPosition);
10319
- }
10320
- paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
10321
- setMouseDownedOnPaper(false);
10322
- }, onResize: function (width, height) {
10323
- if (!selectedElement)
10324
- return;
10325
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
10326
- var oldSize = selectedElement.size;
10327
- var newSize = { width: width, height: height };
10328
- elements[indexSelectedElement].size = newSize;
10329
- var newElements = __spreadArray([], elements, true);
10330
- setElements(newElements);
10331
- if (onElementsChanged) {
10332
- onElementsChanged(newElements);
10333
- }
10334
- if (onElementResized) {
10335
- onElementResized(newSize, selectedElement, indexSelectedElement);
10336
- }
10337
- paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
10338
- setMouseDownedOnPaper(false);
10339
- } }))));
10340
- }, [manuallyTriggerRenderPortHandler, handleElementClicked, handleContextMenu, handleMouseUp, handleMouseDown, handleMouseMove, handleMouseLeave, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handlePortsChanged, 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, elements, getChildOfElement, paperEventEmitter, onElementResized, onElementsChanged, onElementMoved, onElementMouseDown, onElementMouseUp, onLinksChanged, onElementMoving]);
10509
+ onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder,
10510
+ // onTextUpdated={handleElementTextChange}
10511
+ 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))));
10512
+ }, [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]);
10341
10513
  var ElementsInTree = React.useMemo(function () {
10342
- return elementsInTree.map(function (element, index) {
10514
+ return elementsState.elementsInTree.map(function (element, index) {
10343
10515
  return renderElementInTree(element);
10344
10516
  });
10345
- }, [elementsInTree, renderElementInTree]);
10517
+ }, [elementsState.elementsInTree, renderElementInTree]);
10346
10518
  return (React.createElement("div", { style: { position: "relative" } },
10347
10519
  React.createElement(Ruler, { squareSize: 100, border: '1px dashed grey' }),
10348
10520
  React.createElement("svg", { tabIndex: 0, width: size.width, height: size.height, ref: paperContainerRef, id: "paper-container", onMouseMove: handlePaperMouseMove, onMouseDown: handleMouseDownOnPaper, onMouseUp: handleMouseUpOnPaper },
@@ -10350,18 +10522,11 @@ var Paper = function (props) {
10350
10522
  links && links.map(function (link, index) {
10351
10523
  if (!link.targetElement || !link.targetPort)
10352
10524
  return null;
10353
- return (React.createElement(ElementLink, { key: link.id, id: link.id, path: link.path, sourcePosition: {
10354
- x: getAbsolutePosition(link.sourceElement).x + link.sourcePort.position.x,
10355
- y: getAbsolutePosition(link.sourceElement).y + link.sourcePort.position.y
10356
- }, targetPosition: {
10357
- x: getAbsolutePosition(link.targetElement).x + link.targetPort.position.x,
10358
- y: getAbsolutePosition(link.targetElement).y + link.targetPort.position.y
10359
- }, 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) }));
10525
+ 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,
10526
+ //onPathChanged={handlePathChange}
10527
+ 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) }));
10360
10528
  }),
10361
- (tempLink === null || tempLink === void 0 ? void 0 : tempLink.tempTargetPosition) && React.createElement(ElementLink, { id: tempLink.id, points: tempLink.points, sourcePosition: {
10362
- x: getAbsolutePosition(tempLink.sourceElement).x + tempLink.sourcePort.position.x,
10363
- y: getAbsolutePosition(tempLink.sourceElement).y + tempLink.sourcePort.position.y
10364
- }, targetPosition: tempLink.tempTargetPosition, container: paperContainerRef.current, markerStart: tempLink.markerStart, markerEnd: tempLink.markerEnd, markerDistanceFromPort: tempLink.markerDistanceFromPort, markerSize: tempLink.markerSize }),
10529
+ (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 }),
10365
10530
  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 () {
10366
10531
  setSelectedText(text);
10367
10532
  } })); })),
@@ -10418,9 +10583,6 @@ var Editor = function (_a) {
10418
10583
  var handlePortSelected = React.useCallback(function (port, element) {
10419
10584
  editorContext.onPortSelectedHandler(port, element);
10420
10585
  }, [editorContext]);
10421
- var handlePortsChanged = React.useCallback(function (ports, element) {
10422
- element.ports = ports;
10423
- }, []);
10424
10586
  var handlePortContextMenu = React.useCallback(function (port, element, event) {
10425
10587
  editorContext.onPortContextMenuHandler(port, element, event);
10426
10588
  }, [editorContext]);
@@ -10473,7 +10635,7 @@ var Editor = function (_a) {
10473
10635
  if (editorContext.onElementMovingHandler) {
10474
10636
  return editorContext.onElementMovingHandler(element, newPaperPosition);
10475
10637
  }
10476
- return true;
10638
+ return { horizontalAllowed: true, verticalAllowed: true };
10477
10639
  }, [editorContext]);
10478
10640
  var handleOnCreatingPortByLinking = React.useCallback(function (sourceElement, sourcePort, targetElement, position) {
10479
10641
  if (editorContext.onCreatingPortByLinkingHandler) {
@@ -10491,11 +10653,14 @@ var Editor = function (_a) {
10491
10653
  editorContext.onPaperMouseUpHandler(position);
10492
10654
  }, [editorContext]);
10493
10655
  var handleElementRemoved = React.useCallback(function (element) {
10494
- editorContext.onElementRemovedHandler(element.id);
10656
+ var _a;
10657
+ editorContext.onElementRemovedHandler(element.id, (_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.id);
10495
10658
  }, [editorContext]);
10496
10659
  return (React.createElement(EditorConfigurationContextProvider, { value: editorContext.configuration },
10497
10660
  React.createElement(ZoomContextProvider, null,
10498
- 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, onPortsChanged: handlePortsChanged, 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) }))));
10661
+ 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,
10662
+ //onPortsChanged={handlePortsChanged}
10663
+ 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) }))));
10499
10664
  };
10500
10665
 
10501
10666
  exports.CircleRC = Circle;