orcasvn-react-diagrams 0.1.63 → 0.1.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -484,7 +484,7 @@ function generateUniqueId() {
484
484
  }
485
485
 
486
486
  var Element$2 = /** @class */ (function () {
487
- function Element(id, x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
487
+ function Element(id, x, y, width, height, selectable, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
488
488
  if (portMovealeAreas === void 0) { portMovealeAreas = []; }
489
489
  this.positionAnchor = exports.PositioningAnchor.TopLeft;
490
490
  this._childrenElements = [];
@@ -497,6 +497,7 @@ var Element$2 = /** @class */ (function () {
497
497
  this._id = id || generateUniqueId();
498
498
  this._position = { x: x, y: y };
499
499
  this._size = { width: width, height: height };
500
+ this.selectable = selectable === undefined ? true : selectable;
500
501
  this.cssClass = cssClass;
501
502
  this.renderShape = renderShape;
502
503
  this.texts = texts;
@@ -7722,27 +7723,27 @@ var SelectionFrame = function (props) {
7722
7723
  setHeight(propHeight);
7723
7724
  }
7724
7725
  }, [objectY, propHeight]);
7725
- var _c = React.useState(objectX !== null && objectX !== void 0 ? objectX : 0), curX = _c[0], setCurX = _c[1];
7726
- var _d = React.useState(objectY !== null && objectY !== void 0 ? objectY : 0), curY = _d[0], setCurY = _d[1];
7727
- React.useEffect(function () {
7728
- if (objectX) {
7729
- setCurX(objectX);
7730
- }
7731
- }, [objectX]);
7732
- React.useEffect(function () {
7733
- if (objectY) {
7734
- setCurY(objectY);
7735
- }
7736
- }, [objectY]);
7726
+ // const [curX, setCurX] = React.useState<number>(objectX ?? 0)
7727
+ // const [curY, setCurY] = React.useState<number>(objectY ?? 0)
7728
+ // useEffect(() => {
7729
+ // if (objectX) {
7730
+ // setCurX(objectX);
7731
+ // }
7732
+ // }, [objectX]);
7733
+ // useEffect(() => {
7734
+ // if (objectY) {
7735
+ // setCurY(objectY);
7736
+ // }
7737
+ // }, [objectY]);
7737
7738
  var framePadding = propFramePadding || 0;
7738
7739
  var r = 5;
7739
- var _e = React.useState(draggingByDefault || false), draggingRect = _e[0], setDraggingRect = _e[1];
7740
- var _f = React.useState(false), draggingCircle = _f[0], setDraggingCircle = _f[1];
7741
- var _g = React.useState(0), startX = _g[0], setStartX = _g[1];
7742
- var _h = React.useState(0), startY = _h[0], setStartY = _h[1];
7743
- var _j = React.useState(0), xFromMouse = _j[0], setXFromMouse = _j[1];
7744
- var _k = React.useState(0), yFromMouse = _k[0], setYFromMouse = _k[1];
7745
- var _l = React.useState(0), lastMoveTime = _l[0], setLastMoveTime = _l[1];
7740
+ var _c = React.useState(draggingByDefault || false), draggingRect = _c[0], setDraggingRect = _c[1];
7741
+ var _d = React.useState(false), draggingCircle = _d[0], setDraggingCircle = _d[1];
7742
+ var _e = React.useState(0), startX = _e[0], setStartX = _e[1];
7743
+ var _f = React.useState(0), startY = _f[0], setStartY = _f[1];
7744
+ var _g = React.useState(0), xFromMouse = _g[0], setXFromMouse = _g[1];
7745
+ var _h = React.useState(0), yFromMouse = _h[0], setYFromMouse = _h[1];
7746
+ var _j = React.useState(0), lastMoveTime = _j[0], setLastMoveTime = _j[1];
7746
7747
  // const { onStartDraggingElement } = useContext(paperEventEmitterContext);
7747
7748
  // useEffect(() => {
7748
7749
  // const { off } = onStartDraggingElement((element) => {
@@ -7752,13 +7753,13 @@ var SelectionFrame = function (props) {
7752
7753
  // off();
7753
7754
  // }
7754
7755
  // }, [])
7755
- var getMousePosition = function (event) {
7756
+ var getMousePosition = React.useCallback(function (event) {
7756
7757
  var position = windowsPositionToPaperPosition({
7757
7758
  x: event.clientX,
7758
7759
  y: event.clientY
7759
7760
  }, propContainer, zoom);
7760
7761
  return position;
7761
- };
7762
+ }, [propContainer, zoom]);
7762
7763
  var addRectHandleMouseDown = function (event) {
7763
7764
  event.stopPropagation();
7764
7765
  if (!draggingCircle) {
@@ -7766,8 +7767,8 @@ var SelectionFrame = function (props) {
7766
7767
  setStartX(event.clientX);
7767
7768
  setStartY(event.clientY);
7768
7769
  var mousePosition = getMousePosition(event);
7769
- var xFromMouse_1 = (curX || 0) - mousePosition.x;
7770
- var yFromMouse_1 = (curY || 0) - mousePosition.y;
7770
+ var xFromMouse_1 = (objectX || 0) - mousePosition.x;
7771
+ var yFromMouse_1 = (objectY || 0) - mousePosition.y;
7771
7772
  setXFromMouse(xFromMouse_1);
7772
7773
  setYFromMouse(yFromMouse_1);
7773
7774
  }
@@ -7786,15 +7787,15 @@ var SelectionFrame = function (props) {
7786
7787
  var newX = mousePosition.x + xFromMouse;
7787
7788
  var newY = mousePosition.y + yFromMouse;
7788
7789
  if (propOnMove) {
7789
- setCurX(newX);
7790
- setCurY(newY);
7790
+ // setCurX(newX)
7791
+ // setCurY(newY)
7791
7792
  propOnMove(newX, newY);
7792
7793
  setLastMoveTime(Date.now());
7793
7794
  setStartX(mouseEvent.clientX);
7794
7795
  setStartY(mouseEvent.clientY);
7795
7796
  }
7796
7797
  }
7797
- }, [draggingRect, propOnMove, propMovingRate, startX, startY, lastMoveTime, xFromMouse, yFromMouse, zoom]);
7798
+ }, [draggingRect, propOnMove, getMousePosition, propMovingRate, lastMoveTime, xFromMouse, yFromMouse]);
7798
7799
  React.useEffect(function () {
7799
7800
  var addRectHandleMouseUp = function () {
7800
7801
  setDraggingRect(false);
@@ -7838,8 +7839,8 @@ var SelectionFrame = function (props) {
7838
7839
  // setStartX(mouseEvent.clientX);
7839
7840
  // setStartY(mouseEvent.clientY);
7840
7841
  setLastMoveTime(Date.now());
7841
- var newWidth = mousePosition.x - curX;
7842
- var newHeight = mousePosition.y - curY;
7842
+ var newWidth = mousePosition.x - objectX;
7843
+ var newHeight = mousePosition.y - objectY;
7843
7844
  if (propResizability.keepRatio) {
7844
7845
  var ratio = Math.max(Math.abs(newWidth / width), Math.abs(newHeight / height));
7845
7846
  newWidth = newWidth > 0 ? ratio * width : -ratio * width;
@@ -7880,7 +7881,7 @@ var SelectionFrame = function (props) {
7880
7881
  //logging the end of the circle handle mouse move
7881
7882
  logger.debug('SelectionFrame: circleHandleMouseMove ended', container);
7882
7883
  };
7883
- }, [draggingCircle, width, height, curX, curY, lastMoveTime, propContainer, propMovingRate, propOnResize, propResizability, startX, startY]);
7884
+ }, [draggingCircle, width, height, objectX, objectY, lastMoveTime, propContainer, getMousePosition, propMovingRate, propOnResize, propResizability, startX, startY]);
7884
7885
  var rectangleSize = Math.max(width, height);
7885
7886
  var leftX = framePadding;
7886
7887
  var topY = framePadding;
@@ -9475,17 +9476,18 @@ function convertElementsToTree(elements) {
9475
9476
  return parsedElementsInTree;
9476
9477
  }
9477
9478
  var Paper = function (props) {
9478
- var _a = React.useState([]), elements = _a[0], setElements = _a[1];
9479
- var _b = React.useState([]), elementsInTree = _b[0], setElementsInTree = _b[1];
9480
- var _c = React.useState(), selectedElement = _c[0], setSelectedElement = _c[1];
9481
- var _d = React.useState(false), autoEnabledDraggingSelectedElement = _d[0], setAutoEnabledDraggingSelectedElement = _d[1];
9482
- var _e = React.useState([]), links = _e[0], setLinks = _e[1];
9483
- var _f = React.useState(), selectedLink = _f[0], setSelectedLink = _f[1];
9484
- var _g = React.useState(null), tempLink = _g[0], setTempLink = _g[1];
9485
- var _h = React.useState([]), texts = _h[0], setTexts = _h[1];
9486
- var _j = React.useState(), selectedText = _j[0], setSelectedText = _j[1];
9487
- var _k = React.useState(null), selectedElementSVG = _k[0], setSelectedElementSVG = _k[1];
9488
- var _l = React.useState(false), mouseDownedOnPaper = _l[0], setMouseDownedOnPaper = _l[1];
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];
9489
9491
  var paperEventEmitter = React.useContext(paperEventEmitterContext);
9490
9492
  var zoom = useZoomContext().zoom;
9491
9493
  var zoomRef = React.useRef(zoom);
@@ -9495,19 +9497,19 @@ var Paper = function (props) {
9495
9497
  var linksRef = React.useRef(links); //Cache links to avoid re-render when links changed
9496
9498
  var textsRef = React.useRef(texts); //Cache texts to avoid re-render when texts changed
9497
9499
  var size = props.size;
9498
- var selectedElementAbsPosition = React.useMemo(function () { return selectedElement ? getAbsolutePosition(selectedElement) : null; }, [selectedElement, selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.position, selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size]);
9499
- 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, onElementContextMenu = props.onElementContextMenu, onElementMouseUp = props.onElementMouseUp, onElementMouseDown = props.onElementMouseDown, onElementMouseMove = props.onElementMouseMove, 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, manuallySelectElementHandler = props.manuallySelectElementHandler, manuallyTriggerDraggingElementHandler = props.manuallyTriggerDraggingElementHandler, manuallyTriggerStartedLinkingHandler = props.manuallyTriggerStartedLinkingHandler;
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;
9500
9502
  React.useEffect(function () {
9501
9503
  zoomRef.current = zoom;
9502
9504
  }, [zoom]);
9503
9505
  React.useEffect(function () {
9504
- setElements(props.elements);
9506
+ setElements(__spreadArray([], props.elements, true));
9505
9507
  }, [props.elements]);
9506
9508
  React.useEffect(function () {
9507
- setLinks(props.links || []);
9509
+ setLinks(__spreadArray([], props.links || [], true));
9508
9510
  }, [props.links]);
9509
9511
  React.useEffect(function () {
9510
- setTexts(props.texts);
9512
+ setTexts(__spreadArray([], props.texts, true));
9511
9513
  }, [props.texts]);
9512
9514
  React.useEffect(function () {
9513
9515
  var off = manuallyTriggerRenderElementHandler(function (elementId) {
@@ -9555,10 +9557,15 @@ var Paper = function (props) {
9555
9557
  };
9556
9558
  }
9557
9559
  }, [manuallyTriggerStartedLinkingHandler, paperEventEmitter]);
9560
+ var updateElementsTree = React.useCallback(function () {
9561
+ var parsedElementsInTree = convertElementsToTree(elements);
9562
+ setElementsInTree(parsedElementsInTree);
9563
+ }, [elements]);
9558
9564
  //Cache elements to avoid re-render when elements changed
9559
9565
  React.useEffect(function () {
9560
9566
  elementsRef.current = elements;
9561
- }, [elements]);
9567
+ updateElementsTree();
9568
+ }, [elements, updateElementsTree]);
9562
9569
  //Cache links to avoid re-render when links changed
9563
9570
  React.useEffect(function () {
9564
9571
  linksRef.current = links;
@@ -9570,10 +9577,6 @@ var Paper = function (props) {
9570
9577
  useKeyboardCommands({
9571
9578
  element: paperContainerRef.current
9572
9579
  });
9573
- var updateElementsTree = React.useCallback(function () {
9574
- var parsedElementsInTree = convertElementsToTree(elements);
9575
- setElementsInTree(parsedElementsInTree);
9576
- }, [elements]);
9577
9580
  //Cache tempLink to avoid re-render when tempLink changed
9578
9581
  React.useEffect(function () {
9579
9582
  tempLinkRef.current = tempLink;
@@ -9581,17 +9584,16 @@ var Paper = function (props) {
9581
9584
  //Listen text is selected
9582
9585
  React.useEffect(function () {
9583
9586
  var textSelectedListener = paperEventEmitter.onTextSelected(function (text) {
9584
- var _a;
9585
9587
  setSelectedElement(undefined);
9586
9588
  setSelectedElementSVG(null);
9587
9589
  setSelectedLink(undefined);
9588
9590
  //broadcast selected text to parent component
9589
- (_a = props.onTextSelected) === null || _a === void 0 ? void 0 : _a.call(props, text);
9591
+ onTextSelected === null || onTextSelected === void 0 ? void 0 : onTextSelected(text);
9590
9592
  });
9591
9593
  return function () {
9592
9594
  textSelectedListener.off();
9593
9595
  };
9594
- }, []);
9596
+ }, [paperEventEmitter, onTextSelected]);
9595
9597
  //Listen port is selected
9596
9598
  React.useEffect(function () {
9597
9599
  var portSelectedListener = paperEventEmitter.onPortSelected(function (port, elementId) {
@@ -9640,11 +9642,11 @@ var Paper = function (props) {
9640
9642
  parentChangedCancelers.forEach(function (canceller) { return canceller === null || canceller === void 0 ? void 0 : canceller(); });
9641
9643
  addedPortCancelers.forEach(function (canceller) { return canceller(); });
9642
9644
  };
9643
- }, [elements, updateElementsTree, onElementsChanged]);
9644
- //Update elements tree when length of elements change
9645
- React.useEffect(function () {
9646
- updateElementsTree();
9647
- }, [elements, updateElementsTree]);
9645
+ }, [updateElementsTree, onElementsChanged]);
9646
+ // //Update elements tree when length of elements change
9647
+ // useEffect(() => {
9648
+ // updateElementsTree();
9649
+ // }, [elements, updateElementsTree])
9648
9650
  //Get all child elements of the deleted element
9649
9651
  var getChildOfElement = React.useCallback(function (element) {
9650
9652
  if (!element.childrenElementsInTree)
@@ -9823,7 +9825,6 @@ var Paper = function (props) {
9823
9825
  }
9824
9826
  }, [onLinksChanged]);
9825
9827
  var handlePortMoved = React.useCallback(function (port, elementId, oldPosition, newPosition) {
9826
- var _a;
9827
9828
  var element = elementsRef.current.find(function (e) { return e.id === elementId; });
9828
9829
  if (element) {
9829
9830
  //set links equals a clone links to re-render links with new position
@@ -9838,21 +9839,44 @@ var Paper = function (props) {
9838
9839
  }
9839
9840
  return link;
9840
9841
  });
9841
- setLinks(newLinks);
9842
+ setLinks(function (prev) {
9843
+ return prev.map(function (link) {
9844
+ var _a, _b;
9845
+ if (link.sourceElement.id === elementId && link.sourcePort.id === port.id) {
9846
+ link.sourcePort.position = newPosition;
9847
+ }
9848
+ if (((_a = link.targetElement) === null || _a === void 0 ? void 0 : _a.id) === elementId && ((_b = link.targetPort) === null || _b === void 0 ? void 0 : _b.id) === port.id) {
9849
+ link.targetPort.position = newPosition;
9850
+ }
9851
+ return link;
9852
+ });
9853
+ });
9842
9854
  if (onLinksChanged) {
9843
9855
  onLinksChanged(newLinks);
9844
9856
  }
9845
9857
  var newElements = elementsRef.current;
9846
- var updatedElementIndex = newElements.findIndex(function (e) { return e.id === elementId; });
9847
- newElements[updatedElementIndex].ports = (_a = newElements[updatedElementIndex].ports) === null || _a === void 0 ? void 0 : _a.map(function (p) {
9848
- if (p.id === port.id) {
9849
- p.position = newPosition;
9850
- }
9851
- return p;
9852
- });
9858
+ // newElements[updatedElementIndex].ports = newElements[updatedElementIndex].ports?.map(p => {
9859
+ // if (p.id === port.id) {
9860
+ // p.position = newPosition
9861
+ // }
9862
+ // return p
9863
+ // })
9853
9864
  //Update port position in element, not re-render
9854
9865
  //To avoid re-render
9855
- setElements(newElements);
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
+ });
9856
9880
  if (onElementsChanged) {
9857
9881
  onElementsChanged(newElements);
9858
9882
  }
@@ -10145,8 +10169,9 @@ var Paper = function (props) {
10145
10169
  }
10146
10170
  else {
10147
10171
  var element = elementsRef.current.find(function (e) { return e.id === elementId; });
10148
- setSelectedElementSVG(ref);
10149
- if (element) {
10172
+ // Select the element only if it is selectable
10173
+ if (element && element.selectable) {
10174
+ setSelectedElementSVG(ref);
10150
10175
  setSelectedElement(element);
10151
10176
  setAutoEnabledDraggingSelectedElement(false);
10152
10177
  paperEventEmitter.emitElementSelected(element);
@@ -10210,10 +10235,11 @@ var Paper = function (props) {
10210
10235
  }
10211
10236
  }, [onElementMouseLeave]);
10212
10237
  var renderElementInTree = React.useCallback(function (element) {
10238
+ logger.info("Rendering element tree for element ".concat(element.id));
10213
10239
  //use the defined react element or the default Element component
10214
10240
  var ReactElement = element.reactElement || Element$1;
10215
10241
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
10216
- 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, 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,
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,
10217
10243
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
10218
10244
  onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: manuallyTriggerRenderPortHandler, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined },
10219
10245
  element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree),
@@ -10224,25 +10250,22 @@ var Paper = function (props) {
10224
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,
10225
10251
  //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
10226
10252
  onMouseDown: function (ev) {
10227
- var _a;
10228
10253
  if (selectedElement) {
10229
10254
  var paperPosition = windowsPositionToPaperPosition({
10230
10255
  x: ev.clientX,
10231
10256
  y: ev.clientY
10232
10257
  }, paperContainerRef.current, zoomRef.current);
10233
- (_a = props.onElementMouseDown) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement, paperPosition);
10258
+ onElementMouseDown === null || onElementMouseDown === void 0 ? void 0 : onElementMouseDown(ev, selectedElement, paperPosition);
10234
10259
  }
10235
10260
  }, onMouseUp: function (ev) {
10236
- var _a;
10237
10261
  if (selectedElement) {
10238
10262
  var paperPosition = windowsPositionToPaperPosition({
10239
10263
  x: ev.clientX,
10240
10264
  y: ev.clientY
10241
10265
  }, paperContainerRef.current, zoomRef.current);
10242
- (_a = props.onElementMouseUp) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement, paperPosition);
10266
+ onElementMouseUp === null || onElementMouseUp === void 0 ? void 0 : onElementMouseUp(ev, selectedElement, paperPosition);
10243
10267
  }
10244
10268
  }, onMove: function (newX, newY) {
10245
- var _a;
10246
10269
  if (!selectedElement)
10247
10270
  return;
10248
10271
  var oldPosition = __assign({}, selectedElement.position);
@@ -10251,6 +10274,13 @@ var Paper = function (props) {
10251
10274
  x: newX,
10252
10275
  y: newY
10253
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
+ }
10254
10284
  logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(paperPosition)));
10255
10285
  //Adjust position of element if it should move as a port on parent port area
10256
10286
  if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
@@ -10279,13 +10309,13 @@ var Paper = function (props) {
10279
10309
  }
10280
10310
  return link;
10281
10311
  });
10282
- (_a = props.onLinksChanged) === null || _a === void 0 ? void 0 : _a.call(props, newLinks);
10312
+ onLinksChanged === null || onLinksChanged === void 0 ? void 0 : onLinksChanged(newLinks);
10283
10313
  // End updating the position of links connected to the selected element
10284
10314
  //Set state to re-render UI with new position
10285
10315
  setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
10286
- if (props.onElementMoved) {
10316
+ if (onElementMoved) {
10287
10317
  console.log('onElementMoved', selectedElement.position, paperPosition);
10288
- props.onElementMoved(selectedElement.position, selectedElement, indexSelectedElement, paperPosition);
10318
+ onElementMoved(selectedElement.position, selectedElement, indexSelectedElement, paperPosition);
10289
10319
  }
10290
10320
  paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
10291
10321
  setMouseDownedOnPaper(false);
@@ -10298,16 +10328,16 @@ var Paper = function (props) {
10298
10328
  elements[indexSelectedElement].size = newSize;
10299
10329
  var newElements = __spreadArray([], elements, true);
10300
10330
  setElements(newElements);
10301
- if (props.onElementsChanged) {
10302
- props.onElementsChanged(newElements);
10331
+ if (onElementsChanged) {
10332
+ onElementsChanged(newElements);
10303
10333
  }
10304
- if (props.onElementResized) {
10305
- props.onElementResized(newSize, selectedElement, indexSelectedElement);
10334
+ if (onElementResized) {
10335
+ onElementResized(newSize, selectedElement, indexSelectedElement);
10306
10336
  }
10307
10337
  paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
10308
10338
  setMouseDownedOnPaper(false);
10309
10339
  } }))));
10310
- }, [manuallyTriggerRenderPortHandler, handleElementClicked, handleContextMenu, handleMouseUp, handleMouseDown, handleMouseMove, handleMouseLeave, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handlePortsChanged, handlePortContextMenu, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, props, 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]);
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]);
10311
10341
  var ElementsInTree = React.useMemo(function () {
10312
10342
  return elementsInTree.map(function (element, index) {
10313
10343
  return renderElementInTree(element);
@@ -10439,6 +10469,12 @@ var Editor = function (_a) {
10439
10469
  }
10440
10470
  return null;
10441
10471
  }, [editorContext]);
10472
+ var handleOnElementMoving = React.useCallback(function (element, newPaperPosition) {
10473
+ if (editorContext.onElementMovingHandler) {
10474
+ return editorContext.onElementMovingHandler(element, newPaperPosition);
10475
+ }
10476
+ return true;
10477
+ }, [editorContext]);
10442
10478
  var handleOnCreatingPortByLinking = React.useCallback(function (sourceElement, sourcePort, targetElement, position) {
10443
10479
  if (editorContext.onCreatingPortByLinkingHandler) {
10444
10480
  return editorContext.onCreatingPortByLinkingHandler(sourceElement, sourcePort, targetElement, position);
@@ -10459,7 +10495,7 @@ var Editor = function (_a) {
10459
10495
  }, [editorContext]);
10460
10496
  return (React.createElement(EditorConfigurationContextProvider, { value: editorContext.configuration },
10461
10497
  React.createElement(ZoomContextProvider, null,
10462
- 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, 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) }))));
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) }))));
10463
10499
  };
10464
10500
 
10465
10501
  exports.CircleRC = Circle;
@@ -41,6 +41,7 @@ interface PaperProps {
41
41
  manuallyTriggerRenderPortHandler: (callback: (portId: string, elementId: string) => void) => () => void;
42
42
  onCreatingPortByLinking?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;
43
43
  onCreatingLink?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;
44
+ onElementMoving?: (element: IElement, newPaperPosition: IPosition) => boolean;
44
45
  manuallySelectElementHandler?: (callback: (element: IElement | null) => void) => (() => void);
45
46
  manuallyTriggerDraggingElementHandler?: (callback: (element: IElement) => void) => (() => void);
46
47
  manuallyTriggerStartedLinkingHandler?: (callback: (sourceElement: IElement, sourcePort: IPort) => void) => (() => void);
@@ -7,5 +7,5 @@ export default class DiamondElement extends Element {
7
7
  resizability: IResizability;
8
8
  get size(): ISize;
9
9
  set size(value: ISize);
10
- constructor(x: number, y: number, width: number, height: number, cssClass?: string, texts?: IText[], ports?: IPort[]);
10
+ constructor(x: number, y: number, width: number, height: number, selectable?: boolean, cssClass?: string, texts?: IText[], ports?: IPort[]);
11
11
  }
@@ -7,5 +7,5 @@ import IPosition from '../models/position';
7
7
  export default class RectangularFrameElement extends Element {
8
8
  resizability: IResizability;
9
9
  defaultPortSize?: number | undefined;
10
- constructor(x: number, y: number, width: number, height: number, cssClass?: string, texts?: IText[], ports?: IPort[], textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
10
+ constructor(x: number, y: number, width: number, height: number, selectable?: boolean, cssClass?: string, texts?: IText[], ports?: IPort[], textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
11
11
  }
@@ -13,6 +13,7 @@ export default interface IEditorContext {
13
13
  configuration: IEditorConfiguration;
14
14
  onCreatingPortByLinkingHandler?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;
15
15
  onCreatingLinkHandler?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;
16
+ onElementMovingHandler?: (element: IElement, newPaperPosition: IPosition) => boolean;
16
17
  onPaperClicked: (callback: (paperPosition: IPosition) => void) => (() => void);
17
18
  onPaperMouseMoved: (callback: (paperPosition: IPosition) => void) => (() => void);
18
19
  onPaperMouseUp: (callback: (paperPosition: IPosition) => void) => (() => void);
@@ -13,6 +13,7 @@ export default interface IElement {
13
13
  position: IPosition;
14
14
  positionAnchor?: PositioningAnchor;
15
15
  size: ISize;
16
+ selectable?: boolean;
16
17
  moveAsPortOnParent?: boolean;
17
18
  /**
18
19
  * @deprecated This property is deprecated and will be removed in future versions.
@@ -12,6 +12,7 @@ interface IElementProps {
12
12
  y: number;
13
13
  width: number;
14
14
  height: number;
15
+ selectable?: boolean;
15
16
  cssClass?: string;
16
17
  renderShape?: (props: IElementProps) => JSX.Element;
17
18
  children?: React.ReactNode;
@@ -15,6 +15,7 @@ export declare class EditorContext implements IEditorContext {
15
15
  private _configuration;
16
16
  onCreatingPortByLinkingHandler?: ((sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null) | undefined;
17
17
  onCreatingLinkHandler?: ((sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null) | undefined;
18
+ onElementMovingHandler?: (element: IElement, newPaperPosition: IPosition) => boolean;
18
19
  constructor(elements: IElement[], links: IElementLink[], texts: IPaperText[], configuration?: IEditorConfiguration);
19
20
  private addEventListener;
20
21
  get elements(): IElement[];
@@ -17,6 +17,7 @@ export default class Element implements IElement {
17
17
  protected _size: ISize;
18
18
  private _parentElement?;
19
19
  private _childrenElements;
20
+ selectable?: boolean | undefined;
20
21
  cssClass?: string;
21
22
  moveAsPortOnParent?: boolean | undefined;
22
23
  /**
@@ -37,7 +38,7 @@ export default class Element implements IElement {
37
38
  textsPlaceHolderFlexStyle?: IFlexboxType;
38
39
  textsPlaceHolderFlexboxPosition?: IPosition;
39
40
  _eventEmitter: EventEmitter;
40
- constructor(id: string | null, x: number, y: number, width: number, height: number, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas?: IPosition[][], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: IElement, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
41
+ constructor(id: string | null, x: number, y: number, width: number, height: number, selectable?: boolean, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas?: IPosition[][], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: IElement, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
41
42
  get id(): string;
42
43
  get size(): ISize;
43
44
  set size(value: ISize);