@next-bricks/diagram 0.14.0 → 0.15.0

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.
Files changed (28) hide show
  1. package/dist/bricks.json +3 -3
  2. package/dist/chunks/{9380.8d833db1.js → 8020.7d347956.js} +2 -2
  3. package/dist/chunks/8020.7d347956.js.map +1 -0
  4. package/dist/chunks/8272.fcc84aba.js +2 -0
  5. package/dist/chunks/{8600.b65b9474.js.map → 8272.fcc84aba.js.map} +1 -1
  6. package/dist/chunks/eo-diagram.2b8615e9.js +2 -0
  7. package/dist/chunks/{eo-diagram.963f5707.js.map → eo-diagram.2b8615e9.js.map} +1 -1
  8. package/dist/chunks/eo-draw-canvas.0418a178.js +2 -0
  9. package/dist/chunks/eo-draw-canvas.0418a178.js.map +1 -0
  10. package/dist/chunks/{main.391405db.js → main.9d26f349.js} +2 -2
  11. package/dist/chunks/{main.391405db.js.map → main.9d26f349.js.map} +1 -1
  12. package/dist/examples.json +5 -5
  13. package/dist/{index.8e738324.js → index.fa106669.js} +2 -2
  14. package/dist/{index.8e738324.js.map → index.fa106669.js.map} +1 -1
  15. package/dist/manifest.json +94 -77
  16. package/dist/types.json +405 -130
  17. package/dist-types/diagram/lines/getDirectLinePoints.d.ts +2 -2
  18. package/dist-types/draw-canvas/index.d.ts +19 -4
  19. package/dist-types/draw-canvas/interfaces.d.ts +16 -10
  20. package/dist-types/draw-canvas/processors/asserts.d.ts +4 -0
  21. package/dist-types/draw-canvas/reducers/interfaces.d.ts +5 -5
  22. package/docs/eo-draw-canvas.md +56 -18
  23. package/package.json +2 -2
  24. package/dist/chunks/8600.b65b9474.js +0 -2
  25. package/dist/chunks/9380.8d833db1.js.map +0 -1
  26. package/dist/chunks/eo-diagram.963f5707.js +0 -2
  27. package/dist/chunks/eo-draw-canvas.89c9e4a0.js +0 -2
  28. package/dist/chunks/eo-draw-canvas.89c9e4a0.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import type { NodePosition, RenderedNode } from "../interfaces";
2
- export declare function getDirectLinePoints(source: RenderedNode, target: RenderedNode): NodePosition[] | null;
1
+ import type { NodePosition, NodeRect } from "../interfaces";
2
+ export declare function getDirectLinePoints(source: NodeRect, target: NodeRect): NodePosition[] | null;
@@ -3,9 +3,10 @@ import { ReactNextElement } from "@next-core/react-element";
3
3
  import { type UseSingleBrickConf } from "@next-core/react-runtime";
4
4
  import "@next-core/theme";
5
5
  import type { PositionTuple, SizeTuple } from "../diagram/interfaces";
6
- import type { Cell, NodeCell } from "./interfaces";
6
+ import type { Cell, EdgeCell, InitialCell, NodeCell } from "./interfaces";
7
7
  export interface EoDrawCanvasProps {
8
- cells: Cell[] | undefined;
8
+ cells: InitialCell[] | undefined;
9
+ defaultNodeSize?: SizeTuple;
9
10
  }
10
11
  export interface DropNodeInfo extends AddNodeInfo {
11
12
  /** [PointerEvent::clientX, PointerEvent::clientY] */
@@ -13,10 +14,15 @@ export interface DropNodeInfo extends AddNodeInfo {
13
14
  }
14
15
  export interface AddNodeInfo {
15
16
  id: string | number;
16
- data: unknown;
17
17
  useBrick: UseSingleBrickConf;
18
+ data?: unknown;
18
19
  size?: SizeTuple;
19
20
  }
21
+ export interface AddEdgeInfo {
22
+ source: string | number;
23
+ target: string | number;
24
+ data?: unknown;
25
+ }
20
26
  export declare const EoDrawCanvasComponent: React.ForwardRefExoticComponent<EoDrawCanvasComponentProps & React.RefAttributes<DrawCanvasRef>>;
21
27
  /**
22
28
  * 用于手工绘图的画布。
@@ -28,9 +34,11 @@ export declare class EoDrawCanvas extends ReactNextElement implements EoDrawCanv
28
34
  /**
29
35
  * 仅当初始化时使用,渲染后重新设置 `cells` 将无效。
30
36
  */
31
- accessor cells: Cell[] | undefined;
37
+ accessor cells: InitialCell[] | undefined;
38
+ accessor defaultNodeSize: SizeTuple | undefined;
32
39
  dropNode({ id, position, size, data, useBrick, }: DropNodeInfo): Promise<NodeCell | null>;
33
40
  addNodes(nodes: AddNodeInfo[]): Promise<NodeCell[]>;
41
+ addEdge({ source, target, data }: AddEdgeInfo): Promise<EdgeCell>;
34
42
  render(): React.JSX.Element;
35
43
  }
36
44
  export interface EoDrawCanvasComponentProps extends EoDrawCanvasProps {
@@ -39,4 +47,11 @@ export interface EoDrawCanvasComponentProps extends EoDrawCanvasProps {
39
47
  export interface DrawCanvasRef {
40
48
  dropNode(node: NodeCell): void;
41
49
  addNodes(nodes: NodeCell[]): void;
50
+ addEdge(edge: EdgeCell): void;
51
+ }
52
+ export interface EdgeComponentProps {
53
+ edge: EdgeCell;
54
+ cells: Cell[];
55
+ markerEnd: string;
42
56
  }
57
+ export declare function EdgeComponent({ edge, cells, markerEnd, }: EdgeComponentProps): JSX.Element | null;
@@ -1,12 +1,11 @@
1
1
  import type { UseSingleBrickConf } from "@next-core/react-runtime";
2
- export type Cell = ShapeCell | BrickCell;
2
+ export type Cell = NodeCell | EdgeCell;
3
3
  export type ShapeCell = NodeShapeCell;
4
4
  export type BrickCell = NodeBrickCell;
5
5
  export type NodeCell = NodeBrickCell | NodeShapeCell;
6
+ export type EdgeCell = BaseEdgeCell;
6
7
  export type NodeShapeCell = BaseShapeCell & BaseNodeCell;
7
8
  export type NodeBrickCell = BaseBrickCell & BaseNodeCell;
8
- export type EdgeShapeCell = BaseShapeCell & BaseEdgeCell;
9
- export type EdgeBrickCell = BaseBrickCell & BaseEdgeCell;
10
9
  export interface BaseShapeCell extends BaseCell {
11
10
  tag: "shape";
12
11
  shape: string;
@@ -28,21 +27,28 @@ export interface BaseNodeCell extends BaseCell {
28
27
  }
29
28
  export interface BaseEdgeCell extends BaseCell {
30
29
  type: "edge";
31
- source: string;
32
- target: string;
30
+ source: string | number;
31
+ target: string | number;
33
32
  }
34
33
  export interface BaseCell {
35
34
  type: "node" | "edge";
36
35
  tag?: "shape" | "brick";
37
- data: unknown;
38
- view: unknown;
36
+ data?: unknown;
39
37
  }
40
- export interface NodeView {
41
- x: number;
42
- y: number;
38
+ export interface NodeView extends InitialNodeView {
43
39
  width: number;
44
40
  height: number;
45
41
  }
42
+ export interface InitialNodeView {
43
+ x: number;
44
+ y: number;
45
+ width?: number;
46
+ height?: number;
47
+ }
48
+ export type InitialNodeCell = Omit<NodeCell, "view"> & {
49
+ view: InitialNodeView;
50
+ };
51
+ export type InitialCell = InitialNodeCell | EdgeCell;
46
52
  export interface BasicShapeProps {
47
53
  cell: ShapeCell;
48
54
  onMouseEnter?: () => void;
@@ -0,0 +1,4 @@
1
+ import type { Cell, EdgeCell, InitialCell, InitialNodeCell, NodeCell } from "../interfaces";
2
+ export declare function isNodeCell(cell: Cell): cell is NodeCell;
3
+ export declare function isInitialNodeCell(cell: InitialCell): cell is InitialNodeCell;
4
+ export declare function isEdgeCell(cell: Cell): cell is EdgeCell;
@@ -1,8 +1,8 @@
1
- import type { Cell, NodeCell } from "../interfaces";
1
+ import type { Cell, EdgeCell, NodeCell } from "../interfaces";
2
2
  export interface DrawCanvasState {
3
3
  cells: Cell[];
4
4
  }
5
- export type DrawCanvasAction = DropNodeAction | AddNodeAction | AddEdgesAction;
5
+ export type DrawCanvasAction = DropNodeAction | AddNodeAction | AddEdgeAction;
6
6
  export interface DropNodeAction {
7
7
  type: "drop-node";
8
8
  payload: NodeCell;
@@ -11,7 +11,7 @@ export interface AddNodeAction {
11
11
  type: "add-nodes";
12
12
  payload: NodeCell[];
13
13
  }
14
- export interface AddEdgesAction {
15
- type: "add-edges";
16
- payload: unknown;
14
+ export interface AddEdgeAction {
15
+ type: "add-edge";
16
+ payload: EdgeCell;
17
17
  }
@@ -12,6 +12,7 @@ properties:
12
12
  style:
13
13
  display: flex
14
14
  height: 600px
15
+ gap: 1em
15
16
  context:
16
17
  - name: dragging
17
18
  value: null
@@ -19,7 +20,10 @@ children:
19
20
  - brick: div
20
21
  properties:
21
22
  style:
22
- width: 200px
23
+ width: 180px
24
+ display: flex
25
+ flexDirection: column
26
+ gap: 1em
23
27
  children:
24
28
  - brick: eo-button
25
29
  properties:
@@ -55,15 +59,23 @@ children:
55
59
  args:
56
60
  - Added nodes
57
61
  - <% EVENT.detail %>
62
+ - brick: eo-button
63
+ properties:
64
+ textContent: "Add edge: Y => Z"
65
+ events:
66
+ click:
67
+ target: eo-draw-canvas
68
+ method: addEdge
69
+ args:
70
+ - source: Y
71
+ target: Z
58
72
  - brick: hr
59
73
  properties:
60
74
  style:
61
- margin: 1em 0
75
+ width: 100%
62
76
  - brick: h3
63
77
  properties:
64
78
  textContent: Drag nodes below
65
- style:
66
- marginBottom: 1em
67
79
  - brick: :forEach
68
80
  dataSource: |
69
81
  <%
@@ -129,20 +141,46 @@ children:
129
141
  width: 100%
130
142
  height: 100%
131
143
  # Initial nodes only
132
- cells:
133
- - type: node
134
- id: x
135
- data:
136
- name: Node X
137
- view:
138
- x: 300
139
- y: 200
140
- width: 60
141
- height: 60
142
- useBrick:
143
- brick: diagram.experimental-node
144
- properties:
145
- textContent: Node X
144
+ cells: |
145
+ <%
146
+ [
147
+ {
148
+ type: "edge",
149
+ source: "X",
150
+ target: "Y",
151
+ },
152
+ {
153
+ type: "edge",
154
+ source: "X",
155
+ target: "Z",
156
+ },
157
+ ].concat(
158
+ ["X", "Y", "Z"].map((id) => ({
159
+ type: "node",
160
+ id,
161
+ data: {
162
+ name: `Node ${id}`,
163
+ },
164
+ useBrick: {
165
+ brick: "diagram.experimental-node",
166
+ properties: {
167
+ textContent: `Node ${id}`,
168
+ }
169
+ },
170
+ view: {
171
+ x:
172
+ id === "X"
173
+ ? 200 + Math.random() * 200
174
+ : id === "Y"
175
+ ? Math.random() * 300
176
+ : 300 + Math.random() * 300,
177
+ y: (id === "X" ? 0 : 300) + Math.random() * 200,
178
+ width: 60,
179
+ height: 60,
180
+ }
181
+ }))
182
+ )
183
+ %>
146
184
  - brick: diagram.experimental-node
147
185
  properties:
148
186
  usage: dragging
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-bricks/diagram",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "homepage": "https://github.com/easyops-cn/next-bricks/tree/master/bricks/diagram",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,5 +40,5 @@
40
40
  "peerDependencies": {
41
41
  "@next-bricks/icons": "*"
42
42
  },
43
- "gitHead": "ef4df78f4bc2f33e2683fd4310b621a5c8f350df"
43
+ "gitHead": "a7d849545422e957a1c2330f15e1897af2098b85"
44
44
  }
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_next_bricks_diagram=self.webpackChunk_next_bricks_diagram||[]).push([[8600],{8600:(e,t,a)=>{a.r(t);var n,i,l,r,s,c,o,u,d,h,v,p,g,b,m,w,f,k,y,E,M,x,W,N,R,L,C,S,z,D,T,B,O,A,H,I,P,K,Y,X,V,_,j,U,Z,$,q,F,G,J,Q,ee,te,ae,ne,ie,le,re,se=a(123),ce=a(592),oe=a(5866),ue=a(1412),de=a(8644),he=a(5600),ve=a.n(he),pe=a(7672),ge=a(8160),be=(a(48),a(5248)),me=a(1920),we=a(1252),fe=a.n(we),ke=a(7568),ye=a(2504),Ee=a(8996),Me=a(9140),xe=a(3600),We=a(108),Ne=a(4378),Re=a(8276),Le=a(2092),Ce=a(8752),Se=a(4092),ze=a(3784),De=a(3732),Te=a(636),Be=a(6932),Oe=a(4580),Ae=a(9900),He=a(6152),Ie=a(3888),Pe=a(4588),Ke=a(3256),{defineElement:Ye,property:Xe,event:Ve,method:_e}=(0,pe.createDecorators)(),je=(0,he.forwardRef)(Pt);l=[Ye("eo-diagram",{styleTexts:[He.c]})],r=Xe({type:String}),c=Xe({attribute:!1}),u=Xe({attribute:!1}),h=Xe({attribute:!1}),p=Xe({attribute:!1}),b=Xe({attribute:!1}),w=Xe({attribute:!1}),k=Xe({type:Boolean}),E=Xe({attribute:!1}),x=Xe({attribute:!1}),N=Xe({type:Boolean}),L=Xe({type:Boolean}),S=Xe({type:Boolean}),D=Xe({attribute:!1}),B=Ve({type:"activeTarget.change"}),I=Ve({type:"node.delete"}),X=Ve({type:"edge.delete"}),U=Ve({type:"line.click"}),F=Ve({type:"line.dblclick"}),ee=Ve({type:"nodes.connect"}),ie=_e();var Ue=new WeakMap,Ze=new WeakMap,$e=new WeakMap,qe=new WeakMap,Fe=new WeakMap,Ge=new WeakMap,Je=new WeakMap,Qe=new WeakMap,et=new WeakMap,tt=new WeakMap,at=new WeakMap,nt=new WeakMap,it=new WeakMap,lt=new WeakMap,rt=new WeakMap,st=new WeakMap,ct=new WeakMap,ot=new WeakMap,ut=new WeakMap,dt=new WeakMap,ht=new WeakMap,vt=new WeakMap,pt=new WeakMap,gt=new WeakMap,bt=new WeakMap,mt=new WeakMap,wt=new WeakMap,ft=new WeakMap,kt=new WeakMap,yt=new WeakMap,Et=new WeakMap,Mt=new WeakMap,xt=new WeakMap,Wt=new WeakMap;class Nt extends ge.ReactNextElement{constructor(){super(...arguments),(0,se.c)(this,Et,{get:It,set:Ht}),(0,se.c)(this,ft,{get:At,set:Ot}),(0,se.c)(this,bt,{get:Bt,set:Tt}),(0,se.c)(this,vt,{get:Dt,set:zt}),(0,se.c)(this,ut,{get:St,set:Ct}),(0,se.c)(this,st,{get:Lt,set:Rt}),(0,se.c)(this,Ue,{writable:!0,value:(n(this),s(this))}),(0,se.c)(this,Ze,{writable:!0,value:o(this)}),(0,se.c)(this,$e,{writable:!0,value:d(this)}),(0,se.c)(this,qe,{writable:!0,value:v(this)}),(0,se.c)(this,Fe,{writable:!0,value:g(this)}),(0,se.c)(this,Ge,{writable:!0,value:m(this)}),(0,se.c)(this,Je,{writable:!0,value:f(this)}),(0,se.c)(this,Qe,{writable:!0,value:y(this)}),(0,se.c)(this,et,{writable:!0,value:M(this)}),(0,se.c)(this,tt,{writable:!0,value:W(this)}),(0,se.c)(this,at,{writable:!0,value:R(this,!0)}),(0,se.c)(this,nt,{writable:!0,value:C(this,!0)}),(0,se.c)(this,it,{writable:!0,value:z(this,!0)}),(0,se.c)(this,lt,{writable:!0,value:T(this)}),(0,se.c)(this,rt,{writable:!0,value:O(this)}),(0,se.c)(this,ct,{writable:!0,value:e=>{(0,ue.c)(this,st).emit(e)}}),(0,se.c)(this,ot,{writable:!0,value:P(this)}),(0,se.c)(this,dt,{writable:!0,value:e=>{(0,ue.c)(this,ut).emit(e)}}),(0,se.c)(this,ht,{writable:!0,value:V(this)}),(0,se.c)(this,pt,{writable:!0,value:e=>{(0,ue.c)(this,vt).emit(e)}}),(0,se.c)(this,gt,{writable:!0,value:Z(this)}),(0,se.c)(this,mt,{writable:!0,value:e=>{(0,ue.c)(this,bt).emit(e)}}),(0,se.c)(this,wt,{writable:!0,value:G(this)}),(0,se.c)(this,kt,{writable:!0,value:e=>{(0,ue.c)(this,ft).emit(e)}}),(0,se.c)(this,yt,{writable:!0,value:te(this)}),(0,se.c)(this,Mt,{writable:!0,value:e=>{(0,ue.c)(this,Et).emit(e)}}),(0,se.c)(this,xt,{writable:!0,value:e=>{(0,Pe.M)(e,this.activeTarget)||(this.activeTarget=e)}}),(0,se.c)(this,Wt,{writable:!0,value:(0,he.createRef)()})}get layout(){return(0,ue.c)(this,Ue)}set layout(e){(0,oe.c)(this,Ue,e)}get nodes(){return(0,ue.c)(this,Ze)}set nodes(e){(0,oe.c)(this,Ze,e)}get edges(){return(0,ue.c)(this,$e)}set edges(e){(0,oe.c)(this,$e,e)}get nodeBricks(){return(0,ue.c)(this,qe)}set nodeBricks(e){(0,oe.c)(this,qe,e)}get lines(){return(0,ue.c)(this,Fe)}set lines(e){(0,oe.c)(this,Fe,e)}get layoutOptions(){return(0,ue.c)(this,Ge)}set layoutOptions(e){(0,oe.c)(this,Ge,e)}get activeTarget(){return(0,ue.c)(this,Je)}set activeTarget(e){(0,oe.c)(this,Je,e)}get disableKeyboardAction(){return(0,ue.c)(this,Qe)}set disableKeyboardAction(e){(0,oe.c)(this,Qe,e)}get connectNodes(){return(0,ue.c)(this,et)}set connectNodes(e){(0,oe.c)(this,et,e)}get dragNodes(){return(0,ue.c)(this,tt)}set dragNodes(e){(0,oe.c)(this,tt,e)}get zoomable(){return(0,ue.c)(this,at)}set zoomable(e){(0,oe.c)(this,at,e)}get scrollable(){return(0,ue.c)(this,nt)}set scrollable(e){(0,oe.c)(this,nt,e)}get pannable(){return(0,ue.c)(this,it)}set pannable(e){(0,oe.c)(this,it,e)}get scaleRange(){return(0,ue.c)(this,lt)}set scaleRange(e){(0,oe.c)(this,lt,e)}callOnLineLabel(e,t){for(var a,n=arguments.length,i=new Array(n>2?n-2:0),l=2;l<n;l++)i[l-2]=arguments[l];null===(a=(0,ue.c)(this,Wt).current)||void 0===a||a.callOnLineLabel(e,t,...i)}render(){return ve().createElement(je,{ref:(0,ue.c)(this,Wt),layout:this.layout,nodes:this.nodes,edges:this.edges,nodeBricks:this.nodeBricks,lines:this.lines,layoutOptions:this.layoutOptions,connectNodes:this.connectNodes,dragNodes:this.dragNodes,activeTarget:this.activeTarget,disableKeyboardAction:this.disableKeyboardAction,zoomable:this.zoomable,scrollable:this.scrollable,pannable:this.pannable,scaleRange:this.scaleRange,onActiveTargetChange:(0,ue.c)(this,ct),onSwitchActiveTarget:(0,ue.c)(this,xt),onNodeDelete:(0,ue.c)(this,dt),onEdgeDelete:(0,ue.c)(this,pt),onLineClick:(0,ue.c)(this,mt),onLineDoubleClick:(0,ue.c)(this,kt),onNodesConnect:(0,ue.c)(this,Mt)})}}function Rt(e){H(this,e)}function Lt(){return A(this)}function Ct(e){Y(this,e)}function St(){return K(this)}function zt(e){j(this,e)}function Dt(){return _(this)}function Tt(e){q(this,e)}function Bt(){return $(this)}function Ot(e){Q(this,e)}function At(){return J(this)}function Ht(e){ne(this,e)}function It(){return ae(this)}function Pt(e,t){var{layout:a,nodes:n,edges:i,nodeBricks:l,lines:r,layoutOptions:s,connectNodes:c,dragNodes:o,activeTarget:u,disableKeyboardAction:d,zoomable:h,scrollable:v,pannable:p,scaleRange:g,onActiveTargetChange:b,onSwitchActiveTarget:m,onNodeDelete:w,onEdgeDelete:f,onLineClick:k,onLineDoubleClick:y,onNodesConnect:E}=e,[M,x]=(0,he.useState)(!1),[W,N]=(0,he.useState)(0),[R,L]=(0,he.useState)(null),[C,S]=(0,he.useState)(!1),[z,D]=(0,he.useState)(0),[T,B]=(0,he.useState)(null),[O,A]=(0,he.useState)([]),[H,I]=(0,he.useState)(!1),[P,K]=(0,he.useState)({k:1,x:0,y:0}),Y=(0,he.useRef)(new Map),X=(0,he.useRef)(null),V=(0,he.useRef)(null),[_,j]=(0,he.useState)(!1),{userViewReady:U,userViewNodesMap:Z,saveUserView:$}=(0,Ie.y)(null==o?void 0:o.save),[q,F]=(0,he.useState)([0,0]),[G,J]=(0,he.useState)(null),[Q,ee]=(0,he.useState)("initial"),[te,ae]=(0,he.useState)(null);(0,he.useImperativeHandle)(t,(()=>({callOnLineLabel(e,t){for(var a,n=arguments.length,i=new Array(n>2?n-2:0),l=2;l<n;l++)i[l-2]=arguments[l];null==T||null===(a=T.get(e))||void 0===a||null===(a=a.firstElementChild)||void 0===a||a[t](...i)}}))),(0,he.useEffect)((()=>{var e=e=>{(0,Te.w)(e,{nodes:n,nodesRefRepository:R,connectNodes:c,dragNodes:o,scale:P.k,setConnectLineState:J,setConnectLineTo:F,setManualLayoutStatus:ee,setNodeMovement:ae,onSwitchActiveTarget:m,onNodesConnect:E})},t=V.current;return null==t||t.addEventListener("mousedown",e),()=>{null==t||t.removeEventListener("mousedown",e)}}),[n,c,o,P.k,R,E,m]);var{normalizedLines:ne,normalizedLinesMap:ie,markers:le}=(0,he.useMemo)((()=>(0,Ne.K)(i,r)),[i,r]),re=(0,he.useMemo)((()=>ne.flatMap((e=>{var t,a,{line:{text:n,label:i,$id:l},edge:r}=e;return n||i?(i?(t="label",a=[].concat(i)):(t="text",a=[].concat(n)),a.map((e=>{var a;return{[t]:e,id:"".concat(l,"-").concat(null!==(a=e.placement)&&void 0!==a?a:"center"),edge:r}}))):[]}))),[ne]),{nodes:se,edges:ce}=(0,Oe.C)({layout:a,nodes:n,edges:i,manualLayoutStatus:Q,userViewReady:U,userViewNodesMap:Z,nodeMovement:te,nodesRefRepository:R,lineLabelsRefRepository:T,normalizedLinesMap:ie,layoutOptions:s,nodesRenderId:W,lineLabelsRenderId:z});(0,he.useEffect)((()=>{"finished"===Q&&$(se.map((e=>({id:e.id,x:e.x,y:e.y}))))}),[Q]);var oe=(0,he.useMemo)((()=>(0,We.e)(ce,se,ne)),[ne,se,ce]),ue=null!=u?u:null,[de,pe]=(0,he.useState)(ue);(0,he.useEffect)((()=>{pe((e=>(0,Pe.M)(e,ue)?e:ue))}),[ue]);var ge=(0,he.useRef)(!1);(0,he.useEffect)((()=>{ge.current?null==b||b(de):ge.current=!0}),[de,b]),(0,he.useEffect)((()=>{var e=X.current;if(e&&!d){var t=e=>{var t=(0,Me.Y)(e,{renderedNodes:se,activeTarget:de});"delete-node"===(null==t?void 0:t.action)?null==w||w(t.node):"delete-edge"===(null==t?void 0:t.action)?null==f||f(t.edge):"switch-active-node"===(null==t?void 0:t.action)&&t.node&&(null==m||m({type:"node",nodeId:t.node.id}))};return e.addEventListener("keydown",t),()=>{e.removeEventListener("keydown",t)}}}),[de,se,d,m,w,f]);var we=(0,he.useCallback)((e=>{e&&(N((e=>e+1)),L(e)),x((t=>t||!!e))}),[]),He=(0,he.useCallback)((e=>{e&&(D((e=>e+1)),B(e)),S((t=>t||!!e))}),[]),Ye=(0,he.useMemo)((()=>null!=g?g:[Be.WH,Be.Oi]),[g]),Xe=(0,he.useMemo)((()=>(0,me.AT)()),[]);(0,he.useEffect)((()=>{var e=!1;Xe.scaleExtent(h?Ye:[1,1]).on("start",(()=>{e=!1,I(!0)})).on("zoom",(t=>{e=!0,K(t.transform)})).on("end",(()=>{I(!1),e||null==m||m(null)}))}),[m,Ye,h,Xe]),(0,he.useEffect)((()=>{var e=X.current;if(e){var t=(0,be.c)(e),a=()=>{t.on(".zoom",null).on(".zoom.custom",null).on("wheel",null)};if(h||v||p)return(h||v)&&t.on("wheel.zoom.custom",(e=>{e.ctrlKey||(e.stopImmediatePropagation(),v&&(e.preventDefault(),Xe.translateBy(t,e.wheelDeltaX/5,e.wheelDeltaY/5)))})),t.call(Xe).on("wheel",(e=>e.preventDefault())).on("dblclick.zoom",null),p||t.on("mousedown.zoom",null).on("touchstart.zoom",null).on("touchmove.zoom",null).on("touchend.zoom",null),a;a()}}),[p,v,h,Xe]),(0,he.useEffect)((()=>{var e=X.current;if(0!==se.length&&e&&!_){var{k:t,x:a,y:n}=(0,xe.c)(se,{canvasWidth:e.clientWidth,canvasHeight:e.clientHeight,scaleRange:h?Ye:void 0});Xe.transform((0,be.c)(e),new me.O(t,a,n)),j(!0)}}),[_,se,Ye,h,Xe]);var Ve=(0,he.useMemo)((()=>"".concat((0,ke.uniqueId)("diagram-"),"-")),[]),_e="".concat(Ve,"line-arrow-"),je="".concat(Ve,"mask-"),Ue="".concat(Ve,"active-line-");(0,he.useEffect)((()=>{A((e=>(0,De.c)(e,oe,Y.current)))}),[oe]);var[Ze,$e]=ve().useState(new Map);return(0,he.useEffect)((()=>{if(T){(0,Ae.c)(O,T);var e=new ye.c((()=>{$e((0,Ke.E)(O,T))}));for(var t of T.values())e.observe(t);return()=>{e.disconnect()}}}),[z,T,O]),"dagre"!==a&&"force"!==a?ve().createElement("div",null,'Diagram layout not supported: "'.concat(a,'"')):ve().createElement("div",{className:fe()("diagram",{ready:M&&_,grabbing:H,pannable:p}),tabIndex:-1,ref:X},ve().createElement("svg",{width:"100%",height:"100%",className:"lines"},ve().createElement("defs",null,le.map(((e,t)=>{var{type:a,strokeColor:n}=e;return ve().createElement(Ce.y,{key:t,id:"".concat(_e).concat(t),type:a,strokeColor:n})})),[...Ze].map((e=>{var[t,a]=e;return ve().createElement(Se.g,{key:t,lineId:t,rects:a,maskPrefix:je,renderedLineLabels:O})})),ve().createElement("marker",{id:"".concat(Ue,"start"),viewBox:"0 0 8 8",refX:4,refY:4,markerWidth:8,markerHeight:8,orient:"auto"},ve().createElement("path",{d:"M 0.5 0.5 H 7.5 V 7.5 H 0.5 Z",stroke:"var(--palette-gray-7)",strokeWidth:1,fill:"var(--palette-gray-1)"})),ve().createElement("marker",{id:"".concat(Ue,"end"),viewBox:"0 0 14 8",refX:3,refY:4,markerWidth:14,markerHeight:8,orient:"auto"},ve().createElement("path",{d:"M 0.5 1.5 L 5.5 4 L 0.5 6.5 z",stroke:"var(--palette-blue-3)",strokeWidth:1,fill:"var(--palette-blue-3)"}),ve().createElement("path",{d:"M 6.5 0.5 H 13.5 V 7.5 H 6.5 Z",stroke:"var(--palette-gray-7)",strokeWidth:1,fill:"var(--palette-gray-1)"}))),ve().createElement("g",{transform:"translate(".concat(P.x," ").concat(P.y,") scale(").concat(P.k,")")},oe.map((e=>ve().createElement(Le.k,{key:e.line.$id,line:e,linePaths:Y.current,lineMaskRects:Ze,maskPrefix:je,markerPrefix:_e,activeLineMarkerPrefix:Ue,active:"edge"===(null==de?void 0:de.type)&&de.edge.source===e.edge.source&&de.edge.target===e.edge.target,activeRelated:"node"===(null==de?void 0:de.type)&&(e.edge.source===de.nodeId||e.edge.target===de.nodeId),onLineClick:k,onLineDoubleClick:y}))))),ve().createElement("div",{className:fe()("line-labels",{ready:C}),style:{left:P.x,top:P.y,transform:"scale(".concat(P.k,")")}},ve().createElement(Re.Ar,{labels:re,onRendered:He})),ve().createElement("div",{className:"nodes",ref:V,style:{left:P.x,top:P.y,transform:"scale(".concat(P.k,")")}},ve().createElement(Ee._,{nodes:n,nodeBricks:l,onRendered:we})),ve().createElement(ze.E,{connectLineState:G,connectLineTo:q,markerPrefix:_e}))}le=Nt,({e:[s,o,d,v,g,m,f,y,M,W,R,C,z,T,O,A,H,P,K,Y,V,_,j,Z,$,q,G,J,Q,te,ae,ne,n],c:[re,i]}=(0,de.c)(le,[[r,1,"layout"],[c,1,"nodes"],[u,1,"edges"],[h,1,"nodeBricks"],[p,1,"lines"],[b,1,"layoutOptions"],[w,1,"activeTarget"],[k,1,"disableKeyboardAction"],[E,1,"connectNodes"],[x,1,"dragNodes"],[N,1,"zoomable"],[L,1,"scrollable"],[S,1,"pannable"],[D,1,"scaleRange"],[B,1,"activeTargetChangeEvent",e=>(0,ue.c)(e,rt),(e,t)=>(0,oe.c)(e,rt,t)],[I,1,"nodeDelete",e=>(0,ue.c)(e,ot),(e,t)=>(0,oe.c)(e,ot,t)],[X,1,"edgeDelete",e=>(0,ue.c)(e,ht),(e,t)=>(0,oe.c)(e,ht,t)],[U,1,"lineClick",e=>(0,ue.c)(e,gt),(e,t)=>(0,oe.c)(e,gt,t)],[F,1,"lineDoubleClick",e=>(0,ue.c)(e,wt),(e,t)=>(0,oe.c)(e,wt,t)],[ee,1,"connectNodes",e=>(0,ue.c)(e,yt),(e,t)=>(0,oe.c)(e,yt,t)],[ie,2,"callOnLineLabel"]],l,0,(e=>Wt.has((0,ce.c)(e))),ge.ReactNextElement)),i();var Kt,Yt,Xt,Vt,_t,jt,Ut,Zt,$t,qt,Ft,Gt,Jt,Qt,ea,ta,aa,na,ia=a(7518),{defineElement:la,property:ra,event:sa,method:ca}=(0,pe.createDecorators)(),oa=(0,he.forwardRef)(xa);Xt=[la("diagram.editable-label",{styleTexts:[ia.c]})],Vt=ra(),jt=ra({render:!1}),Zt=sa({type:"label.editing.change"}),Gt=sa({type:"label.change"}),ta=ca();var ua=new WeakMap,da=new WeakMap,ha=new WeakMap,va=new WeakMap,pa=new WeakMap,ga=new WeakMap,ba=new WeakMap,ma=new WeakMap,wa=new WeakMap;class fa extends ge.ReactNextElement{constructor(){super(...arguments),(0,se.c)(this,ba,{get:Ma,set:Ea}),(0,se.c)(this,va,{get:ya,set:ka}),(0,se.c)(this,ua,{writable:!0,value:(Kt(this),_t(this))}),(0,se.c)(this,da,{writable:!0,value:Ut(this)}),(0,se.c)(this,ha,{writable:!0,value:$t(this)}),(0,se.c)(this,pa,{writable:!0,value:e=>{(0,ue.c)(this,va).emit(e)}}),(0,se.c)(this,ga,{writable:!0,value:Jt(this)}),(0,se.c)(this,ma,{writable:!0,value:e=>{(0,ue.c)(this,ba).emit(e)}}),(0,se.c)(this,wa,{writable:!0,value:(0,he.createRef)()})}get label(){return(0,ue.c)(this,ua)}set label(e){(0,oe.c)(this,ua,e)}get type(){return(0,ue.c)(this,da)}set type(e){(0,oe.c)(this,da,e)}enableEditing(){var e;null===(e=(0,ue.c)(this,wa).current)||void 0===e||e.enableEditing()}render(){return ve().createElement(oa,{ref:(0,ue.c)(this,wa),label:this.label,onLabelEditingChange:(0,ue.c)(this,pa),onLabelChange:(0,ue.c)(this,ma)})}}function ka(e){Ft(this,e)}function ya(){return qt(this)}function Ea(e){ea(this,e)}function Ma(){return Qt(this)}function xa(e,t){var{label:a,onLabelChange:n,onLabelEditingChange:i}=e,l=null!=a?a:"",[r,s]=(0,he.useState)(l),[c,o]=(0,he.useState)(!1),u=(0,he.useRef)(!1),[d,h]=(0,he.useState)(!1),v=(0,he.useRef)(null);(0,he.useImperativeHandle)(t,(()=>({enableEditing(){o(!0)}}))),(0,he.useEffect)((()=>{s(l)}),[l]);var p=(0,he.useCallback)((e=>{e.preventDefault(),e.stopPropagation(),o(!0)}),[]);(0,he.useEffect)((()=>{var e,t;c&&(null===(e=v.current)||void 0===e||e.focus({preventScroll:!0}),null===(t=v.current)||void 0===t||t.select())}),[c]),(0,he.useEffect)((()=>{u.current?null==i||i(c):u.current=!0}),[c,i]);var g=(0,he.useCallback)((e=>{s(e.target.value)}),[]),b=(0,he.useCallback)((e=>{var t,a=e.key||e.keyCode||e.which;"Enter"!==a&&13!==a||null===(t=v.current)||void 0===t||t.blur()}),[]),m=(0,he.useCallback)((()=>{o(!1),h(!0)}),[]);(0,he.useEffect)((()=>{d&&(null==n||n(r),h(!1))}),[r,n,d]);var w=(0,he.useCallback)((e=>{e.stopPropagation()}),[]);return ve().createElement("div",{className:fe()("label",{editing:c,empty:!r}),onDoubleClick:w,onMouseDown:w},ve().createElement("input",{className:"label-input",value:r,ref:v,onChange:g,onKeyDown:b,onBlur:m}),ve().createElement("div",{className:"label-text",onDoubleClick:p},r))}aa=fa,({e:[_t,Ut,$t,qt,Ft,Jt,Qt,ea,Kt],c:[na,Yt]}=(0,de.c)(aa,[[Vt,1,"label"],[jt,1,"type"],[Zt,1,"labelEditingChange",e=>(0,ue.c)(e,ha),(e,t)=>(0,oe.c)(e,ha,t)],[Gt,1,"labelChange",e=>(0,ue.c)(e,ga),(e,t)=>(0,oe.c)(e,ga,t)],[ta,2,"enableEditing"]],Xt,0,(e=>wa.has((0,ce.c)(e))),ge.ReactNextElement)),Yt();var Wa,Na,Ra,La,Ca,Sa,za,Da,Ta,Ba,Oa=a(4412),Aa=a(640),Ha=a(8944),Ia=a(6196),Pa=(Wa={cells:(e,t)=>{switch(t.type){case"drop-node":return[...e,t.payload];case"add-nodes":return[...e,...t.payload]}return e}},(e,t)=>Object.fromEntries(Object.entries(Wa).map((a=>{var[n,i]=a;return[n,i(e[n],t)]})))),Ka=a(7584),Ya=["size"],Xa=20,{defineElement:Va,property:_a,method:ja}=(0,pe.createDecorators)(),Ua=ve().forwardRef(Fa);La=[Va("eo-draw-canvas",{styleTexts:[Ka.c]})],Ca=_a({attribute:!1}),za=ja(),Da=ja();var Za=new WeakMap,$a=new WeakMap;class qa extends ge.ReactNextElement{constructor(){super(...arguments),(0,se.c)(this,Za,{writable:!0,value:(Na(this),Sa(this))}),(0,se.c)(this,$a,{writable:!0,value:(0,he.createRef)()})}get cells(){return(0,ue.c)(this,Za)}set cells(e){(0,oe.c)(this,Za,e)}dropNode(e){var t=this;return(0,Ha.c)((function*(){var a,n,{id:i,position:l,size:r,data:s,useBrick:c}=e;if(null===(a=(n=document).elementsFromPoint)||void 0===a||null===(a=a.call(n,l[0],l[1]))||void 0===a?void 0:a.includes(t)){var o,u,d,h=t.getBoundingClientRect(),v={type:"node",id:i,view:{x:l[0]-h.left,y:l[1]-h.top,width:null!==(o=null==r?void 0:r[0])&&void 0!==o?o:Xa,height:null!==(u=null==r?void 0:r[1])&&void 0!==u?u:Xa},data:s,useBrick:c};return null===(d=(0,ue.c)(t,$a).current)||void 0===d||d.dropNode(v),v}return null}))()}addNodes(e){var t=this;return(0,Ha.c)((function*(){var a,n,i,l,r;if(0===e.length)return[];var s=e[0],c=null!==(a=null===(n=s.size)||void 0===n?void 0:n[0])&&void 0!==a?a:Xa,o=null!==(i=null===(l=s.size)||void 0===l?void 0:l[1])&&void 0!==i?i:Xa,u=Math.floor(600/(o+20)),d=e.map(((e,t)=>{var a,n,{size:i}=e,l=(0,Aa.c)(e,Ya);return(0,Oa.c)((0,Oa.c)({},l),{},{type:"node",view:{x:Math.floor(t/u)*(c+20)+20,y:t%u*(o+20)+20,width:null!==(a=null==i?void 0:i[0])&&void 0!==a?a:Xa,height:null!==(n=null==i?void 0:i[1])&&void 0!==n?n:Xa}})}));return null===(r=(0,ue.c)(t,$a).current)||void 0===r||r.addNodes(d),d}))()}render(){return ve().createElement(Ua,{ref:(0,ue.c)(this,$a),cells:this.cells})}}function Fa(e,t){var{cells:a}=e,[{cells:n},i]=(0,he.useReducer)(Pa,{cells:null!=a?a:[]});return(0,he.useImperativeHandle)(t,(()=>({dropNode(e){i({type:"drop-node",payload:e})},addNodes(e){i({type:"add-nodes",payload:e})}})),[]),ve().createElement("svg",{width:800,height:600},ve().createElement("g",null,n.map(((e,t)=>e.useBrick?ve().createElement("foreignObject",{key:t,x:e.view.x,y:e.view.y,width:e.view.width,height:e.view.height,style:{overflow:"visible"}},ve().createElement(Ia.ReactUseBrick,{useBrick:e.useBrick})):null))))}Ta=qa,({e:[Sa,Na],c:[Ba,Ra]}=(0,de.c)(Ta,[[Ca,1,"cells"],[za,2,"dropNode"],[Da,2,"addNodes"]],La,0,void 0,ge.ReactNextElement)),Ra();var Ga,Ja,Qa,en,tn,an,nn,ln,rn,sn,cn,on,un,dn,hn,vn,pn,gn,bn,mn=a(3704),{defineElement:wn,property:fn,event:kn}=(0,pe.createDecorators)();Qa=[wn("diagram.experimental-node",{styleTexts:[mn.c]})],en=fn(),an=kn({type:"drag.start"}),sn=kn({type:"drag.move"}),dn=kn({type:"drag.end"});var yn=new WeakMap,En=new WeakMap,Mn=new WeakMap,xn=new WeakMap,Wn=new WeakMap,Nn=new WeakMap,Rn=new WeakMap,Ln=new WeakMap,Cn=new WeakMap,Sn=new WeakMap;class zn extends ge.ReactNextElement{constructor(){super(...arguments),(0,se.c)(this,Cn,{get:Hn,set:An}),(0,se.c)(this,Nn,{get:On,set:Bn}),(0,se.c)(this,Mn,{get:Tn,set:Dn}),(0,se.c)(this,yn,{writable:!0,value:(Ga(this),tn(this))}),(0,se.c)(this,En,{writable:!0,value:nn(this)}),(0,se.c)(this,xn,{writable:!0,value:e=>{(0,ue.c)(this,Mn).emit(e)}}),(0,se.c)(this,Wn,{writable:!0,value:cn(this)}),(0,se.c)(this,Rn,{writable:!0,value:e=>{(0,ue.c)(this,Nn).emit(e)}}),(0,se.c)(this,Ln,{writable:!0,value:hn(this)}),(0,se.c)(this,Sn,{writable:!0,value:e=>{(0,ue.c)(this,Cn).emit(e)}})}get usage(){return(0,ue.c)(this,yn)}set usage(e){(0,oe.c)(this,yn,e)}render(){return ve().createElement(In,{usage:this.usage,onDragStart:(0,ue.c)(this,xn),onDragMove:(0,ue.c)(this,Rn),onDragEnd:(0,ue.c)(this,Sn)})}}function Dn(e){rn(this,e)}function Tn(){return ln(this)}function Bn(e){un(this,e)}function On(){return on(this)}function An(e){pn(this,e)}function Hn(){return vn(this)}function In(e){var{usage:t,onDragStart:a,onDragMove:n,onDragEnd:i}=e,l=(0,he.useCallback)((e=>{if("library"===t){e.stopPropagation(),e.preventDefault();var l=[e.clientX,e.clientY],r=!1,s=e=>{r||(r=(e.clientX-l[0])**2+(e.clientY-l[1])**2>=9)&&(null==a||a([e.clientX,e.clientY])),r&&(null==n||n([e.clientX,e.clientY]))},c=e=>{document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",c),r&&(null==i||i([e.clientX,e.clientY]))};document.addEventListener("mousemove",s),document.addEventListener("mouseup",c)}}),[i,n,a,t]);return ve().createElement("div",{onMouseDown:l},ve().createElement("slot",null))}gn=zn,({e:[tn,nn,ln,rn,cn,on,un,hn,vn,pn,Ga],c:[bn,Ja]}=(0,de.c)(gn,[[en,1,"usage"],[an,1,"dragStartEvent",e=>(0,ue.c)(e,En),(e,t)=>(0,oe.c)(e,En,t)],[sn,1,"dragMoveEvent",e=>(0,ue.c)(e,Wn),(e,t)=>(0,oe.c)(e,Wn,t)],[dn,1,"dragEndEvent",e=>(0,ue.c)(e,Ln),(e,t)=>(0,oe.c)(e,Ln,t)]],Qa,0,(e=>Sn.has((0,ce.c)(e))),ge.ReactNextElement)),Ja()},7584:(e,t,a)=>{a.d(t,{c:()=>s});var n=a(8304),i=a.n(n),l=a(1849),r=a.n(l)()(i());r.push([e.id,"*{box-sizing:border-box}:host{display:block;background:var(--palette-gray-2);position:relative}:host([hidden]){display:none}",""]);const s=r.toString()},7518:(e,t,a)=>{a.d(t,{c:()=>s});var n=a(8304),i=a.n(n),l=a(1849),r=a.n(l)()(i());r.push([e.id,':host{display:block;--local-label-line-height:inherit;--local-label-font-size:inherit;--local-label-color:inherit;--local-label-font-weight:inherit}:host([hidden]){display:none}:host([type="line"]){--local-label-line-height:18px;--local-label-font-size:11px;--local-label-color:var(--color-secondary-text);--local-label-font-weight:400}*{box-sizing:border-box}.label{max-width:168px;margin:-3px}.label-text,\n.label-input{width:100%;height:24px;padding:3px;border:none;line-height:var(--local-label-line-height);font-size:var(--local-label-font-size);color:var(--local-label-color);font-weight:var(--local-label-font-weight);text-align:center;font-family:inherit;cursor:text;-webkit-user-select:text;-moz-user-select:text;user-select:text}.label-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.label.editing .label-text,\n.label.empty:not(.editing) .label-text,\n.label:not(.editing) .label-input{display:none}',""]);const s=r.toString()},3704:(e,t,a)=>{a.d(t,{c:()=>s});var n=a(8304),i=a.n(n),l=a(1849),r=a.n(l)()(i());r.push([e.id,'*{box-sizing:border-box}:host{display:block;border:1px solid var(--palette-gray-5);cursor:default}:host([hidden]){display:none}:host([usage="dragging"]){opacity:0.75;position:fixed}:host(:not([usage="library"])){background:var(--palette-gray-3);width:60px;height:60px}:host([usage="library"]){width:180px;height:30px;margin-bottom:10px}div{width:100%;height:100%;display:flex;align-items:center;justify-content:center}',""]);const s=r.toString()}}]);
2
- //# sourceMappingURL=8600.b65b9474.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunks/9380.8d833db1.js","mappings":"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","sources":["webpack:///./src/diagram/ConnectLineComponent.tsx","webpack:///./src/diagram/LineComponent.tsx","webpack:///./src/diagram/LineLabelComponent.tsx","webpack:///./src/diagram/LineMaskComponent.tsx","webpack:///./src/diagram/MarkerComponent.tsx","webpack:///./src/diagram/NodeComponent.tsx","webpack:///./src/diagram/processors/findNodeBrick.ts","webpack:///./src/diagram/constants.ts","webpack:///./src/diagram/processors/adjustNodesSize.ts","webpack:///./src/diagram/processors/adjustNodesPosition.ts","webpack:///./src/diagram/processors/extractPartialRectTuple.ts","webpack:///./src/diagram/processors/getRenderedEdges.ts","webpack:///./src/diagram/processors/getForceGraph.ts","webpack:///./src/diagram/hooks/useRenderedDiagram.ts","webpack:///./src/diagram/processors/getDagreGraph.ts","webpack:///./src/diagram/processors/getManualGraph.ts","webpack:///./src/diagram/hooks/useUserView.ts","webpack:///./src/diagram/processors/createAsyncQueue.ts","webpack:///./src/diagram/processors/adjustLineLabels.ts","webpack:///./src/diagram/processors/getLineMaskRects.ts","webpack:///./src/diagram/processors/getRenderedLineLabels.ts","webpack:///./src/diagram/lines/curveLine.ts","webpack:///./src/diagram/processors/doTwoNodesOverlap.ts","webpack:///./src/diagram/lines/getPolyLinePoints.ts","webpack:///./src/diagram/processors/getRenderedLines.ts","webpack:///./src/diagram/lines/getDirectLinePoints.ts","webpack:///./src/diagram/processors/handleKeyboard.ts","webpack:///./src/diagram/processors/handleNodesMouseDown.ts","webpack:///./src/diagram/processors/normalizeLinesAndMarkers.ts","webpack:///./src/diagram/processors/matchEdgeByFilter.ts","webpack:///./src/diagram/processors/sameTarget.ts","webpack:///./src/diagram/processors/transformToCenter.ts","webpack:///./src/diagram/styles.shadow.css"],"sourcesContent":["import React from \"react\";\nimport classNames from \"classnames\";\nimport type { ConnectLineState, PositionTuple } from \"./interfaces\";\nimport { MarkerComponent } from \"./MarkerComponent\";\n\nexport interface ConnectLineComponentProps {\n connectLineState: ConnectLineState | null;\n connectLineTo: PositionTuple;\n markerPrefix: string;\n}\n\nexport function ConnectLineComponent({\n connectLineState,\n connectLineTo,\n markerPrefix,\n}: ConnectLineComponentProps): JSX.Element {\n return (\n <svg\n width=\"100%\"\n height=\"100%\"\n className={classNames(\"connect-line\", {\n connecting:\n !!connectLineState &&\n // Do not show when the distance of mouse move is less than 5px\n (connectLineTo[0] - connectLineState.from[0]) ** 2 +\n (connectLineTo[1] - connectLineState.from[1]) ** 2 >\n 25,\n })}\n >\n <defs>\n <MarkerComponent\n type=\"arrow\"\n id={`${markerPrefix}connect-line`}\n strokeColor={connectLineState?.options.strokeColor}\n />\n </defs>\n <path\n d={\n connectLineState\n ? `M${connectLineState.from.join(\" \")}L${connectLineTo.join(\" \")}`\n : \"\"\n }\n fill=\"none\"\n stroke={connectLineState?.options.strokeColor}\n strokeWidth={connectLineState?.options.strokeWidth}\n markerEnd={\n connectLineState?.options.arrow\n ? `url(#${markerPrefix}connect-line)`\n : undefined\n }\n />\n </svg>\n );\n}\n","import React from \"react\";\nimport classNames from \"classnames\";\nimport type { LineTarget, RenderedLine, LineMaskRects } from \"./interfaces\";\n\nexport interface LineComponentProps {\n line: RenderedLine;\n linePaths: Map<string, SVGPathElement | null>;\n lineMaskRects: LineMaskRects;\n maskPrefix: string;\n markerPrefix: string;\n activeLineMarkerPrefix: string;\n active?: boolean;\n activeRelated?: boolean;\n onLineClick?(line: LineTarget): void;\n onLineDoubleClick?(line: LineTarget): void;\n}\n\nexport function LineComponent({\n line: { line, edge, d, markers },\n linePaths,\n lineMaskRects,\n maskPrefix,\n markerPrefix,\n activeLineMarkerPrefix,\n active,\n activeRelated,\n onLineClick,\n onLineDoubleClick,\n}: LineComponentProps): JSX.Element {\n const mask = lineMaskRects.has(line.$id)\n ? `url(#${maskPrefix}${line.$id})`\n : undefined;\n\n const { strokeColor, strokeWidth, interactStrokeWidth } = {\n ...line,\n ...(active\n ? line.overrides?.active\n : activeRelated\n ? line.overrides?.activeRelated\n : null),\n };\n\n const expectVariant = active\n ? \"active\"\n : activeRelated\n ? \"active-related\"\n : \"default\";\n\n let markerStart: string | undefined;\n let markerEnd: string | undefined;\n\n for (const marker of markers) {\n if (marker.variant === expectVariant) {\n if (marker.placement === \"start\") {\n markerStart = `url(#${markerPrefix}${marker.index})`;\n } else {\n markerEnd = `url(#${markerPrefix}${marker.index})`;\n }\n }\n }\n\n return (\n <g\n className={classNames(\"line\", {\n interactable: line.interactable,\n active,\n \"active-related\": activeRelated,\n })}\n onClick={\n line.interactable\n ? () => {\n onLineClick?.({ id: line.$id, edge });\n }\n : undefined\n }\n onDoubleClick={\n line.interactable\n ? (e) => {\n e.preventDefault();\n e.stopPropagation();\n onLineDoubleClick?.({ id: line.$id, edge });\n }\n : undefined\n }\n style={{ cursor: line.cursor }}\n >\n {line.interactable && (\n <path\n // This `path` is made for expanding interaction area of graph lines.\n d={d}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={interactStrokeWidth}\n />\n )}\n <path\n ref={(element) => linePaths.set(line.$id, element)}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n d={d}\n fill=\"none\"\n markerStart={markerStart}\n markerEnd={markerEnd}\n mask={mask}\n />\n <path\n stroke=\"var(--palette-blue-3)\"\n strokeWidth={strokeWidth}\n d={d}\n fill=\"none\"\n className=\"active-bg\"\n markerStart={`url(#${activeLineMarkerPrefix}start)`}\n markerEnd={`url(#${activeLineMarkerPrefix}end)`}\n mask={mask}\n />\n </g>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport { checkIfByTransform } from \"@next-core/runtime\";\nimport type {\n DiagramEdge,\n LineLabelConf,\n // PositionTuple,\n RefRepository,\n LineLabel,\n TextOptions,\n} from \"./interfaces\";\n\nexport interface LineLabelComponentGroupProps {\n labels?: LineLabel[];\n onRendered?: (refRepository: RefRepository | null) => void;\n}\n\nexport function LineLabelComponentGroup({\n labels,\n onRendered,\n}: LineLabelComponentGroupProps): JSX.Element {\n const [rendered, setRendered] = useState(false);\n const [renderedIds, setRenderedIds] = useState<string[]>([]);\n const refRepository = useMemo<RefRepository>(() => new Map(), []);\n\n const handleRenderer = useCallback(\n (id: string, element: HTMLElement | null) => {\n if (element) {\n refRepository.set(id, element);\n }\n setRenderedIds((previous) =>\n previous.includes(id) ? previous : previous.concat(id)\n );\n },\n [refRepository]\n );\n\n const handleUnmount = useCallback(\n (id: string) => {\n setRenderedIds((previous) => {\n const index = previous.indexOf(id);\n return index === -1\n ? previous\n : previous.slice(0, index).concat(previous.slice(index + 1));\n });\n refRepository.delete(id);\n },\n [refRepository]\n );\n\n useEffect(() => {\n // All nodes have been rendered.\n setRendered(!labels?.some((label) => !renderedIds.includes(label.id)));\n }, [labels, renderedIds]);\n\n useEffect(\n () => {\n onRendered?.(rendered ? refRepository : null);\n },\n // Dot not re-run effect when `onRendered` changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [/* onRendered, */ refRepository, rendered]\n );\n\n return (\n <React.Fragment>\n {labels?.map(({ text, label, /* position, */ id, edge }) =>\n label ? (\n <div\n key={id}\n className=\"line-label\"\n // style={{\n // left: position[0],\n // top: position[1],\n // }}\n >\n <LineLabelComponent\n id={id}\n edge={edge}\n label={label}\n onRendered={handleRenderer}\n onUnmount={handleUnmount}\n />\n </div>\n ) : (\n <LineTextComponent\n key={id}\n id={id}\n text={text!}\n // position={position}\n onRendered={handleRenderer}\n />\n )\n )}\n </React.Fragment>\n );\n}\n\nexport interface LineTextComponentProps {\n id: string;\n text: TextOptions;\n // position: PositionTuple;\n onRendered?: (id: string, element: HTMLElement | null) => void;\n // onUnmount?: (id: string) => void;\n}\n\nexport function LineTextComponent({\n id,\n text,\n // position,\n onRendered /* , onUnmount */,\n}: LineTextComponentProps): JSX.Element {\n const refCallback = useCallback(\n (element: HTMLDivElement) => {\n onRendered?.(id, element);\n },\n [id, onRendered]\n );\n\n return (\n <div\n className=\"line-label\"\n ref={refCallback}\n // style={{\n // left: position[0],\n // top: position[1],\n // ...text!.style,\n // }}\n style={text.style}\n >\n {text!.content}\n </div>\n );\n}\n\n// export const LineLabelComponentGroup = React.memo(LegacyLineLabelComponentGroup);\n\nexport interface LineLabelComponentProps {\n id: string;\n edge: DiagramEdge;\n label: LineLabelConf;\n onRendered?: (id: string, element: HTMLElement | null) => void;\n onUnmount?: (id: string) => void;\n}\n\nexport function LineLabelComponent({\n id,\n edge,\n label,\n onRendered,\n onUnmount,\n}: LineLabelComponentProps): JSX.Element | null {\n const useBrick = useMemo(\n () => (checkIfByTransform(label, { edge }) ? label.useBrick : null),\n [edge, label]\n );\n\n const memoizedData = useMemo(() => ({ edge }), [edge]);\n\n useEffect(() => {\n if (!useBrick) {\n // Keep the same time delay for reporting rendered.\n setTimeout(() => {\n onRendered?.(id, null);\n });\n }\n }, [id, onRendered, useBrick]);\n\n useEffect(\n () => {\n return () => {\n onUnmount?.(id);\n };\n },\n // Only unmount once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const refCallback = useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n // Todo: correctly wait for `useBrick` in v3 to be rendered (after layout)\n // Wait a macro task to let `useBrick` to be rendered.\n setTimeout(() => {\n onRendered?.(id, element.parentElement);\n });\n }\n },\n [id, onRendered]\n );\n\n const ignoredCallback = useCallback(() => {\n setTimeout(() => {\n onRendered?.(id, null);\n });\n }, [id, onRendered]);\n\n if (!useBrick) {\n return null;\n }\n\n return (\n <ReactUseBrick\n refCallback={refCallback}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore For v3 only\n ignoredCallback={ignoredCallback}\n useBrick={useBrick}\n data={memoizedData}\n />\n );\n}\n","import React from \"react\";\nimport type { RenderedLineLabel, SimpleRect } from \"./interfaces\";\n\nexport interface LineMaskComponentProps {\n maskPrefix: string;\n lineId: string;\n rects: SimpleRect[];\n renderedLineLabels: RenderedLineLabel[];\n}\n\nexport function LineMaskComponent({\n lineId,\n rects,\n maskPrefix,\n renderedLineLabels,\n}: LineMaskComponentProps): JSX.Element | null {\n const lineText = renderedLineLabels.find(\n (item) => item.lineId === lineId && item.placement === \"center\"\n );\n // istanbul ignore next\n if (!lineText) {\n return null;\n }\n const { lineRect } = lineText;\n const bgRect = getRectWithPadding(lineRect, 1000);\n return (\n <mask\n id={`${maskPrefix}${lineId}`}\n x={bgRect.left}\n y={bgRect.top}\n width={bgRect.width}\n height={bgRect.height}\n >\n <rect\n x={bgRect.left}\n y={bgRect.top}\n width={bgRect.width}\n height={bgRect.height}\n // Everything under a white pixel will be visible\n fill=\"white\"\n />\n {rects.map((rect, index) => (\n <rect\n key={index}\n x={rect.left}\n y={rect.top}\n width={rect.width}\n height={rect.height}\n // Everything under a black pixel will be invisible\n fill=\"black\"\n />\n ))}\n </mask>\n );\n}\n\nfunction getRectWithPadding(rect: SimpleRect, padding: number): SimpleRect {\n return {\n left: rect.left - padding,\n top: rect.top - padding,\n width: rect.width + padding * 2,\n height: rect.height + padding * 2,\n };\n}\n","import React from \"react\";\nimport type { LineMarkerType } from \"./interfaces\";\n\nexport interface MarkerComponentProps extends BaseMarkerComponentProps {\n type: LineMarkerType;\n}\n\nexport interface BaseMarkerComponentProps {\n id: string;\n strokeColor?: string;\n}\n\nexport function MarkerComponent({\n id,\n type,\n strokeColor,\n}: MarkerComponentProps): JSX.Element {\n let Component: (props: BaseMarkerComponentProps) => JSX.Element;\n\n switch (type) {\n case \"0..1\":\n Component = EntityRelationZeroOrOneMarker;\n break;\n case \"0..N\":\n Component = EntityRelationZeroOrManyMarker;\n break;\n default:\n Component = ArrowMarker;\n }\n\n return <Component id={id} strokeColor={strokeColor} />;\n}\n\nfunction ArrowMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 6 6\"\n refX={5}\n refY={3}\n markerWidth={6}\n markerHeight={6}\n orient=\"auto-start-reverse\"\n strokeLinejoin=\"round\"\n >\n <path\n d=\"M 0.5 0.5 L 5.5 3 L 0.5 5.5 z\"\n stroke={strokeColor}\n strokeWidth={1}\n fill={strokeColor}\n />\n </marker>\n );\n}\n\nfunction EntityRelationZeroOrOneMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 21 11\"\n refX={0.5}\n refY={5.5}\n markerWidth={21}\n markerHeight={11}\n orient=\"auto-start-reverse\"\n >\n <path\n d=\"M 5.5 5.5 m 5 0 a 5 5 0 1 0 -10 0 a 5 5 0 1 0 10 0 M 15.5 0.5 V 10.5 M 10.5 5.5 H 20.5\"\n stroke={strokeColor}\n strokeWidth={1}\n fill=\"none\"\n />\n </marker>\n );\n}\n\nfunction EntityRelationZeroOrManyMarker({\n id,\n strokeColor,\n}: BaseMarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 21 11\"\n refX={0.5}\n refY={5.5}\n markerWidth={21}\n markerHeight={11}\n orient=\"auto-start-reverse\"\n >\n <path\n d=\"M 5.5 5.5 m 5 0 a 5 5 0 1 0 -10 0 a 5 5 0 1 0 10 0 M 20.5 0.5 L 10.5 5.5 L 20.5 10.5 M 10.5 5.5 H 20.5\"\n stroke={strokeColor}\n strokeWidth={1}\n fill=\"none\"\n />\n </marker>\n );\n}\n","import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ReactUseBrick } from \"@next-core/react-runtime\";\nimport type {\n DiagramNode,\n DiagramNodeId,\n NodeBrickConf,\n RefRepository,\n} from \"./interfaces\";\nimport { findNodeBrick } from \"./processors/findNodeBrick\";\n\nexport interface NodeComponentGroupProps {\n nodes?: DiagramNode[];\n nodeBricks?: NodeBrickConf[];\n onRendered?: (refRepository: RefRepository | null) => void;\n}\n\nexport function NodeComponentGroup({\n nodes,\n nodeBricks,\n onRendered,\n}: NodeComponentGroupProps): JSX.Element {\n const [rendered, setRendered] = useState(false);\n const [renderedIds, setRenderedIds] = useState<DiagramNodeId[]>([]);\n const refRepository = useMemo<RefRepository>(() => new Map(), []);\n\n const handleRenderer = useCallback(\n (id: DiagramNodeId, element: HTMLElement | null) => {\n if (element) {\n refRepository.set(id, element);\n }\n setRenderedIds((previous) =>\n previous.includes(id) ? previous : previous.concat(id)\n );\n },\n [refRepository]\n );\n\n const handleUnmount = useCallback(\n (id: DiagramNodeId) => {\n setRenderedIds((previous) => {\n const index = previous.indexOf(id);\n return index === -1\n ? previous\n : previous.slice(0, index).concat(previous.slice(index + 1));\n });\n refRepository.delete(id);\n },\n [refRepository]\n );\n\n useEffect(() => {\n // All nodes have been rendered.\n setRendered(!nodes?.some((node) => !renderedIds.includes(node.id)));\n }, [nodes, renderedIds]);\n\n useEffect(\n () => {\n onRendered?.(rendered ? refRepository : null);\n },\n // Dot not re-run effect when `onRendered` changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [/* onRendered, */ refRepository, rendered]\n );\n\n return (\n <React.Fragment>\n {nodes?.map((node) => (\n <div key={node.id} className=\"node\">\n <NodeComponent\n nodeBricks={nodeBricks}\n node={node}\n onRendered={handleRenderer}\n onUnmount={handleUnmount}\n />\n </div>\n ))}\n </React.Fragment>\n );\n}\n\nexport interface NodeComponentProps {\n node: DiagramNode;\n nodeBricks?: NodeBrickConf[];\n onRendered?: (id: DiagramNodeId, element: HTMLElement | null) => void;\n onUnmount?: (id: DiagramNodeId) => void;\n}\n\nexport function NodeComponent({\n node,\n nodeBricks,\n onRendered,\n onUnmount,\n}: NodeComponentProps): JSX.Element | null {\n const useBrick = useMemo(\n () => findNodeBrick(node, nodeBricks)?.useBrick,\n [node, nodeBricks]\n );\n const memoizedData = useMemo(() => ({ node }), [node]);\n\n useEffect(() => {\n if (!useBrick) {\n // Keep the same time delay for reporting rendered.\n setTimeout(() => {\n onRendered?.(node.id, null);\n });\n }\n }, [node.id, onRendered, useBrick]);\n\n useEffect(\n () => {\n return () => {\n onUnmount?.(node.id);\n };\n },\n // Only unmount once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const refCallback = useCallback(\n (element: HTMLElement | null) => {\n if (element) {\n // Todo: correctly wait for `useBrick` in v3 to be rendered (after layout)\n // Wait a macro task to let `useBrick` to be rendered.\n setTimeout(() => {\n onRendered?.(node.id, element);\n });\n }\n },\n [node.id, onRendered]\n );\n\n const ignoredCallback = useCallback(() => {\n setTimeout(() => {\n onRendered?.(node.id, null);\n });\n }, [node.id, onRendered]);\n\n if (!useBrick) {\n return null;\n }\n\n return (\n <ReactUseBrick\n refCallback={refCallback}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore For v3 only\n ignoredCallback={ignoredCallback}\n useBrick={useBrick}\n data={memoizedData}\n />\n );\n}\n","import { checkIfByTransform } from \"@next-core/runtime\";\nimport { NodeBrickConf, DiagramNode } from \"../interfaces\";\n\nexport function findNodeBrick(\n node: DiagramNode,\n nodeBricks: NodeBrickConf[] | undefined\n): NodeBrickConf | undefined {\n return nodeBricks?.find((item) => {\n if (item.nodeType) {\n return ([] as unknown[]).concat(item.nodeType).includes(node.type);\n }\n return checkIfByTransform(item, { node });\n });\n}\n","export const DEFAULT_LINE_STROKE_COLOR = \"var(--palette-gray-5)\";\nexport const DEFAULT_LINE_STROKE_WIDTH = 1;\nexport const DEFAULT_LINE_CURVE_TYPE = \"curveBasis\";\nexport const DEFAULT_LINE_INTERACT_STROKE_WIDTH = 20;\nexport const DEFAULT_SCALE_RANGE_MIN = 0.5;\nexport const DEFAULT_SCALE_RANGE_MAX = 2;\n","import type { FullRectTuple, RefRepository, RenderedNode } from \"../interfaces\";\n\nexport function adjustNodesSize(\n nodes: RenderedNode[],\n nodesRefRepository: RefRepository,\n nodePaddings: FullRectTuple\n) {\n for (const node of nodes) {\n const element = nodesRefRepository.get(node.id);\n node.width =\n Math.max(element?.offsetWidth ?? 0, 10) +\n nodePaddings[1] +\n nodePaddings[3];\n node.height =\n Math.max(element?.offsetHeight ?? 0, 10) +\n nodePaddings[0] +\n nodePaddings[2];\n }\n}\n","import type { FullRectTuple, RefRepository, RenderedNode } from \"../interfaces\";\n\nexport function adjustNodesPosition(\n nodes: RenderedNode[],\n nodesRefRepository: RefRepository,\n nodePaddings: FullRectTuple\n) {\n for (const node of nodes) {\n const x = node.x - node.width / 2 + nodePaddings[3];\n const y = node.y - node.height / 2 + nodePaddings[0];\n\n const nodeContainer = nodesRefRepository.get(node.id)?.parentElement;\n if (nodeContainer) {\n nodeContainer.style.left = `${x}px`;\n nodeContainer.style.top = `${y}px`;\n nodeContainer.style.visibility = \"visible\";\n }\n }\n}\n","import type { FullRectTuple, PartialRectTuple } from \"../interfaces\";\n\nexport function extractPartialRectTuple(\n value: PartialRectTuple\n): FullRectTuple {\n if (Array.isArray(value)) {\n const v0 = value[0];\n const v1 = value.length > 1 ? value[1]! : v0;\n const v2 = value.length > 2 ? value[2]! : v0;\n const v3 = value.length > 3 ? value[3]! : v1;\n return [v0, v1, v2, v3];\n }\n return new Array(4).fill(value) as FullRectTuple;\n}\n","// istanbul ignore file: experimental\nimport type {\n DiagramEdge,\n LabelSize,\n RefRepository,\n RenderedEdge,\n} from \"../interfaces\";\n\nexport function getRenderedEdges(\n edges: DiagramEdge[] | undefined,\n {\n normalizedLinesMap,\n lineLabelsRefRepository,\n }: {\n normalizedLinesMap: WeakMap<DiagramEdge, string>;\n lineLabelsRefRepository: RefRepository;\n }\n) {\n return (\n edges?.map<RenderedEdge>((edge) => {\n const lineId = normalizedLinesMap.get(edge);\n const labelSize: LabelSize = {};\n if (lineId) {\n for (const placement of [/* \"center\", */ \"start\", \"end\"] as const) {\n const element = lineLabelsRefRepository.get(`${lineId}-${placement}`);\n if (element) {\n labelSize[placement] = [element.offsetWidth, element.offsetHeight];\n }\n }\n }\n\n return {\n data: edge,\n labelSize,\n };\n }) ?? []\n );\n}\n","// istanbul ignore file: experimental\nimport {\n forceSimulation,\n forceLink,\n forceCollide,\n forceManyBody,\n forceX,\n forceY,\n type Simulation,\n type SimulationNodeDatum,\n type SimulationLinkDatum,\n} from \"d3-force\";\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n ForceCollideOptions,\n LayoutOptionsForce,\n RenderedNode,\n UnifiedGraph,\n UserViewNodesMap,\n} from \"../interfaces\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\nimport { getRenderedEdges } from \"./getRenderedEdges\";\n\ninterface NormalNode extends SimulationNodeDatum {\n dummy?: false;\n id: string;\n data: DiagramNode;\n width: number;\n height: number;\n}\n\ninterface DummyNode extends SimulationNodeDatum {\n dummy: true;\n id: string;\n}\n\ntype ForceNode = NormalNode | DummyNode;\n\ntype ForceLink = SimulationLinkDatum<ForceNode> & {\n dummy?: boolean;\n};\n\nexport function getForceGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n userViewNodesMap: UserViewNodesMap | null,\n forceLayoutOptions: LayoutOptionsForce | undefined\n): UnifiedGraph {\n const { nodePadding, dummyNodesOnEdges, collide } = {\n nodePadding: 0,\n dummyNodesOnEdges: 0,\n ...pick(forceLayoutOptions, [\"nodePadding\", \"dummyNodesOnEdges\"]),\n collide:\n forceLayoutOptions?.collide !== false\n ? ({\n dummyRadius: 1,\n radiusDiff: 5,\n strength: 1,\n iterations: 1,\n ...(forceLayoutOptions?.collide === true\n ? null\n : (forceLayoutOptions?.collide as ForceCollideOptions)),\n } as Required<ForceCollideOptions>)\n : (false as const),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n const renderedNodes: RenderedNode[] = [];\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n if (previousNode?.data === node) {\n renderedNodes.push(previousNode);\n } else {\n const renderedNode = {\n id: node.id,\n data: node,\n } as RenderedNode & { fx?: number; fy?: number };\n const userViewNode = userViewNodesMap?.get(node.id);\n if (userViewNode) {\n renderedNode.fx = userViewNode.x;\n renderedNode.fy = userViewNode.y;\n }\n renderedNodes.push(renderedNode);\n }\n }\n\n function getNode(id: string) {\n return renderedNodes.find((node) => node.data.id === id);\n }\n\n return {\n layout: \"force\",\n getNode,\n applyLayout({\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n }) {\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n const forceNodes = renderedNodes.slice();\n const forceLinks: ForceLink[] = [];\n\n for (const edge of edges ?? []) {\n forceLinks.push({ ...edge });\n if (dummyNodesOnEdges > 0) {\n forceNodes.push(\n ...(getDummyNodes(\n edge,\n dummyNodesOnEdges\n ) as Partial<RenderedNode>[] as RenderedNode[])\n );\n forceLinks.push(...getDummyEdges(edge, dummyNodesOnEdges));\n }\n }\n\n const linkSimulation = forceLink<ForceNode, ForceLink>(forceLinks).id(\n (d) => d.id\n );\n\n if (dummyNodesOnEdges > 0) {\n linkSimulation\n .distance((l) => (l.dummy ? 30 / (dummyNodesOnEdges + 1) : 30))\n .strength((l) => (l.dummy ? 0.5 : 1));\n }\n\n const simulation = forceSimulation<ForceNode>(forceNodes)\n .force(\"link\", linkSimulation)\n .force(\"x\", forceX())\n .force(\"y\", forceY())\n .force(\"charge\", forceManyBody());\n\n if (collide) {\n simulation.force(\n \"collide\",\n forceCollide<ForceNode>()\n .radius((d) =>\n d.dummy\n ? collide.dummyRadius\n : Math.sqrt(d.width ** 2 + d.height ** 2) / 2 +\n collide.radiusDiff\n )\n .strength(collide.strength)\n .iterations(collide.iterations)\n );\n }\n\n simulation.stop();\n manuallyTickToTheEnd(simulation);\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = getRenderedEdges(edges, {\n normalizedLinesMap,\n lineLabelsRefRepository,\n });\n\n return { nodes: renderedNodes, edges: renderedEdges };\n },\n };\n}\n\nfunction manuallyTickToTheEnd(\n simulation: Simulation<ForceNode, ForceLink>\n): void {\n // Manually tick to the end.\n simulation.tick(\n Math.ceil(\n Math.log(simulation.alphaMin()) / Math.log(1 - simulation.alphaDecay())\n )\n );\n}\n\nfunction getDummyNodes(edge: DiagramEdge, count: number): DummyNode[] {\n return new Array(count).fill(null).map<DummyNode>((v, i) => ({\n dummy: true,\n id: `$dummy-${edge.source}-${edge.target}-${i}`,\n }));\n}\n\nfunction getDummyEdges(edge: DiagramEdge, count: number): ForceLink[] {\n return new Array(count + 1).fill(null).map<ForceLink>((v, i) => ({\n dummy: true,\n source:\n i === 0 ? edge.source : `$dummy-${edge.source}-${edge.target}-${i - 1}`,\n target:\n i === count ? edge.target : `$dummy-${edge.source}-${edge.target}-${i}`,\n }));\n}\n","import { useEffect, useState } from \"react\";\nimport type {\n DiagramEdge,\n DiagramNode,\n LayoutOptions,\n LayoutOptionsDagre,\n LayoutOptionsForce,\n ManualLayoutStatus,\n NodeMovement,\n RefRepository,\n RenderedDiagram,\n UnifiedGraph,\n UserViewNodesMap,\n} from \"../interfaces\";\nimport { getDagreGraph } from \"../processors/getDagreGraph\";\nimport { getForceGraph } from \"../processors/getForceGraph\";\nimport { getManualGraph } from \"../processors/getManualGraph\";\n\nexport function useRenderedDiagram({\n layout: originalLayout,\n nodes,\n edges,\n manualLayoutStatus,\n userViewReady,\n userViewNodesMap,\n nodeMovement,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodesRenderId,\n lineLabelsRenderId,\n layoutOptions,\n}: {\n layout: \"dagre\" | \"force\" | undefined;\n nodes: DiagramNode[] | undefined;\n edges: DiagramEdge[] | undefined;\n manualLayoutStatus: ManualLayoutStatus;\n userViewReady: boolean;\n userViewNodesMap: UserViewNodesMap | null;\n nodeMovement: NodeMovement | null;\n nodesRefRepository: RefRepository | null;\n lineLabelsRefRepository: RefRepository | null;\n normalizedLinesMap: WeakMap<DiagramEdge, string>;\n nodesRenderId: number;\n lineLabelsRenderId: number;\n layoutOptions?: LayoutOptions;\n}) {\n const layout = manualLayoutStatus === \"initial\" ? originalLayout : \"manual\";\n const [graph, setGraph] = useState<UnifiedGraph | null>(null);\n\n const [renderedDiagram, setRenderedDiagram] = useState<RenderedDiagram>({\n nodes: [],\n edges: [],\n });\n\n useEffect(() => {\n if (!userViewReady) {\n return;\n }\n setGraph((previousGraph) =>\n layout === \"dagre\"\n ? getDagreGraph(\n previousGraph,\n nodes,\n edges,\n layoutOptions as LayoutOptionsDagre\n )\n : layout === \"force\"\n ? getForceGraph(\n previousGraph,\n nodes,\n edges,\n userViewNodesMap,\n layoutOptions as LayoutOptionsForce\n )\n : layout === \"manual\"\n ? getManualGraph(previousGraph, nodes, edges, layoutOptions)\n : null\n );\n }, [edges, nodes, layout, layoutOptions, userViewReady, userViewNodesMap]);\n\n useEffect(() => {\n if (\n !nodesRefRepository ||\n !lineLabelsRefRepository ||\n layout !== graph?.layout\n ) {\n return;\n }\n const renderedDiagram = graph?.applyLayout({\n manualLayoutStatus,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodeMovement,\n });\n if (renderedDiagram) {\n setRenderedDiagram(renderedDiagram);\n }\n }, [\n layout,\n manualLayoutStatus,\n graph,\n nodeMovement,\n nodesRefRepository,\n lineLabelsRefRepository,\n nodesRenderId,\n lineLabelsRenderId,\n normalizedLinesMap,\n ]);\n\n return renderedDiagram;\n}\n","import dagre from \"@dagrejs/dagre\";\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n LayoutOptionsDagre,\n RenderedEdge,\n RenderedNode,\n UnifiedGraph,\n} from \"../interfaces\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\n\nexport function getDagreGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n dagreLayoutOptions: LayoutOptionsDagre | undefined\n): UnifiedGraph {\n const { nodePadding, ...dagreGraphOptions } = {\n nodePadding: 0,\n rankdir: \"TB\",\n ranksep: 50,\n edgesep: 10,\n nodesep: 50,\n // align: undefined,\n ...pick(dagreLayoutOptions, [\n \"nodePadding\",\n \"rankdir\",\n \"ranksep\",\n \"edgesep\",\n \"nodesep\",\n \"align\",\n ]),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n // Create a new directed graph\n const graph = new dagre.graphlib.Graph<RenderedNode>();\n\n // Set an object for the graph label\n graph.setGraph(dagreGraphOptions);\n\n // Default to assigning a new object as a label for each new edge.\n graph.setDefaultEdgeLabel(function () {\n return {};\n });\n\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n graph.setNode(\n node.id,\n previousNode?.data === node\n ? previousNode\n : {\n id: node.id,\n data: node,\n }\n );\n }\n\n for (const edge of edges ?? []) {\n graph.setEdge(edge.source, edge.target, { data: edge });\n }\n\n return {\n layout: \"dagre\",\n getNode(id) {\n return graph.node(id);\n },\n applyLayout({\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n }) {\n const renderedNodes: RenderedNode[] = [];\n for (const id of graph.nodes()) {\n const node = graph.node(id);\n if (node) {\n renderedNodes.push(node);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Diagram node not found: %s\", id);\n }\n }\n\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = graph\n .edges()\n .map((e) => graph.edge(e) as RenderedEdge);\n for (const edge of renderedEdges) {\n const lineId = normalizedLinesMap.get(edge.data);\n if (lineId) {\n for (const placement of [\"center\", \"start\", \"end\"] as const) {\n const element = lineLabelsRefRepository.get(\n `${lineId}-${placement}`\n );\n if (element) {\n const { offsetWidth, offsetHeight } = element;\n if (placement === \"center\") {\n edge.labelpos = \"c\";\n edge.width = offsetWidth;\n edge.height = offsetHeight;\n }\n edge.labelSize ??= {};\n edge.labelSize[placement] = [offsetWidth, offsetHeight];\n }\n }\n }\n }\n dagre.layout(graph);\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n return {\n nodes: renderedNodes,\n edges: renderedEdges,\n };\n },\n };\n}\n","// istanbul ignore file: experimental\nimport { pick } from \"lodash\";\nimport type {\n DiagramEdge,\n DiagramNode,\n BaseLayoutOptions,\n RenderedNode,\n UnifiedGraph,\n} from \"../interfaces\";\nimport { extractPartialRectTuple } from \"./extractPartialRectTuple\";\nimport { adjustNodesSize } from \"./adjustNodesSize\";\nimport { adjustNodesPosition } from \"./adjustNodesPosition\";\nimport { getRenderedEdges } from \"./getRenderedEdges\";\n\nexport function getManualGraph(\n previousGraph: UnifiedGraph | null,\n nodes: DiagramNode[] | undefined,\n edges: DiagramEdge[] | undefined,\n layoutOptions: BaseLayoutOptions | undefined\n): UnifiedGraph {\n const { nodePadding } = {\n nodePadding: 0,\n ...pick(layoutOptions, [\"nodePadding\"]),\n };\n const nodePaddings = extractPartialRectTuple(nodePadding);\n\n const renderedNodes: RenderedNode[] = [];\n for (const node of nodes ?? []) {\n const previousNode = previousGraph?.getNode(node.id);\n if (previousNode?.data === node) {\n renderedNodes.push(previousNode);\n previousNode.x0 = previousNode.x;\n previousNode.y0 = previousNode.y;\n } else {\n renderedNodes.push({\n id: node.id,\n data: node,\n } as RenderedNode);\n }\n }\n\n function getNode(id: string) {\n return renderedNodes.find((node) => node.data.id === id);\n }\n\n let movedNode: RenderedNode | undefined;\n\n return {\n layout: \"manual\",\n getNode,\n applyLayout({\n manualLayoutStatus,\n nodesRefRepository,\n lineLabelsRefRepository,\n normalizedLinesMap,\n nodeMovement,\n }) {\n if (renderedNodes.length === 0) {\n return null;\n }\n\n adjustNodesSize(renderedNodes, nodesRefRepository, nodePaddings);\n\n if (nodeMovement) {\n movedNode = renderedNodes.find((node) => node.id === nodeMovement.id);\n if (movedNode) {\n movedNode.x = (movedNode.x0 ?? 0) + nodeMovement.move[0];\n movedNode.y = (movedNode.y0 ?? 0) + nodeMovement.move[1];\n }\n }\n\n if (manualLayoutStatus === \"finished\" && movedNode) {\n // Set x0/y0 after finished manual layout\n movedNode.x0 = movedNode.x;\n movedNode.y0 = movedNode.y;\n }\n\n adjustNodesPosition(renderedNodes, nodesRefRepository, nodePaddings);\n\n const renderedEdges = getRenderedEdges(edges, {\n normalizedLinesMap,\n lineLabelsRefRepository,\n });\n\n return { nodes: renderedNodes, edges: renderedEdges };\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { handleHttpError } from \"@next-core/runtime\";\nimport {\n InstanceApi_postSearchV3,\n InstanceApi_updateInstanceV2,\n InstanceApi_createInstance,\n} from \"@next-api-sdk/cmdb-sdk\";\nimport { createAsyncQueue } from \"../processors/createAsyncQueue\";\nimport {\n NodeUserView,\n UserView,\n UserViewNodesMap,\n UserViewQuery,\n} from \"../interfaces\";\n\nconst USER_VIEW_MODEL_ID = \"GRAPH_USER_VIEW@EASYOPS\";\n\nexport interface UserViewHook {\n userViewReady: boolean;\n userViewNodesMap: UserViewNodesMap | null;\n saveUserView: (nodes: NodeUserView[]) => void;\n}\n\nexport function useUserView(query: UserViewQuery | undefined): UserViewHook {\n const [userViewReady, setUserViewReady] = useState(!query);\n const userViewIdRef = useRef<string>();\n const [userViewNodesMap, setUserViewNodesMap] =\n useState<UserViewNodesMap | null>(null);\n const queue = useMemo(() => createAsyncQueue(), []);\n\n useEffect(() => {\n async function getUserView(): Promise<void> {\n if (!query) {\n setUserViewReady(true);\n return;\n }\n const { namespace, key } = query;\n if (!(namespace && key)) {\n // eslint-disable-next-line no-console\n console.error(\"Namespace and key are required to save graph user view\");\n setUserViewReady(true);\n return;\n }\n try {\n const list = (\n await InstanceApi_postSearchV3(USER_VIEW_MODEL_ID, {\n fields: [\"nodes\"],\n query: {\n namespace: {\n $eq: namespace,\n },\n key: {\n $eq: key,\n },\n },\n page: 1,\n page_size: 30,\n })\n ).list as UserView[];\n if (list.length > 0) {\n const userView = list[0];\n const userViewNodesMap = new Map(\n userView.nodes?.map((node) => [node.id, node])\n );\n userViewIdRef.current = userView.instanceId;\n setUserViewNodesMap(userViewNodesMap);\n } else {\n setUserViewNodesMap(null);\n }\n } catch (error) {\n handleHttpError(error as Error);\n } finally {\n setUserViewReady(true);\n }\n }\n getUserView();\n }, [query]);\n\n const saveUserView = useCallback(\n (nodes: NodeUserView[]) => {\n const { namespace, key } = query ?? {};\n if (!(namespace && key)) {\n return;\n }\n queue(async () => {\n const userViewData = {\n namespace,\n key,\n nodes,\n };\n try {\n if (userViewIdRef.current) {\n await InstanceApi_updateInstanceV2(\n USER_VIEW_MODEL_ID,\n userViewIdRef.current,\n userViewData,\n {\n interceptorParams: {\n ignoreLoadingBar: true,\n },\n }\n );\n } else {\n const userView = await InstanceApi_createInstance(\n USER_VIEW_MODEL_ID,\n userViewData,\n {\n interceptorParams: {\n ignoreLoadingBar: true,\n },\n }\n );\n userViewIdRef.current = userView.instanceId;\n }\n } catch (error) {\n handleHttpError(error);\n }\n });\n },\n [query, queue]\n );\n\n return {\n userViewReady,\n userViewNodesMap,\n saveUserView,\n };\n}\n","type Task = (...args: unknown[]) => unknown;\ntype Queue = (task: Task) => Promise<void>;\n\nexport function createAsyncQueue(): Queue {\n let working = false;\n const waitingTasks: Task[] = [];\n return async function queue(task: Task) {\n waitingTasks.push(task);\n if (!working) {\n working = true;\n let nextTask: Task | undefined;\n while ((nextTask = waitingTasks.shift())) {\n try {\n await nextTask();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n working = false;\n }\n };\n}\n","import type { RefRepository, RenderedLineLabel } from \"../interfaces\";\n\nexport function adjustLineLabels(\n renderedLineLabels: RenderedLineLabel[],\n lineLabelsRefRepository: RefRepository\n) {\n for (const {\n id,\n position,\n placement,\n angle,\n size: _size,\n } of renderedLineLabels) {\n const label = lineLabelsRefRepository.get(id);\n if (label) {\n label.style.left = `${position[0]}px`;\n label.style.top = `${position[1]}px`;\n label.style.visibility = \"visible\";\n // label.classList.add(placement);\n if (placement !== \"center\" && angle !== undefined) {\n const [width, height] = _size ?? [0, 0];\n // Get the numbered direction of the line\n //\n // \\ | /\n // \\ 5 | 6 /\n // 4 \\ | / 7\n // -----x-----\n // 3 / | \\ 0\n // / 2 | 1 \\\n // / | \\\n const tempDirection = Math.floor(\n ((angle < 0 ? Math.PI * 2 + angle : angle) / Math.PI) * 4\n );\n // Swap direction for end labels.\n const direction =\n placement === \"start\" ? tempDirection : (tempDirection + 4) % 8;\n const tangent = Math.tan(angle);\n const offsetAngle =\n angle + ((placement === \"start\" ? 1 : -1) * Math.PI) / 2;\n const offset = 2;\n const offsetSin = Math.sin(offsetAngle) * offset;\n const offsetCos = Math.cos(offsetAngle) * offset;\n let transform: string;\n switch (direction) {\n case 0:\n transform = `translate(0,${width * tangent + offsetSin}px)`;\n break;\n case 1:\n transform = `translate(${height / tangent - offsetCos}px,0)`;\n break;\n case 2:\n transform = `translate(calc(${\n height / tangent + offsetCos\n }px - 100%),0)`;\n break;\n case 3:\n transform = `translate(-100%,${-width * tangent - offsetSin}px)`;\n break;\n case 4:\n transform = `translate(-100%,calc(${\n -width * tangent + offsetSin\n }px - 100%))`;\n break;\n case 5:\n transform = `translate(calc(${\n -height / tangent - offsetCos\n }px - 100%),-100%)`;\n break;\n case 6:\n transform = `translate(${-height / tangent + offsetCos}px,-100%)`;\n break;\n default:\n transform = `translate(0,calc(${\n width * tangent - offsetSin\n }px - 100%))`;\n }\n label.style.transform = transform;\n }\n }\n }\n}\n","import type {\n LineMaskRects,\n RefRepository,\n RenderedLineLabel,\n} from \"../interfaces\";\n\nexport function getLineMaskRects(\n renderedLineLabels: RenderedLineLabel[],\n lineLabelsRefRepository: RefRepository\n) {\n const map: LineMaskRects = new Map();\n\n for (const { id, lineId, placement } of renderedLineLabels) {\n if (!lineLabelsRefRepository || placement !== \"center\") {\n continue;\n }\n const element = lineLabelsRefRepository.get(id);\n if (!element) {\n continue;\n }\n const { offsetWidth, offsetHeight } = element;\n // Do not mask out when the label takes no space.\n // istanbul ignore next\n if (\n process.env.NODE_ENV !== \"test\" &&\n (offsetWidth === 0 || offsetHeight === 0)\n ) {\n continue;\n }\n const padding = 3;\n // Currently no other rects\n map.set(lineId, [\n {\n left: element.offsetLeft - offsetWidth / 2 - padding,\n top: element.offsetTop - offsetHeight / 2 - padding,\n width: offsetWidth + padding * 2,\n height: offsetHeight + padding * 2,\n },\n ]);\n }\n\n return map;\n}\n","import type {\n LineLabelConf,\n RenderedLine,\n RenderedLineLabel,\n TextOptions,\n} from \"../interfaces\";\n\nexport function getRenderedLineLabels(\n previous: RenderedLineLabel[],\n renderedLines: RenderedLine[],\n linePaths: Map<string, SVGPathElement | null>\n) {\n if (previous.length === 0 && renderedLines.length === 0) {\n return previous;\n }\n return renderedLines.flatMap(\n ({ line: { text, label, $id }, edge, labelSize, angle }) => {\n const path = linePaths.get($id);\n if ((!text && !label) || !path || !path.getAttribute(\"d\")) {\n return [] as RenderedLineLabel[];\n }\n\n let key: \"label\" | \"text\";\n let list: LineLabelConf[] | TextOptions[];\n if (label) {\n key = \"label\";\n list = ([] as LineLabelConf[]).concat(label);\n } else {\n key = \"text\";\n list = ([] as TextOptions[]).concat(text!);\n }\n\n // istanbul ignore next\n const {\n x: left,\n y: top,\n width,\n height,\n } = process.env.NODE_ENV === \"test\"\n ? { x: 10, y: 20, width: 300, height: 400 }\n : path.getBBox();\n\n // istanbul ignore next\n const pathLength =\n process.env.NODE_ENV === \"test\" ? 50 : path.getTotalLength();\n\n return list.map<RenderedLineLabel>((item) => {\n const placement = item.placement ?? \"center\";\n const offset = 0;\n // istanbul ignore next\n const point =\n process.env.NODE_ENV === \"test\"\n ? { x: 50, y: 50 }\n : path.getPointAtLength(\n placement === \"start\"\n ? Math.min(offset, pathLength / 2)\n : placement === \"end\"\n ? Math.max(pathLength - offset, pathLength / 2)\n : pathLength / 2\n );\n\n return {\n [key as \"label\"]: item as LineLabelConf,\n edge,\n position: [point.x, point.y],\n lineRect: { left, top, width, height },\n id: `${$id}-${placement}`,\n lineId: $id,\n placement,\n angle,\n size: labelSize?.[placement],\n };\n });\n }\n );\n}\n","import {\n curveLinear,\n line,\n curveBasis,\n curveBumpX,\n curveBumpY,\n type CurveFactory,\n curveMonotoneX,\n curveNatural,\n curveMonotoneY,\n} from \"d3-shape\";\nimport type { CurveType, NodePosition } from \"../interfaces\";\n\n/**\n * Generate Line from points\n */\nexport function curveLine(\n points: Array<NodePosition> | null | undefined,\n curveType: CurveType | undefined,\n startOffset: number,\n endOffset: number\n): string {\n if (!Array.isArray(points)) {\n return \"\";\n }\n let curveFactory: CurveFactory;\n switch (curveType) {\n case \"curveLinear\":\n curveFactory = curveLinear;\n break;\n case \"curveBumpX\":\n curveFactory = curveBumpX;\n break;\n case \"curveBumpY\":\n curveFactory = curveBumpY;\n break;\n case \"curveMonotoneX\":\n curveFactory = curveMonotoneX;\n break;\n case \"curveMonotoneY\":\n curveFactory = curveMonotoneY;\n break;\n case \"curveNatural\":\n curveFactory = curveNatural;\n break;\n default:\n curveFactory = curveBasis;\n }\n const startOffsets = getOffsets(points[1], points[0], startOffset);\n const endOffsets = getOffsets(\n points[points.length - 2],\n points[points.length - 1],\n endOffset\n );\n const lineFunction = line()\n .x(\n (d, index) =>\n (d as unknown as { x: number }).x -\n (index === 0\n ? startOffsets.x\n : index === points.length - 1\n ? endOffsets.x\n : 0)\n )\n .y(\n (d, index) =>\n (d as unknown as { y: number }).y -\n (index === 0\n ? startOffsets.y\n : index === points.length - 1\n ? endOffsets.y\n : 0)\n )\n .curve(curveFactory);\n return lineFunction(points as unknown as Array<[number, number]>)!;\n}\n\nfunction getOffsets(\n start: NodePosition,\n end: NodePosition,\n offset: number\n): NodePosition {\n if (!offset) {\n return { x: 0, y: 0 };\n }\n const { x: x0, y: y0 } = start;\n const { x: x1, y: y1 } = end;\n const distance = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2));\n const ratio = offset / distance;\n return {\n x: (x1 - x0) * ratio,\n y: (y1 - y0) * ratio,\n };\n}\n","import type { NodeRect } from \"../interfaces\";\n\nexport function doTwoNodesOverlap(\n a: NodeRect,\n b: NodeRect,\n paddingA: number,\n paddingB: number\n): boolean {\n const A = paddingA ? getNodesWithPadding(a, paddingA) : a;\n const B = paddingB ? getNodesWithPadding(b, paddingB) : b;\n const left = Math.min(A.x - A.width / 2, B.x - B.width / 2);\n const right = Math.max(A.x + A.width / 2, B.x + B.width / 2);\n const top = Math.min(A.y - A.height / 2, B.y - B.height / 2);\n const bottom = Math.max(A.y + A.height / 2, B.y + B.height / 2);\n return right - left < A.width + B.width && bottom - top < A.height + B.height;\n}\n\nfunction getNodesWithPadding(node: NodeRect, padding: number) {\n return {\n x: node.x - node.width / 2 - padding,\n y: node.y - node.height / 2 - padding,\n width: node.width + padding * 2,\n height: node.height + padding * 2,\n };\n}\n","import type { Direction, NodePosition, RenderedNode } from \"../interfaces\";\n\nexport function getPolyLinePoints(\n source: RenderedNode,\n target: RenderedNode,\n sourceDirection: Direction,\n targetDirection: Direction,\n sourcePosition: number,\n targetPosition: number\n): NodePosition[] | null {\n const p0 = getCoordinates(source, sourceDirection, sourcePosition);\n const p1 = getCoordinates(target, targetDirection, targetPosition);\n\n let c1: NodePosition;\n let c2: NodePosition;\n switch (sourceDirection) {\n case \"top\":\n case \"bottom\":\n switch (targetDirection) {\n default:\n c1 = { x: p0.x, y: (p0.y + p1.y) / 2 };\n c2 = { x: p1.x, y: c1.y };\n break;\n }\n break;\n default:\n switch (targetDirection) {\n default:\n c1 = { x: (p0.x + p1.x) / 2, y: p0.y };\n c2 = { x: c1.x, y: p1.y };\n break;\n }\n }\n\n return [p0, c1, c2, p1];\n}\n\nfunction getCoordinates(\n node: RenderedNode,\n direction: Direction,\n position: number\n): NodePosition {\n const { x, y, width, height } = node;\n switch (direction) {\n case \"top\":\n return {\n x: x - width / 2 + width * position,\n y: y - height / 2,\n };\n case \"bottom\":\n return {\n x: x - width / 2 + width * position,\n y: y + height / 2,\n };\n case \"left\":\n return {\n x: x - width / 2,\n y: y - height / 2 + height * position,\n };\n case \"right\":\n return {\n x: x + width / 2,\n y: y - height / 2 + height * position,\n };\n }\n}\n","// istanbul ignore file: experimental\nimport type {\n DiagramEdge,\n Direction,\n NormalizedLine,\n RenderedEdge,\n RenderedLine,\n RenderedNode,\n} from \"../interfaces\";\nimport { curveLine } from \"../lines/curveLine\";\nimport { getDirectLinePoints } from \"../lines/getDirectLinePoints\";\nimport { getPolyLinePoints } from \"../lines/getPolyLinePoints\";\nimport { doTwoNodesOverlap } from \"./doTwoNodesOverlap\";\n\nexport function getRenderedLines(\n renderedEdges: RenderedEdge[],\n renderedNodes: RenderedNode[],\n normalizedLines: NormalizedLine[]\n): RenderedLine[] {\n const renderedEdgeMap = new WeakMap<DiagramEdge, RenderedEdge>();\n const renderedNodeMap = new Map<string, RenderedNode>();\n const relatedNodes = new Map<string, Set<RenderedNode>>();\n\n for (const renderedNode of renderedNodes) {\n renderedNodeMap.set(renderedNode.id, renderedNode);\n }\n\n for (const renderedEdge of renderedEdges) {\n const { data: edge } = renderedEdge;\n renderedEdgeMap.set(edge, renderedEdge);\n }\n\n let prepared = false;\n const prepareRelatedNodes = () => {\n if (prepared) {\n return;\n }\n prepared = true;\n\n const addRelatedNodes = (from: string, to: string) => {\n let relates = relatedNodes.get(from);\n if (!relates) {\n relatedNodes.set(from, (relates = new Set()));\n }\n const toNode = renderedNodeMap.get(to);\n if (toNode) {\n relates.add(toNode);\n }\n };\n\n for (const {\n data: { source, target },\n } of renderedEdges) {\n if (source !== target) {\n addRelatedNodes(source, target);\n addRelatedNodes(target, source);\n }\n }\n };\n\n return normalizedLines\n .map<RenderedLine | undefined>(({ line, edge, markers, ...rest }) => {\n const renderedEdge = renderedEdgeMap.get(edge);\n if (!renderedEdge) {\n return;\n }\n const startMarkerOffset =\n markers.find(\n (marker) =>\n marker.variant === \"default\" && marker.placement === \"start\"\n )?.offset ?? 0;\n const endMarkerOffset =\n markers.find(\n (marker) => marker.variant === \"default\" && marker.placement === \"end\"\n )?.offset ?? 0;\n let angle: number | undefined;\n\n let { points } = renderedEdge;\n // Only dagre graph will have pre-calculated line points\n if (!points) {\n const source = renderedNodeMap.get(edge.source);\n const target = renderedNodeMap.get(edge.target);\n\n if (source && target && source !== target) {\n if (line.type === \"polyline\") {\n if (\n !doTwoNodesOverlap(\n source,\n target,\n startMarkerOffset,\n endMarkerOffset\n )\n ) {\n prepareRelatedNodes();\n const sourceDirection = getDirection(\n source,\n target,\n startMarkerOffset\n );\n const targetDirection = getDirection(\n target,\n source,\n endMarkerOffset\n );\n const sourceRelates = getOrderedRelates(\n relatedNodes.get(edge.source) ?? [],\n source,\n sourceDirection,\n startMarkerOffset\n );\n const targetRelates = getOrderedRelates(\n relatedNodes.get(edge.target) ?? [],\n target,\n targetDirection,\n endMarkerOffset\n );\n\n const sourcePosition =\n (sourceRelates.indexOf(target) + 1) /\n (sourceRelates.length + 1);\n const targetPosition =\n (targetRelates.indexOf(source) + 1) /\n (targetRelates.length + 1);\n\n points = getPolyLinePoints(\n source,\n target,\n sourceDirection,\n targetDirection,\n sourcePosition,\n targetPosition\n );\n }\n } else {\n points = getDirectLinePoints(source, target);\n }\n\n if (points) {\n const start = points[0];\n const end = points[points.length - 1];\n angle = Math.atan2(end.y - start.y, end.x - start.x);\n }\n }\n }\n\n const d = curveLine(\n points,\n line.curveType,\n startMarkerOffset,\n endMarkerOffset\n );\n return {\n ...rest,\n markers,\n line,\n edge,\n d,\n angle,\n labelSize: renderedEdge.labelSize,\n };\n })\n .filter(Boolean) as RenderedLine[];\n}\n\nfunction getDirection(\n source: RenderedNode,\n target: RenderedNode,\n padding: number\n): Direction {\n // Add a padding to the source node to avoid the markers being warped.\n const sourceAngle = Math.atan2(\n source.height + padding * 2,\n source.width + padding * 2\n );\n const { x: sx, y: sy } = source;\n const { x: tx, y: ty } = target;\n const angle = Math.atan2(ty - sy, tx - sx);\n const fixedAngle = angle < 0 ? Math.PI * 2 + angle : angle;\n const direction = Math.floor((fixedAngle / Math.PI) * 2);\n switch (direction) {\n case 0:\n return fixedAngle < sourceAngle ? \"right\" : \"bottom\";\n case 1:\n return fixedAngle < Math.PI - sourceAngle ? \"bottom\" : \"left\";\n case 2:\n return fixedAngle < Math.PI + sourceAngle ? \"left\" : \"top\";\n default:\n return fixedAngle < Math.PI * 2 - sourceAngle ? \"top\" : \"right\";\n }\n}\n\nfunction getOrderedRelates(\n relates: Iterable<RenderedNode>,\n from: RenderedNode,\n direction: Direction,\n padding: number\n): RenderedNode[] {\n return [...relates]\n .filter((node) => getDirection(from, node, padding) === direction)\n .sort((a, b) => {\n const { x: ax, y: ay } = a;\n const { x: bx, y: by } = b;\n return direction === \"top\" || direction === \"bottom\" ? ax - bx : ay - by;\n });\n}\n","import type { NodePosition, RenderedNode } from \"../interfaces\";\nimport { doTwoNodesOverlap } from \"../processors/doTwoNodesOverlap\";\n\nexport function getDirectLinePoints(\n source: RenderedNode,\n target: RenderedNode\n): NodePosition[] | null {\n // Ignore if two nodes are the same.\n // Ignore if two nodes overlap.\n if (source === target || doTwoNodesOverlap(source, target, 0, 0)) {\n return null;\n }\n\n const dx = target.x - source.x;\n const dy = target.y - source.y;\n\n let x0: number, y0: number, x1: number, y1: number;\n const directionX = dx > 0 ? 1 : -1;\n if (dy !== 0) {\n const deltaRadio = Math.abs(dx / dy);\n const directionY = dy > 0 ? 1 : -1;\n const sourceRadio = source.width / source.height;\n if (deltaRadio < sourceRadio) {\n x0 = source.x + ((deltaRadio * source.height) / 2) * directionX;\n y0 = source.y + (source.height / 2) * directionY;\n } else {\n x0 = source.x + (source.width / 2) * directionX;\n y0 = source.y + (source.width / 2 / deltaRadio) * directionY;\n }\n const targetRadio = target.width / target.height;\n if (deltaRadio < targetRadio) {\n x1 = target.x - ((deltaRadio * target.height) / 2) * directionX;\n y1 = target.y - (target.height / 2) * directionY;\n } else {\n x1 = target.x - (target.width / 2) * directionX;\n y1 = target.y - (target.width / 2 / deltaRadio) * directionY;\n }\n } else {\n x0 = source.x + (source.width / 2) * directionX;\n x1 = target.x - (target.width / 2) * directionX;\n y0 = y1 = source.y;\n }\n\n return [\n { x: x0, y: y0 },\n { x: x1, y: y1 },\n ];\n}\n","import { minBy } from \"lodash\";\nimport type {\n ActiveTarget,\n DiagramEdge,\n DiagramNode,\n RenderedNode,\n} from \"../interfaces\";\n\nexport type KeyboardAction =\n | KeyboardActionSwitchActiveNode\n | KeyboardActionDeleteNode\n | KeyboardActionDeleteEdge;\n\nexport interface KeyboardActionSwitchActiveNode {\n action: \"switch-active-node\";\n node?: DiagramNode;\n}\n\nexport interface KeyboardActionDeleteNode {\n action: \"delete-node\";\n node: DiagramNode;\n}\n\nexport interface KeyboardActionDeleteEdge {\n action: \"delete-edge\";\n edge: DiagramEdge;\n}\n\nexport function handleKeyboard(\n event: KeyboardEvent,\n {\n renderedNodes,\n activeTarget,\n }: {\n renderedNodes: RenderedNode[];\n activeTarget: ActiveTarget | null | undefined;\n }\n): KeyboardAction | undefined {\n const activeNode =\n activeTarget?.type === \"node\"\n ? renderedNodes.find((node) => node.id === activeTarget.nodeId)\n : undefined;\n const activeEdge =\n activeTarget?.type === \"edge\" ? activeTarget.edge : undefined;\n\n if (!activeNode && !activeEdge) {\n return;\n }\n\n const key =\n event.key ||\n /* istanbul ignore next: compatibility */ event.keyCode ||\n /* istanbul ignore next: compatibility */ event.which;\n let action: KeyboardAction[\"action\"] | undefined;\n let node: RenderedNode | undefined;\n let edge: DiagramEdge | undefined;\n\n switch (key) {\n case \"Backspace\":\n case 8:\n case \"Delete\":\n case 46: {\n if (activeNode) {\n action = \"delete-node\";\n node = activeNode;\n } else {\n action = \"delete-edge\";\n edge = activeEdge;\n }\n break;\n }\n default:\n if (!activeNode) {\n return;\n }\n switch (key) {\n case \"ArrowLeft\":\n case 37: {\n node = moveOnAxis(\"x\", renderedNodes, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowUp\":\n case 38: {\n node = moveOnAxis(\"y\", renderedNodes, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowRight\":\n case 39: {\n node = moveOnAxis(\"x\", renderedNodes, activeNode, 1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowDown\":\n case 40: {\n node = moveOnAxis(\"y\", renderedNodes, activeNode, 1);\n action = \"switch-active-node\";\n break;\n }\n }\n }\n if (action) {\n event.preventDefault();\n event.stopPropagation();\n return { action, node: node?.data, edge } as KeyboardAction;\n }\n}\n\nfunction moveOnAxis(\n axis: \"x\" | \"y\",\n renderedNodes: RenderedNode[],\n activeNode: RenderedNode,\n direction: 1 | -1\n) {\n const oppositeAxis = axis === \"x\" ? \"y\" : \"x\";\n let diff: number;\n const candidates = renderedNodes.filter(\n (node) =>\n node !== activeNode &&\n ((diff = (node[axis] - activeNode[axis]) * direction), diff > 0) &&\n diff > Math.abs(activeNode[oppositeAxis] - node[oppositeAxis])\n );\n return minBy(\n candidates,\n (node) =>\n (activeNode[oppositeAxis] - node[oppositeAxis]) ** 2 +\n (activeNode[axis] - node[axis]) ** 2\n );\n}\n","import { checkIfByTransform, __secret_internals } from \"@next-core/runtime\";\nimport type React from \"react\";\nimport {\n DEFAULT_LINE_STROKE_COLOR,\n DEFAULT_LINE_STROKE_WIDTH,\n} from \"../constants\";\nimport type {\n ConnectLineState,\n DiagramNode,\n ConnectLineDetail,\n ConnectNodesOptions,\n PositionTuple,\n RefRepository,\n ActiveTarget,\n DragNodesOptions,\n NodesFilterOptions,\n NodeMovement,\n ManualLayoutStatus,\n} from \"../interfaces\";\n\nexport function handleNodesMouseDown(\n event: MouseEvent,\n {\n nodes,\n nodesRefRepository,\n connectNodes,\n dragNodes,\n scale,\n setConnectLineState,\n setConnectLineTo,\n setManualLayoutStatus,\n setNodeMovement,\n onSwitchActiveTarget,\n onNodesConnect,\n }: {\n nodes: DiagramNode[] | undefined;\n connectNodes: ConnectNodesOptions | undefined;\n dragNodes: DragNodesOptions | undefined;\n nodesRefRepository: RefRepository | null;\n scale: number;\n setConnectLineState: (\n value: React.SetStateAction<ConnectLineState | null>\n ) => void;\n setConnectLineTo: (value: React.SetStateAction<PositionTuple>) => void;\n setManualLayoutStatus: (\n value: React.SetStateAction<ManualLayoutStatus>\n ) => void;\n setNodeMovement: (value: React.SetStateAction<NodeMovement | null>) => void;\n onSwitchActiveTarget?(target: ActiveTarget | null): void;\n onNodesConnect?(detail: ConnectLineDetail): void;\n }\n) {\n function findNode(match: (element: HTMLElement) => boolean) {\n if (nodesRefRepository) {\n for (const [id, element] of nodesRefRepository) {\n if (match(element)) {\n return nodes?.find((node) => node.id === id);\n }\n }\n }\n }\n\n if (!connectNodes && !dragNodes) {\n return;\n }\n\n const source = findNode((element) =>\n element.contains(event.target as Node | null)\n );\n\n if (!source) {\n return;\n }\n\n if (!nodeMatched(connectNodes || dragNodes!, source)) {\n return;\n }\n\n event.stopPropagation();\n const from: PositionTuple = [event.clientX, event.clientY];\n\n if (connectNodes) {\n setConnectLineState({\n from,\n options: {\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n strokeWidth: DEFAULT_LINE_STROKE_WIDTH,\n ...(__secret_internals.legacyDoTransform(\n { source },\n connectNodes\n ) as ConnectNodesOptions),\n },\n });\n setConnectLineTo(from);\n\n onSwitchActiveTarget?.({ type: \"node\", nodeId: source.id });\n\n const onMouseMove = (e: MouseEvent) => {\n setConnectLineTo([e.clientX, e.clientY]);\n };\n const onMouseUp = (e: MouseEvent) => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setConnectLineState(null);\n const eventTargets = e.composedPath();\n const target = findNode((element) => eventTargets.includes(element));\n if (target && source !== target) {\n onNodesConnect?.({ source, target });\n }\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return;\n }\n\n // Drag node\n onSwitchActiveTarget?.({ type: \"node\", nodeId: source.id });\n\n let moved = false;\n const onMouseMove = (e: MouseEvent) => {\n // Respect the scale\n const movement: PositionTuple = [\n (e.clientX - from[0]) / scale,\n (e.clientY - from[1]) / scale,\n ];\n if (!moved) {\n moved = movement[0] ** 2 + movement[1] ** 2 >= 9;\n if (moved) {\n setManualLayoutStatus(\"started\");\n }\n }\n if (moved) {\n setNodeMovement({ id: source.id, move: movement });\n }\n };\n const onMouseUp = () => {\n moved = false;\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n setNodeMovement(null);\n setManualLayoutStatus(\"finished\");\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n}\n\nfunction nodeMatched(\n options: NodesFilterOptions,\n source: DiagramNode\n): boolean {\n return options.sourceType\n ? ([] as unknown[]).concat(options.sourceType).includes(source.type)\n : checkIfByTransform(options, { source });\n}\n","import { findIndex, uniqueId } from \"lodash\";\nimport { __secret_internals } from \"@next-core/runtime\";\nimport type {\n DiagramEdge,\n LineConf,\n LineMarker,\n LineMarkerConf,\n LineMarkerType,\n NormalizedLine,\n NormalizedLineMarker,\n} from \"../interfaces\";\nimport { matchEdgeByFilter } from \"./matchEdgeByFilter\";\nimport {\n DEFAULT_LINE_CURVE_TYPE,\n DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n DEFAULT_LINE_STROKE_COLOR,\n DEFAULT_LINE_STROKE_WIDTH,\n} from \"../constants\";\n\nexport function normalizeLinesAndMarkers(\n edges: DiagramEdge[] | undefined,\n lines: LineConf[] | undefined\n) {\n const normalizedLines: NormalizedLine[] = [];\n const normalizedLinesMap = new WeakMap<DiagramEdge, string>();\n const markers: LineMarker[] = [];\n for (const edge of edges ?? []) {\n const { label, ...restLineConf } =\n lines?.find((line) => matchEdgeByFilter(edge, line)) ?? {};\n\n const computedLineConf = __secret_internals.legacyDoTransform(\n { edge },\n restLineConf\n ) as LineConf | undefined;\n if (computedLineConf?.draw === false) {\n continue;\n }\n const id = uniqueId(\"line-\");\n const line: NormalizedLine[\"line\"] = {\n strokeColor: DEFAULT_LINE_STROKE_COLOR,\n strokeWidth: DEFAULT_LINE_STROKE_WIDTH,\n curveType:\n computedLineConf?.type === \"polyline\"\n ? \"curveLinear\"\n : DEFAULT_LINE_CURVE_TYPE,\n interactStrokeWidth: DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n type: \"auto\",\n ...computedLineConf,\n label,\n $id: id,\n };\n normalizedLinesMap.set(edge, id);\n\n const normalizedMarkers: NormalizedLineMarker[] = [];\n\n const lineMarkers: LineMarkerConf[] =\n line.markers ?? (line.arrow ? [{ placement: \"end\", type: \"arrow\" }] : []);\n for (const marker of lineMarkers) {\n const { placement: _placement, type: _type } = marker;\n const placement = _placement ?? \"end\";\n\n let type: LineMarkerType;\n let offsetUnit: number;\n\n switch (_type) {\n case \"0..1\":\n case \"0..N\":\n offsetUnit = 21;\n type = _type;\n break;\n default:\n offsetUnit = 1;\n type = \"arrow\";\n }\n const offset = offsetUnit * line.strokeWidth;\n\n const index = addMarker({ type, strokeColor: line.strokeColor }, markers);\n normalizedMarkers.push({\n index,\n placement,\n type,\n variant: \"default\",\n offset,\n });\n\n const activeStrokeColor =\n line.overrides?.active?.strokeColor ?? line.strokeColor;\n const activeMarkerIndex = addMarker(\n { type, strokeColor: activeStrokeColor },\n markers\n );\n normalizedMarkers.push({\n index: activeMarkerIndex,\n placement,\n type,\n variant: \"active\",\n offset,\n });\n const activeRelatedStrokeColor =\n line.overrides?.activeRelated?.strokeColor ?? line.strokeColor;\n const activeRelatedMarkerIndex = addMarker(\n { type, strokeColor: activeRelatedStrokeColor },\n markers\n );\n normalizedMarkers.push({\n index: activeRelatedMarkerIndex,\n placement,\n type,\n variant: \"active-related\",\n offset,\n });\n }\n\n normalizedLines.push({\n line,\n markers: normalizedMarkers,\n edge,\n });\n }\n return {\n normalizedLines,\n normalizedLinesMap,\n markers,\n };\n}\n\nfunction addMarker(marker: LineMarker, markers: LineMarker[]): number {\n let markerIndex = findIndex(markers, marker);\n if (markerIndex === -1) {\n markerIndex = markers.push(marker) - 1;\n }\n return markerIndex;\n}\n","import { checkIfByTransform } from \"@next-core/runtime\";\nimport type { DiagramEdge, LineConf } from \"../interfaces\";\n\nexport function matchEdgeByFilter(\n edge: DiagramEdge,\n filter: LineConf\n): boolean {\n if (!filter) {\n return false;\n }\n if (filter.edgeType) {\n return ([] as string[]).concat(filter.edgeType).includes(edge.type!);\n }\n return checkIfByTransform(filter, { edge });\n}\n","import type {\n ActiveTarget,\n ActiveTargetOfEdge,\n ActiveTargetOfNode,\n} from \"../interfaces\";\n\nexport function sameTarget(\n a: ActiveTarget | null | undefined,\n b: ActiveTarget | null | undefined\n): boolean {\n return a\n ? !!b &&\n a.type === b.type &&\n (a.type === \"node\"\n ? a.nodeId === (b as ActiveTargetOfNode).nodeId\n : a.edge.source === (b as ActiveTargetOfEdge).edge.source &&\n a.edge.target === (b as ActiveTargetOfEdge).edge.target)\n : !b;\n}\n","import type { RenderedNode, TransformLiteral } from \"../interfaces\";\n\nexport interface TransformToCenterOptions {\n canvasWidth: number;\n canvasHeight: number;\n scaleRange?: [min: number, max: number];\n}\n\nexport function transformToCenter(\n renderedNodes: RenderedNode[],\n { canvasWidth, canvasHeight, scaleRange }: TransformToCenterOptions\n): TransformLiteral {\n let left = Infinity;\n let top = Infinity;\n let right = -Infinity;\n let bottom = -Infinity;\n for (const node of renderedNodes) {\n const hw = node.width / 2;\n const hh = node.height / 2;\n const l = node.x - hw;\n const r = node.x + hw;\n const t = node.y - hh;\n const b = node.y + hh;\n if (l < left) {\n left = l;\n }\n if (r > right) {\n right = r;\n }\n if (t < top) {\n top = t;\n }\n if (b > bottom) {\n bottom = b;\n }\n }\n\n const width = right - left;\n const height = bottom - top;\n\n const scale =\n scaleRange && (width > canvasWidth || height > canvasHeight)\n ? Math.max(\n Math.min(canvasWidth / width, canvasHeight / height, scaleRange[1]),\n scaleRange[0]\n )\n : 1;\n\n const x = (canvasWidth - width * scale) / 2 - left * scale;\n const y = (canvasHeight - height * scale) / 2 - top * scale;\n\n return { x, y, k: scale };\n}\n","// Imports\nimport ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `:host{display:block;width:100%;height:100%;overflow:hidden}:host([hidden]){display:none}*{box-sizing:border-box}.diagram{width:100%;height:100%;position:relative;opacity:0}.diagram:focus{outline:none}.lines,\n.line-labels,\n.nodes{position:absolute;top:0;left:0}.line-labels{opacity:0}.ready{opacity:1}.diagram.ready.pannable{cursor:-webkit-grab;cursor:grab}.diagram.pannable.grabbing{cursor:-webkit-grabbing;cursor:grabbing}.nodes,\n.lines{transform-origin:0 0}.node,\n.line-label{position:absolute;visibility:hidden}.line-label{transform:translate(-50%,-50%);white-space:pre-line;width:-webkit-max-content;width:-moz-max-content;width:max-content;text-align:center;line-height:1}.lines{pointer-events:none}.line.interactable{pointer-events:auto;cursor:default}.connect-line{position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none}.connect-line:not(.connecting){display:none}.line:not(.active) .active-bg{display:none}`, \"\"]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___.toString();\n"],"names":["ConnectLineComponent","_ref","connectLineState","connectLineTo","markerPrefix","React","width","height","className","classNames","connecting","from","MarkerComponent","type","id","concat","strokeColor","options","d","join","fill","stroke","strokeWidth","markerEnd","arrow","undefined","LineComponent","_line$overrides","_line$overrides2","markerStart","line","edge","markers","linePaths","lineMaskRects","maskPrefix","activeLineMarkerPrefix","active","activeRelated","onLineClick","onLineDoubleClick","mask","has","$id","interactStrokeWidth","_objectSpread","overrides","expectVariant","marker","variant","placement","index","interactable","onClick","onDoubleClick","e","preventDefault","stopPropagation","style","cursor","ref","element","set","LineLabelComponentGroup","labels","onRendered","rendered","setRendered","useState","renderedIds","setRenderedIds","refRepository","useMemo","Map","handleRenderer","useCallback","previous","includes","handleUnmount","indexOf","slice","delete","useEffect","some","label","map","_ref2","text","key","LineLabelComponent","onUnmount","LineTextComponent","_ref3","refCallback","content","_ref4","useBrick","checkIfByTransform","memoizedData","setTimeout","parentElement","ignoredCallback","ReactUseBrick","data","LineMaskComponent","lineId","rects","renderedLineLabels","lineText","find","item","rect","padding","lineRect","bgRect","left","top","x","y","Component","EntityRelationZeroOrOneMarker","EntityRelationZeroOrManyMarker","ArrowMarker","viewBox","refX","refY","markerWidth","markerHeight","orient","strokeLinejoin","NodeComponentGroup","nodes","nodeBricks","node","NodeComponent","_findNodeBrick","nodeType","findNodeBrick","DEFAULT_LINE_STROKE_COLOR","DEFAULT_LINE_STROKE_WIDTH","DEFAULT_LINE_CURVE_TYPE","DEFAULT_LINE_INTERACT_STROKE_WIDTH","DEFAULT_SCALE_RANGE_MIN","DEFAULT_SCALE_RANGE_MAX","adjustNodesSize","nodesRefRepository","nodePaddings","_element$offsetWidth","_element$offsetHeight","get","Math","max","offsetWidth","offsetHeight","adjustNodesPosition","_nodesRefRepository$g","nodeContainer","visibility","extractPartialRectTuple","value","Array","isArray","v0","v1","length","getRenderedEdges","edges","_edges$map","normalizedLinesMap","lineLabelsRefRepository","labelSize","getDummyNodes","count","v","i","dummy","source","target","getDummyEdges","useRenderedDiagram","layout","originalLayout","manualLayoutStatus","userViewReady","userViewNodesMap","nodeMovement","nodesRenderId","lineLabelsRenderId","layoutOptions","graph","setGraph","renderedDiagram","setRenderedDiagram","previousGraph","dagreLayoutOptions","_nodePadding$rankdir$","nodePadding","rankdir","ranksep","edgesep","nodesep","pick","dagreGraphOptions","_objectWithoutProperties","_excluded","dagre","Graph","setDefaultEdgeLabel","previousNode","getNode","setNode","setEdge","applyLayout","renderedNodes","push","console","error","renderedEdges","_edge$labelSize","labelpos","getDagreGraph","forceLayoutOptions","dummyNodesOnEdges","collide","dummyRadius","radiusDiff","strength","iterations","renderedNode","userViewNode","fx","fy","forceNodes","forceLinks","linkSimulation","forceLink","distance","l","simulation","forceSimulation","force","forceX","forceY","forceManyBody","forceCollide","radius","sqrt","stop","tick","ceil","log","alphaMin","alphaDecay","manuallyTickToTheEnd","getForceGraph","movedNode","x0","y0","_movedNode$x","_movedNode$y","move","getManualGraph","USER_VIEW_MODEL_ID","useUserView","query","setUserViewReady","userViewIdRef","useRef","setUserViewNodesMap","queue","createAsyncQueue","working","waitingTasks","_queue","_asyncToGenerator","task","nextTask","shift","_x","apply","arguments","_getUserView","namespace","list","InstanceApi_postSearchV3","fields","$eq","page","page_size","_userView$nodes","userView","current","instanceId","handleHttpError","getUserView","saveUserView","userViewData","InstanceApi_updateInstanceV2","interceptorParams","ignoreLoadingBar","InstanceApi_createInstance","adjustLineLabels","position","angle","size","_size","tempDirection","floor","PI","direction","tangent","tan","offsetAngle","offsetSin","sin","offsetCos","cos","transform","getLineMaskRects","offsetLeft","offsetTop","getRenderedLineLabels","renderedLines","flatMap","path","getAttribute","getBBox","pathLength","getTotalLength","_item$placement","point","getPointAtLength","min","curveLine","points","curveType","startOffset","endOffset","curveFactory","curveLinear","curveBumpX","curveBumpY","curveMonotoneX","curveMonotoneY","curveNatural","curveBasis","startOffsets","getOffsets","endOffsets","curve","lineFunction","start","end","offset","x1","y1","ratio","pow","doTwoNodesOverlap","a","b","paddingA","paddingB","A","getNodesWithPadding","B","right","bottom","getCoordinates","getRenderedLines","normalizedLines","renderedEdgeMap","WeakMap","renderedNodeMap","relatedNodes","renderedEdge","prepared","_markers$find$offset","_markers$find","_markers$find$offset2","_markers$find2","rest","startMarkerOffset","endMarkerOffset","_relatedNodes$get","_relatedNodes$get2","prepareRelatedNodes","addRelatedNodes","to","relates","Set","toNode","add","sourceDirection","getDirection","targetDirection","sourceRelates","getOrderedRelates","targetRelates","sourcePosition","targetPosition","c1","c2","p0","p1","getPolyLinePoints","dx","dy","directionX","deltaRadio","abs","directionY","getDirectLinePoints","atan2","filter","Boolean","sourceAngle","sx","sy","tx","ty","fixedAngle","sort","ax","ay","bx","by","handleKeyboard","event","activeTarget","activeNode","nodeId","activeEdge","action","_node","keyCode","which","moveOnAxis","axis","diff","oppositeAxis","candidates","minBy","handleNodesMouseDown","connectNodes","dragNodes","scale","setConnectLineState","setConnectLineTo","setManualLayoutStatus","setNodeMovement","onSwitchActiveTarget","onNodesConnect","findNode","match","_ret","_loop","contains","sourceType","nodeMatched","clientX","clientY","__secret_internals","legacyDoTransform","onMouseMove","onMouseUp","document","removeEventListener","eventTargets","composedPath","addEventListener","moved","movement","normalizeLinesAndMarkers","lines","_lines$find","_line$markers","edgeType","matchEdgeByFilter","restLineConf","computedLineConf","draw","uniqueId","normalizedMarkers","lineMarkers","_line$overrides$activ","_line$overrides$activ2","_placement","_type","offsetUnit","addMarker","activeMarkerIndex","activeRelatedMarkerIndex","markerIndex","findIndex","sameTarget","transformToCenter","canvasWidth","canvasHeight","scaleRange","Infinity","hw","hh","r","t","k","___CSS_LOADER_EXPORT___","module","toString"],"sourceRoot":""}