orcasvn-react-diagrams 0.1.46 → 0.1.48

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
@@ -1208,24 +1208,39 @@ var PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH = 20;
1208
1208
  var PORT_DEFAULT_SIZE = 20;
1209
1209
 
1210
1210
  var SelectionFrame = function (props) {
1211
- var _a, _b;
1212
- var propTargetSVGElement = props.targetSVGElement, propWidth = props.width, propHeight = props.height, propFramePadding = props.framePadding,
1211
+ var propTargetSVGElement = props.targetSVGElement, propWidth = props.width, propHeight = props.height, propFramePadding = props.framePadding, x = props.x, y = props.y,
1213
1212
  // movingOffsetThreshold: propMovingOffsetThreshold,
1214
- propMovingRate = props.movingRate, propOnMove = props.onMove, propContainer = props.container, propResizability = props.resizability, propOnResize = props.onResize, PropDragDropHandlerElement = props.dragDropHandlerElement, propStrokeWidth = props.strokeWidth, propAnchor = props.anchor;
1213
+ propMovingRate = props.movingRate, propOnMouseDown = props.onMouseDown, propOnMouseUp = props.onMouseUp, propOnMove = props.onMove, propContainer = props.container, propResizability = props.resizability, propOnResize = props.onResize, PropDragDropHandlerElement = props.dragDropHandlerElement, propStrokeWidth = props.strokeWidth, propAnchor = props.anchor;
1215
1214
  var bbox = propTargetSVGElement === null || propTargetSVGElement === void 0 ? void 0 : propTargetSVGElement.getBBox();
1216
- var _c = React.useState(propWidth || (bbox === null || bbox === void 0 ? void 0 : bbox.width) || MIN_ELEMENT_SIZE), width = _c[0], setWidth = _c[1];
1217
- var _d = React.useState(propHeight || (bbox === null || bbox === void 0 ? void 0 : bbox.height) || MIN_ELEMENT_SIZE), height = _d[0], setHeight = _d[1];
1218
- var _e = React.useState((_a = props.x) !== null && _a !== void 0 ? _a : 0), x = _e[0], setX = _e[1];
1219
- var _f = React.useState((_b = props.y) !== null && _b !== void 0 ? _b : 0), y = _f[0], setY = _f[1];
1215
+ var _a = React.useState(propWidth || (bbox === null || bbox === void 0 ? void 0 : bbox.width) || MIN_ELEMENT_SIZE), width = _a[0], setWidth = _a[1];
1216
+ var _b = React.useState(propHeight || (bbox === null || bbox === void 0 ? void 0 : bbox.height) || MIN_ELEMENT_SIZE), height = _b[0], setHeight = _b[1];
1217
+ React.useEffect(function () {
1218
+ if (propWidth) {
1219
+ setWidth(propWidth);
1220
+ }
1221
+ }, [x]);
1222
+ var _c = React.useState(x !== null && x !== void 0 ? x : 0), curX = _c[0], setX = _c[1];
1223
+ var _d = React.useState(y !== null && y !== void 0 ? y : 0), curY = _d[0], setY = _d[1];
1224
+ React.useEffect(function () {
1225
+ if (x) {
1226
+ setX(x);
1227
+ }
1228
+ }, [x]);
1229
+ React.useEffect(function () {
1230
+ if (y) {
1231
+ setY(y);
1232
+ }
1233
+ }, [y]);
1220
1234
  var framePadding = propFramePadding || 0;
1221
1235
  var r = 5;
1222
- var _g = React.useState(false), draggingRect = _g[0], setDraggingRect = _g[1];
1223
- var _h = React.useState(false), draggingCircle = _h[0], setDraggingCircle = _h[1];
1224
- var _j = React.useState(0), startX = _j[0], setStartX = _j[1];
1225
- var _k = React.useState(0), startY = _k[0], setStartY = _k[1];
1226
- var _l = React.useState(0), xFromMouse = _l[0], setXFromMouse = _l[1];
1227
- var _m = React.useState(0), yFromMouse = _m[0], setYFromMouse = _m[1];
1228
- var _o = React.useState(0), lastMoveTime = _o[0], setLastMoveTime = _o[1];
1236
+ var _e = React.useState(false), draggingRect = _e[0], setDraggingRect = _e[1];
1237
+ var _f = React.useState(false), draggingCircle = _f[0], setDraggingCircle = _f[1];
1238
+ var _g = React.useState(0), startX = _g[0], setStartX = _g[1];
1239
+ var _h = React.useState(0), startY = _h[0], setStartY = _h[1];
1240
+ var _j = React.useState(0), xFromMouse = _j[0], setXFromMouse = _j[1];
1241
+ var _k = React.useState(0), yFromMouse = _k[0], setYFromMouse = _k[1];
1242
+ var _l = React.useState(0), lastMoveTime = _l[0], setLastMoveTime = _l[1];
1243
+ //set x by props.x
1229
1244
  var getMousePosition = function (event) {
1230
1245
  var elementBounding = propContainer.getBoundingClientRect();
1231
1246
  //Coordinates of mouse on paper.
@@ -1242,11 +1257,14 @@ var SelectionFrame = function (props) {
1242
1257
  setStartX(event.clientX);
1243
1258
  setStartY(event.clientY);
1244
1259
  var mousePosition = getMousePosition(event);
1245
- var xFromMouse_1 = x - mousePosition.x;
1246
- var yFromMouse_1 = y - mousePosition.y;
1260
+ var xFromMouse_1 = (curX || 0) - mousePosition.x;
1261
+ var yFromMouse_1 = (curY || 0) - mousePosition.y;
1247
1262
  setXFromMouse(xFromMouse_1);
1248
1263
  setYFromMouse(yFromMouse_1);
1249
1264
  }
1265
+ if (propOnMouseDown) {
1266
+ propOnMouseDown(event);
1267
+ }
1250
1268
  };
1251
1269
  var rectHandleMouseMove = React.useCallback(function (event) {
1252
1270
  var mouseEvent = event;
@@ -1331,7 +1349,7 @@ var SelectionFrame = function (props) {
1331
1349
  container.removeEventListener('mousemove', circleHandleMouseMove);
1332
1350
  container.removeEventListener('mouseup', circleHandleMouseUp);
1333
1351
  };
1334
- }, [draggingCircle, width, height, lastMoveTime, propContainer, propMovingRate, propOnResize, propResizability, startX, startY]);
1352
+ }, [draggingCircle, width, height, curX, curY, lastMoveTime, propContainer, propMovingRate, propOnResize, propResizability, startX, startY]);
1335
1353
  var rectangleSize = Math.max(width, height);
1336
1354
  var leftX = framePadding;
1337
1355
  var topY = framePadding;
@@ -1341,7 +1359,7 @@ var SelectionFrame = function (props) {
1341
1359
  }
1342
1360
  return (React.createElement(React.Fragment, null,
1343
1361
  PropDragDropHandlerElement && React.createElement(PropDragDropHandlerElement, { dragging: draggingRect, onMouseDown: addRectHandleMouseDown }),
1344
- 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 }),
1362
+ 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 }),
1345
1363
  propResizability.enabled ?
1346
1364
  (React.createElement("circle", { cursor: 'se-resize', cx: leftX + width, cy: topY + height, r: r, fill: 'blue', stroke: 'blue', onMouseDown: circleHandleMouseDown })) : null));
1347
1365
  };
@@ -1365,7 +1383,7 @@ var useSelectionFrame = function (props) {
1365
1383
  };
1366
1384
  }
1367
1385
  }
1368
- }, [props.targetSVGElement, props.container]);
1386
+ }, [props]);
1369
1387
  };
1370
1388
 
1371
1389
  var eventEmitter = new EventEmitter();
@@ -8024,7 +8042,7 @@ function CloseIcon(_a) {
8024
8042
  return (React.createElement("svg", { width: 20, height: 20, viewBox: "0 0 24.00 24.00", xmlns: "http://www.w3.org/2000/svg", fill: "#ff0000", transform: "rotate(0)", onMouseDown: function (ev) { ev.stopPropagation(); }, onClick: onClick, cursor: 'pointer' },
8025
8043
  React.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0", transform: "translate(3.84,3.84), scale(0.68)" },
8026
8044
  React.createElement("rect", { x: "0", y: "0", width: "24.00", height: "24.00", rx: "12", fill: "#ffffff", strokeWidth: "0" })),
8027
- React.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round", stroke: "#CCCCCC", "stroke-width": "0.048" }),
8045
+ React.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round", stroke: "#CCCCCC", strokeWidth: "0.048" }),
8028
8046
  React.createElement("g", { id: "SVGRepo_iconCarrier" },
8029
8047
  React.createElement("g", null,
8030
8048
  React.createElement("path", { fill: "none", d: "M0 0h24v24H0z" }),
@@ -9137,7 +9155,7 @@ var Paper = function (props) {
9137
9155
  var linksRef = React.useRef(links); //Cache links to avoid re-render when links changed
9138
9156
  var textsRef = React.useRef(texts); //Cache texts to avoid re-render when texts changed
9139
9157
  var size = props.size;
9140
- var selectedElementAbsPosition = React.useMemo(function () { return selectedElement ? getAbsolutePosition(selectedElement) : null; }, [selectedElement]);
9158
+ 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]);
9141
9159
  React.useEffect(function () {
9142
9160
  setElements(props.elements);
9143
9161
  }, [props.elements]);
@@ -9157,7 +9175,7 @@ var Paper = function (props) {
9157
9175
  return function () {
9158
9176
  off();
9159
9177
  };
9160
- }, [props.onManuallyTriggerRenderElement, props.onElementsChanged, elements]);
9178
+ }, [props.onManuallyTriggerRenderElement, props.onElementsChanged, elements, selectedElement]);
9161
9179
  //Cache elements to avoid re-render when elements changed
9162
9180
  React.useEffect(function () {
9163
9181
  elementsRef.current = elements;
@@ -9622,66 +9640,6 @@ var Paper = function (props) {
9622
9640
  }
9623
9641
  return element;
9624
9642
  };
9625
- //use selection frame
9626
- useSelectionFrame({
9627
- container: paperContainerRef.current,
9628
- targetSVGElement: selectedElementSVG || undefined,
9629
- resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
9630
- enabled: true,
9631
- keepRatio: true
9632
- },
9633
- x: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x,
9634
- y: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.y,
9635
- width: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.width,
9636
- height: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.height,
9637
- //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9638
- onMove: function (newX, newY) {
9639
- if (!selectedElement)
9640
- return;
9641
- var oldPosition = __assign({}, selectedElement.position);
9642
- var newPosition = {
9643
- x: newX,
9644
- y: newY
9645
- };
9646
- logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(newPosition)));
9647
- //Adjust position of element if it should move as a port on parent port area
9648
- if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
9649
- newPosition = adjustElementPositionOnParentPortArea(selectedElement, newPosition, true);
9650
- updateElementPosition(selectedElement, newPosition.x, newPosition.y, true);
9651
- }
9652
- else {
9653
- updateElementPosition(selectedElement, newPosition.x, newPosition.y, false);
9654
- }
9655
- //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
9656
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9657
- logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
9658
- //Set state to re-render UI with new position
9659
- setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
9660
- if (props.onElementMoved) {
9661
- props.onElementMoved(selectedElement.position, selectedElement, indexSelectedElement);
9662
- }
9663
- paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
9664
- setMouseDownedOnPaper(false);
9665
- },
9666
- onResize: function (width, height) {
9667
- if (!selectedElement)
9668
- return;
9669
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9670
- var oldSize = selectedElement.size;
9671
- var newSize = { width: width, height: height };
9672
- elements[indexSelectedElement].size = newSize;
9673
- var newElements = __spreadArray([], elements, true);
9674
- setElements(newElements);
9675
- if (props.onElementsChanged) {
9676
- props.onElementsChanged(newElements);
9677
- }
9678
- if (props.onElementResized) {
9679
- props.onElementResized(newSize, selectedElement, indexSelectedElement);
9680
- }
9681
- paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
9682
- setMouseDownedOnPaper(false);
9683
- }
9684
- });
9685
9643
  /*
9686
9644
  Cache to avoid re-initializing the function when the component re-renders to
9687
9645
  avoid causing the components using it to re-render unnecessarily
@@ -9830,13 +9788,75 @@ var Paper = function (props) {
9830
9788
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
9831
9789
  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,
9832
9790
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
9833
- onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined }, element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree))));
9834
- }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, handleMouseUp, handleMouseMove, handleMouseLeave]);
9791
+ onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined },
9792
+ element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree),
9793
+ !!paperContainerRef.current && !!selectedElement && selectedElement.id === element.id &&
9794
+ React.createElement(SelectionFrame, { container: paperContainerRef.current, targetSVGElement: selectedElementSVG || undefined, resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
9795
+ enabled: true,
9796
+ keepRatio: true
9797
+ }, x: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x, y: 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,
9798
+ //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9799
+ onMouseDown: function (ev) {
9800
+ var _a;
9801
+ if (selectedElement) {
9802
+ (_a = props.onElementMouseDown) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement);
9803
+ }
9804
+ }, onMouseUp: function (ev) {
9805
+ var _a;
9806
+ if (selectedElement) {
9807
+ (_a = props.onElementMouseUp) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement);
9808
+ }
9809
+ }, onMove: function (newX, newY) {
9810
+ if (!selectedElement)
9811
+ return;
9812
+ var oldPosition = __assign({}, selectedElement.position);
9813
+ var newPosition = {
9814
+ x: newX,
9815
+ y: newY
9816
+ };
9817
+ logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(newPosition)));
9818
+ //Adjust position of element if it should move as a port on parent port area
9819
+ if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
9820
+ newPosition = adjustElementPositionOnParentPortArea(selectedElement, newPosition, true);
9821
+ updateElementPosition(selectedElement, newPosition.x, newPosition.y, true);
9822
+ }
9823
+ else {
9824
+ updateElementPosition(selectedElement, newPosition.x, newPosition.y, false);
9825
+ }
9826
+ //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
9827
+ var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9828
+ logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
9829
+ //Set state to re-render UI with new position
9830
+ setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
9831
+ if (props.onElementMoved) {
9832
+ props.onElementMoved(selectedElement.position, selectedElement, indexSelectedElement);
9833
+ }
9834
+ paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
9835
+ setMouseDownedOnPaper(false);
9836
+ }, onResize: function (width, height) {
9837
+ if (!selectedElement)
9838
+ return;
9839
+ var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9840
+ var oldSize = selectedElement.size;
9841
+ var newSize = { width: width, height: height };
9842
+ elements[indexSelectedElement].size = newSize;
9843
+ var newElements = __spreadArray([], elements, true);
9844
+ setElements(newElements);
9845
+ if (props.onElementsChanged) {
9846
+ props.onElementsChanged(newElements);
9847
+ }
9848
+ if (props.onElementResized) {
9849
+ props.onElementResized(newSize, selectedElement, indexSelectedElement);
9850
+ }
9851
+ paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
9852
+ setMouseDownedOnPaper(false);
9853
+ } }))));
9854
+ }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, handleMouseUp, handleMouseMove, handleMouseLeave, selectedElement, selectedElementAbsPosition]);
9835
9855
  var ElementsInTree = React.useMemo(function () {
9836
9856
  return elementsInTree.map(function (element, index) {
9837
9857
  return renderElementInTree(element);
9838
9858
  });
9839
- }, [elementsInTree, renderElementInTree]);
9859
+ }, [elementsInTree, renderElementInTree, selectedElement]);
9840
9860
  return (React.createElement("div", { style: { position: "relative" } },
9841
9861
  React.createElement(Ruler, { squareSize: 100, border: '1px dashed grey' }),
9842
9862
  React.createElement("svg", { tabIndex: 0, width: size.width, height: size.height, ref: paperContainerRef, id: "paper-container", onMouseMove: handlePaperMouseMove, onMouseDown: handleMouseDownOnPaper, onMouseUp: handleMouseUpOnPaper },
@@ -0,0 +1,2 @@
1
+ import { EditorContext } from "../models/implementations/EditorContext";
2
+ export declare const editorContext: EditorContext;
@@ -8,6 +8,8 @@ interface ISelectionFrameProps {
8
8
  width?: number;
9
9
  height?: number;
10
10
  targetSVGElement?: SVGSVGElement;
11
+ onMouseDown?: (event: React.MouseEvent<SVGRectElement>) => void;
12
+ onMouseUp?: (event: React.MouseEvent<SVGRectElement>) => void;
11
13
  onMove?: (x: number, y: number) => void;
12
14
  onResize?: (width: number, height: number) => void;
13
15
  resizability: IResizability;
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import React, { forwardRef, useMemo, useState, useCallback, useEffect, createContext, useRef, useContext, memo, useLayoutEffect, useImperativeHandle } from 'react';
1
+ import React, { forwardRef, useMemo, useEffect, useState, useCallback, createContext, useRef, useContext, memo, useLayoutEffect, useImperativeHandle } from 'react';
2
2
  import require$$0 from 'react-dom';
3
3
 
4
4
  var PositioningAnchor;
@@ -1204,24 +1204,39 @@ var PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH = 20;
1204
1204
  var PORT_DEFAULT_SIZE = 20;
1205
1205
 
1206
1206
  var SelectionFrame = function (props) {
1207
- var _a, _b;
1208
- var propTargetSVGElement = props.targetSVGElement, propWidth = props.width, propHeight = props.height, propFramePadding = props.framePadding,
1207
+ var propTargetSVGElement = props.targetSVGElement, propWidth = props.width, propHeight = props.height, propFramePadding = props.framePadding, x = props.x, y = props.y,
1209
1208
  // movingOffsetThreshold: propMovingOffsetThreshold,
1210
- propMovingRate = props.movingRate, propOnMove = props.onMove, propContainer = props.container, propResizability = props.resizability, propOnResize = props.onResize, PropDragDropHandlerElement = props.dragDropHandlerElement, propStrokeWidth = props.strokeWidth, propAnchor = props.anchor;
1209
+ propMovingRate = props.movingRate, propOnMouseDown = props.onMouseDown, propOnMouseUp = props.onMouseUp, propOnMove = props.onMove, propContainer = props.container, propResizability = props.resizability, propOnResize = props.onResize, PropDragDropHandlerElement = props.dragDropHandlerElement, propStrokeWidth = props.strokeWidth, propAnchor = props.anchor;
1211
1210
  var bbox = propTargetSVGElement === null || propTargetSVGElement === void 0 ? void 0 : propTargetSVGElement.getBBox();
1212
- var _c = React.useState(propWidth || (bbox === null || bbox === void 0 ? void 0 : bbox.width) || MIN_ELEMENT_SIZE), width = _c[0], setWidth = _c[1];
1213
- var _d = React.useState(propHeight || (bbox === null || bbox === void 0 ? void 0 : bbox.height) || MIN_ELEMENT_SIZE), height = _d[0], setHeight = _d[1];
1214
- var _e = React.useState((_a = props.x) !== null && _a !== void 0 ? _a : 0), x = _e[0], setX = _e[1];
1215
- var _f = React.useState((_b = props.y) !== null && _b !== void 0 ? _b : 0), y = _f[0], setY = _f[1];
1211
+ var _a = React.useState(propWidth || (bbox === null || bbox === void 0 ? void 0 : bbox.width) || MIN_ELEMENT_SIZE), width = _a[0], setWidth = _a[1];
1212
+ var _b = React.useState(propHeight || (bbox === null || bbox === void 0 ? void 0 : bbox.height) || MIN_ELEMENT_SIZE), height = _b[0], setHeight = _b[1];
1213
+ useEffect(function () {
1214
+ if (propWidth) {
1215
+ setWidth(propWidth);
1216
+ }
1217
+ }, [x]);
1218
+ var _c = React.useState(x !== null && x !== void 0 ? x : 0), curX = _c[0], setX = _c[1];
1219
+ var _d = React.useState(y !== null && y !== void 0 ? y : 0), curY = _d[0], setY = _d[1];
1220
+ useEffect(function () {
1221
+ if (x) {
1222
+ setX(x);
1223
+ }
1224
+ }, [x]);
1225
+ useEffect(function () {
1226
+ if (y) {
1227
+ setY(y);
1228
+ }
1229
+ }, [y]);
1216
1230
  var framePadding = propFramePadding || 0;
1217
1231
  var r = 5;
1218
- var _g = React.useState(false), draggingRect = _g[0], setDraggingRect = _g[1];
1219
- var _h = React.useState(false), draggingCircle = _h[0], setDraggingCircle = _h[1];
1220
- var _j = React.useState(0), startX = _j[0], setStartX = _j[1];
1221
- var _k = React.useState(0), startY = _k[0], setStartY = _k[1];
1222
- var _l = useState(0), xFromMouse = _l[0], setXFromMouse = _l[1];
1223
- var _m = useState(0), yFromMouse = _m[0], setYFromMouse = _m[1];
1224
- var _o = React.useState(0), lastMoveTime = _o[0], setLastMoveTime = _o[1];
1232
+ var _e = React.useState(false), draggingRect = _e[0], setDraggingRect = _e[1];
1233
+ var _f = React.useState(false), draggingCircle = _f[0], setDraggingCircle = _f[1];
1234
+ var _g = React.useState(0), startX = _g[0], setStartX = _g[1];
1235
+ var _h = React.useState(0), startY = _h[0], setStartY = _h[1];
1236
+ var _j = useState(0), xFromMouse = _j[0], setXFromMouse = _j[1];
1237
+ var _k = useState(0), yFromMouse = _k[0], setYFromMouse = _k[1];
1238
+ var _l = React.useState(0), lastMoveTime = _l[0], setLastMoveTime = _l[1];
1239
+ //set x by props.x
1225
1240
  var getMousePosition = function (event) {
1226
1241
  var elementBounding = propContainer.getBoundingClientRect();
1227
1242
  //Coordinates of mouse on paper.
@@ -1238,11 +1253,14 @@ var SelectionFrame = function (props) {
1238
1253
  setStartX(event.clientX);
1239
1254
  setStartY(event.clientY);
1240
1255
  var mousePosition = getMousePosition(event);
1241
- var xFromMouse_1 = x - mousePosition.x;
1242
- var yFromMouse_1 = y - mousePosition.y;
1256
+ var xFromMouse_1 = (curX || 0) - mousePosition.x;
1257
+ var yFromMouse_1 = (curY || 0) - mousePosition.y;
1243
1258
  setXFromMouse(xFromMouse_1);
1244
1259
  setYFromMouse(yFromMouse_1);
1245
1260
  }
1261
+ if (propOnMouseDown) {
1262
+ propOnMouseDown(event);
1263
+ }
1246
1264
  };
1247
1265
  var rectHandleMouseMove = useCallback(function (event) {
1248
1266
  var mouseEvent = event;
@@ -1327,7 +1345,7 @@ var SelectionFrame = function (props) {
1327
1345
  container.removeEventListener('mousemove', circleHandleMouseMove);
1328
1346
  container.removeEventListener('mouseup', circleHandleMouseUp);
1329
1347
  };
1330
- }, [draggingCircle, width, height, lastMoveTime, propContainer, propMovingRate, propOnResize, propResizability, startX, startY]);
1348
+ }, [draggingCircle, width, height, curX, curY, lastMoveTime, propContainer, propMovingRate, propOnResize, propResizability, startX, startY]);
1331
1349
  var rectangleSize = Math.max(width, height);
1332
1350
  var leftX = framePadding;
1333
1351
  var topY = framePadding;
@@ -1337,7 +1355,7 @@ var SelectionFrame = function (props) {
1337
1355
  }
1338
1356
  return (React.createElement(React.Fragment, null,
1339
1357
  PropDragDropHandlerElement && React.createElement(PropDragDropHandlerElement, { dragging: draggingRect, onMouseDown: addRectHandleMouseDown }),
1340
- 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 }),
1358
+ 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 }),
1341
1359
  propResizability.enabled ?
1342
1360
  (React.createElement("circle", { cursor: 'se-resize', cx: leftX + width, cy: topY + height, r: r, fill: 'blue', stroke: 'blue', onMouseDown: circleHandleMouseDown })) : null));
1343
1361
  };
@@ -1361,7 +1379,7 @@ var useSelectionFrame = function (props) {
1361
1379
  };
1362
1380
  }
1363
1381
  }
1364
- }, [props.targetSVGElement, props.container]);
1382
+ }, [props]);
1365
1383
  };
1366
1384
 
1367
1385
  var eventEmitter = new EventEmitter();
@@ -8020,7 +8038,7 @@ function CloseIcon(_a) {
8020
8038
  return (React.createElement("svg", { width: 20, height: 20, viewBox: "0 0 24.00 24.00", xmlns: "http://www.w3.org/2000/svg", fill: "#ff0000", transform: "rotate(0)", onMouseDown: function (ev) { ev.stopPropagation(); }, onClick: onClick, cursor: 'pointer' },
8021
8039
  React.createElement("g", { id: "SVGRepo_bgCarrier", strokeWidth: "0", transform: "translate(3.84,3.84), scale(0.68)" },
8022
8040
  React.createElement("rect", { x: "0", y: "0", width: "24.00", height: "24.00", rx: "12", fill: "#ffffff", strokeWidth: "0" })),
8023
- React.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round", stroke: "#CCCCCC", "stroke-width": "0.048" }),
8041
+ React.createElement("g", { id: "SVGRepo_tracerCarrier", strokeLinecap: "round", strokeLinejoin: "round", stroke: "#CCCCCC", strokeWidth: "0.048" }),
8024
8042
  React.createElement("g", { id: "SVGRepo_iconCarrier" },
8025
8043
  React.createElement("g", null,
8026
8044
  React.createElement("path", { fill: "none", d: "M0 0h24v24H0z" }),
@@ -9133,7 +9151,7 @@ var Paper = function (props) {
9133
9151
  var linksRef = useRef(links); //Cache links to avoid re-render when links changed
9134
9152
  var textsRef = useRef(texts); //Cache texts to avoid re-render when texts changed
9135
9153
  var size = props.size;
9136
- var selectedElementAbsPosition = useMemo(function () { return selectedElement ? getAbsolutePosition(selectedElement) : null; }, [selectedElement]);
9154
+ var selectedElementAbsPosition = 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]);
9137
9155
  useEffect(function () {
9138
9156
  setElements(props.elements);
9139
9157
  }, [props.elements]);
@@ -9153,7 +9171,7 @@ var Paper = function (props) {
9153
9171
  return function () {
9154
9172
  off();
9155
9173
  };
9156
- }, [props.onManuallyTriggerRenderElement, props.onElementsChanged, elements]);
9174
+ }, [props.onManuallyTriggerRenderElement, props.onElementsChanged, elements, selectedElement]);
9157
9175
  //Cache elements to avoid re-render when elements changed
9158
9176
  useEffect(function () {
9159
9177
  elementsRef.current = elements;
@@ -9618,66 +9636,6 @@ var Paper = function (props) {
9618
9636
  }
9619
9637
  return element;
9620
9638
  };
9621
- //use selection frame
9622
- useSelectionFrame({
9623
- container: paperContainerRef.current,
9624
- targetSVGElement: selectedElementSVG || undefined,
9625
- resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
9626
- enabled: true,
9627
- keepRatio: true
9628
- },
9629
- x: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x,
9630
- y: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.y,
9631
- width: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.width,
9632
- height: selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.size.height,
9633
- //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9634
- onMove: function (newX, newY) {
9635
- if (!selectedElement)
9636
- return;
9637
- var oldPosition = __assign({}, selectedElement.position);
9638
- var newPosition = {
9639
- x: newX,
9640
- y: newY
9641
- };
9642
- logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(newPosition)));
9643
- //Adjust position of element if it should move as a port on parent port area
9644
- if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
9645
- newPosition = adjustElementPositionOnParentPortArea(selectedElement, newPosition, true);
9646
- updateElementPosition(selectedElement, newPosition.x, newPosition.y, true);
9647
- }
9648
- else {
9649
- updateElementPosition(selectedElement, newPosition.x, newPosition.y, false);
9650
- }
9651
- //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
9652
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9653
- logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
9654
- //Set state to re-render UI with new position
9655
- setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
9656
- if (props.onElementMoved) {
9657
- props.onElementMoved(selectedElement.position, selectedElement, indexSelectedElement);
9658
- }
9659
- paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
9660
- setMouseDownedOnPaper(false);
9661
- },
9662
- onResize: function (width, height) {
9663
- if (!selectedElement)
9664
- return;
9665
- var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9666
- var oldSize = selectedElement.size;
9667
- var newSize = { width: width, height: height };
9668
- elements[indexSelectedElement].size = newSize;
9669
- var newElements = __spreadArray([], elements, true);
9670
- setElements(newElements);
9671
- if (props.onElementsChanged) {
9672
- props.onElementsChanged(newElements);
9673
- }
9674
- if (props.onElementResized) {
9675
- props.onElementResized(newSize, selectedElement, indexSelectedElement);
9676
- }
9677
- paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
9678
- setMouseDownedOnPaper(false);
9679
- }
9680
- });
9681
9639
  /*
9682
9640
  Cache to avoid re-initializing the function when the component re-renders to
9683
9641
  avoid causing the components using it to re-render unnecessarily
@@ -9826,13 +9784,75 @@ var Paper = function (props) {
9826
9784
  return (React.createElement("g", { id: "group-of-element-".concat(element.id), key: element.id },
9827
9785
  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 === PositioningAnchor.Center ? element.position.x - element.size.width / 2 : element.position.x, y: element.positionAnchor === 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,
9828
9786
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
9829
- onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined }, element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree))));
9830
- }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, handleMouseUp, handleMouseMove, handleMouseLeave]);
9787
+ onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition, parentAbsolutePosition: element.parentElement ? getAbsolutePosition(element.parentElement) : undefined },
9788
+ element.childrenElementsInTree && element.childrenElementsInTree.map(renderElementInTree),
9789
+ !!paperContainerRef.current && !!selectedElement && selectedElement.id === element.id &&
9790
+ React.createElement(SelectionFrame, { container: paperContainerRef.current, targetSVGElement: selectedElementSVG || undefined, resizability: (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.resizability) || {
9791
+ enabled: true,
9792
+ keepRatio: true
9793
+ }, x: selectedElementAbsPosition === null || selectedElementAbsPosition === void 0 ? void 0 : selectedElementAbsPosition.x, y: 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,
9794
+ //movingOffsetThreshold: ELEMENT_MOVING_OFFSET_THRESHOLD,
9795
+ onMouseDown: function (ev) {
9796
+ var _a;
9797
+ if (selectedElement) {
9798
+ (_a = props.onElementMouseDown) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement);
9799
+ }
9800
+ }, onMouseUp: function (ev) {
9801
+ var _a;
9802
+ if (selectedElement) {
9803
+ (_a = props.onElementMouseUp) === null || _a === void 0 ? void 0 : _a.call(props, ev, selectedElement);
9804
+ }
9805
+ }, onMove: function (newX, newY) {
9806
+ if (!selectedElement)
9807
+ return;
9808
+ var oldPosition = __assign({}, selectedElement.position);
9809
+ var newPosition = {
9810
+ x: newX,
9811
+ y: newY
9812
+ };
9813
+ logger.info("Element ".concat(selectedElement.id, " is dragging to position ").concat(JSON.stringify(newPosition)));
9814
+ //Adjust position of element if it should move as a port on parent port area
9815
+ if (selectedElement.moveAsPortOnParent && selectedElement.parentElement) {
9816
+ newPosition = adjustElementPositionOnParentPortArea(selectedElement, newPosition, true);
9817
+ updateElementPosition(selectedElement, newPosition.x, newPosition.y, true);
9818
+ }
9819
+ else {
9820
+ updateElementPosition(selectedElement, newPosition.x, newPosition.y, false);
9821
+ }
9822
+ //let newElementPosition = updateElementPosition(selectedElement, newPosition.x, newPosition.y, true)
9823
+ var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9824
+ logger.info("Element ".concat(selectedElement.id, " is moving to relative position ").concat(JSON.stringify(selectedElement.position)));
9825
+ //Set state to re-render UI with new position
9826
+ setElementsInTree(function (prev) { return __spreadArray([], prev, true); });
9827
+ if (props.onElementMoved) {
9828
+ props.onElementMoved(selectedElement.position, selectedElement, indexSelectedElement);
9829
+ }
9830
+ paperEventEmitter.emitElementMoved(selectedElement, oldPosition, selectedElement.position);
9831
+ setMouseDownedOnPaper(false);
9832
+ }, onResize: function (width, height) {
9833
+ if (!selectedElement)
9834
+ return;
9835
+ var indexSelectedElement = elements.findIndex(function (e) { return e.id === selectedElement.id; });
9836
+ var oldSize = selectedElement.size;
9837
+ var newSize = { width: width, height: height };
9838
+ elements[indexSelectedElement].size = newSize;
9839
+ var newElements = __spreadArray([], elements, true);
9840
+ setElements(newElements);
9841
+ if (props.onElementsChanged) {
9842
+ props.onElementsChanged(newElements);
9843
+ }
9844
+ if (props.onElementResized) {
9845
+ props.onElementResized(newSize, selectedElement, indexSelectedElement);
9846
+ }
9847
+ paperEventEmitter.emitElementResized(selectedElement, oldSize, newSize);
9848
+ setMouseDownedOnPaper(false);
9849
+ } }))));
9850
+ }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange, handleMouseUp, handleMouseMove, handleMouseLeave, selectedElement, selectedElementAbsPosition]);
9831
9851
  var ElementsInTree = useMemo(function () {
9832
9852
  return elementsInTree.map(function (element, index) {
9833
9853
  return renderElementInTree(element);
9834
9854
  });
9835
- }, [elementsInTree, renderElementInTree]);
9855
+ }, [elementsInTree, renderElementInTree, selectedElement]);
9836
9856
  return (React.createElement("div", { style: { position: "relative" } },
9837
9857
  React.createElement(Ruler, { squareSize: 100, border: '1px dashed grey' }),
9838
9858
  React.createElement("svg", { tabIndex: 0, width: size.width, height: size.height, ref: paperContainerRef, id: "paper-container", onMouseMove: handlePaperMouseMove, onMouseDown: handleMouseDownOnPaper, onMouseUp: handleMouseUpOnPaper },