orcasvn-react-diagrams 0.1.26 → 0.1.28

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
@@ -442,7 +442,6 @@ function generateUniqueId() {
442
442
  return v4();
443
443
  }
444
444
 
445
- var MANUALLY_TRIGGER_RENDER$1 = 'manuallyTriggerRender';
446
445
  var Element$2 = /** @class */ (function () {
447
446
  function Element(x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
448
447
  if (portMovealeAreas === void 0) { portMovealeAreas = []; }
@@ -467,27 +466,26 @@ var Element$2 = /** @class */ (function () {
467
466
  this.textsPlaceHolderFlexStyle = textsPlaceHolderFlexStyle;
468
467
  this.textsPlaceHolderFlexboxPosition = textsPlaceHolderFlexboxPosition;
469
468
  }
470
- Element.prototype.manuallyTriggerRender = function () {
471
- //TODO: Implement this
472
- this._eventEmitter.emit(MANUALLY_TRIGGER_RENDER$1);
473
- };
474
- Element.prototype.manuallyTriggerRenderHandler = function (callback) {
475
- var _this = this;
476
- //TODO: Implement this
477
- this._eventEmitter.on(MANUALLY_TRIGGER_RENDER$1, callback);
478
- var canceller = function () {
479
- _this._eventEmitter.off(MANUALLY_TRIGGER_RENDER$1, callback);
480
- };
481
- return canceller;
482
- };
483
- Element.prototype.manuallyTriggerRenderPort = function (portId) {
484
- //TODO: Implement this
485
- var port = this.getPort(portId);
486
- if (port) {
487
- port.manuallyTriggerRender();
488
- }
489
- };
490
469
  Object.defineProperty(Element.prototype, "id", {
470
+ // public manuallyTriggerRender() {
471
+ // //TODO: Implement this
472
+ // this._eventEmitter.emit(MANUALLY_TRIGGER_RENDER);
473
+ // }
474
+ // public manuallyTriggerRenderHandler(callback: () => void) {
475
+ // //TODO: Implement this
476
+ // this._eventEmitter.on(MANUALLY_TRIGGER_RENDER, callback);
477
+ // const canceller = () => {
478
+ // this._eventEmitter.off(MANUALLY_TRIGGER_RENDER, callback);
479
+ // }
480
+ // return canceller;
481
+ // }
482
+ // public manuallyTriggerRenderPort(portId: string) {
483
+ // //TODO: Implement this
484
+ // const port = this.getPort(portId);
485
+ // if (port) {
486
+ // port.manuallyTriggerRender();
487
+ // }
488
+ // }
491
489
  get: function () {
492
490
  return this._id;
493
491
  },
@@ -672,7 +670,6 @@ var CustomShape = React$1.forwardRef(function (props, ref) {
672
670
  return (React$1.createElement(ShapeWrapper, __assign({}, props, { ref: ref }), props.children));
673
671
  });
674
672
 
675
- var MANUALLY_TRIGGER_RENDER = 'manuallyTriggerRender';
676
673
  var Port$1 = /** @class */ (function () {
677
674
  function Port(x, y, label, shapeRenderer, width, height) {
678
675
  var _this = this;
@@ -703,18 +700,6 @@ var Port$1 = /** @class */ (function () {
703
700
  enumerable: false,
704
701
  configurable: true
705
702
  });
706
- Port.prototype.manuallyTriggerRender = function () {
707
- //TODO: Implement this
708
- this._eventEmitter.emit(MANUALLY_TRIGGER_RENDER);
709
- };
710
- Port.prototype.manuallyTriggerRenderHandler = function (callback) {
711
- var _this = this;
712
- this._eventEmitter.on(MANUALLY_TRIGGER_RENDER, callback);
713
- var canceller = function () {
714
- _this._eventEmitter.off(MANUALLY_TRIGGER_RENDER, callback);
715
- };
716
- return canceller;
717
- };
718
703
  return Port;
719
704
  }());
720
705
 
@@ -779,6 +764,9 @@ var Text$2 = /** @class */ (function () {
779
764
  return Text;
780
765
  }());
781
766
 
767
+ var EVENT_MANUALLY_RENDER_ELEMENT = 'manuallyRenderElement';
768
+ var EVENT_MANUALLY_RENDER_PORT = 'manuallyRenderPort';
769
+ var EVENT_EDITOR_CONTEXT_UPDATED = 'editorContextUpdated';
782
770
  var EVENT_PAPER_CLICKED = 'paperClicked';
783
771
  var EVENT_PAPER_MOUSE_MOVED = 'paperMouseMoved';
784
772
  var EVENT_PAPER_MOUSE_DOWN = 'paperMouseDown';
@@ -793,6 +781,15 @@ var EVENT_LINK_SELECTED = 'linkSelected';
793
781
  var EVENT_TEXT_SELECTED = 'textSelected';
794
782
  var EditorContext = /** @class */ (function () {
795
783
  function EditorContext(elements, links, texts) {
784
+ var _this = this;
785
+ /** @internal */
786
+ this.onEditorContextUpdated = function (callback) {
787
+ _this._eventEmitter.on(EVENT_EDITOR_CONTEXT_UPDATED, callback);
788
+ var off = function () {
789
+ _this._eventEmitter.off(EVENT_EDITOR_CONTEXT_UPDATED, callback);
790
+ };
791
+ return off;
792
+ };
796
793
  this._elements = elements;
797
794
  this._links = links;
798
795
  this._texts = texts;
@@ -832,27 +829,33 @@ var EditorContext = /** @class */ (function () {
832
829
  };
833
830
  EditorContext.prototype.addElement = function (element) {
834
831
  this._elements = __spreadArray(__spreadArray([], this._elements, true), [element], false);
832
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
835
833
  };
836
834
  EditorContext.prototype.removeElement = function (elementId) {
837
835
  this._elements = this._elements.filter(function (e) { return e.id !== elementId; });
836
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
838
837
  };
839
838
  EditorContext.prototype.getLink = function (linkId) {
840
839
  return this._links.find(function (l) { return l.id === linkId; });
841
840
  };
842
841
  EditorContext.prototype.addLink = function (link) {
843
842
  this._links = __spreadArray(__spreadArray([], this._links, true), [link], false);
843
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
844
844
  };
845
845
  EditorContext.prototype.removeLink = function (linkId) {
846
846
  this._links = this._links.filter(function (l) { return l.id !== linkId; });
847
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
847
848
  };
848
849
  EditorContext.prototype.getText = function (textId) {
849
850
  return this._texts.find(function (t) { return t.id === textId; });
850
851
  };
851
852
  EditorContext.prototype.addText = function (text) {
852
853
  this._texts = __spreadArray(__spreadArray([], this._texts, true), [text], false);
854
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
853
855
  };
854
856
  EditorContext.prototype.removeText = function (textId) {
855
857
  this._texts = this._texts.filter(function (t) { return t.id !== textId; });
858
+ this._eventEmitter.emit(EVENT_EDITOR_CONTEXT_UPDATED);
856
859
  };
857
860
  EditorContext.prototype.onPaperClicked = function (callback) {
858
861
  return this.addEventListener(EVENT_PAPER_CLICKED, callback);
@@ -939,22 +942,16 @@ var EditorContext = /** @class */ (function () {
939
942
  this._eventEmitter.emit(EVENT_TEXT_SELECTED, text);
940
943
  };
941
944
  EditorContext.prototype.triggerRenderElement = function (elementId) {
942
- //TODO: to be implemented
943
- var element = this.getElement(elementId);
944
- if (element) {
945
- element.manuallyTriggerRender();
946
- }
945
+ this._eventEmitter.emit(EVENT_MANUALLY_RENDER_ELEMENT, elementId);
946
+ };
947
+ EditorContext.prototype.onManuallyTriggerRenderElement = function (callback) {
948
+ return this.addEventListener(EVENT_MANUALLY_RENDER_ELEMENT, callback);
947
949
  };
948
950
  EditorContext.prototype.triggerRenderPort = function (portId, elementId) {
949
- var _a;
950
- //TODO: to be implemented
951
- var element = this.getElement(elementId);
952
- if (element) {
953
- var port = (_a = element.ports) === null || _a === void 0 ? void 0 : _a.find(function (p) { return p.id === portId; });
954
- if (port) {
955
- port.manuallyTriggerRender();
956
- }
957
- }
951
+ this._eventEmitter.emit(EVENT_MANUALLY_RENDER_PORT, portId, elementId);
952
+ };
953
+ EditorContext.prototype.onManuallyTriggerRenderPort = function (callback) {
954
+ return this.addEventListener(EVENT_MANUALLY_RENDER_PORT, callback);
958
955
  };
959
956
  return EditorContext;
960
957
  }());
@@ -1646,17 +1643,19 @@ var Text = React$1.forwardRef(function (_a, ref) {
1646
1643
  var Text$1 = React$1.memo(Text);
1647
1644
 
1648
1645
  var Port1 = React$1.forwardRef(function (props, ref) {
1649
- var id = props.id, x = props.x, y = props.y, width = props.width, height = props.height, container = props.container, label = props.label, onPortLabelMoved = props.onPortLabelMoved, onPortLabelResized = props.onPortLabelResized, onPortLabelContentChanged = props.onPortLabelContentChanged, onSelected = props.onSelected, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onMouseMove = props.onMouseMove, calculateRotationAngle = props.calculateRotationAngle, onManuallyTriggerRenderHandler = props.onManuallyTriggerRenderHandler, renderShape = props.renderShape;
1650
- var _a = React$1.useState(false); _a[0]; var setUpdated = _a[1];
1646
+ var id = props.id, x = props.x, y = props.y, width = props.width, height = props.height, container = props.container, label = props.label, onPortLabelMoved = props.onPortLabelMoved, onPortLabelResized = props.onPortLabelResized, onPortLabelContentChanged = props.onPortLabelContentChanged, onSelected = props.onSelected, onMouseDown = props.onMouseDown, onMouseUp = props.onMouseUp, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, onMouseMove = props.onMouseMove, calculateRotationAngle = props.calculateRotationAngle,
1647
+ // onManuallyTriggerRenderHandler,
1648
+ renderShape = props.renderShape;
1649
+ var _a = React$1.useState(false); _a[0]; _a[1];
1651
1650
  var textRef = React$1.useRef(null);
1652
- React$1.useEffect(function () {
1653
- var off = onManuallyTriggerRenderHandler === null || onManuallyTriggerRenderHandler === void 0 ? void 0 : onManuallyTriggerRenderHandler(function () {
1654
- setUpdated(function (prev) { return !prev; });
1655
- });
1656
- return function () {
1657
- off === null || off === void 0 ? void 0 : off();
1658
- };
1659
- }, []);
1651
+ // useEffect(() => {
1652
+ // const off = onManuallyTriggerRenderHandler?.(() => {
1653
+ // setUpdated(prev => !prev);
1654
+ // });
1655
+ // return () => {
1656
+ // off?.();
1657
+ // }
1658
+ // }, [])
1660
1659
  var rotationAngle = React$1.useMemo(function () {
1661
1660
  if (!calculateRotationAngle)
1662
1661
  return 0;
@@ -7414,6 +7413,44 @@ var findNearestPosition = function (listPositions, targetPosition) {
7414
7413
  }
7415
7414
  return nearestPoint;
7416
7415
  };
7416
+ /**
7417
+ * From one point find projected Point on the line segment.
7418
+ * @param position
7419
+ * @param linePoints
7420
+ * @returns
7421
+ */
7422
+ var findNearestPointOnSegment = function (position, linePoints) {
7423
+ var beginPosition = linePoints[0], endPosition = linePoints[1];
7424
+ var point = Flatten$1.point(position.x, position.y);
7425
+ var segment = Flatten$1.segment(Flatten$1.point(beginPosition.x, beginPosition.y), Flatten$1.point(endPosition.x, endPosition.y));
7426
+ var _a = point.distanceTo(segment); _a[0]; var segmentFromPointToSegment = _a[1];
7427
+ return {
7428
+ x: segmentFromPointToSegment.pe.x,
7429
+ y: segmentFromPointToSegment.pe.y
7430
+ };
7431
+ };
7432
+ /**
7433
+ * From 1 point find projected Point on the line segments so that the distance between 2 points is shortest.
7434
+ * @param position
7435
+ * @param lines
7436
+ * @returns
7437
+ */
7438
+ var findNearestProjectedPoint = function (position, lines) {
7439
+ var possiblePoints = lines.map(function (p) { return findNearestPointOnSegment(position, p); });
7440
+ var nearestPoint = findNearestPosition(possiblePoints, position);
7441
+ return nearestPoint;
7442
+ };
7443
+ /**
7444
+ * Check if a point is inside a polygon
7445
+ * @param position
7446
+ * @param polygonPoints
7447
+ * @returns
7448
+ */
7449
+ var checkPointContainsPolygon = function (position, polygonPoints) {
7450
+ var polygon = new Flatten$1.Polygon();
7451
+ polygon.addFace(polygonPoints.map(function (p) { return Flatten$1.point(p.x, p.y); }));
7452
+ return polygon.contains(Flatten$1.point(position.x, position.y));
7453
+ };
7417
7454
  /**
7418
7455
  * @param ele : IElement
7419
7456
  * @returns Flatten.Polygon
@@ -9153,34 +9190,42 @@ var Flexbox$1 = /*@__PURE__*/getDefaultExportFromCjs(bundleExports);
9153
9190
 
9154
9191
  var Element = function (props) {
9155
9192
  var _a, _b, _c;
9156
- 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, onManuallyTriggerRenderHandler = props.onManuallyTriggerRenderHandler, 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; props.onMouseMove; props.onMouseLeave; props.onMouseUp; var onMouseUpAtLinkedPortPlaceholder = props.onMouseUpAtLinkedPortPlaceholder, onTextUpdated = props.onTextUpdated;
9193
+ 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, 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; props.onMouseMove; props.onMouseLeave; props.onMouseUp; var onMouseUpAtLinkedPortPlaceholder = props.onMouseUpAtLinkedPortPlaceholder, onTextUpdated = props.onTextUpdated;
9157
9194
  var _d = React$1.useState(), selectedPort = _d[0], setSelectedPort = _d[1];
9158
9195
  var _e = React$1.useState(), hoveredPort = _e[0], setHoveredPort = _e[1];
9159
9196
  var _f = React$1.useState((_a = props.ports) !== null && _a !== void 0 ? _a : []), ports = _f[0], setPorts = _f[1];
9160
9197
  var _g = React$1.useState(false), someElementLinkStarted = _g[0], setSomeElementLinkStarted = _g[1];
9161
9198
  var _h = React$1.useState(), potentialPortPosition = _h[0], setPotentialPortPosition = _h[1];
9162
- var _j = React$1.useState(false); _j[0]; var setUpdated = _j[1];
9199
+ var _j = React$1.useState(false); _j[0]; _j[1];
9163
9200
  var _paperEventEmitterContext = React$1.useContext(paperEventEmitterContext);
9164
9201
  var elementRef = React$1.useRef(null);
9165
9202
  var elementLinkStarted = React$1.useRef();
9166
9203
  var portsRef = React$1.useRef(ports);
9204
+ React$1.useEffect(function () {
9205
+ return function () {
9206
+ var _a;
9207
+ console.log('un mount', (_a = texts === null || texts === void 0 ? void 0 : texts[0]) === null || _a === void 0 ? void 0 : _a.content);
9208
+ };
9209
+ }, []);
9167
9210
  //Listen to manually trigger render event
9168
9211
  React$1.useEffect(function () {
9169
- var off = onManuallyTriggerRenderHandler === null || onManuallyTriggerRenderHandler === void 0 ? void 0 : onManuallyTriggerRenderHandler(function () {
9170
- console.log('Manually trigger render element', id);
9171
- setUpdated(function (prev) { return !prev; });
9212
+ var off = props.onManuallyTriggerRenderPort(function (portId, elementId) {
9213
+ if (elementId !== id)
9214
+ return;
9215
+ console.log('onManuallyTriggerRenderPort', id);
9216
+ setPorts(function (prev) { return __spreadArray([], prev, true); });
9172
9217
  });
9173
9218
  return function () {
9174
- off === null || off === void 0 ? void 0 : off();
9219
+ off();
9175
9220
  };
9176
- }, []);
9221
+ }, [props.onManuallyTriggerRenderPort]);
9177
9222
  //Update portsRef when ports changed
9178
9223
  React$1.useEffect(function () {
9179
9224
  portsRef.current = ports;
9180
9225
  }, [ports]);
9181
9226
  React$1.useEffect(function () {
9182
9227
  var _a;
9183
- console.info('Rendering Element ' + id + ' with text ' + ((_a = texts === null || texts === void 0 ? void 0 : texts[0]) === null || _a === void 0 ? void 0 : _a.content));
9228
+ console.info('Rendering Element ' + ((_a = texts === null || texts === void 0 ? void 0 : texts[0]) === null || _a === void 0 ? void 0 : _a.content) || id);
9184
9229
  });
9185
9230
  //Listen a new port is created, after add new port to ports state
9186
9231
  React$1.useEffect(function () {
@@ -9298,29 +9343,6 @@ var Element = function (props) {
9298
9343
  setSelectedPort(port);
9299
9344
  _paperEventEmitterContext.emitPortSelected(port, id);
9300
9345
  }, [_paperEventEmitterContext]);
9301
- //From one point find another point on the line segment so that the distance between the two points is the shortest.
9302
- var findNearestPointOnSegment = function (position, linePoints) {
9303
- var beginPosition = linePoints[0], endPosition = linePoints[1];
9304
- var point = Flatten$1.point(position.x, position.y);
9305
- var segment = Flatten$1.segment(Flatten$1.point(beginPosition.x, beginPosition.y), Flatten$1.point(endPosition.x, endPosition.y));
9306
- var _a = point.distanceTo(segment); _a[0]; var segmentFromPointToSegment = _a[1];
9307
- return {
9308
- x: segmentFromPointToSegment.pe.x,
9309
- y: segmentFromPointToSegment.pe.y
9310
- };
9311
- };
9312
- //From 1 point find another point on the line segment so that the distance between 2 points is shortest.
9313
- var findNearestProjectedPoint = function (position, linePositions) {
9314
- var possiblePoints = linePositions.map(function (p) { return findNearestPointOnSegment(position, p); });
9315
- var nearestPoint = findNearestPosition(possiblePoints, position);
9316
- return nearestPoint;
9317
- };
9318
- //Check if a point is inside a polygon
9319
- var checkPointContainsPolygon = function (position, polygonPoints) {
9320
- var polygon = new Flatten$1.Polygon();
9321
- polygon.addFace(polygonPoints.map(function (p) { return Flatten$1.point(p.x, p.y); }));
9322
- return polygon.contains(Flatten$1.point(position.x, position.y));
9323
- };
9324
9346
  //Normalize a point so that it can lie exactly on an area
9325
9347
  var normalizePortPositionOnMoveableAreas = function (moveableAreas, position) {
9326
9348
  var lines = moveableAreas.filter(function (area) { return area.length === 2; });
@@ -9625,14 +9647,16 @@ var Element = function (props) {
9625
9647
  ? React$1.createElement("svg", { x: potentialPortPosition.x, y: potentialPortPosition.y }, portPlaceholderShape)
9626
9648
  : React$1.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 :
9627
9649
  ports.map(function (p, index) {
9628
- var _a, _b, _c, _d, _e, _f, _g;
9650
+ var _a, _b, _c, _d, _e, _f;
9629
9651
  return React$1.createElement(Port, { key: p.id, ref: p.ref, id: p.id, x: p.position.x, y: p.position.y, 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,
9630
9652
  // rotation={rotatePort(p)}
9631
9653
  calculateRotationAngle: rotatePort, label: p.label, onPortLabelMoved: handlePortLabelMoved, onPortLabelResized: handlePortLabelResized, onPortLabelContentChanged: handlePortLabelContentChanged, onSelected: handleSelectedPort, onMouseDown: handlePortMouseDown, onMouseUp: handlePortMouseUp, onMouseMove: handlePortMouseMove,
9632
9654
  // onMouseEnter={() => {
9633
9655
  // if (someElementLinkStarted) setHoveredPort(p)
9634
9656
  // }}
9635
- onMouseLeave: handlePortMouseLeave, onManuallyTriggerRenderHandler: (_g = p.manuallyTriggerRenderHandler) === null || _g === void 0 ? void 0 : _g.bind(p), renderShape: p.renderShape });
9657
+ onMouseLeave: handlePortMouseLeave,
9658
+ // onManuallyTriggerRenderHandler={p.manuallyTriggerRenderHandler?.bind(p)}
9659
+ renderShape: p.renderShape });
9636
9660
  }),
9637
9661
  React$1.createElement(Flexbox$1, { className: textsPlaceHolderClassName, style: textsPlaceHolderFlexStyle, x: textsPlaceHolderFlexboxPosition === null || textsPlaceHolderFlexboxPosition === void 0 ? void 0 : textsPlaceHolderFlexboxPosition.x, y: textsPlaceHolderFlexboxPosition === null || textsPlaceHolderFlexboxPosition === void 0 ? void 0 : textsPlaceHolderFlexboxPosition.y }, texts === null || texts === void 0 ? void 0 : texts.map(function (t, index) {
9638
9662
  var _a, _b;
@@ -9870,17 +9894,16 @@ function convertElementsToTree(elements) {
9870
9894
  return parsedElementsInTree;
9871
9895
  }
9872
9896
  var Paper = function (props) {
9873
- var _a;
9874
- var _b = React$1.useState(props.elements), elements = _b[0], setElements = _b[1];
9875
- var _c = React$1.useState([]), elementsInTree = _c[0], setElementsInTree = _c[1];
9876
- var _d = React$1.useState(), selectedElement = _d[0], setSelectedElement = _d[1];
9877
- var _e = React$1.useState((_a = props.links) !== null && _a !== void 0 ? _a : []), links = _e[0], setLinks = _e[1];
9878
- var _f = React$1.useState(), selectedLink = _f[0], setSelectedLink = _f[1];
9879
- var _g = React$1.useState(null), tempLink = _g[0], setTempLink = _g[1];
9880
- var _h = React$1.useState(props.texts), texts = _h[0], setTexts = _h[1];
9881
- var _j = React$1.useState(), selectedText = _j[0], setSelectedText = _j[1];
9882
- var _k = React$1.useState(null), selectedElementSVG = _k[0], setSelectedElementSVG = _k[1];
9883
- var _l = React$1.useState(false), mouseDownedOnPaper = _l[0], setMouseDownedOnPaper = _l[1];
9897
+ var _a = React$1.useState([]), elements = _a[0], setElements = _a[1];
9898
+ var _b = React$1.useState([]), elementsInTree = _b[0], setElementsInTree = _b[1];
9899
+ var _c = React$1.useState(), selectedElement = _c[0], setSelectedElement = _c[1];
9900
+ var _d = React$1.useState([]), links = _d[0], setLinks = _d[1];
9901
+ var _e = React$1.useState(), selectedLink = _e[0], setSelectedLink = _e[1];
9902
+ var _f = React$1.useState(null), tempLink = _f[0], setTempLink = _f[1];
9903
+ var _g = React$1.useState([]), texts = _g[0], setTexts = _g[1];
9904
+ var _h = React$1.useState(), selectedText = _h[0], setSelectedText = _h[1];
9905
+ var _j = React$1.useState(null), selectedElementSVG = _j[0], setSelectedElementSVG = _j[1];
9906
+ var _k = React$1.useState(false), mouseDownedOnPaper = _k[0], setMouseDownedOnPaper = _k[1];
9884
9907
  var paperEventEmitter = React$1.useContext(paperEventEmitterContext);
9885
9908
  var paperContainerRef = React$1.useRef(null);
9886
9909
  var tempLinkRef = React$1.useRef(tempLink); //Cache tempLink to avoid re-render when tempLink changed
@@ -9889,6 +9912,24 @@ var Paper = function (props) {
9889
9912
  React$1.useEffect(function () {
9890
9913
  console.log('Render Paper');
9891
9914
  });
9915
+ React$1.useEffect(function () {
9916
+ setElements(props.elements);
9917
+ }, [props.elements]);
9918
+ React$1.useEffect(function () {
9919
+ setLinks(props.links || []);
9920
+ }, [props.links]);
9921
+ React$1.useEffect(function () {
9922
+ setTexts(props.texts);
9923
+ }, [props.texts]);
9924
+ React$1.useEffect(function () {
9925
+ var off = props.onManuallyTriggerRenderElement(function (elementId) {
9926
+ console.log('onManuallyTriggerRenderElement');
9927
+ setElements(function (prev) { return __spreadArray([], prev, true); });
9928
+ });
9929
+ return function () {
9930
+ off();
9931
+ };
9932
+ }, [props.onManuallyTriggerRenderElement]);
9892
9933
  //Cache elements to avoid re-render when elements changed
9893
9934
  React$1.useEffect(function () {
9894
9935
  elementsRef.current = elements;
@@ -10473,15 +10514,21 @@ var Paper = function (props) {
10473
10514
  }
10474
10515
  }, [props.onElementContextMenu, handleElementClicked]);
10475
10516
  var renderElementInTree = React$1.useCallback(function (element) {
10476
- var _a, _b, _c;
10517
+ var _a, _b;
10477
10518
  //use the defined react element or the default Element component
10478
10519
  var ReactElement = element.reactElement || Element$1;
10479
10520
  console.log("Render element ".concat(element.id));
10480
10521
  return (React$1.createElement("g", { key: element.id },
10481
10522
  React$1.createElement(ReactElement, { key: "element-".concat(element.id), id: element.id, height: element.size.height, width: element.size.width, x: (_a = element.relativePosition) === null || _a === void 0 ? void 0 : _a.x, y: (_b = element.relativePosition) === null || _b === void 0 ? void 0 : _b.y, onClick: handleElementClicked, onContextMenu: handleContextMenu, 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,
10482
10523
  // portPlaceholderShape={(<Circle x={0} y={0} width={10} height={10} fill='red' positioningAnchor={PositioningAnchor.Center} />)}
10483
- onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderHandler: (_c = element.manuallyTriggerRenderHandler) === null || _c === void 0 ? void 0 : _c.bind(element), textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition }, element.childrenElements && element.childrenElements.map(renderElementInTree))));
10524
+ onMouseUpAtLinkedPortPlaceholder: handleMouseUpAtLinkedPortPlaceholder, onTextUpdated: handleElementTextChange, onManuallyTriggerRenderPort: props.onManuallyTriggerRenderPort, textsPlaceHolderClassName: element.textsPlaceHolderClassName, textsPlaceHolderFlexStyle: element.textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition: element.textsPlaceHolderFlexboxPosition }, element.childrenElements && element.childrenElements.map(renderElementInTree))));
10484
10525
  }, [handleElementClicked, handleContextMenu, handlePortMoved, handlePortMouseDown, handlePortMouseUp, handleMouseUpAtLinkedPortPlaceholder, handleElementTextChange]);
10526
+ React$1.useEffect(function () {
10527
+ console.log('elementsInTree');
10528
+ }, [elementsInTree]);
10529
+ React$1.useEffect(function () {
10530
+ console.log('renderElementInTree');
10531
+ }, [renderElementInTree]);
10485
10532
  var ElementsInTree = React$1.useMemo(function () {
10486
10533
  return elementsInTree.map(function (element, index) {
10487
10534
  return renderElementInTree(element);
@@ -10513,14 +10560,39 @@ var Paper = function (props) {
10513
10560
  };
10514
10561
  var Paper$1 = React$1.memo(Paper);
10515
10562
 
10516
- function Editor(_a) {
10563
+ var Editor = function (_a) {
10517
10564
  var editorContext = _a.editorContext, width = _a.width, height = _a.height;
10565
+ var _b = React$1.useState([]), elements = _b[0], setElements = _b[1];
10566
+ var _c = React$1.useState([]), links = _c[0], setLinks = _c[1];
10567
+ var _d = React$1.useState([]), texts = _d[0], setTexts = _d[1];
10518
10568
  if (!width) {
10519
10569
  width = 3000;
10520
10570
  }
10521
10571
  if (!height) {
10522
10572
  height = 3000;
10523
10573
  }
10574
+ var setEditorStates = React$1.useCallback(function (ctx) {
10575
+ setElements(__spreadArray([], ctx.elements, true));
10576
+ setLinks(__spreadArray([], ctx.links, true));
10577
+ setTexts(__spreadArray([], ctx.texts, true));
10578
+ }, []);
10579
+ React$1.useEffect(function () {
10580
+ if (editorContext) {
10581
+ setEditorStates(editorContext);
10582
+ }
10583
+ }, [editorContext, setEditorStates]);
10584
+ React$1.useEffect(function () {
10585
+ var offs = [];
10586
+ if (editorContext) {
10587
+ offs.push(editorContext.onEditorContextUpdated(function () {
10588
+ console.log("onEditorContextUpdated");
10589
+ setEditorStates(editorContext);
10590
+ }));
10591
+ }
10592
+ return function () {
10593
+ offs.forEach(function (off) { return off(); });
10594
+ };
10595
+ }, [editorContext, setEditorStates]);
10524
10596
  var handlePaperClicked = React$1.useCallback(function (position) {
10525
10597
  editorContext.onPaperClickedHandler(position);
10526
10598
  }, [editorContext]);
@@ -10569,10 +10641,8 @@ function Editor(_a) {
10569
10641
  var handlePaperMouseUp = React$1.useCallback(function (position) {
10570
10642
  editorContext.onPaperMouseUpHandler(position);
10571
10643
  }, [editorContext]);
10572
- if (editorContext)
10573
- return (React$1.createElement(Paper$1, { size: { width: width, height: height }, elements: editorContext.elements, links: editorContext.links, texts: editorContext.texts, onPaperClicked: handlePaperClicked, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onTextSelected: handleTextSelected, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown }));
10574
- return null;
10575
- }
10644
+ return (React$1.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onTextSelected: handleTextSelected, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) }));
10645
+ };
10576
10646
 
10577
10647
  exports.CircleRC = Circle;
10578
10648
  exports.CrescentRC = Crescent;
@@ -5,5 +5,5 @@ interface IEditorProps {
5
5
  width?: number;
6
6
  height?: number;
7
7
  }
8
- export default function Editor({ editorContext, width, height }: IEditorProps): React.JSX.Element | null;
9
- export {};
8
+ declare const Editor: React.FC<IEditorProps>;
9
+ export default Editor;
@@ -25,6 +25,8 @@ interface PaperProps {
25
25
  onElementSelected?: (element: IElement) => void;
26
26
  onLinkSelected?: (link: IElementLink) => void;
27
27
  onTextSelected?: (text: IText) => void;
28
+ onManuallyTriggerRenderElement: (callback: (elementId: string) => void) => () => void;
29
+ onManuallyTriggerRenderPort: (callback: (portId: string, elementId: string) => void) => () => void;
28
30
  onCreatingPortByLinking?: (sourceElement: IElement, sourcePort: IPort, targetElement: IElement, position: IPosition) => IPort | null;
29
31
  onCreatingLink?: (sourcePort: IPort, sourceElement: IElement, targetPort: IPort, targetElement: IElement) => IElementLink | null;
30
32
  }
@@ -34,4 +34,6 @@ export default interface IEditorContext {
34
34
  removeText(textId: string): void;
35
35
  triggerRenderElement(elementId: string): void;
36
36
  triggerRenderPort(portId: string, elementId: string): void;
37
+ onManuallyTriggerRenderElement: (callback: (elementId: string) => void) => (() => void);
38
+ onManuallyTriggerRenderPort: (callback: (portId: string, elementId: string) => void) => (() => void);
37
39
  }
@@ -26,13 +26,10 @@ export default interface IElement {
26
26
  defaultPortSize?: number;
27
27
  parentElement?: IElement;
28
28
  onParentChanged?: (callback: (oldParent?: IElement, newParent?: IElement) => void) => (() => void);
29
- manuallyTriggerRender: () => void;
30
29
  addPort: (newPort: IPort) => void;
31
30
  onAddedPort: (callback: (newPort: IPort) => void) => (() => void);
32
31
  deletePort: (id: string) => void;
33
32
  onDeletedPort: (callback: (id: string) => void) => (() => void);
34
- manuallyTriggerRenderPort: (portId: string) => void;
35
- manuallyTriggerRenderHandler?: (callback: () => void) => (() => void);
36
33
  textsPlaceHolderClassName?: string;
37
34
  textsPlaceHolderFlexStyle?: IFlexboxType;
38
35
  textsPlaceHolderFlexboxPosition?: IPosition;
@@ -35,7 +35,7 @@ interface IElementProps {
35
35
  onMouseUp?: (event: React.MouseEvent) => void;
36
36
  onMouseUpAtLinkedPortPlaceholder?: (link: IElementLink, position: IPosition, targetElementId: string) => void;
37
37
  onTextUpdated?: (elmentId: string, textId: string, newTextContent: string) => void;
38
- onManuallyTriggerRenderHandler?: (callback: () => void) => () => void;
38
+ onManuallyTriggerRenderPort: (callback: (portId: string, elementId: string) => void) => () => void;
39
39
  textsPlaceHolderClassName?: string;
40
40
  textsPlaceHolderFlexStyle?: IFlexboxType;
41
41
  textsPlaceHolderFlexboxPosition?: IPosition;
@@ -9,6 +9,4 @@ export default interface IPort {
9
9
  size?: ISize;
10
10
  label?: IText;
11
11
  renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
12
- manuallyTriggerRender: () => void;
13
- manuallyTriggerRenderHandler?: (callback: () => void) => () => void;
14
12
  }
@@ -25,5 +25,4 @@ export interface IPortProps {
25
25
  onPortLabelContentChanged?: (ev: React.ChangeEvent, newValue: string, portId: string) => void;
26
26
  renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
27
27
  calculateRotationAngle?: (x: number, y: number) => number;
28
- onManuallyTriggerRenderHandler?: (callback: () => void) => () => void;
29
28
  }
@@ -40,5 +40,7 @@ export declare class EditorContext implements IEditorContext {
40
40
  onLinkSelected(callback: (link: IElementLink) => void): () => void;
41
41
  onTextSelected(callback: (text: IText) => void): () => void;
42
42
  triggerRenderElement(elementId: string): void;
43
+ onManuallyTriggerRenderElement(callback: (elementId: string) => void): () => void;
43
44
  triggerRenderPort(portId: string, elementId: string): void;
45
+ onManuallyTriggerRenderPort(callback: (portId: string, elementId: string) => void): () => void;
44
46
  }
@@ -34,9 +34,6 @@ export default class Element implements IElement {
34
34
  textsPlaceHolderFlexboxPosition?: IPosition;
35
35
  _eventEmitter: EventEmitter;
36
36
  constructor(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?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
37
- manuallyTriggerRender(): void;
38
- manuallyTriggerRenderHandler(callback: () => void): () => void;
39
- manuallyTriggerRenderPort(portId: string): void;
40
37
  get id(): string;
41
38
  get size(): ISize;
42
39
  set size(value: ISize);
@@ -18,6 +18,4 @@ export default class Port implements IPort {
18
18
  positioningAnchor?: IPosition;
19
19
  }, width?: number, height?: number);
20
20
  get id(): string;
21
- manuallyTriggerRender(): void;
22
- manuallyTriggerRenderHandler(callback: () => void): () => void;
23
21
  }
@@ -11,6 +11,27 @@ export declare function removeDuplicatePosition<T extends IPosition>(positions:
11
11
  * Find the closest point from a list of points to the destination point
12
12
  */
13
13
  export declare const findNearestPosition: (listPositions: IPosition[], targetPosition: IPosition) => IPosition;
14
+ /**
15
+ * From one point find projected Point on the line segment.
16
+ * @param position
17
+ * @param linePoints
18
+ * @returns
19
+ */
20
+ export declare const findNearestPointOnSegment: (position: IPosition, linePoints: IPosition[]) => IPosition;
21
+ /**
22
+ * From 1 point find projected Point on the line segments so that the distance between 2 points is shortest.
23
+ * @param position
24
+ * @param lines
25
+ * @returns
26
+ */
27
+ export declare const findNearestProjectedPoint: (position: IPosition, lines: IPosition[][]) => IPosition;
28
+ /**
29
+ * Check if a point is inside a polygon
30
+ * @param position
31
+ * @param polygonPoints
32
+ * @returns
33
+ */
34
+ export declare const checkPointContainsPolygon: (position: IPosition, polygonPoints: IPosition[]) => boolean;
14
35
  /**
15
36
  * @param ele : IElement
16
37
  * @returns Flatten.Polygon