orcasvn-react-diagrams 0.1.50 → 0.1.52
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 +116 -42
- package/dist/cjs/types/contexts/zoomContext.d.ts +15 -0
- package/dist/cjs/types/mocks/port2.d.ts +5 -0
- package/dist/cjs/types/models/implementations/Element.d.ts +1 -1
- package/dist/cjs/types/models/implementations/ElementLink.d.ts +1 -1
- package/dist/cjs/types/models/implementations/Port.d.ts +1 -1
- package/dist/cjs/types/models/implementations/Text.d.ts +1 -1
- package/dist/esm/index.js +116 -42
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/contexts/zoomContext.d.ts +15 -0
- package/dist/esm/types/mocks/port2.d.ts +5 -0
- package/dist/esm/types/models/implementations/Element.d.ts +1 -1
- package/dist/esm/types/models/implementations/ElementLink.d.ts +1 -1
- package/dist/esm/types/models/implementations/Port.d.ts +1 -1
- package/dist/esm/types/models/implementations/Text.d.ts +1 -1
- package/dist/index.d.ts +4 -4
- package/package.json +1 -1
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(x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
|
|
487
|
+
function Element(id, x, y, width, height, 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 = [];
|
|
@@ -494,7 +494,7 @@ var Element$2 = /** @class */ (function () {
|
|
|
494
494
|
};
|
|
495
495
|
//internal properties
|
|
496
496
|
this._eventEmitter = new EventEmitter();
|
|
497
|
-
this._id = generateUniqueId();
|
|
497
|
+
this._id = id || generateUniqueId();
|
|
498
498
|
this._position = { x: x, y: y };
|
|
499
499
|
this._size = { width: width, height: height };
|
|
500
500
|
this.cssClass = cssClass;
|
|
@@ -696,11 +696,11 @@ var CustomShape = React.forwardRef(function (props, ref) {
|
|
|
696
696
|
});
|
|
697
697
|
|
|
698
698
|
var Port$1 = /** @class */ (function () {
|
|
699
|
-
function Port(x, y, label, shapeRenderer, width, height) {
|
|
699
|
+
function Port(id, x, y, label, shapeRenderer, width, height) {
|
|
700
700
|
var _this = this;
|
|
701
701
|
//internal properties
|
|
702
702
|
this._eventEmitter = new EventEmitter();
|
|
703
|
-
this._id = generateUniqueId();
|
|
703
|
+
this._id = id || generateUniqueId();
|
|
704
704
|
this.position = { x: x, y: y };
|
|
705
705
|
if (!height) {
|
|
706
706
|
height = width;
|
|
@@ -731,8 +731,8 @@ var Port$1 = /** @class */ (function () {
|
|
|
731
731
|
}());
|
|
732
732
|
|
|
733
733
|
var ElementLink$1 = /** @class */ (function () {
|
|
734
|
-
function ElementLink(sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
|
|
735
|
-
this.id = generateUniqueId();
|
|
734
|
+
function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
|
|
735
|
+
this.id = id || generateUniqueId();
|
|
736
736
|
this.sourceElement = sourceElement;
|
|
737
737
|
this.sourcePort = sourcePort;
|
|
738
738
|
if (tempTargetPosition) {
|
|
@@ -769,8 +769,8 @@ var ElementLink$1 = /** @class */ (function () {
|
|
|
769
769
|
}());
|
|
770
770
|
|
|
771
771
|
var Text$2 = /** @class */ (function () {
|
|
772
|
-
function Text(content, width, height, editable, x, y, align, fontSize, border, style) {
|
|
773
|
-
this._id = generateUniqueId();
|
|
772
|
+
function Text(id, content, width, height, editable, x, y, align, fontSize, border, style) {
|
|
773
|
+
this._id = id || generateUniqueId();
|
|
774
774
|
this.content = content;
|
|
775
775
|
this.align = align;
|
|
776
776
|
this.fontSize = fontSize;
|
|
@@ -1094,17 +1094,15 @@ var Crescent = React.forwardRef(function (props, ref) {
|
|
|
1094
1094
|
var Rectangle = React.forwardRef(function (props, ref) {
|
|
1095
1095
|
var scaledWidth = props.width;
|
|
1096
1096
|
var scaledHeight = props.height;
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
scaledWidth = scaledWidth / heightRatio;
|
|
1107
|
-
}
|
|
1097
|
+
var widthRatio = props.width / 100;
|
|
1098
|
+
var heightRatio = props.height / 100;
|
|
1099
|
+
if (widthRatio > heightRatio) {
|
|
1100
|
+
scaledWidth = 100;
|
|
1101
|
+
scaledHeight = scaledHeight / widthRatio;
|
|
1102
|
+
}
|
|
1103
|
+
else {
|
|
1104
|
+
scaledHeight = 100;
|
|
1105
|
+
scaledWidth = scaledWidth / heightRatio;
|
|
1108
1106
|
}
|
|
1109
1107
|
var sw = props.stroke ? (props.strokeWidth || 1) : 0;
|
|
1110
1108
|
return (React.createElement(ShapeWrapper, __assign({}, props, { ref: ref, height: props.height, width: props.width }),
|
|
@@ -1115,17 +1113,15 @@ var Rectangle = React.forwardRef(function (props, ref) {
|
|
|
1115
1113
|
var RectangularFrame = React.forwardRef(function (props, ref) {
|
|
1116
1114
|
var scaledWidth = props.width;
|
|
1117
1115
|
var scaledHeight = props.height;
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
scaledWidth = scaledWidth / heightRatio;
|
|
1128
|
-
}
|
|
1116
|
+
var widthRatio = props.width / 100;
|
|
1117
|
+
var heightRatio = props.height / 100;
|
|
1118
|
+
if (widthRatio > heightRatio) {
|
|
1119
|
+
scaledWidth = 100;
|
|
1120
|
+
scaledHeight = scaledHeight / widthRatio;
|
|
1121
|
+
}
|
|
1122
|
+
else {
|
|
1123
|
+
scaledHeight = 100;
|
|
1124
|
+
scaledWidth = scaledWidth / heightRatio;
|
|
1129
1125
|
}
|
|
1130
1126
|
var vbX = 0; //(100 - scaledWidth) / 2;
|
|
1131
1127
|
var vbY = 0; //(100 - scaledHeight) / 2;
|
|
@@ -8074,20 +8070,20 @@ function CloseIcon(_a) {
|
|
|
8074
8070
|
React.createElement("path", { d: "M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z" })))));
|
|
8075
8071
|
}
|
|
8076
8072
|
|
|
8077
|
-
|
|
8078
|
-
|
|
8073
|
+
// const makerStart = <circle cx={10} cy={10} r={10} fill="blue"></circle>
|
|
8074
|
+
// const makerEnd = <path d="M0 0 L 20 10 L0 20 Z" fill="blue"></path>//<path d="M0 0 L 10 5 L0 10 Z"></path>
|
|
8079
8075
|
var IElementLink = function (_a) {
|
|
8080
8076
|
var _b, _c;
|
|
8081
|
-
var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container,
|
|
8082
|
-
var
|
|
8083
|
-
var
|
|
8084
|
-
var
|
|
8085
|
-
var
|
|
8086
|
-
var
|
|
8077
|
+
var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
|
|
8078
|
+
var _g = React.useState(path), pathStr = _g[0], setPathStr = _g[1];
|
|
8079
|
+
var _h = React.useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
|
|
8080
|
+
var _j = React.useState(false), isDragging = _j[0], setIsDragging = _j[1];
|
|
8081
|
+
var _k = React.useState(), draggingPointIndex = _k[0], setDraggingPointIndex = _k[1];
|
|
8082
|
+
var _l = React.useState({
|
|
8087
8083
|
current: null,
|
|
8088
|
-
}), selectedLabelRef =
|
|
8089
|
-
var
|
|
8090
|
-
var
|
|
8084
|
+
}), selectedLabelRef = _l[0], setSelectedLabelRef = _l[1];
|
|
8085
|
+
var _m = React.useState(false), isSelectedLink = _m[0], setIsSelectedLink = _m[1];
|
|
8086
|
+
var _o = React.useContext(paperEventEmitterContext), onPaperClicked = _o.onPaperClicked, onElementSelected = _o.onElementSelected;
|
|
8091
8087
|
var pathRef = React.useRef(null);
|
|
8092
8088
|
var labelRef = React.useRef(null);
|
|
8093
8089
|
var sourceLabelRef = React.useRef(null);
|
|
@@ -9900,6 +9896,83 @@ var Paper = function (props) {
|
|
|
9900
9896
|
};
|
|
9901
9897
|
var Paper$1 = React.memo(Paper);
|
|
9902
9898
|
|
|
9899
|
+
/**
|
|
9900
|
+
* Zoom context to manage zoom level and related state.
|
|
9901
|
+
* This context can be used to provide zoom functionality across the application.
|
|
9902
|
+
*/
|
|
9903
|
+
var zoomContext = React.createContext(null);
|
|
9904
|
+
var ZoomContextProvider = function (_a) {
|
|
9905
|
+
var children = _a.children;
|
|
9906
|
+
var _b = React.useState(1), zoom = _b[0], setZoom = _b[1];
|
|
9907
|
+
var _c = React.useState(0), scrollLeft = _c[0], setScrollLeft = _c[1];
|
|
9908
|
+
var _d = React.useState(0), scrollTop = _d[0], setScrollTop = _d[1];
|
|
9909
|
+
var wrapperRef = React.useRef(null);
|
|
9910
|
+
var contentRef = React.useRef(null);
|
|
9911
|
+
var handleWheel = function (e) {
|
|
9912
|
+
// Chỉ zoom khi giữ Ctrl
|
|
9913
|
+
if (!e.ctrlKey)
|
|
9914
|
+
return;
|
|
9915
|
+
e.preventDefault();
|
|
9916
|
+
var delta = -e.deltaY;
|
|
9917
|
+
var zoomFactor = 0.05;
|
|
9918
|
+
var newZoom = zoom + (delta > 0 ? zoomFactor : -zoomFactor);
|
|
9919
|
+
newZoom = Math.max(0.1, Math.min(newZoom, 4));
|
|
9920
|
+
if (!wrapperRef.current || !contentRef.current)
|
|
9921
|
+
return;
|
|
9922
|
+
var wrapper = wrapperRef.current;
|
|
9923
|
+
var content = contentRef.current;
|
|
9924
|
+
// Get bounding rectangle of the content
|
|
9925
|
+
var rect = content.getBoundingClientRect();
|
|
9926
|
+
var offsetX = e.clientX - rect.left;
|
|
9927
|
+
var offsetY = e.clientY - rect.top;
|
|
9928
|
+
var percentX = offsetX / (content.offsetWidth);
|
|
9929
|
+
var percentY = offsetY / (content.offsetHeight);
|
|
9930
|
+
console.log(offsetX, offsetY, content.offsetWidth, content.offsetHeight, percentX, percentY);
|
|
9931
|
+
// Old width and height of content
|
|
9932
|
+
var prevWidth = content.offsetWidth * zoom;
|
|
9933
|
+
var prevHeight = content.offsetHeight * zoom;
|
|
9934
|
+
var newWidth = content.offsetWidth * newZoom;
|
|
9935
|
+
var newHeight = content.offsetHeight * newZoom;
|
|
9936
|
+
var scrollLeft = wrapper.scrollLeft + (percentX * (newWidth - prevWidth));
|
|
9937
|
+
var scrollTop = wrapper.scrollTop + (percentY * (newHeight - prevHeight));
|
|
9938
|
+
setZoom(newZoom);
|
|
9939
|
+
setScrollLeft(scrollLeft);
|
|
9940
|
+
setScrollTop(scrollTop);
|
|
9941
|
+
};
|
|
9942
|
+
React.useLayoutEffect(function () {
|
|
9943
|
+
var _a;
|
|
9944
|
+
(_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
|
|
9945
|
+
left: scrollLeft,
|
|
9946
|
+
top: scrollTop,
|
|
9947
|
+
});
|
|
9948
|
+
}, [zoom, scrollLeft, scrollTop]);
|
|
9949
|
+
var resetZoom = function () {
|
|
9950
|
+
setZoom(1);
|
|
9951
|
+
};
|
|
9952
|
+
React.useEffect(function () {
|
|
9953
|
+
var preventBrowserZoom = function (e) {
|
|
9954
|
+
if (e.ctrlKey || e.metaKey) {
|
|
9955
|
+
e.preventDefault();
|
|
9956
|
+
}
|
|
9957
|
+
};
|
|
9958
|
+
window.addEventListener("wheel", preventBrowserZoom, { passive: false });
|
|
9959
|
+
return function () {
|
|
9960
|
+
window.removeEventListener("wheel", preventBrowserZoom);
|
|
9961
|
+
};
|
|
9962
|
+
}, []);
|
|
9963
|
+
return (React.createElement(zoomContext.Provider, { value: { zoom: zoom, setZoom: setZoom, resetZoom: resetZoom } },
|
|
9964
|
+
React.createElement("div", { ref: wrapperRef, onWheel: handleWheel, style: {
|
|
9965
|
+
width: "100vw",
|
|
9966
|
+
height: "92vh",
|
|
9967
|
+
overflow: "auto",
|
|
9968
|
+
} },
|
|
9969
|
+
React.createElement("div", { ref: contentRef, style: {
|
|
9970
|
+
transform: "scale(".concat(zoom, ")"),
|
|
9971
|
+
transformOrigin: "top left",
|
|
9972
|
+
// transition: "transform 0.1s linear",
|
|
9973
|
+
} }, children))));
|
|
9974
|
+
};
|
|
9975
|
+
|
|
9903
9976
|
var Editor = function (_a) {
|
|
9904
9977
|
var editorContext = _a.editorContext, width = _a.width, height = _a.height;
|
|
9905
9978
|
var _b = React.useState([]), elements = _b[0], setElements = _b[1];
|
|
@@ -10008,7 +10081,8 @@ var Editor = function (_a) {
|
|
|
10008
10081
|
var handlePaperMouseUp = React.useCallback(function (position) {
|
|
10009
10082
|
editorContext.onPaperMouseUpHandler(position);
|
|
10010
10083
|
}, [editorContext]);
|
|
10011
|
-
return (React.createElement(
|
|
10084
|
+
return (React.createElement(ZoomContextProvider, null,
|
|
10085
|
+
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, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) })));
|
|
10012
10086
|
};
|
|
10013
10087
|
|
|
10014
10088
|
exports.CircleRC = Circle;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface IZoomContext {
|
|
3
|
+
zoom: number;
|
|
4
|
+
setZoom: (zoom: number) => void;
|
|
5
|
+
resetZoom: () => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Zoom context to manage zoom level and related state.
|
|
9
|
+
* This context can be used to provide zoom functionality across the application.
|
|
10
|
+
*/
|
|
11
|
+
export declare const zoomContext: React.Context<IZoomContext | null>;
|
|
12
|
+
export declare const ZoomContextProvider: ({ children }: {
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
}) => React.JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -37,7 +37,7 @@ export default class Element implements IElement {
|
|
|
37
37
|
textsPlaceHolderFlexStyle?: IFlexboxType;
|
|
38
38
|
textsPlaceHolderFlexboxPosition?: IPosition;
|
|
39
39
|
_eventEmitter: EventEmitter;
|
|
40
|
-
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);
|
|
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?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
|
|
41
41
|
get id(): string;
|
|
42
42
|
get size(): ISize;
|
|
43
43
|
set size(value: ISize);
|
|
@@ -20,5 +20,5 @@ export default class ElementLink implements IElementLink {
|
|
|
20
20
|
label?: IText;
|
|
21
21
|
sourceLabel?: IText;
|
|
22
22
|
targetLabel?: IText;
|
|
23
|
-
constructor(sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);
|
|
23
|
+
constructor(id: string | null, sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);
|
|
24
24
|
}
|
|
@@ -12,7 +12,7 @@ export default class Port implements IPort {
|
|
|
12
12
|
label?: IText;
|
|
13
13
|
renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
|
|
14
14
|
_eventEmitter: EventEmitter;
|
|
15
|
-
constructor(x: number, y: number, label?: IText, shapeRenderer?: {
|
|
15
|
+
constructor(id: string | null, x: number, y: number, label?: IText, shapeRenderer?: {
|
|
16
16
|
shape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
|
|
17
17
|
customShapeWithJSX?: JSX.Element;
|
|
18
18
|
positioningAnchor?: IPosition;
|
|
@@ -13,6 +13,6 @@ export default class Text implements IText {
|
|
|
13
13
|
fontSize?: number;
|
|
14
14
|
border?: string;
|
|
15
15
|
style?: IFlexboxType;
|
|
16
|
-
constructor(content: string, width: number, height: number, editable: boolean, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType);
|
|
16
|
+
constructor(id: string | null, content: string, width: number, height: number, editable: boolean, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType);
|
|
17
17
|
get id(): string;
|
|
18
18
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -480,7 +480,7 @@ function generateUniqueId() {
|
|
|
480
480
|
}
|
|
481
481
|
|
|
482
482
|
var Element$2 = /** @class */ (function () {
|
|
483
|
-
function Element(x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
|
|
483
|
+
function Element(id, x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
|
|
484
484
|
if (portMovealeAreas === void 0) { portMovealeAreas = []; }
|
|
485
485
|
this.positionAnchor = PositioningAnchor.TopLeft;
|
|
486
486
|
this._childrenElements = [];
|
|
@@ -490,7 +490,7 @@ var Element$2 = /** @class */ (function () {
|
|
|
490
490
|
};
|
|
491
491
|
//internal properties
|
|
492
492
|
this._eventEmitter = new EventEmitter();
|
|
493
|
-
this._id = generateUniqueId();
|
|
493
|
+
this._id = id || generateUniqueId();
|
|
494
494
|
this._position = { x: x, y: y };
|
|
495
495
|
this._size = { width: width, height: height };
|
|
496
496
|
this.cssClass = cssClass;
|
|
@@ -692,11 +692,11 @@ var CustomShape = forwardRef(function (props, ref) {
|
|
|
692
692
|
});
|
|
693
693
|
|
|
694
694
|
var Port$1 = /** @class */ (function () {
|
|
695
|
-
function Port(x, y, label, shapeRenderer, width, height) {
|
|
695
|
+
function Port(id, x, y, label, shapeRenderer, width, height) {
|
|
696
696
|
var _this = this;
|
|
697
697
|
//internal properties
|
|
698
698
|
this._eventEmitter = new EventEmitter();
|
|
699
|
-
this._id = generateUniqueId();
|
|
699
|
+
this._id = id || generateUniqueId();
|
|
700
700
|
this.position = { x: x, y: y };
|
|
701
701
|
if (!height) {
|
|
702
702
|
height = width;
|
|
@@ -727,8 +727,8 @@ var Port$1 = /** @class */ (function () {
|
|
|
727
727
|
}());
|
|
728
728
|
|
|
729
729
|
var ElementLink$1 = /** @class */ (function () {
|
|
730
|
-
function ElementLink(sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
|
|
731
|
-
this.id = generateUniqueId();
|
|
730
|
+
function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
|
|
731
|
+
this.id = id || generateUniqueId();
|
|
732
732
|
this.sourceElement = sourceElement;
|
|
733
733
|
this.sourcePort = sourcePort;
|
|
734
734
|
if (tempTargetPosition) {
|
|
@@ -765,8 +765,8 @@ var ElementLink$1 = /** @class */ (function () {
|
|
|
765
765
|
}());
|
|
766
766
|
|
|
767
767
|
var Text$2 = /** @class */ (function () {
|
|
768
|
-
function Text(content, width, height, editable, x, y, align, fontSize, border, style) {
|
|
769
|
-
this._id = generateUniqueId();
|
|
768
|
+
function Text(id, content, width, height, editable, x, y, align, fontSize, border, style) {
|
|
769
|
+
this._id = id || generateUniqueId();
|
|
770
770
|
this.content = content;
|
|
771
771
|
this.align = align;
|
|
772
772
|
this.fontSize = fontSize;
|
|
@@ -1090,17 +1090,15 @@ var Crescent = forwardRef(function (props, ref) {
|
|
|
1090
1090
|
var Rectangle = forwardRef(function (props, ref) {
|
|
1091
1091
|
var scaledWidth = props.width;
|
|
1092
1092
|
var scaledHeight = props.height;
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
scaledWidth = scaledWidth / heightRatio;
|
|
1103
|
-
}
|
|
1093
|
+
var widthRatio = props.width / 100;
|
|
1094
|
+
var heightRatio = props.height / 100;
|
|
1095
|
+
if (widthRatio > heightRatio) {
|
|
1096
|
+
scaledWidth = 100;
|
|
1097
|
+
scaledHeight = scaledHeight / widthRatio;
|
|
1098
|
+
}
|
|
1099
|
+
else {
|
|
1100
|
+
scaledHeight = 100;
|
|
1101
|
+
scaledWidth = scaledWidth / heightRatio;
|
|
1104
1102
|
}
|
|
1105
1103
|
var sw = props.stroke ? (props.strokeWidth || 1) : 0;
|
|
1106
1104
|
return (React.createElement(ShapeWrapper, __assign({}, props, { ref: ref, height: props.height, width: props.width }),
|
|
@@ -1111,17 +1109,15 @@ var Rectangle = forwardRef(function (props, ref) {
|
|
|
1111
1109
|
var RectangularFrame = forwardRef(function (props, ref) {
|
|
1112
1110
|
var scaledWidth = props.width;
|
|
1113
1111
|
var scaledHeight = props.height;
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
scaledWidth = scaledWidth / heightRatio;
|
|
1124
|
-
}
|
|
1112
|
+
var widthRatio = props.width / 100;
|
|
1113
|
+
var heightRatio = props.height / 100;
|
|
1114
|
+
if (widthRatio > heightRatio) {
|
|
1115
|
+
scaledWidth = 100;
|
|
1116
|
+
scaledHeight = scaledHeight / widthRatio;
|
|
1117
|
+
}
|
|
1118
|
+
else {
|
|
1119
|
+
scaledHeight = 100;
|
|
1120
|
+
scaledWidth = scaledWidth / heightRatio;
|
|
1125
1121
|
}
|
|
1126
1122
|
var vbX = 0; //(100 - scaledWidth) / 2;
|
|
1127
1123
|
var vbY = 0; //(100 - scaledHeight) / 2;
|
|
@@ -8070,20 +8066,20 @@ function CloseIcon(_a) {
|
|
|
8070
8066
|
React.createElement("path", { d: "M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z" })))));
|
|
8071
8067
|
}
|
|
8072
8068
|
|
|
8073
|
-
|
|
8074
|
-
|
|
8069
|
+
// const makerStart = <circle cx={10} cy={10} r={10} fill="blue"></circle>
|
|
8070
|
+
// const makerEnd = <path d="M0 0 L 20 10 L0 20 Z" fill="blue"></path>//<path d="M0 0 L 10 5 L0 10 Z"></path>
|
|
8075
8071
|
var IElementLink = function (_a) {
|
|
8076
8072
|
var _b, _c;
|
|
8077
|
-
var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container,
|
|
8078
|
-
var
|
|
8079
|
-
var
|
|
8080
|
-
var
|
|
8081
|
-
var
|
|
8082
|
-
var
|
|
8073
|
+
var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
|
|
8074
|
+
var _g = useState(path), pathStr = _g[0], setPathStr = _g[1];
|
|
8075
|
+
var _h = useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
|
|
8076
|
+
var _j = useState(false), isDragging = _j[0], setIsDragging = _j[1];
|
|
8077
|
+
var _k = useState(), draggingPointIndex = _k[0], setDraggingPointIndex = _k[1];
|
|
8078
|
+
var _l = useState({
|
|
8083
8079
|
current: null,
|
|
8084
|
-
}), selectedLabelRef =
|
|
8085
|
-
var
|
|
8086
|
-
var
|
|
8080
|
+
}), selectedLabelRef = _l[0], setSelectedLabelRef = _l[1];
|
|
8081
|
+
var _m = useState(false), isSelectedLink = _m[0], setIsSelectedLink = _m[1];
|
|
8082
|
+
var _o = useContext(paperEventEmitterContext), onPaperClicked = _o.onPaperClicked, onElementSelected = _o.onElementSelected;
|
|
8087
8083
|
var pathRef = useRef(null);
|
|
8088
8084
|
var labelRef = useRef(null);
|
|
8089
8085
|
var sourceLabelRef = useRef(null);
|
|
@@ -9896,6 +9892,83 @@ var Paper = function (props) {
|
|
|
9896
9892
|
};
|
|
9897
9893
|
var Paper$1 = memo(Paper);
|
|
9898
9894
|
|
|
9895
|
+
/**
|
|
9896
|
+
* Zoom context to manage zoom level and related state.
|
|
9897
|
+
* This context can be used to provide zoom functionality across the application.
|
|
9898
|
+
*/
|
|
9899
|
+
var zoomContext = createContext(null);
|
|
9900
|
+
var ZoomContextProvider = function (_a) {
|
|
9901
|
+
var children = _a.children;
|
|
9902
|
+
var _b = React.useState(1), zoom = _b[0], setZoom = _b[1];
|
|
9903
|
+
var _c = React.useState(0), scrollLeft = _c[0], setScrollLeft = _c[1];
|
|
9904
|
+
var _d = React.useState(0), scrollTop = _d[0], setScrollTop = _d[1];
|
|
9905
|
+
var wrapperRef = useRef(null);
|
|
9906
|
+
var contentRef = useRef(null);
|
|
9907
|
+
var handleWheel = function (e) {
|
|
9908
|
+
// Chỉ zoom khi giữ Ctrl
|
|
9909
|
+
if (!e.ctrlKey)
|
|
9910
|
+
return;
|
|
9911
|
+
e.preventDefault();
|
|
9912
|
+
var delta = -e.deltaY;
|
|
9913
|
+
var zoomFactor = 0.05;
|
|
9914
|
+
var newZoom = zoom + (delta > 0 ? zoomFactor : -zoomFactor);
|
|
9915
|
+
newZoom = Math.max(0.1, Math.min(newZoom, 4));
|
|
9916
|
+
if (!wrapperRef.current || !contentRef.current)
|
|
9917
|
+
return;
|
|
9918
|
+
var wrapper = wrapperRef.current;
|
|
9919
|
+
var content = contentRef.current;
|
|
9920
|
+
// Get bounding rectangle of the content
|
|
9921
|
+
var rect = content.getBoundingClientRect();
|
|
9922
|
+
var offsetX = e.clientX - rect.left;
|
|
9923
|
+
var offsetY = e.clientY - rect.top;
|
|
9924
|
+
var percentX = offsetX / (content.offsetWidth);
|
|
9925
|
+
var percentY = offsetY / (content.offsetHeight);
|
|
9926
|
+
console.log(offsetX, offsetY, content.offsetWidth, content.offsetHeight, percentX, percentY);
|
|
9927
|
+
// Old width and height of content
|
|
9928
|
+
var prevWidth = content.offsetWidth * zoom;
|
|
9929
|
+
var prevHeight = content.offsetHeight * zoom;
|
|
9930
|
+
var newWidth = content.offsetWidth * newZoom;
|
|
9931
|
+
var newHeight = content.offsetHeight * newZoom;
|
|
9932
|
+
var scrollLeft = wrapper.scrollLeft + (percentX * (newWidth - prevWidth));
|
|
9933
|
+
var scrollTop = wrapper.scrollTop + (percentY * (newHeight - prevHeight));
|
|
9934
|
+
setZoom(newZoom);
|
|
9935
|
+
setScrollLeft(scrollLeft);
|
|
9936
|
+
setScrollTop(scrollTop);
|
|
9937
|
+
};
|
|
9938
|
+
useLayoutEffect(function () {
|
|
9939
|
+
var _a;
|
|
9940
|
+
(_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
|
|
9941
|
+
left: scrollLeft,
|
|
9942
|
+
top: scrollTop,
|
|
9943
|
+
});
|
|
9944
|
+
}, [zoom, scrollLeft, scrollTop]);
|
|
9945
|
+
var resetZoom = function () {
|
|
9946
|
+
setZoom(1);
|
|
9947
|
+
};
|
|
9948
|
+
React.useEffect(function () {
|
|
9949
|
+
var preventBrowserZoom = function (e) {
|
|
9950
|
+
if (e.ctrlKey || e.metaKey) {
|
|
9951
|
+
e.preventDefault();
|
|
9952
|
+
}
|
|
9953
|
+
};
|
|
9954
|
+
window.addEventListener("wheel", preventBrowserZoom, { passive: false });
|
|
9955
|
+
return function () {
|
|
9956
|
+
window.removeEventListener("wheel", preventBrowserZoom);
|
|
9957
|
+
};
|
|
9958
|
+
}, []);
|
|
9959
|
+
return (React.createElement(zoomContext.Provider, { value: { zoom: zoom, setZoom: setZoom, resetZoom: resetZoom } },
|
|
9960
|
+
React.createElement("div", { ref: wrapperRef, onWheel: handleWheel, style: {
|
|
9961
|
+
width: "100vw",
|
|
9962
|
+
height: "92vh",
|
|
9963
|
+
overflow: "auto",
|
|
9964
|
+
} },
|
|
9965
|
+
React.createElement("div", { ref: contentRef, style: {
|
|
9966
|
+
transform: "scale(".concat(zoom, ")"),
|
|
9967
|
+
transformOrigin: "top left",
|
|
9968
|
+
// transition: "transform 0.1s linear",
|
|
9969
|
+
} }, children))));
|
|
9970
|
+
};
|
|
9971
|
+
|
|
9899
9972
|
var Editor = function (_a) {
|
|
9900
9973
|
var editorContext = _a.editorContext, width = _a.width, height = _a.height;
|
|
9901
9974
|
var _b = React.useState([]), elements = _b[0], setElements = _b[1];
|
|
@@ -10004,7 +10077,8 @@ var Editor = function (_a) {
|
|
|
10004
10077
|
var handlePaperMouseUp = useCallback(function (position) {
|
|
10005
10078
|
editorContext.onPaperMouseUpHandler(position);
|
|
10006
10079
|
}, [editorContext]);
|
|
10007
|
-
return (React.createElement(
|
|
10080
|
+
return (React.createElement(ZoomContextProvider, null,
|
|
10081
|
+
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, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) })));
|
|
10008
10082
|
};
|
|
10009
10083
|
|
|
10010
10084
|
export { Circle as CircleRC, Crescent as CrescentRC, CustomShape as CustomShapeRC, EditorContext, Element$2 as Element, ElementLink$1 as ElementLink, ElementLink as ElementLinkRC, Port$1 as Port, Port as PortRC, PositioningAnchor, Rectangle as RectangleRC, RectangularFrame as RectangularFrameRC, ResizingDirection, ShapeWrapper as ShapeWrapperRC, SubObjectDirection, Text$2 as Text, TextAlign, Text$1 as TextRC, addPointToList, calculateAngleWithOx, checkPointContainsPolygon, checkPositionOnLine, checkSamePosition, configureLogger, correctPortPositionInElement, createSmoothPathString, Editor as default, degreeToRadian, diamondEdgeInsideSquare, dist, findNearestPointOnSegment, findNearestPosition, findNearestProjectedPoint, generateSubstitutePosition, generateUniqueId, getAbsolutePosition, getCurvePathData, getElementRotationInfo, getFirstIntersection, getFourVertexesOfBBoxFromElement, getIntersectionPositions, getPortAbsolutePosition, getRectangleCorners, getRelativePosition, getRotatedRectangleCoordinates, getRotatedSVGBBox, getSVGBBoxOutsideTransformedParent, makePolygonOfElement, pathDataToD, removeDuplicatePosition, transformAbsPositionToElementRelativePosition, transformAbsPositionToRelativePositionInsideElement };
|