@next-bricks/diagram 0.10.0 → 0.10.1

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.
@@ -535,30 +535,40 @@ context:
535
535
  value:
536
536
  - source: 产品
537
537
  target: 产品评价
538
+ sourceName: 评价列表
539
+ targetName: 所属产品
538
540
  sourceConstraints:
539
541
  required: true
540
542
  targetConstraints:
541
543
  multiple: true
542
544
  - source: 产品
543
545
  target: 产品线
546
+ sourceName: 所属产品线
547
+ targetName: 产品列表
544
548
  sourceConstraints:
545
549
  multiple: true
546
550
  targetConstraints:
547
551
  required: true
548
552
  - source: 产品
549
553
  target: 用户角色
554
+ sourceName: 负责人
555
+ targetName: 负责的产品
550
556
  sourceConstraints:
551
557
  multiple: true
552
558
  targetConstraints:
553
559
  multiple: true
554
560
  - source: 产品
555
561
  target: 模型视图
562
+ sourceName: 模型视图列表
563
+ targetName: 所属产品
556
564
  sourceConstraints:
557
565
  required: true
558
566
  targetConstraints:
559
567
  multiple: true
560
568
  - source: 产品
561
569
  target: 业务场景
570
+ sourceName: 业务场景列表
571
+ targetName: 所属产品
562
572
  sourceConstraints:
563
573
  required: true
564
574
  targetConstraints:
@@ -567,62 +577,74 @@ context:
567
577
  target: 业务场景
568
578
  - source: 业务场景
569
579
  target: 业务规则
580
+ sourceName: 业务规则列表
581
+ targetName: 所属业务场景
570
582
  sourceConstraints:
571
583
  required: true
572
584
  targetConstraints:
573
585
  multiple: true
574
586
  - source: 业务场景
575
587
  target: 用户角色
588
+ sourceName: 负责人
589
+ targetName: 负责的业务场景
576
590
  sourceConstraints:
577
591
  multiple: true
578
592
  targetConstraints:
579
593
  multiple: true
580
594
  - source: 产品
581
595
  target: 模型
596
+ sourceName: 模型列表
597
+ targetName: 关联的产品
582
598
  sourceConstraints:
583
599
  required: true
584
600
  targetConstraints:
585
601
  multiple: true
586
602
  - source: 产品
587
603
  target: 产品模块
604
+ sourceName: 模块列表
605
+ targetName: 所属产品
588
606
  sourceConstraints:
589
607
  required: true
590
608
  targetConstraints:
591
609
  multiple: true
592
610
  - source: 产品
593
611
  target: 产品价值点
612
+ sourceName: 价值点列表
613
+ targetName: 所属产品
594
614
  sourceConstraints:
595
615
  required: true
596
616
  targetConstraints:
597
617
  multiple: true
598
618
  - source: 业务场景
599
619
  target: 产品价值点
620
+ sourceName: 价值点列表
621
+ targetName: 关联的业务场景
600
622
  - source: 业务场景
601
623
  target: 工作流
602
624
  - source: 业务规则
603
625
  target: 工作流
604
- - source: 产品
605
- target: 产品模块
606
- sourceConstraints:
607
- required: true
608
- targetConstraints:
609
- multiple: true
610
626
  - source: 产品模块
611
627
  target: 产品模块
612
628
  - source: 产品模块
613
629
  target: 测试用例
630
+ sourceName: 测试用例列表
631
+ targetName: 所属产品模块
614
632
  sourceConstraints:
615
633
  multiple: true
616
634
  targetConstraints:
617
635
  multiple: true
618
636
  - source: 产品模块
619
637
  target: 功能点
638
+ sourceName: 功能点列表
639
+ targetName: 所属产品模块
620
640
  sourceConstraints:
621
641
  required: true
622
642
  targetConstraints:
623
643
  multiple: true
624
644
  - source: 测试用例
625
645
  target: 功能点
646
+ sourceName: 关联的功能点
647
+ targetName: 关联的测试用例
626
648
  sourceConstraints:
627
649
  multiple: true
628
650
  targetConstraints:
@@ -638,29 +660,32 @@ children:
638
660
  edges: <%= CTX.edges %>
639
661
  activeTarget: <%= CTX.activeTarget %>
640
662
  layoutOptions:
641
- nodePadding: 5
663
+ # nodePadding: 5
642
664
  dummyNodesOnEdges: 1
643
665
  collide:
644
666
  dummyRadius: 10
645
- radiusDiff: 32
667
+ radiusDiff: 40
646
668
  # rankdir: LR
647
669
  # acyclicer: greedy
648
670
  # align: DL
649
671
  lines:
650
- - arrow: false
672
+ - arrow: true
651
673
  # curveType: curveLinear
652
674
  # interactable: true
653
675
  text:
654
- - content: |
655
- <% DATA.edge.sourceConstraints ? `${DATA.edge.sourceConstraints.required ? "1" : "0"}${DATA.edge.sourceConstraints.multiple ? "..*" : ""}` : "0..1" %>
656
- style:
657
- color: rgba(128,128,128,0.8)
658
- placement: start
659
- - content: |
660
- <% DATA.edge.targetConstraints ? `${DATA.edge.targetConstraints.required ? "1" : "0"}${DATA.edge.targetConstraints.multiple ? "..*" : ""}` : "0..1" %>
676
+ - content: <% DATA.edge.sourceName %>
661
677
  style:
662
- color: rgba(128,128,128,0.8)
663
- placement: end
678
+ color: var(--palette-gray-6)
679
+ # - placement: start
680
+ # content: <% DATA.edge.sourceName %>
681
+ # style:
682
+ # color: var(--palette-gray-6)
683
+ # padding: 5px
684
+ # - placement: end
685
+ # content: <% DATA.edge.targetName %>
686
+ # style:
687
+ # color: var(--palette-gray-6)
688
+ # padding: 5px
664
689
  nodeBricks:
665
690
  - useBrick:
666
691
  # if: <% DATA.node.id !== "kbacon" %>
@@ -677,9 +702,10 @@ children:
677
702
  display: "flex",
678
703
  alignItems: "center",
679
704
  justifyContent: "center",
680
- outline: CTX.activeTarget?.type === "node" && DATA.node.id === CTX.activeTarget.nodeId ? "2px solid orange" : "none",
705
+ // outline: CTX.activeTarget?.type === "node" && DATA.node.id === CTX.activeTarget.nodeId ? "2px solid orange" : "none",
681
706
  outlineOffset: "2px",
682
707
  cursor: "pointer",
708
+ userSelect: "none",
683
709
  }
684
710
  %>
685
711
  children:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next-bricks/diagram",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
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": "af56f8a7cb3319600f17d8da6d9aa30ae86d2630"
43
+ "gitHead": "520aa0f03e91dddf56292b5057f13418d9617a0b"
44
44
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"chunks/4180.121ee4d3.js","mappings":"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","sources":["webpack:///./src/diagram/ClipPathComponent.tsx","webpack:///./src/diagram/ConnectLineComponent.tsx","webpack:///./src/diagram/LineComponent.tsx","webpack:///./src/diagram/LineLabelComponent.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/lines/getDirectLinePoints.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/getClipPathList.ts","webpack:///./src/diagram/processors/getRenderedLineLabels.ts","webpack:///./src/diagram/lines/curveLine.ts","webpack:///./src/diagram/processors/getRenderedLines.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/transformToCenter.ts","webpack:///./src/diagram/styles.shadow.css"],"sourcesContent":["import React from \"react\";\nimport type { LineTextClipPath, RenderedLineLabel } from \"./interfaces\";\n\nexport interface ClipPathComponentProps {\n clipPathPrefix: string;\n clipPath: LineTextClipPath;\n renderedLineLabels: RenderedLineLabel[];\n}\n\nexport function ClipPathComponent({\n clipPath,\n clipPathPrefix,\n renderedLineLabels,\n}: ClipPathComponentProps): JSX.Element | null {\n const { x0, y0, w, h, lineId } = clipPath;\n const lineText = renderedLineLabels.find(\n (item) => item.lineId === lineId && item.placement === \"center\"\n );\n if (!lineText) {\n return null;\n }\n const { left, top, right, bottom } = lineText.lineRect;\n // https://css-tricks.com/cutting-inner-part-element-using-clip-path/\n return (\n <clipPath key={lineId} id={`${clipPathPrefix}${lineId}`}>\n <polygon\n points={[\n `${x0},${y0 + h}`,\n `${x0 + w},${y0 + h}`,\n `${x0 + w},${y0}`,\n `${x0},${y0}`,\n `${x0},${top}`,\n `${right},${top}`,\n `${right},${bottom}`,\n `${left},${bottom}`,\n `${left},${top}`,\n `${x0},${top}`,\n ].join(\" \")}\n />\n </clipPath>\n );\n}\n","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 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 {\n DiagramEdge,\n LineTarget,\n LineTextClipPath,\n RenderedLine,\n} from \"./interfaces\";\n\nexport interface LineComponentProps {\n line: RenderedLine;\n linePaths: Map<string, SVGPathElement | null>;\n clipPathList: LineTextClipPath[];\n markerPrefix: string;\n clipPathPrefix: string;\n activeLineMarkerPrefix: string;\n activeEdge: DiagramEdge | null;\n onLineClick?(line: LineTarget): void;\n onLineDoubleClick?(line: LineTarget): void;\n}\n\nexport function LineComponent({\n line: { line, d, markerIndex, edge },\n linePaths,\n clipPathList,\n markerPrefix,\n clipPathPrefix,\n activeLineMarkerPrefix,\n activeEdge,\n onLineClick,\n onLineDoubleClick,\n}: LineComponentProps): JSX.Element {\n const clipPath = clipPathList.some((clip) => clip.lineId === line.$id)\n ? `url(#${clipPathPrefix}${line.$id})`\n : undefined;\n return (\n <g\n className={classNames(\"line\", {\n interactable: line.interactable,\n active:\n activeEdge &&\n edge.source === activeEdge.source &&\n edge.target === activeEdge.target,\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={line.interactStrokeWidth}\n />\n )}\n <path\n ref={(element) => linePaths.set(line.$id, element)}\n stroke={line.strokeColor}\n strokeWidth={line.strokeWidth}\n d={d}\n fill=\"none\"\n markerEnd={\n markerIndex === undefined\n ? undefined\n : `url(#${markerPrefix}${markerIndex})`\n }\n clipPath={clipPath}\n />\n <path\n stroke=\"var(--palette-blue-3)\"\n strokeWidth={line.strokeWidth}\n d={d}\n fill=\"none\"\n className=\"active-bg\"\n markerStart={`url(#${activeLineMarkerPrefix}start)`}\n markerEnd={`url(#${activeLineMarkerPrefix}end)`}\n clipPath={clipPath}\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\";\n\nexport interface MarkerComponentProps {\n id: string;\n strokeColor?: string;\n}\n\nexport function MarkerComponent({\n id,\n strokeColor,\n}: MarkerComponentProps): JSX.Element {\n return (\n <marker\n id={id}\n viewBox=\"0 0 6 6\"\n refX={3}\n refY={3}\n markerWidth={6}\n markerHeight={6}\n orient=\"auto\"\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","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 (element?.offsetWidth ?? 10) + nodePaddings[1] + nodePaddings[3];\n node.height =\n (element?.offsetHeight ?? 10) + nodePaddings[0] + 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 RenderedNode,\n} from \"../interfaces\";\nimport { getDirectLinePoints } from \"../lines/getDirectLinePoints\";\n\nexport function getRenderedEdges(\n edges: DiagramEdge[] | undefined,\n {\n getNode,\n normalizedLinesMap,\n lineLabelsRefRepository,\n }: {\n getNode(id: string): RenderedNode | undefined;\n normalizedLinesMap: WeakMap<DiagramEdge, string>;\n lineLabelsRefRepository: RefRepository;\n }\n) {\n return (\n edges?.map((edge) => {\n const source = getNode(edge.source)!;\n const target = getNode(edge.target)!;\n const points = getDirectLinePoints(source, target);\n let angle: number | undefined;\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 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 points,\n angle,\n labelSize,\n };\n }) ?? []\n );\n}\n","import type { NodePosition, RenderedNode } from \"../interfaces\";\n\nexport function getDirectLinePoints(\n source: RenderedNode,\n target: RenderedNode\n): NodePosition[] | null {\n // Ignore if two nodes are the same.\n if (source === target) {\n return null;\n }\n\n // Ignore if two nodes overlap.\n const left = Math.min(\n source.x - source.width / 2,\n target.x - target.width / 2\n );\n const right = Math.max(\n source.x + source.width / 2,\n target.x + target.width / 2\n );\n const top = Math.min(\n source.y - source.height / 2,\n target.y - target.height / 2\n );\n const bottom = Math.max(\n source.y + source.height / 2,\n target.y + target.height / 2\n );\n if (\n right - left < source.width + target.width &&\n bottom - top < source.height + target.height\n ) {\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","// 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 getNode,\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 getNode,\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 LineTextClipPath,\n RefRepository,\n RenderedLineLabel,\n} from \"../interfaces\";\n\nexport function getClipPathList(\n renderedLineLabels: RenderedLineLabel[],\n lineLabelsRefRepository: RefRepository\n) {\n return renderedLineLabels\n .map(({ id, lineId, placement }) => {\n if (!lineLabelsRefRepository || placement !== \"center\") {\n return;\n }\n const element = lineLabelsRefRepository.get(id);\n if (!element) {\n return;\n }\n const { offsetWidth, offsetHeight } = element;\n // Do not clip when the label takes no space.\n if (\n process.env.NODE_ENV !== \"test\" &&\n (offsetWidth === 0 || offsetHeight === 0)\n ) {\n return;\n }\n const padding = 3;\n return {\n x0: element.offsetLeft - offsetWidth / 2 - padding,\n y0: element.offsetTop - offsetHeight / 2 - padding,\n w: offsetWidth + padding * 2,\n h: offsetHeight + padding * 2,\n lineId,\n };\n })\n .filter(Boolean) as LineTextClipPath[];\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 { x, y, width, height } =\n process.env.NODE_ENV === \"test\"\n ? { x: 10, y: 20, width: 300, height: 400 }\n : path.getBBox();\n // Make redundant extra padding.\n const padding = 1000;\n const left = x - padding;\n const top = y - padding;\n const right = x + width + padding;\n const bottom = y + height + padding;\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, right, bottom },\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 arrowOffset: number,\n curveType?: CurveType\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 let arrowOffsetX = 0;\n let arrowOffsetY = 0;\n if (arrowOffset) {\n const { x: x0, y: y0 } = points[points.length - 2];\n const { x: x1, y: y1 } = points[points.length - 1];\n const distance = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2));\n const ratio = arrowOffset / distance;\n arrowOffsetX = (x0 - x1) * ratio;\n arrowOffsetY = (y0 - y1) * ratio;\n }\n const transformPoints = points;\n const lineFunction = line()\n .x(\n (d, index) =>\n (d as unknown as { x: number }).x -\n (index === points.length - 1 ? arrowOffsetX : 0)\n )\n .y(\n (d, index) =>\n (d as unknown as { y: number }).y -\n (index === points.length - 1 ? arrowOffsetY : 0)\n )\n .curve(curveFactory);\n return lineFunction(transformPoints as unknown as Array<[number, number]>)!;\n}\n","import type {\n DiagramEdge,\n NormalizedLine,\n RenderedEdge,\n RenderedLine,\n} from \"../interfaces\";\nimport { curveLine } from \"../lines/curveLine\";\n\nexport function getRenderedLines(\n renderedEdges: RenderedEdge[],\n normalizedLines: NormalizedLine[]\n): RenderedLine[] {\n const renderedMap = new WeakMap<DiagramEdge, RenderedEdge>();\n for (const renderedEdge of renderedEdges) {\n renderedMap.set(renderedEdge.data, renderedEdge);\n }\n return normalizedLines\n .map(({ line, edge, ...rest }) => {\n const renderedEdge = renderedMap.get(edge);\n if (!renderedEdge) {\n return;\n }\n const d = curveLine(\n renderedEdge.points,\n line.arrow ? -5 : 0,\n line.curveType\n );\n return {\n ...rest,\n line,\n edge,\n d,\n angle: renderedEdge.angle,\n labelSize: renderedEdge.labelSize,\n };\n })\n .filter(Boolean) as RenderedLine[];\n}\n","import { minBy } from \"lodash\";\nimport type {\n ActiveTarget,\n DiagramEdge,\n DiagramNode,\n RenderedEdge,\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 renderedEdges,\n activeTarget,\n }: {\n renderedNodes: RenderedNode[];\n renderedEdges: RenderedEdge[];\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 = moveOnX(renderedNodes, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowUp\":\n case 38: {\n node = moveOnY(renderedNodes, renderedEdges, activeNode, -1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowRight\":\n case 39: {\n node = moveOnX(renderedNodes, activeNode, 1);\n action = \"switch-active-node\";\n break;\n }\n case \"ArrowDown\":\n case 40: {\n node = moveOnY(renderedNodes, renderedEdges, 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 moveOnX(\n renderedNodes: RenderedNode[],\n activeNode: RenderedNode,\n direction: 1 | -1\n) {\n let diff: number;\n const candidates = renderedNodes.filter(\n (node) =>\n node !== activeNode &&\n ((diff = (node.x - activeNode.x) * direction), diff > 0) &&\n diff > Math.abs(activeNode.y - node.y)\n );\n return minBy(\n candidates,\n (node) => (activeNode.y - node.y) ** 2 + (activeNode.x - node.x) ** 2\n );\n}\n\nfunction moveOnY(\n renderedNodes: RenderedNode[],\n renderedEdges: RenderedEdge[],\n activeNode: RenderedNode,\n direction: 1 | -1\n) {\n const from = direction === 1 ? \"source\" : \"target\";\n const to = direction === 1 ? \"target\" : \"source\";\n const candidateEdges = renderedEdges.filter(\n ({ data }) => data[from] === activeNode.id && data[to] !== activeNode.id\n );\n const candidates = candidateEdges\n .map(({ data }) => renderedNodes.find((node) => node.id === data[to]))\n .filter(\n (node) => node && (node.y - activeNode.y) * direction > 0\n ) as RenderedNode[];\n return minBy(\n candidates,\n (node) => (activeNode.y - node.y) ** 2 + (activeNode.x - node.x) ** 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 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 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 const movement: PositionTuple = [e.clientX - from[0], e.clientY - from[1]];\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 NormalizedLine,\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: DEFAULT_LINE_CURVE_TYPE,\n interactStrokeWidth: DEFAULT_LINE_INTERACT_STROKE_WIDTH,\n ...computedLineConf,\n label,\n $id: id,\n };\n normalizedLinesMap.set(edge, id);\n\n let markerIndex: number | undefined;\n if (line.arrow) {\n const marker: LineMarker = {\n strokeColor: line.strokeColor,\n };\n markerIndex = findIndex(markers, marker);\n if (markerIndex === -1) {\n markerIndex = markers.push(marker) - 1;\n }\n }\n\n normalizedLines.push({\n line,\n markerIndex,\n edge,\n });\n }\n return {\n normalizedLines,\n normalizedLinesMap,\n markers,\n };\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 { 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":["ClipPathComponent","_ref","clipPath","clipPathPrefix","renderedLineLabels","x0","y0","w","h","lineId","lineText","find","item","placement","left","top","right","bottom","lineRect","React","key","id","concat","points","join","ConnectLineComponent","connectLineState","connectLineTo","markerPrefix","width","height","className","classNames","connecting","from","MarkerComponent","strokeColor","options","d","fill","stroke","strokeWidth","markerEnd","arrow","undefined","LineComponent","line","markerIndex","edge","linePaths","clipPathList","activeLineMarkerPrefix","activeEdge","onLineClick","onLineDoubleClick","some","clip","$id","interactable","active","source","target","onClick","onDoubleClick","e","preventDefault","stopPropagation","style","cursor","interactStrokeWidth","ref","element","set","markerStart","LineLabelComponentGroup","labels","onRendered","rendered","setRendered","useState","renderedIds","setRenderedIds","refRepository","useMemo","Map","handleRenderer","useCallback","previous","includes","handleUnmount","index","indexOf","slice","delete","useEffect","label","map","_ref2","text","LineLabelComponent","onUnmount","LineTextComponent","_ref3","refCallback","content","_ref4","useBrick","checkIfByTransform","memoizedData","setTimeout","parentElement","ignoredCallback","ReactUseBrick","data","viewBox","refX","refY","markerWidth","markerHeight","orient","NodeComponentGroup","nodes","nodeBricks","node","NodeComponent","_findNodeBrick","nodeType","type","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","offsetWidth","offsetHeight","adjustNodesPosition","_nodesRefRepository$g","x","y","nodeContainer","visibility","extractPartialRectTuple","value","Array","isArray","v0","v1","length","getRenderedEdges","edges","_edges$map","getNode","normalizedLinesMap","lineLabelsRefRepository","angle","Math","min","max","x1","y1","dx","dy","directionX","deltaRadio","abs","directionY","getDirectLinePoints","start","end","atan2","labelSize","getDummyNodes","count","v","i","dummy","getDummyEdges","useRenderedDiagram","layout","originalLayout","manualLayoutStatus","userViewReady","userViewNodesMap","nodeMovement","nodesRenderId","lineLabelsRenderId","layoutOptions","graph","setGraph","renderedDiagram","setRenderedDiagram","previousGraph","dagreLayoutOptions","_nodePadding$rankdir$","_objectSpread","nodePadding","rankdir","ranksep","edgesep","nodesep","pick","dagreGraphOptions","_objectWithoutProperties","_excluded","dagre","Graph","setDefaultEdgeLabel","previousNode","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","_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","size","_size","tempDirection","floor","PI","direction","tangent","tan","offsetAngle","offsetSin","sin","offsetCos","cos","transform","getClipPathList","offsetLeft","offsetTop","padding","filter","Boolean","getRenderedLineLabels","renderedLines","flatMap","path","getAttribute","getBBox","pathLength","getTotalLength","_item$placement","point","getPointAtLength","curveLine","arrowOffset","curveType","curveFactory","curveLinear","curveBumpX","curveBumpY","curveMonotoneX","curveMonotoneY","curveNatural","curveBasis","arrowOffsetX","arrowOffsetY","ratio","pow","transformPoints","curve","lineFunction","getRenderedLines","normalizedLines","renderedMap","WeakMap","renderedEdge","rest","handleKeyboard","event","activeTarget","activeNode","nodeId","action","_node","keyCode","which","moveOnX","moveOnY","diff","candidates","minBy","to","handleNodesMouseDown","connectNodes","dragNodes","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","markers","_lines$find","edgeType","matchEdgeByFilter","restLineConf","computedLineConf","draw","uniqueId","marker","findIndex","transformToCenter","canvasWidth","canvasHeight","scaleRange","Infinity","hw","hh","r","t","b","scale","k","___CSS_LOADER_EXPORT___","module","toString"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunk_next_bricks_diagram=self.webpackChunk_next_bricks_diagram||[]).push([[9393],{9393:(e,t,a)=>{a.r(t);var n,l,i,s,r,o,c,u,h,d,b,p,v,g,w,Z,m,f,k,y,M,E,W,x,C,L,N,R,S,z,D,T,B,P,A,O,H,K,I,V,_,X,Y,$,q,U,j,F,G,J,Q,ee,te,ae,ne,le,ie,se,re,oe,ce=a(3395),ue=a(1815),he=a(381),de=a(687),be=a(5066),pe=a(8657),ve=a.n(pe),ge=a(5727),we=a(305),Ze=(a(928),a(1105)),me=a(3725),fe=a(2779),ke=a.n(fe),ye=a(1211),Me=a(2370),Ee=a(5702),We=a(7441),xe=a(2846),Ce=a(4880),Le=a(7853),Ne=a(6462),Re=a(9575),Se=a(2260),ze=a(7587),De=a(1251),Te=a(4126),Be=a(542),Pe=a(5318),Ae=a(2359),Oe=a(7271),He=a(6436),Ke=a(8116),{defineElement:Ie,property:Ve,event:_e,method:Xe}=(0,ge.createDecorators)(),Ye=(0,pe.forwardRef)(Kt);l=Ie("eo-diagram",{styleTexts:[He.Z]}),i=Ve({type:String}),r=Ve({attribute:!1}),c=Ve({attribute:!1}),h=Ve({attribute:!1}),b=Ve({attribute:!1}),v=Ve({attribute:!1}),w=Ve({attribute:!1}),m=Ve({type:Boolean}),k=Ve({attribute:!1}),M=Ve({attribute:!1}),W=Ve({attribute:!1}),C=Ve({type:Boolean}),N=Ve({type:Boolean}),S=Ve({type:Boolean}),D=Ve({attribute:!1}),B=_e({type:"activeTarget.change"}),H=_e({type:"node.delete"}),_=_e({type:"edge.delete"}),q=_e({type:"line.click"}),G=_e({type:"line.dblclick"}),te=_e({type:"nodes.connect"}),ie=Xe();var $e=new WeakMap,qe=new WeakMap,Ue=new WeakMap,je=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,lt=new WeakMap,it=new WeakMap,st=new WeakMap,rt=new WeakMap,ot=new WeakMap,ct=new WeakMap,ut=new WeakMap,ht=new WeakMap,dt=new WeakMap,bt=new WeakMap,pt=new WeakMap,vt=new WeakMap,gt=new WeakMap,wt=new WeakMap,Zt=new WeakMap,mt=new WeakMap,ft=new WeakMap,kt=new WeakMap,yt=new WeakMap,Mt=new WeakMap,Et=new WeakMap,Wt=new WeakMap,xt=new WeakMap;class Ct extends we.ReactNextElement{constructor(){super(...arguments),(0,ce.Z)(this,Mt,{get:Ht,set:Ot}),(0,ce.Z)(this,ft,{get:At,set:Pt}),(0,ce.Z)(this,wt,{get:Bt,set:Tt}),(0,ce.Z)(this,pt,{get:Dt,set:zt}),(0,ce.Z)(this,ht,{get:St,set:Rt}),(0,ce.Z)(this,ot,{get:Nt,set:Lt}),(0,ce.Z)(this,$e,{writable:!0,value:(se(this),s(this))}),(0,ce.Z)(this,qe,{writable:!0,value:o(this)}),(0,ce.Z)(this,Ue,{writable:!0,value:u(this)}),(0,ce.Z)(this,je,{writable:!0,value:d(this)}),(0,ce.Z)(this,Fe,{writable:!0,value:p(this)}),(0,ce.Z)(this,Ge,{writable:!0,value:g(this)}),(0,ce.Z)(this,Je,{writable:!0,value:Z(this)}),(0,ce.Z)(this,Qe,{writable:!0,value:f(this)}),(0,ce.Z)(this,et,{writable:!0,value:y(this)}),(0,ce.Z)(this,tt,{writable:!0,value:E(this)}),(0,ce.Z)(this,at,{writable:!0,value:x(this)}),(0,ce.Z)(this,nt,{writable:!0,value:L(this,!0)}),(0,ce.Z)(this,lt,{writable:!0,value:R(this,!0)}),(0,ce.Z)(this,it,{writable:!0,value:z(this,!0)}),(0,ce.Z)(this,st,{writable:!0,value:T(this)}),(0,ce.Z)(this,rt,{writable:!0,value:P(this)}),(0,ce.Z)(this,ct,{writable:!0,value:e=>{(0,de.Z)(this,ot).emit(e)}}),(0,ce.Z)(this,ut,{writable:!0,value:K(this)}),(0,ce.Z)(this,dt,{writable:!0,value:e=>{(0,de.Z)(this,ht).emit(e)}}),(0,ce.Z)(this,bt,{writable:!0,value:X(this)}),(0,ce.Z)(this,vt,{writable:!0,value:e=>{(0,de.Z)(this,pt).emit(e)}}),(0,ce.Z)(this,gt,{writable:!0,value:U(this)}),(0,ce.Z)(this,Zt,{writable:!0,value:e=>{(0,de.Z)(this,wt).emit(e)}}),(0,ce.Z)(this,mt,{writable:!0,value:J(this)}),(0,ce.Z)(this,kt,{writable:!0,value:e=>{(0,de.Z)(this,ft).emit(e)}}),(0,ce.Z)(this,yt,{writable:!0,value:ae(this)}),(0,ce.Z)(this,Et,{writable:!0,value:e=>{(0,de.Z)(this,Mt).emit(e)}}),(0,ce.Z)(this,Wt,{writable:!0,value:e=>{this.activeTarget=e}}),(0,ce.Z)(this,xt,{writable:!0,value:(0,pe.createRef)()})}get layout(){return(0,de.Z)(this,$e)}set layout(e){(0,he.Z)(this,$e,e)}get nodes(){return(0,de.Z)(this,qe)}set nodes(e){(0,he.Z)(this,qe,e)}get edges(){return(0,de.Z)(this,Ue)}set edges(e){(0,he.Z)(this,Ue,e)}get nodeBricks(){return(0,de.Z)(this,je)}set nodeBricks(e){(0,he.Z)(this,je,e)}get lines(){return(0,de.Z)(this,Fe)}set lines(e){(0,he.Z)(this,Fe,e)}get layoutOptions(){return(0,de.Z)(this,Ge)}set layoutOptions(e){(0,he.Z)(this,Ge,e)}get activeTarget(){return(0,de.Z)(this,Je)}set activeTarget(e){(0,he.Z)(this,Je,e)}get disableKeyboardAction(){return(0,de.Z)(this,Qe)}set disableKeyboardAction(e){(0,he.Z)(this,Qe,e)}get connectNodes(){return(0,de.Z)(this,et)}set connectNodes(e){(0,he.Z)(this,et,e)}get nodesConnect(){return(0,de.Z)(this,tt)}set nodesConnect(e){(0,he.Z)(this,tt,e)}get dragNodes(){return(0,de.Z)(this,at)}set dragNodes(e){(0,he.Z)(this,at,e)}get zoomable(){return(0,de.Z)(this,nt)}set zoomable(e){(0,he.Z)(this,nt,e)}get scrollable(){return(0,de.Z)(this,lt)}set scrollable(e){(0,he.Z)(this,lt,e)}get pannable(){return(0,de.Z)(this,it)}set pannable(e){(0,he.Z)(this,it,e)}get scaleRange(){return(0,de.Z)(this,st)}set scaleRange(e){(0,he.Z)(this,st,e)}callOnLineLabel(e,t){for(var a,n=arguments.length,l=new Array(n>2?n-2:0),i=2;i<n;i++)l[i-2]=arguments[i];null===(a=(0,de.Z)(this,xt).current)||void 0===a||a.callOnLineLabel(e,t,...l)}render(){var e;return ve().createElement(Ye,{ref:(0,de.Z)(this,xt),layout:this.layout,nodes:this.nodes,edges:this.edges,nodeBricks:this.nodeBricks,lines:this.lines,layoutOptions:this.layoutOptions,connectNodes:null!==(e=this.connectNodes)&&void 0!==e?e:this.nodesConnect,dragNodes:this.dragNodes,activeTarget:this.activeTarget,disableKeyboardAction:this.disableKeyboardAction,zoomable:this.zoomable,scrollable:this.scrollable,pannable:this.pannable,scaleRange:this.scaleRange,onActiveTargetChange:(0,de.Z)(this,ct),onSwitchActiveTarget:(0,de.Z)(this,Wt),onNodeDelete:(0,de.Z)(this,dt),onEdgeDelete:(0,de.Z)(this,vt),onLineClick:(0,de.Z)(this,Zt),onLineDoubleClick:(0,de.Z)(this,kt),onNodesConnect:(0,de.Z)(this,Et)})}}function Lt(e){O(this,e)}function Nt(){return A(this)}function Rt(e){V(this,e)}function St(){return I(this)}function zt(e){$(this,e)}function Dt(){return Y(this)}function Tt(e){F(this,e)}function Bt(){return j(this)}function Pt(e){ee(this,e)}function At(){return Q(this)}function Ot(e){le(this,e)}function Ht(){return ne(this)}function Kt(e,t){var{layout:a,nodes:n,edges:l,nodeBricks:i,lines:s,layoutOptions:r,connectNodes:o,dragNodes:c,activeTarget:u,disableKeyboardAction:h,zoomable:d,scrollable:b,pannable:p,scaleRange:v,onActiveTargetChange:g,onSwitchActiveTarget:w,onNodeDelete:Z,onEdgeDelete:m,onLineClick:f,onLineDoubleClick:k,onNodesConnect:y}=e,[M,E]=(0,pe.useState)(!1),[W,x]=(0,pe.useState)(0),[C,L]=(0,pe.useState)(null),[N,R]=(0,pe.useState)(!1),[S,z]=(0,pe.useState)(0),[D,T]=(0,pe.useState)(null),[B,P]=(0,pe.useState)([]),[A,O]=(0,pe.useState)(!1),[H,K]=(0,pe.useState)({k:1,x:0,y:0}),I=(0,pe.useRef)(new Map),V=(0,pe.useRef)(null),_=(0,pe.useRef)(null),[X,Y]=(0,pe.useState)(!1),{userViewReady:$,userViewNodesMap:q,saveUserView:U}=(0,Ke.k)(null==c?void 0:c.save),[j,F]=(0,pe.useState)([0,0]),[G,J]=(0,pe.useState)(null),[Q,ee]=(0,pe.useState)("initial"),[te,ae]=(0,pe.useState)(null);(0,pe.useImperativeHandle)(t,(()=>({callOnLineLabel(e,t){for(var a,n=arguments.length,l=new Array(n>2?n-2:0),i=2;i<n;i++)l[i-2]=arguments[i];null==D||null===(a=D.get(e))||void 0===a||null===(a=a.firstElementChild)||void 0===a||a[t](...l)}}))),(0,pe.useEffect)((()=>{var e=e=>{(0,Be.w)(e,{nodes:n,nodesRefRepository:C,connectNodes:o,dragNodes:c,setConnectLineState:J,setConnectLineTo:F,setManualLayoutStatus:ee,setNodeMovement:ae,onSwitchActiveTarget:w,onNodesConnect:y})},t=_.current;return null==t||t.addEventListener("mousedown",e),()=>{null==t||t.removeEventListener("mousedown",e)}}),[n,o,c,C,y,w]);var{normalizedLines:ne,normalizedLinesMap:le,markers:ie}=(0,pe.useMemo)((()=>(0,Ce.c)(l,s)),[l,s]),se=(0,pe.useMemo)((()=>ne.flatMap((e=>{var t,a,{line:{text:n,label:l,$id:i},edge:s}=e;return n||l?(l?(t="label",a=[].concat(l)):(t="text",a=[].concat(n)),a.map((e=>{var a;return{[t]:e,id:"".concat(i,"-").concat(null!==(a=e.placement)&&void 0!==a?a:"center"),edge:s}}))):[]}))),[ne]),{nodes:re,edges:oe}=(0,Ae.n)({layout:a,nodes:n,edges:l,manualLayoutStatus:Q,userViewReady:$,userViewNodesMap:q,nodeMovement:te,nodesRefRepository:C,lineLabelsRefRepository:D,normalizedLinesMap:le,layoutOptions:r,nodesRenderId:W,lineLabelsRenderId:S});(0,pe.useEffect)((()=>{"finished"===Q&&U(re.map((e=>({id:e.id,x:e.x,y:e.y}))))}),[Q]);var ce=(0,pe.useMemo)((()=>(0,xe.s)(oe,ne)),[ne,oe]),ue=(0,pe.useRef)(!1);(0,pe.useEffect)((()=>{ue.current?null==g||g(null!=u?u:null):ue.current=!0}),[n,u,g]),(0,pe.useEffect)((()=>{var e=V.current;if(e&&!h){var t=e=>{var t=(0,Ee.p)(e,{renderedNodes:re,renderedEdges:oe,activeTarget:u});"delete-node"===(null==t?void 0:t.action)?null==Z||Z(t.node):"delete-edge"===(null==t?void 0:t.action)?null==m||m(t.edge):"switch-active-node"===(null==t?void 0:t.action)&&t.node&&(null==w||w({type:"node",nodeId:t.node.id}))};return e.addEventListener("keydown",t),()=>{e.removeEventListener("keydown",t)}}}),[u,re,oe,h,w,Z,m]);var he=(0,pe.useCallback)((e=>{e&&(x((e=>e+1)),L(e)),E((t=>t||!!e))}),[]),de=(0,pe.useCallback)((e=>{e&&(z((e=>e+1)),T(e)),R((t=>t||!!e))}),[]),be=(0,pe.useMemo)((()=>null!=v?v:[Pe.oh,Pe.rN]),[v]),ge=(0,pe.useMemo)((()=>(0,me.sP)()),[]);(0,pe.useEffect)((()=>{var e=!1;ge.scaleExtent(d?be:[1,1]).on("start",(()=>{e=!1,O(!0)})).on("zoom",(t=>{e=!0,K(t.transform)})).on("end",(()=>{O(!1),e||null==w||w(null)}))}),[w,be,d,ge]),(0,pe.useEffect)((()=>{var e=V.current;if(e){var t=(0,Ze.Z)(e),a=()=>{t.on(".zoom",null).on(".zoom.custom",null).on("wheel",null)};if(d||b||p)return(d||b)&&t.on("wheel.zoom.custom",(e=>{e.ctrlKey||(e.stopImmediatePropagation(),b&&(e.preventDefault(),ge.translateBy(t,e.wheelDeltaX/5,e.wheelDeltaY/5)))})),t.call(ge).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,b,d,ge]),(0,pe.useEffect)((()=>{var e=V.current;if(0!==re.length&&e&&!X){var{k:t,x:a,y:n}=(0,We.i)(re,{canvasWidth:e.clientWidth,canvasHeight:e.clientHeight,scaleRange:d?be:void 0});ge.transform((0,Ze.Z)(e),new me.ax(t,a,n)),Y(!0)}}),[X,re,be,d,ge]);var we=(0,pe.useMemo)((()=>"".concat((0,ye.uniqueId)("diagram-"),"-")),[]),fe="".concat(we,"line-arrow-"),He="".concat(we,"clip-path-"),Ie="".concat(we,"active-line-");(0,pe.useEffect)((()=>{P((e=>(0,Te.K)(e,ce,I.current)))}),[ce]);var[Ve,_e]=ve().useState([]);return(0,pe.useEffect)((()=>{D&&((0,Oe.b)(B,D),_e((0,De.i)(B,D)))}),[S,D,B]),"dagre"!==a&&"force"!==a?ve().createElement("div",null,'Diagram layout not supported: "'.concat(a,'"')):ve().createElement("div",{className:ke()("diagram",{ready:M&&X,grabbing:A,pannable:p}),tabIndex:-1,ref:V},ve().createElement("svg",{width:"100%",height:"100%",className:"lines"},ve().createElement("defs",null,ie.map(((e,t)=>{var{strokeColor:a}=e;return ve().createElement(Re.C,{key:t,id:"".concat(fe).concat(t),strokeColor:a})})),Ve.map((e=>ve().createElement(Se.K,{key:e.lineId,clipPath:e,clipPathPrefix:He,renderedLineLabels:B}))),ve().createElement("marker",{id:"".concat(Ie,"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(Ie,"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(H.x," ").concat(H.y,") scale(").concat(H.k,")")},ce.map((e=>ve().createElement(Ne.y,{key:e.line.$id,line:e,linePaths:I.current,clipPathList:Ve,markerPrefix:fe,clipPathPrefix:He,activeLineMarkerPrefix:Ie,activeEdge:"edge"===(null==u?void 0:u.type)?u.edge:null,onLineClick:f,onLineDoubleClick:k}))))),ve().createElement("div",{className:ke()("line-labels",{ready:N}),style:{left:H.x,top:H.y,transform:"scale(".concat(H.k,")")}},ve().createElement(Le.L8,{labels:se,onRendered:de})),ve().createElement("div",{className:"nodes",ref:_,style:{left:H.x,top:H.y,transform:"scale(".concat(H.k,")")}},ve().createElement(Me.n,{nodes:n,nodeBricks:i,onRendered:he})),ve().createElement(ze.f,{connectLineState:G,connectLineTo:j,markerPrefix:fe}))}re=Ct,({e:[s,o,u,d,p,g,Z,f,y,E,x,L,R,z,T,P,A,O,K,I,V,X,Y,$,U,j,F,J,Q,ee,ae,ne,le,se],c:[oe,n]}=(0,be.Z)(re,[[i,1,"layout"],[r,1,"nodes"],[c,1,"edges"],[h,1,"nodeBricks"],[b,1,"lines"],[v,1,"layoutOptions"],[w,1,"activeTarget"],[m,1,"disableKeyboardAction"],[k,1,"connectNodes"],[M,1,"nodesConnect"],[W,1,"dragNodes"],[C,1,"zoomable"],[N,1,"scrollable"],[S,1,"pannable"],[D,1,"scaleRange"],[B,1,"activeTargetChangeEvent",e=>(0,de.Z)(e,rt),(e,t)=>(0,he.Z)(e,rt,t)],[H,1,"nodeDelete",e=>(0,de.Z)(e,ut),(e,t)=>(0,he.Z)(e,ut,t)],[_,1,"edgeDelete",e=>(0,de.Z)(e,bt),(e,t)=>(0,he.Z)(e,bt,t)],[q,1,"lineClick",e=>(0,de.Z)(e,gt),(e,t)=>(0,he.Z)(e,gt,t)],[G,1,"lineDoubleClick",e=>(0,de.Z)(e,mt),(e,t)=>(0,he.Z)(e,mt,t)],[te,1,"connectNodes",e=>(0,de.Z)(e,yt),(e,t)=>(0,he.Z)(e,yt,t)],[ie,2,"callOnLineLabel"]],[l],0,(e=>xt.has((0,ue.Z)(e))),we.ReactNextElement)),n();var It,Vt,_t,Xt,Yt,$t,qt,Ut,jt,Ft,Gt,Jt,Qt,ea,ta,aa,na,la,ia=a(8074),{defineElement:sa,property:ra,event:oa,method:ca}=(0,ge.createDecorators)(),ua=(0,pe.forwardRef)(Wa);Vt=sa("diagram.editable-label",{styleTexts:[ia.Z]}),_t=ra(),Yt=ra({render:!1}),qt=oa({type:"label.editing.change"}),Gt=oa({type:"label.change"}),ta=ca();var ha=new WeakMap,da=new WeakMap,ba=new WeakMap,pa=new WeakMap,va=new WeakMap,ga=new WeakMap,wa=new WeakMap,Za=new WeakMap,ma=new WeakMap;class fa extends we.ReactNextElement{constructor(){super(...arguments),(0,ce.Z)(this,wa,{get:Ea,set:Ma}),(0,ce.Z)(this,pa,{get:ya,set:ka}),(0,ce.Z)(this,ha,{writable:!0,value:(aa(this),Xt(this))}),(0,ce.Z)(this,da,{writable:!0,value:$t(this)}),(0,ce.Z)(this,ba,{writable:!0,value:Ut(this)}),(0,ce.Z)(this,va,{writable:!0,value:e=>{(0,de.Z)(this,pa).emit(e)}}),(0,ce.Z)(this,ga,{writable:!0,value:Jt(this)}),(0,ce.Z)(this,Za,{writable:!0,value:e=>{(0,de.Z)(this,wa).emit(e)}}),(0,ce.Z)(this,ma,{writable:!0,value:(0,pe.createRef)()})}get label(){return(0,de.Z)(this,ha)}set label(e){(0,he.Z)(this,ha,e)}get type(){return(0,de.Z)(this,da)}set type(e){(0,he.Z)(this,da,e)}enableEditing(){var e;null===(e=(0,de.Z)(this,ma).current)||void 0===e||e.enableEditing()}render(){return ve().createElement(ua,{ref:(0,de.Z)(this,ma),label:this.label,onLabelEditingChange:(0,de.Z)(this,va),onLabelChange:(0,de.Z)(this,Za)})}}function ka(e){Ft(this,e)}function ya(){return jt(this)}function Ma(e){ea(this,e)}function Ea(){return Qt(this)}function Wa(e,t){var{label:a,onLabelChange:n,onLabelEditingChange:l}=e,i=null!=a?a:"",[s,r]=(0,pe.useState)(i),[o,c]=(0,pe.useState)(!1),u=(0,pe.useRef)(!1),[h,d]=(0,pe.useState)(!1),b=(0,pe.useRef)(null);(0,pe.useImperativeHandle)(t,(()=>({enableEditing(){c(!0)}}))),(0,pe.useEffect)((()=>{r(i)}),[i]);var p=(0,pe.useCallback)((e=>{e.preventDefault(),e.stopPropagation(),c(!0)}),[]);(0,pe.useEffect)((()=>{var e,t;o&&(null===(e=b.current)||void 0===e||e.focus({preventScroll:!0}),null===(t=b.current)||void 0===t||t.select())}),[o]),(0,pe.useEffect)((()=>{u.current?null==l||l(o):u.current=!0}),[o,l]);var v=(0,pe.useCallback)((e=>{r(e.target.value)}),[]),g=(0,pe.useCallback)((e=>{var t,a=e.key||e.keyCode||e.which;"Enter"!==a&&13!==a||null===(t=b.current)||void 0===t||t.blur()}),[]),w=(0,pe.useCallback)((()=>{c(!1),d(!0)}),[]);(0,pe.useEffect)((()=>{h&&(null==n||n(s),d(!1))}),[s,n,h]);var Z=(0,pe.useCallback)((e=>{e.stopPropagation()}),[]);return ve().createElement("div",{className:ke()("label",{editing:o,empty:!s}),onDoubleClick:Z,onMouseDown:Z},ve().createElement("input",{className:"label-input",value:s,ref:b,onChange:v,onKeyDown:g,onBlur:w}),ve().createElement("div",{className:"label-text",onDoubleClick:p},s))}na=fa,({e:[Xt,$t,Ut,jt,Ft,Jt,Qt,ea,aa],c:[la,It]}=(0,be.Z)(na,[[_t,1,"label"],[Yt,1,"type"],[qt,1,"labelEditingChange",e=>(0,de.Z)(e,ba),(e,t)=>(0,he.Z)(e,ba,t)],[Gt,1,"labelChange",e=>(0,de.Z)(e,ga),(e,t)=>(0,he.Z)(e,ga,t)],[ta,2,"enableEditing"]],[Vt],0,(e=>ma.has((0,ue.Z)(e))),we.ReactNextElement)),It()},8074:(e,t,a)=>{a.d(t,{Z:()=>r});var n=a(9601),l=a.n(n),i=a(2609),s=a.n(i)()(l());s.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 r=s.toString()}}]);
2
- //# sourceMappingURL=9393.4618c3e0.js.map