orcasvn-react-diagrams 0.1.51 → 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 +98 -20
- package/dist/cjs/types/contexts/zoomContext.d.ts +15 -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 +98 -20
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/contexts/zoomContext.d.ts +15 -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;
|
|
@@ -8070,20 +8070,20 @@ function CloseIcon(_a) {
|
|
|
8070
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" })))));
|
|
8071
8071
|
}
|
|
8072
8072
|
|
|
8073
|
-
|
|
8074
|
-
|
|
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>
|
|
8075
8075
|
var IElementLink = function (_a) {
|
|
8076
8076
|
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
|
|
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({
|
|
8083
8083
|
current: null,
|
|
8084
|
-
}), selectedLabelRef =
|
|
8085
|
-
var
|
|
8086
|
-
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;
|
|
8087
8087
|
var pathRef = React.useRef(null);
|
|
8088
8088
|
var labelRef = React.useRef(null);
|
|
8089
8089
|
var sourceLabelRef = React.useRef(null);
|
|
@@ -9896,6 +9896,83 @@ var Paper = function (props) {
|
|
|
9896
9896
|
};
|
|
9897
9897
|
var Paper$1 = React.memo(Paper);
|
|
9898
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
|
+
|
|
9899
9976
|
var Editor = function (_a) {
|
|
9900
9977
|
var editorContext = _a.editorContext, width = _a.width, height = _a.height;
|
|
9901
9978
|
var _b = React.useState([]), elements = _b[0], setElements = _b[1];
|
|
@@ -10004,7 +10081,8 @@ var Editor = function (_a) {
|
|
|
10004
10081
|
var handlePaperMouseUp = React.useCallback(function (position) {
|
|
10005
10082
|
editorContext.onPaperMouseUpHandler(position);
|
|
10006
10083
|
}, [editorContext]);
|
|
10007
|
-
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) })));
|
|
10008
10086
|
};
|
|
10009
10087
|
|
|
10010
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;
|
|
@@ -8066,20 +8066,20 @@ function CloseIcon(_a) {
|
|
|
8066
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" })))));
|
|
8067
8067
|
}
|
|
8068
8068
|
|
|
8069
|
-
|
|
8070
|
-
|
|
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>
|
|
8071
8071
|
var IElementLink = function (_a) {
|
|
8072
8072
|
var _b, _c;
|
|
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,
|
|
8074
|
-
var
|
|
8075
|
-
var
|
|
8076
|
-
var
|
|
8077
|
-
var
|
|
8078
|
-
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({
|
|
8079
8079
|
current: null,
|
|
8080
|
-
}), selectedLabelRef =
|
|
8081
|
-
var
|
|
8082
|
-
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;
|
|
8083
8083
|
var pathRef = useRef(null);
|
|
8084
8084
|
var labelRef = useRef(null);
|
|
8085
8085
|
var sourceLabelRef = useRef(null);
|
|
@@ -9892,6 +9892,83 @@ var Paper = function (props) {
|
|
|
9892
9892
|
};
|
|
9893
9893
|
var Paper$1 = memo(Paper);
|
|
9894
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
|
+
|
|
9895
9972
|
var Editor = function (_a) {
|
|
9896
9973
|
var editorContext = _a.editorContext, width = _a.width, height = _a.height;
|
|
9897
9974
|
var _b = React.useState([]), elements = _b[0], setElements = _b[1];
|
|
@@ -10000,7 +10077,8 @@ var Editor = function (_a) {
|
|
|
10000
10077
|
var handlePaperMouseUp = useCallback(function (position) {
|
|
10001
10078
|
editorContext.onPaperMouseUpHandler(position);
|
|
10002
10079
|
}, [editorContext]);
|
|
10003
|
-
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) })));
|
|
10004
10082
|
};
|
|
10005
10083
|
|
|
10006
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 };
|