{"version":3,"file":"static/js/main-54a41043.8fed9ac9.js","mappings":"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","sources":["Components/DrawBoard/Edges/AnimatedDashedEdge.js","Components/DrawBoard/Edges/CustomEdge.js","Components/DrawBoard/Edges/CustomEdgeLabel.js","Components/DrawBoard/Edges/EdgeMarkers.js","Components/DrawBoard/Edges/EdgeWithAminatedBall.js","Components/DrawBoard/Edges/EditableEdge/ControlPoint.js","Components/DrawBoard/Edges/EditableEdge/path/bezier.js","Components/DrawBoard/Edges/EditableEdge/path/catmull-rom.js","Components/DrawBoard/Edges/EditableEdge/path/index.js","Components/DrawBoard/Edges/EditableEdge/path/linear.js","Components/DrawBoard/Edges/EditableEdge/EditableEdge.js","Components/DrawBoard/Edges/EditableEdge/constants.js","Components/DrawBoard/Edges/EditableEdge/path/StepEdge.js","Components/DrawBoard/Edges/TreeNodeEdgeType1.js","Components/DrawBoard/Edges/TreeNodeEdgeType2.js","Components/DrawBoard/Edges/TreeNodeEdgeType3.js","Components/DrawBoard/Edges/TreeNodeEdgeType5.js","Components/DrawBoard/Edges/TreeNodeEdgeType8.js"],"sourcesContent":["import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { EdgeLabelRenderer, getBezierPath, useReactFlow } from \"reactflow\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\nimport {\r\n convertToRgba,\r\n extractPointsFromPath,\r\n findNearestIndex,\r\n setEdgeAnchorTransform,\r\n} from \"../../../CommanFunctions/commanFunctions\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst AnimatedDashedEdge = (edge) => {\r\n // const reactFlowInstance = useReactFlow();\r\n // const positionHandlers = edge?.data?.positionHandlers ?? [];\r\n // const edgeSegmentsCount = positionHandlers.length + 1;\r\n // let edgeSegmentsArray = [];\r\n\r\n // for (let i = 0; i < edgeSegmentsCount; i++) {\r\n // let segmentSourceX, segmentSourceY, segmentTargetX, segmentTargetY;\r\n // if (i === 0) {\r\n // segmentSourceX = edge?.sourceX;\r\n // segmentSourceY = edge?.sourceY;\r\n // } else {\r\n // const handler = positionHandlers[i - 1];\r\n // segmentSourceX = handler.x;\r\n // segmentSourceY = handler.y;\r\n // }\r\n\r\n // if (i === edgeSegmentsCount - 1) {\r\n // segmentTargetX = edge?.targetX;\r\n // segmentTargetY = edge?.targetY;\r\n // } else {\r\n // const handler = positionHandlers[i];\r\n // segmentTargetX = handler.x;\r\n // segmentTargetY = handler.y;\r\n // }\r\n // const [edgePath, labelX, labelY] = getBezierPath({\r\n // ...edge,\r\n // sourceX: segmentSourceX,\r\n // sourceY: segmentSourceY,\r\n // targetX: segmentTargetX,\r\n // targetY: segmentTargetY,\r\n // });\r\n\r\n // edgeSegmentsArray.push({ edgePath, labelX, labelY });\r\n // }\r\n\r\n // let labelPosX = (positionHandlers[0].x + positionHandlers[1].x) / 2;\r\n // let labelPosY =\r\n // positionHandlers[0].y + positionHandlers[1].y < positionHandlers[0].y &&\r\n // positionHandlers[0].y + positionHandlers[1].y < positionHandlers[1].y\r\n // ? positionHandlers[0].y < positionHandlers[1].y\r\n // ? positionHandlers[0].y + positionHandlers[1].y > -100\r\n // ? positionHandlers[0].y + 10\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : positionHandlers[0].y + positionHandlers[1].y > -135\r\n // ? (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2;\r\n\r\n const { boardRef } = useSelector((e) => e?.drawboard);\r\n const { sourceX, targetX, sourceY, targetY, sourcePosition, targetPosition } =\r\n edge;\r\n\r\n const [edgePath, labelX, labelY] = getBezierPath({\r\n ...edge,\r\n });\r\n\r\n const [labelData, setLabelData] = useState(edge.data.label || []);\r\n\r\n const { setEdges } = useReactFlow();\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === edge.id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [edge.id, labelData, setEdges]\r\n );\r\n\r\n const pathPoints = useMemo(\r\n () => extractPointsFromPath(edgePath, 300).slice(30, -30),\r\n [edgePath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = edge.data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(edge.data?.label) !== JSON.stringify(labelData)) {\r\n if (edge.data?.label) {\r\n setLabelData(edge.data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [edge.data?.label]);\r\n\r\n useEffect(() => {\r\n if (boardRef) {\r\n // Get source and target elements\r\n const sourceElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-source\"\r\n );\r\n const targetElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-target\"\r\n );\r\n\r\n // Apply transforms to source and target elements\r\n setEdgeAnchorTransform(sourceElements, sourceX, sourceY, sourcePosition);\r\n setEdgeAnchorTransform(targetElements, targetX, targetY, targetPosition);\r\n }\r\n }, [sourcePosition, targetPosition]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPoints.length;\r\n if (edge.data.label) {\r\n const newLabelData = edge.data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPoints, label.position);\r\n return {\r\n ...label,\r\n position: pathPoints[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPoints[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [edge.data.label, edgePath, updateEdgeIfNeeded, labelData]);\r\n\r\n return (\r\n <>\r\n {/* {edgeSegmentsArray.map(({ edgePath, labelX, labelY }, index) => (\r\n \r\n ))} */}\r\n {/* {edge.selected &&\r\n positionHandlers.map(({ x, y, active }, handlerIndex) => (\r\n \r\n \r\n {\r\n let activeEdge = parseInt(event.target.dataset.active ?? -1);\r\n if (activeEdge === -1) {\r\n return;\r\n }\r\n const position = reactFlowInstance.screenToFlowPosition({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n reactFlowInstance.setEdges((edges) => {\r\n edges[activeEdge].id = Math.random();\r\n edges[activeEdge].data.positionHandlers[handlerIndex] = {\r\n x: position.x,\r\n y: position.y,\r\n active: activeEdge,\r\n };\r\n return edges;\r\n });\r\n }}\r\n // mouse up is used to release all the handlers\r\n onMouseUp={() => {\r\n reactFlowInstance.setEdges((edges) => {\r\n for (let i = 0; i < edges.length; i++) {\r\n const handlersLength =\r\n edges[i].data.positionHandlers.length;\r\n for (let j = 0; j < handlersLength; j++) {\r\n edges[i].data.positionHandlers[j].active = -1;\r\n }\r\n }\r\n\r\n return edges;\r\n });\r\n }}\r\n >\r\n {\r\n reactFlowInstance.setEdges((edges) => {\r\n const edgeIndex = edges.findIndex(\r\n (prevEdge) => prevEdge.id === edge.id\r\n );\r\n edges[edgeIndex].data.positionHandlers[\r\n handlerIndex\r\n ].active = edgeIndex;\r\n return edges;\r\n });\r\n }}\r\n onMouseUp={() => {\r\n reactFlowInstance.setEdges((edges) => {\r\n for (let i = 0; i < edges.length; i++) {\r\n const handlersLength =\r\n edges[i].data.positionHandlers.length;\r\n for (let j = 0; j < handlersLength; j++) {\r\n edges[i].data.positionHandlers[j].active = -1;\r\n }\r\n }\r\n\r\n return edges;\r\n });\r\n }}\r\n // right click is used to delete the handler\r\n onContextMenu={(event) => {\r\n event.preventDefault();\r\n // reactFlowInstance.setEdges((edges) => {\r\n // const edgeIndex = edges.findIndex(\r\n // (prevEdge) => prevEdge.id === edge.id\r\n // );\r\n // edges[edgeIndex].id = Math.random();\r\n // edges[edgeIndex].data.positionHandlers.splice(\r\n // handlerIndex,\r\n // 1\r\n // );\r\n // return edges;\r\n // });\r\n }}\r\n >\r\n \r\n \r\n \r\n ))} */}\r\n \r\n \r\n \r\n \r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default memo(AnimatedDashedEdge);\r\n\r\nconst ClickableBaseEdge = ({\r\n id,\r\n path,\r\n style,\r\n markerEnd,\r\n markerStart,\r\n interactionWidth = 20,\r\n edge,\r\n index,\r\n}) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n {/* {index === 2 && ( */}\r\n \r\n \r\n \r\n \r\n \r\n {/* )} */}\r\n {interactionWidth && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nClickableBaseEdge.displayName = \"BaseEdge\";\r\n","import React, { useMemo, useCallback } from \"react\";\r\nimport {\r\n getStraightPath,\r\n getSmoothStepPath,\r\n getBezierPath,\r\n EdgeLabelRenderer,\r\n useReactFlow,\r\n} from \"reactflow\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { useLocation, useParams } from \"react-router-dom\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { Typography } from \"@mui/material\";\r\nimport { updateJson } from \"../../../CommanFunctions/commanFunctions\";\r\nimport { useUndoRedo } from \"../dndUndoRedo/UndoRedoProvider\";\r\n\r\nconst pathFunctions = {\r\n straight: getStraightPath,\r\n smoothstep: getSmoothStepPath,\r\n bezier: getBezierPath,\r\n};\r\n\r\nconst CustomEdge = ({ edge, type }) => {\r\n const { screenToFlowPosition, setEdges } = useReactFlow();\r\n const { getEdges, getNodes } = useReactFlow();\r\n const positionHandlers = edge?.data?.positionHandlers ?? [];\r\n const edgeSegmentsCount = positionHandlers.length + 1;\r\n const dispatch = useDispatch();\r\n const { id } = useParams();\r\n const user_data = localStorage.getItem(\"user_data\");\r\n const { undo, takeSnapshot } = useUndoRedo();\r\n const location = useLocation();\r\n\r\n const pathFunction = useMemo(\r\n () => pathFunctions[type] || getBezierPath,\r\n [type]\r\n );\r\n\r\n const edgeSegmentsArray = useMemo(() => {\r\n return Array.from({ length: edgeSegmentsCount }).map((_, i) => {\r\n const segmentSource =\r\n i === 0\r\n ? { x: edge.sourceX, y: edge.sourceY }\r\n : positionHandlers[i - 1];\r\n const segmentTarget =\r\n i === edgeSegmentsCount - 1\r\n ? { x: edge.targetX, y: edge.targetY }\r\n : positionHandlers[i];\r\n\r\n const [edgePath, labelX, labelY] = pathFunction({\r\n ...edge,\r\n sourceX: segmentSource.x,\r\n sourceY: segmentSource.y,\r\n targetX: segmentTarget.x,\r\n targetY: segmentTarget.y,\r\n });\r\n\r\n return { edgePath, labelX, labelY };\r\n });\r\n }, [edge, positionHandlers, pathFunction, edgeSegmentsCount]);\r\n\r\n const handleMouseMove = useCallback(\r\n (event, handlerIndex) => {\r\n const activeEdge = parseInt(event.target.dataset.active ?? -1);\r\n if (activeEdge === -1) return;\r\n\r\n const position = screenToFlowPosition({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n const updatedEdges = [...edges];\r\n updatedEdges[activeEdge] = {\r\n ...updatedEdges[activeEdge],\r\n id: Math.random(),\r\n data: {\r\n ...updatedEdges[activeEdge].data,\r\n positionHandlers: updatedEdges[\r\n activeEdge\r\n ].data.positionHandlers.map((handler, index) =>\r\n index === handlerIndex\r\n ? {\r\n ...handler,\r\n x: position.x,\r\n y: position.y,\r\n active: activeEdge,\r\n }\r\n : handler\r\n ),\r\n },\r\n };\r\n return updatedEdges;\r\n });\r\n },\r\n [screenToFlowPosition, setEdges]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n let parsedData = user_data ? JSON.parse(user_data) : {};\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n const updatedEdges = edges.map((e) => ({\r\n ...e,\r\n data: {\r\n ...e.data,\r\n positionHandlers: e.data.positionHandlers?.map((handler) => ({\r\n ...handler,\r\n active: -1,\r\n })),\r\n },\r\n }));\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n // nodes: getNodes(),\r\n edges: getEdges(),\r\n lastUpdatedBy: parsedData?.user_id,\r\n },\r\n },\r\n id,\r\n dispatch,\r\n undo,\r\n a_id,\r\n takeSnapshot\r\n });\r\n return updatedEdges;\r\n });\r\n }, [\r\n user_data,\r\n setEdges,\r\n location.search,\r\n getNodes,\r\n getEdges,\r\n id,\r\n dispatch,\r\n undo,\r\n ]);\r\n\r\n const handleMouseDown = useCallback(\r\n (handlerIndex) => {\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n const updatedEdges = edges?.map((e) => ({\r\n ...e,\r\n data: {\r\n ...e.data,\r\n positionHandlers: e.data.positionHandlers.map((handler, index) =>\r\n index === handlerIndex ? { ...handler, active: edge.id } : handler\r\n ),\r\n },\r\n }));\r\n return updatedEdges;\r\n });\r\n },\r\n [setEdges, edge.id]\r\n );\r\n\r\n const handleContextMenu = useCallback(\r\n (event, handlerIndex) => {\r\n event.preventDefault();\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n const updatedEdges = edges.map((e) => ({\r\n ...e,\r\n id: Math.random(),\r\n data: {\r\n ...e.data,\r\n positionHandlers: e.data.positionHandlers.filter(\r\n (_, index) => index !== handlerIndex\r\n ),\r\n },\r\n }));\r\n return updatedEdges;\r\n });\r\n },\r\n [setEdges]\r\n );\r\n\r\n const smoothPathData = useMemo(() => getSmoothStepPath({ ...edge }), [edge]);\r\n\r\n return (\r\n <>\r\n {edgeSegmentsArray.map(({ edgePath, labelX, labelY }, index) => (\r\n \r\n ))}\r\n {positionHandlers.map(({ x, y, active }, handlerIndex) => (\r\n \r\n \r\n handleMouseMove(event, handlerIndex)}\r\n onMouseUp={handleMouseUp}\r\n >\r\n handleMouseDown(handlerIndex)}\r\n onContextMenu={(event) =>\r\n handleContextMenu(event, handlerIndex)\r\n }\r\n />\r\n \r\n \r\n \r\n ))}\r\n\r\n {(edge.label || edge?.data?.doubleClicked) && (\r\n \r\n \r\n {edge?.data?.doubleClicked ? (\r\n \r\n ) : (\r\n \r\n {edge?.label}\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default React.memo(CustomEdge);\r\n\r\nconst ClickableBaseEdge = ({\r\n id,\r\n path,\r\n style,\r\n markerEnd,\r\n markerStart,\r\n interactionWidth = 20,\r\n}) => (\r\n <>\r\n \r\n {interactionWidth && (\r\n \r\n )}\r\n \r\n);\r\n\r\nClickableBaseEdge.displayName = \"BaseEdge\";\r\n","import { useLocation, useParams } from \"react-router-dom\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { useEdgesState, useNodesState, useReactFlow } from \"reactflow\";\r\nimport { useCallback, useEffect, useState } from \"react\";\r\nimport { debounce, updateJson } from \"../../../CommanFunctions/commanFunctions\";\r\nimport { useUndoRedo } from \"../dndUndoRedo/UndoRedoProvider\";\r\n\r\nconst CustomEdgeLabel = ({ edge, labelIndex, isFocus = false }) => {\r\n const { id } = useParams();\r\n\r\n const { edgesLocalSave, nodesLocalSave } = useSelector((_) => _?.common);\r\n const { setEdges, getNodes, getEdges } = useReactFlow();\r\n\r\n const nodes = getNodes();\r\n const edges = getEdges();\r\n\r\n // const [nodes] = useNodesState(nodesLocalSave || []);\r\n // const [edges] = useEdgesState(edgesLocalSave || []);\r\n const [label, setLabel] = useState(\r\n edge.data.label[labelIndex]?.labelData || \"\"\r\n );\r\n const user_data = localStorage.getItem(\"user_data\");\r\n const dispatch = useDispatch();\r\n const { undo } = useUndoRedo();\r\n const location = useLocation();\r\n\r\n // useEffect(() => {\r\n // setLabel(edge.data.label[labelIndex]?.labelData || \"\");\r\n // }, [edge.data.label, labelIndex]);\r\n\r\n const handleChangeLabel = useCallback((e) => {\r\n const newLabelData = e.target.value;\r\n setLabel(newLabelData);\r\n\r\n const updatedEdges = edges.map((prevEdge) => {\r\n if (prevEdge.id === edge.id) {\r\n const newLabels = prevEdge.data.label.map((label, idx) =>\r\n idx === labelIndex ? { ...label, labelData: newLabelData } : label\r\n );\r\n return {\r\n ...prevEdge,\r\n data: {\r\n ...prevEdge.data,\r\n label: newLabels,\r\n },\r\n };\r\n }\r\n return prevEdge;\r\n });\r\n\r\n setEdges(updatedEdges);\r\n debouncedUpdate(updatedEdges);\r\n }, []);\r\n\r\n // TODO:- for multiline input\r\n // const inputRef = useRef(null);\r\n\r\n // TODO:- for multiline input\r\n // function isTextSelected(input) {\r\n // if (typeof input.selectionStart == \"number\") {\r\n // return (\r\n // input.selectionStart === 0 && input.selectionEnd === input.value.length\r\n // );\r\n // } else if (typeof document.selection != \"undefined\") {\r\n // return document.selection.createRange().text === input.value;\r\n // }\r\n // }\r\n\r\n const debouncedUpdate = useCallback(\r\n debounce((updatedEdges) => {\r\n let parsedData = {};\r\n if (user_data) {\r\n parsedData = JSON.parse(user_data);\r\n }\r\n\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: updatedEdges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n // nodes: nodes,\r\n edges: updatedEdges,\r\n lastUpdatedBy: parsedData?.user_id,\r\n },\r\n },\r\n id,\r\n dispatch,\r\n undo,\r\n a_id,\r\n });\r\n }, 200),\r\n [\r\n // edge.id,\r\n // edges,\r\n // labelIndex,\r\n // nodes,\r\n // setEdges,\r\n id,\r\n dispatch,\r\n undo,\r\n user_data,\r\n location.search,\r\n ]\r\n );\r\n\r\n // TODO: for multiline input\r\n // useEffect(() => {\r\n // inputRef?.current?.focus();\r\n // }, [])\r\n\r\n // useEffect(() => {\r\n // if(!isFocus){\r\n // inputRef?.current?.blur();\r\n // } else {\r\n // inputRef?.current?.focus();\r\n // }\r\n\r\n // }, [isFocus])\r\n\r\n return (\r\n <>\r\n \r\n {/* TODO:- For multiline input */}\r\n {/* {\r\n e?.stopPropagation();\r\n if (inputRef?.current) {\r\n inputRef?.current?.select();\r\n }\r\n }}\r\n onClick={(e) => {\r\n e?.preventDefault();\r\n e?.stopPropagation();\r\n const isAllTextSelected = isTextSelected(inputRef?.current);\r\n if (isAllTextSelected) {\r\n inputRef?.current?.setSelectionRange(\r\n label?.length,\r\n label?.length\r\n );\r\n inputRef?.current?.blur(); // Remove focus temporarily\r\n inputRef?.current?.focus(); // Focus again at the end\r\n } else {\r\n inputRef?.current?.blur();\r\n }\r\n }}\r\n /> */}\r\n \r\n );\r\n};\r\n\r\nexport default CustomEdgeLabel;\r\n","import React from 'react'\r\nimport { useDNDContext } from '../dnd-context/DndContext';\r\n\r\nfunction EdgeMarkers({ edge }) {\r\n\r\n const { mainBackgroundStyles } = useDNDContext(({ state }) => state);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default EdgeMarkers\r\n","import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { EdgeLabelRenderer, getBezierPath, useReactFlow } from \"reactflow\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\nimport {\r\n convertToRgba,\r\n extractPointsFromPath,\r\n findNearestIndex,\r\n setEdgeAnchorTransform,\r\n} from \"../../../CommanFunctions/commanFunctions\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nconst EdgeWithAminatedBall = (edge) => {\r\n // const reactFlowInstance = useReactFlow();\r\n // const positionHandlers = edge?.data?.positionHandlers ?? [];\r\n // const edgeSegmentsCount = positionHandlers.length + 1;\r\n // let edgeSegmentsArray = [];\r\n\r\n // let ballPath = \"\";\r\n // for (let i = 0; i < edgeSegmentsCount; i++) {\r\n // let segmentSourceX, segmentSourceY, segmentTargetX, segmentTargetY;\r\n // if (i === 0) {\r\n // segmentSourceX = edge?.sourceX;\r\n // segmentSourceY = edge?.sourceY;\r\n // } else {\r\n // const handler = positionHandlers[i - 1];\r\n // segmentSourceX = handler.x;\r\n // segmentSourceY = handler.y;\r\n // }\r\n\r\n // if (i === edgeSegmentsCount - 1) {\r\n // segmentTargetX = edge?.targetX;\r\n // segmentTargetY = edge?.targetY;\r\n // } else {\r\n // const handler = positionHandlers[i];\r\n // segmentTargetX = handler.x;\r\n // segmentTargetY = handler.y;\r\n // }\r\n // const [edgePath, labelX, labelY] = getBezierPath({\r\n // ...edge,\r\n // sourceX: segmentSourceX,\r\n // sourceY: segmentSourceY,\r\n // targetX: segmentTargetX,\r\n // targetY: segmentTargetY,\r\n // });\r\n\r\n // ballPath =\r\n // ballPath.trim().length <= 0\r\n // ? ballPath + \" \" + edgePath\r\n // : ballPath + edgePath;\r\n\r\n // edgeSegmentsArray.push({ edgePath, labelX, labelY });\r\n // }\r\n\r\n // let labelPosX = (positionHandlers[0].x + positionHandlers[1].x) / 2;\r\n // let labelPosY =\r\n // positionHandlers[0].y + positionHandlers[1].y < positionHandlers[0].y &&\r\n // positionHandlers[0].y + positionHandlers[1].y < positionHandlers[1].y\r\n // ? positionHandlers[0].y < positionHandlers[1].y\r\n // ? positionHandlers[0].y + positionHandlers[1].y > -100\r\n // ? positionHandlers[0].y + 10\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : positionHandlers[0].y + positionHandlers[1].y > -135\r\n // ? (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2\r\n // : (positionHandlers[0].y + positionHandlers[1].y) / 2;\r\n\r\n const { boardRef } = useSelector((e) => e?.drawboard);\r\n const { sourceX, targetX, sourceY, targetY, sourcePosition, targetPosition } =\r\n edge;\r\n\r\n const [edgePath, labelX, labelY] = getBezierPath({\r\n ...edge,\r\n });\r\n\r\n const [labelData, setLabelData] = useState(edge.data.label || []);\r\n\r\n const { setEdges } = useReactFlow();\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === edge.id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [edge.id, labelData, setEdges]\r\n );\r\n\r\n useEffect(() => {\r\n if (boardRef) {\r\n // Get source and target elements\r\n const sourceElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-source\"\r\n );\r\n const targetElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-target\"\r\n );\r\n\r\n // Apply transforms to source and target elements\r\n setEdgeAnchorTransform(sourceElements, sourceX, sourceY, sourcePosition);\r\n setEdgeAnchorTransform(targetElements, targetX, targetY, targetPosition);\r\n }\r\n }, [sourcePosition, targetPosition]);\r\n\r\n const pathPoints = useMemo(\r\n () => extractPointsFromPath(edgePath, 300).slice(30, -30),\r\n [edgePath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = edge.data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(edge.data?.label) !== JSON.stringify(labelData)) {\r\n if (edge.data?.label) {\r\n setLabelData(edge.data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [edge.data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPoints.length;\r\n if (edge.data.label) {\r\n const newLabelData = edge.data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPoints, label.position);\r\n return {\r\n ...label,\r\n position: pathPoints[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPoints[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [edge.data.label, edgePath, updateEdgeIfNeeded, labelData]);\r\n\r\n return (\r\n <>\r\n {/* {edgeSegmentsArray.map(({ edgePath, labelX, labelY }, index) => (\r\n \r\n ))} */}\r\n \r\n \r\n \r\n \r\n {/* {edge.selected &&\r\n positionHandlers.map(({ x, y, active }, handlerIndex) => (\r\n \r\n \r\n {\r\n let activeEdge = parseInt(event.target.dataset.active ?? -1);\r\n if (activeEdge === -1) {\r\n return;\r\n }\r\n const position = reactFlowInstance.screenToFlowPosition({\r\n x: event.clientX,\r\n y: event.clientY,\r\n });\r\n reactFlowInstance.setEdges((edges) => {\r\n edges[activeEdge].id = Math.random();\r\n edges[activeEdge].data.positionHandlers[handlerIndex] = {\r\n x: position.x,\r\n y: position.y,\r\n active: activeEdge,\r\n };\r\n return edges;\r\n });\r\n }}\r\n // mouse up is used to release all the handlers\r\n onMouseUp={() => {\r\n reactFlowInstance.setEdges((edges) => {\r\n for (let i = 0; i < edges.length; i++) {\r\n const handlersLength =\r\n edges[i].data.positionHandlers.length;\r\n for (let j = 0; j < handlersLength; j++) {\r\n edges[i].data.positionHandlers[j].active = -1;\r\n }\r\n }\r\n\r\n return edges;\r\n });\r\n }}\r\n >\r\n {\r\n reactFlowInstance.setEdges((edges) => {\r\n const edgeIndex = edges.findIndex(\r\n (prevEdge) => prevEdge.id === edge.id\r\n );\r\n edges[edgeIndex].data.positionHandlers[\r\n handlerIndex\r\n ].active = edgeIndex;\r\n return edges;\r\n });\r\n }}\r\n onMouseUp={() => {\r\n reactFlowInstance.setEdges((edges) => {\r\n for (let i = 0; i < edges.length; i++) {\r\n const handlersLength =\r\n edges[i].data.positionHandlers.length;\r\n for (let j = 0; j < handlersLength; j++) {\r\n edges[i].data.positionHandlers[j].active = -1;\r\n }\r\n }\r\n\r\n return edges;\r\n });\r\n }}\r\n // right click is used to delete the handler\r\n onContextMenu={(event) => {\r\n event.preventDefault();\r\n // reactFlowInstance.setEdges((edges) => {\r\n // const edgeIndex = edges.findIndex(\r\n // (prevEdge) => prevEdge.id === edge.id\r\n // );\r\n // edges[edgeIndex].id = Math.random();\r\n // edges[edgeIndex].data.positionHandlers.splice(\r\n // handlerIndex,\r\n // 1\r\n // );\r\n // return edges;\r\n // });\r\n }}\r\n >\r\n \r\n \r\n \r\n ))} */}\r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default memo(EdgeWithAminatedBall);\r\n\r\nconst ClickableBaseEdge = ({\r\n id,\r\n path,\r\n style,\r\n markerEnd,\r\n markerStart,\r\n interactionWidth = 20,\r\n index,\r\n edge,\r\n}) => {\r\n return (\r\n <>\r\n \r\n {interactionWidth && (\r\n \r\n )}\r\n {/* {index === 2 && ( */}\r\n \r\n \r\n \r\n \r\n \r\n {/* )} */}\r\n \r\n );\r\n};\r\n\r\nClickableBaseEdge.displayName = \"BaseEdge\";\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useReactFlow, useStore } from \"reactflow\";\r\nimport { color as colorsConst } from \"../../../../Utils/style/color/color\";\r\n\r\n\r\nexport function ControlPoint({\r\n id,\r\n index,\r\n x,\r\n y,\r\n color,\r\n active,\r\n setControlPoints,\r\n onDragEnd,\r\n}) {\r\n const container = useStore((store) => store.domNode);\r\n const { screenToFlowPosition } = useReactFlow();\r\n const [dragging, setDragging] = useState(false);\r\n const ref = useRef(null);\r\n\r\n // CALLBACKS -----------------------------------------------------------------\r\n const updatePosition = useCallback(\r\n (pos) => {\r\n setControlPoints((points) => {\r\n const shouldActivate = !active;\r\n if (shouldActivate) {\r\n if (index !== 0) {\r\n return points.flatMap((p, i) =>\r\n i === index * 0.5 - 1 ? [p, { ...pos, id, active: true }] : p\r\n );\r\n } else {\r\n return [{ ...pos, id, active: true }, ...points];\r\n }\r\n } else {\r\n return points.map((p) => (p.id === id ? { ...p, ...pos } : p));\r\n }\r\n });\r\n },\r\n [id, active, index, setControlPoints]\r\n );\r\n\r\n const deletePoint = useCallback(() => {\r\n setControlPoints((points) => points.filter((p) => p.id !== id));\r\n\r\n // previous active control points are always 2 elements before the current one\r\n const previousControlPoint =\r\n ref.current?.previousElementSibling?.previousElementSibling;\r\n if (\r\n previousControlPoint?.tagName === \"circle\" &&\r\n previousControlPoint.classList.contains(\"active\")\r\n ) {\r\n window.requestAnimationFrame(() => {\r\n previousControlPoint.focus();\r\n });\r\n }\r\n }, []);\r\n\r\n const handleKeyPress = useCallback(\r\n (e) => {\r\n switch (e.key) {\r\n case \"Enter\":\r\n case \"Space\":\r\n if (!active) {\r\n e.preventDefault();\r\n }\r\n updatePosition({ x, y });\r\n break;\r\n\r\n case \"Backspace\":\r\n case \"Delete\":\r\n e.stopPropagation();\r\n deletePoint();\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n updatePosition({ x: x - 5, y });\r\n break;\r\n\r\n case \"ArrowRight\":\r\n updatePosition({ x: x + 5, y });\r\n break;\r\n\r\n case \"ArrowUp\":\r\n updatePosition({ x, y: y - 5 });\r\n break;\r\n\r\n case \"ArrowDown\":\r\n updatePosition({ x, y: y + 5 });\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n },\r\n [id, x, y, updatePosition, setControlPoints]\r\n );\r\n\r\n const handleDragEnd = useCallback(\r\n (pos) => {\r\n updatePosition(pos);\r\n onDragEnd();\r\n },\r\n [updatePosition, onDragEnd]\r\n );\r\n\r\n // EFFECTS -------------------------------------------------------------------\r\n\r\n useEffect(() => {\r\n if (!container || !active || !dragging) return;\r\n\r\n const onPointerMove = (e) => {\r\n updatePosition(screenToFlowPosition({ x: e.clientX, y: e.clientY }));\r\n };\r\n\r\n const onPointerUp = (e) => {\r\n container.removeEventListener(\"pointermove\", onPointerMove);\r\n\r\n if (!active) {\r\n e.preventDefault();\r\n }\r\n\r\n setDragging(false);\r\n // updatePosition(screenToFlowPosition({ x: e.clientX, y: e.clientY }));\r\n handleDragEnd(screenToFlowPosition({ x: e.clientX, y: e.clientY }));\r\n };\r\n\r\n container.addEventListener(\"pointermove\", onPointerMove);\r\n container.addEventListener(\"pointerup\", onPointerUp, { once: true });\r\n container.addEventListener(\"pointerleave\", onPointerUp, { once: true });\r\n\r\n return () => {\r\n container.removeEventListener(\"pointermove\", onPointerMove);\r\n container.removeEventListener(\"pointerup\", onPointerUp);\r\n container.removeEventListener(\"pointerleave\", onPointerUp);\r\n\r\n setDragging(false);\r\n };\r\n }, [\r\n id,\r\n container,\r\n dragging,\r\n active,\r\n screenToFlowPosition,\r\n setControlPoints,\r\n updatePosition,\r\n handleDragEnd,\r\n ]);\r\n\r\n // RENDER --------------------------------------------------------------------\r\n\r\n return (\r\n {\r\n e.preventDefault();\r\n // delete point by right clicking\r\n if (active) {\r\n deletePoint();\r\n }\r\n }}\r\n onPointerDown={(e) => {\r\n if (e.button === 2) return;\r\n updatePosition({ x, y });\r\n setDragging(true);\r\n }}\r\n onKeyDown={handleKeyPress}\r\n onPointerUp={() => setDragging(false)}\r\n />\r\n );\r\n}\r\n","import { Position } from 'reactflow';\r\n// This is directly lifted from the library - it is used to calculate\r\n// the control points for the bezier curve, which can be converted to\r\n// catmull-rom control points and used to create an editable bezier curve\r\n\r\nfunction calculateControlOffset(distance, curvature) {\r\n if (distance >= 0) {\r\n return 0.5 * distance;\r\n }\r\n\r\n return curvature * 25 * Math.sqrt(-distance);\r\n}\r\n\r\nexport function getControlWithCurvature(\r\n pos,\r\n x1,\r\n y1,\r\n x2,\r\n y2,\r\n c\r\n) {\r\n switch (pos) {\r\n case Position.Left:\r\n return [x1 - calculateControlOffset(x1 - x2, c), y1];\r\n case Position.Right:\r\n return [x1 + calculateControlOffset(x2 - x1, c), y1];\r\n case Position.Top:\r\n return [x1, y1 - calculateControlOffset(y1 - y2, c)];\r\n case Position.Bottom:\r\n return [x1, y1 + calculateControlOffset(y2 - y1, c)];\r\n }\r\n}\r\n","import { isControlPoint } from '../constants';\r\nimport { getControlWithCurvature } from './bezier';\r\nimport { Position } from 'reactflow';\r\n\r\nexport function getCatmullRomPath(\r\n points,\r\n bezier = false,\r\n sides = { fromSide: Position.Left, toSide: Position.Right }\r\n) {\r\n if (points.length < 2) return '';\r\n\r\n let path = `M ${points[0].x} ${points[0].y}`;\r\n\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n\r\n const p0 =\r\n points[i - 1] ??\r\n (bezier ? calculateBezierP0(p1, p2, sides.fromSide) : p1);\r\n\r\n const p3 =\r\n points[i + 2] ?? (bezier ? calculateBezierP3(p1, p2, sides.toSide) : p2);\r\n\r\n const b1 = {\r\n x: (-p0.x + 6 * p1.x + p2.x) / 6,\r\n y: (-p0.y + 6 * p1.y + p2.y) / 6,\r\n };\r\n\r\n const b2 = {\r\n x: (p1.x + 6 * p2.x - p3.x) / 6,\r\n y: (p1.y + 6 * p2.y - p3.y) / 6,\r\n };\r\n\r\n path += ` C ${b1.x} ${b1.y}, ${b2.x} ${b2.y}, ${p2.x} ${p2.y}`;\r\n }\r\n\r\n return path;\r\n}\r\n\r\nexport function getCatmullRomControlPoints(\r\n points,\r\n bezier = false,\r\n sides = { fromSide: Position.Left, toSide: Position.Right }\r\n) {\r\n const controlPoints = [];\r\n\r\n // The `actualPoints.length - 2` is intentional and significant! The final point\r\n // in the array is just the `XYPosition` of the target handle: we don't want to\r\n // include it in the control points array, but we still need to know it's there\r\n // to calculate the final control point.\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n\r\n const p0 =\r\n points[i - 1] ??\r\n (bezier ? calculateBezierP0(p1, p2, sides.fromSide) : p1);\r\n\r\n const p3 =\r\n points[i + 2] ?? (bezier ? calculateBezierP3(p1, p2, sides.toSide) : p2);\r\n\r\n // The first and last points are the source and target handles, and we don't\r\n // want to include them as control points.\r\n if (isControlPoint(p1)) {\r\n controlPoints.push(p1);\r\n }\r\n\r\n controlPoints.push({\r\n id: '',\r\n active: false,\r\n x: q(p0.x, p1.x, p2.x, p3.x),\r\n y: q(p0.y, p1.y, p2.y, p3.y),\r\n });\r\n }\r\n\r\n return controlPoints;\r\n}\r\n\r\n// UTILS -----------------------------------------------------------------------\r\n\r\nfunction calculateBezierP0(p1, p2, side) {\r\n const c1 = getControlWithCurvature(side, p1.x, p1.y, p2.x, p2.y, 0.25);\r\n return { x: p2.x + 6 * (p1.x - c1[0]), y: p2.y + 6 * (p1.y - c1[1]) };\r\n}\r\n\r\nfunction calculateBezierP3(p1, p2, side) {\r\n const c2 = getControlWithCurvature(side, p2.x, p2.y, p1.x, p1.y, 0.25);\r\n return { x: p1.x + 6 * (p2.x - c2[0]), y: p1.y + 6 * (p2.y - c2[1]) };\r\n}\r\n\r\nfunction q(p0, p1, p2, p3, t = 0.5) {\r\n const alpha = 0.5;\r\n const t2 = t ** 2;\r\n const t3 = t ** 3;\r\n\r\n return (\r\n alpha *\r\n (2 * p1 +\r\n (-p0 + p2) * t +\r\n (2 * p0 - 5 * p1 + 4 * p2 - p3) * t2 +\r\n (-p0 + 3 * p1 - 3 * p2 + p3) * t3)\r\n );\r\n}\r\n","import { getLinearPath, getLinearControlPoints } from './linear';\r\nimport { getCatmullRomPath, getCatmullRomControlPoints } from './catmull-rom';\r\nimport { Position } from 'reactflow';\r\nimport { Algorithm } from '../constants';\r\n\r\nexport function getControlPoints(\r\n points,\r\n algorithm = Algorithm.BezierCatmullRom,\r\n sides = { fromSide: Position.Left, toSide: Position.Right }\r\n) {\r\n switch (algorithm) {\r\n case Algorithm.Linear:\r\n return getLinearControlPoints(points);\r\n\r\n case Algorithm.CatmullRom:\r\n return getCatmullRomControlPoints(points);\r\n\r\n case Algorithm.BezierCatmullRom:\r\n return getCatmullRomControlPoints(points, true, sides);\r\n }\r\n}\r\n\r\nexport function getPath(\r\n points,\r\n algorithm = Algorithm.BezierCatmullRom,\r\n sides = { fromSide: Position.Left, toSide: Position.Right }\r\n) {\r\n switch (algorithm) {\r\n case Algorithm.Linear:\r\n return getLinearPath(points);\r\n\r\n case Algorithm.CatmullRom:\r\n return getCatmullRomPath(points);\r\n\r\n case Algorithm.BezierCatmullRom:\r\n return getCatmullRomPath(points, true, sides);\r\n }\r\n}\r\n","import { isControlPoint } from \"../constants\";\r\nexport function getLinearPath(points) {\r\n if (points.length < 1) return '';\r\n\r\n let path = `M ${points[0].x} ${points[0].y}`;\r\n\r\n for (let i = 0; i < points.length; i++) {\r\n path += ` L ${points[i].x} ${points[i].y}`;\r\n }\r\n\r\n return path;\r\n}\r\n\r\nexport function getLinearControlPoints(\r\n points\r\n) {\r\n const controlPoints = [];\r\n\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n\r\n if (isControlPoint(p1)) {\r\n controlPoints.push(p1);\r\n }\r\n\r\n controlPoints.push({\r\n prev: 'id' in p1 ? p1.id : undefined,\r\n id: `spline-${window.crypto.randomUUID()}`,\r\n active: false,\r\n x: (p1.x + p2.x) / 2,\r\n y: (p1.y + p2.y) / 2,\r\n });\r\n }\r\n\r\n return controlPoints;\r\n}\r\n","import { memo, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from \"reactflow\";\r\nimport { ControlPoint } from \"./ControlPoint\";\r\nimport { getPath, getControlPoints } from \"./path\";\r\nimport CustomEdgeLabel from \"../CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\nimport { useDNDContext } from \"../../dnd-context/DndContext\";\r\nimport {\r\n convertToRgba,\r\n extractPointsFromPath,\r\n findNearestIndex,\r\n getNodeHandlePositions,\r\n setEdgeAnchorTransform,\r\n updateJson,\r\n} from \"../../../../CommanFunctions/commanFunctions\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { useSelector } from \"react-redux\";\r\nimport EdgeMarkers from \"../EdgeMarkers\";\r\nimport { useUndoRedo } from \"../../dndUndoRedo/UndoRedoProvider\";\r\nimport useNodeSelectionStarted from \"../../../../Utils/hooks/useNodeSelectionStarted\";\r\n\r\nconst useIdsForInactiveControlPoints = (points) => {\r\n const prevIds = useRef([]);\r\n let newPoints = [];\r\n if (prevIds.current.length === points.length) {\r\n // reuse control points from last render, just update their position\r\n newPoints = points.map((point, i) =>\r\n point.active ? point : { ...point, id: prevIds.current[i] }\r\n );\r\n } else {\r\n // calculate new control points\r\n newPoints = points.map((prevPoint, i) => {\r\n const id = window.crypto.randomUUID();\r\n prevIds.current[i] = id;\r\n return prevPoint.active ? points[i] : { ...points[i], id };\r\n });\r\n }\r\n\r\n return newPoints;\r\n};\r\n\r\nexport function EditableEdge({\r\n id,\r\n selected,\r\n source,\r\n sourceX,\r\n sourceY,\r\n sourcePosition,\r\n target,\r\n targetX,\r\n targetY,\r\n targetPosition,\r\n markerEnd,\r\n markerStart,\r\n style,\r\n data = { points: [] },\r\n ...delegated\r\n}) {\r\n const { setEdges, getEdge, getNodes, getEdges, getNode } = useReactFlow();\r\n\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.type === \"TreeView\" && targetNode?.type === \"TreeView\" && sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n if (sourceNode?.type === \"stickyNoteEditor\") {\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n }\r\n\r\n if (targetNode?.type === \"stickyNoteEditor\") {\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const shouldShowPoints = selected || sourceNode.selected || targetNode.selected;\r\n\r\n let sourceOrigin = { x: sourceX, y: sourceY };\r\n let targetOrigin = { x: targetX, y: targetY };\r\n const { boardRef } = useSelector((e) => e?.drawboard);\r\n\r\n const currEdge = getEdge(id);\r\n const { isNodeSelectionStarted } = useNodeSelectionStarted({ selected });\r\n const { undo, takeSnapshot } = useUndoRedo();\r\n const dispatch = useDispatch();\r\n const location = useLocation();\r\n\r\n const markerEndRegex = /type=([^&')]+)/;\r\n const markerStartRegex = /react_flow_container__type=([^&')]+)/;\r\n const getMarkerEndTypeValue = (str) => {\r\n const match = str.match(markerEndRegex);\r\n const match2 = str.match(markerEndRegex);\r\n return match ? match[1] : match2 ? match2[0] : null;\r\n };\r\n\r\n const typeValueMarkerEnd = getMarkerEndTypeValue(markerEnd);\r\n\r\n const getMarkerStartTypeValue = (str) => {\r\n const match = str.match(markerStartRegex);\r\n const match2 = str.match(markerEndRegex);\r\n return match ? match[1] : match2 ? match2[0] : null;\r\n };\r\n const typeValueMarkerStart = getMarkerStartTypeValue(markerStart);\r\n\r\n if (sourcePosition === \"right\") {\r\n if (typeValueMarkerStart === \"type=arrowclosed\" || !typeValueMarkerStart) {\r\n } else {\r\n sourceOrigin.x = sourceOrigin.x + 2;\r\n }\r\n } else if (sourcePosition === \"left\") {\r\n if (typeValueMarkerStart === \"type=arrowclosed\" || !typeValueMarkerStart) {\r\n } else {\r\n sourceOrigin.x = sourceOrigin.x - 2;\r\n }\r\n } else if (sourcePosition === \"top\") {\r\n if (typeValueMarkerStart === \"type=arrowclosed\" || !typeValueMarkerStart) {\r\n } else {\r\n sourceOrigin.y = sourceOrigin.y - 2;\r\n }\r\n } else if (sourcePosition === \"bottom\") {\r\n if (typeValueMarkerStart === \"type=arrowclosed\" || !typeValueMarkerStart) {\r\n } else {\r\n sourceOrigin.y = sourceOrigin.y + 2;\r\n }\r\n }\r\n\r\n if (typeValueMarkerEnd === \"arrowclosed\" || typeValueMarkerEnd === null) {\r\n } else {\r\n if (targetPosition === \"left\") targetOrigin.x = targetOrigin.x - 2;\r\n if (targetPosition === \"top\") targetOrigin.y = targetOrigin.y - 2;\r\n if (targetPosition === \"bottom\") targetOrigin.y = targetOrigin.y + 2;\r\n if (targetPosition === \"right\") targetOrigin.x = targetOrigin.x + 2;\r\n }\r\n\r\n useEffect(() => {\r\n if (boardRef) {\r\n // Get source and target elements\r\n const sourceElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-source\"\r\n );\r\n const targetElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-target\"\r\n );\r\n\r\n // Apply transforms to source and target elements\r\n setEdgeAnchorTransform(sourceElements, sourceX, sourceY, sourcePosition);\r\n setEdgeAnchorTransform(targetElements, targetX, targetY, targetPosition);\r\n }\r\n }, [sourcePosition, targetPosition]);\r\n\r\n const setControlPoints = useCallback(\r\n (update) => {\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id !== id) return e;\r\n if (!isEditableEdgeDot(e)) return e;\r\n\r\n const points = e.data?.points ?? [];\r\n const data = { ...e.data, points: update(points) };\r\n\r\n return { ...e, data };\r\n });\r\n });\r\n },\r\n [id, setEdges]\r\n );\r\n\r\n const handleDragEnd = useCallback(() => {\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n edges: getEdges(),\r\n },\r\n },\r\n id: localStorage.getItem(\"architectureId\"),\r\n dispatch,\r\n undo,\r\n a_id,\r\n takeSnapshot\r\n });\r\n }, [setEdges, location.search, dispatch, undo, takeSnapshot]);\r\n\r\n const pathPoints = [sourceOrigin, ...data.points, targetOrigin];\r\n const controlPoints = getControlPoints(pathPoints, data.algorithm, {\r\n fromSide: sourcePosition,\r\n toSide: targetPosition,\r\n });\r\n\r\n const path = getPath(pathPoints, data.algorithm, {\r\n fromSide: sourcePosition,\r\n toSide: targetPosition,\r\n });\r\n\r\n // const regex = /-?\\d+\\.?\\d*/g;\r\n // const numbers = path.match(regex).map(Number);\r\n\r\n // const points = [];\r\n // for (let i = 0; i < numbers.length; i += 2) {\r\n // points.push({ x: numbers[i], y: numbers[i + 1] });\r\n // }\r\n\r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(path, 300).slice(30, -30),\r\n [path]\r\n );\r\n useEffect(() => {\r\n if (isNodeSelectionStarted) {\r\n document.body.classList.add(\"is-selection-applied\");\r\n } else {\r\n document.body.classList.remove(\"is-selection-applied\");\r\n }\r\n }, [isNodeSelectionStarted]);\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, path, updateEdgeIfNeeded, labelData]);\r\n\r\n const { mainBackgroundStyles } = useDNDContext(({ state }) => state);\r\n\r\n const controlPointsWithIds = useIdsForInactiveControlPoints(controlPoints);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const sourceOrTargetHide = getNodes()\r\n ?.filter((data) => [source, target]?.includes(data?.id))\r\n ?.map((val) => !!val?.data?.isHidden)\r\n ?.find((data) => !!data);\r\n\r\n const treeViewParents =\r\n getNodes().filter((nd) => source === nd.id && nd.type === \"TreeView\")\r\n .length > 0;\r\n\r\n return (\r\n <>\r\n {!sourceOrTargetHide && (\r\n <>\r\n {/* \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n */} \r\n \r\n {data?.isDashed ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {/* {!data?.isDashed && data?.animate === true && ( */}\r\n \r\n \r\n \r\n {/* )} */}\r\n {!treeViewParents &&\r\n shouldShowPoints &&\r\n !isNodeSelectionStarted &&\r\n controlPointsWithIds.map((point, index) => (\r\n \r\n ))}\r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport default memo(EditableEdge);\r\n\r\nconst isEditableEdgeDot = (edge) => edge.type === \"editable-edge\";\r\n\r\nconst ClickableBaseEdge = ({\r\n id,\r\n path,\r\n style,\r\n markerEnd,\r\n markerStart,\r\n interactionWidth = 20,\r\n edge,\r\n}) => {\r\n const value = `${edge.data.animate ? \"1000\" : \"0\"};0`;\r\n return (\r\n <>\r\n \r\n \r\n \r\n {interactionWidth && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","export const Algorithm = {\r\n Linear: 'linear',\r\n CatmullRom: 'catmull-rom',\r\n BezierCatmullRom: 'bezier-catmull-rom',\r\n }\r\n\r\nexport const COLORS = {\r\n [Algorithm.Linear]: '#0375ff',\r\n [Algorithm.BezierCatmullRom]: '#68D391',\r\n [Algorithm.CatmullRom]: '#FF0072',\r\n };\r\n\r\nexport const isControlPoint = (\r\n point\r\n) => 'id' in point;\r\n\r\nexport const DEFAULT_ALGORITHM = Algorithm.Linear;\r\n ","import {\r\n BaseEdge,\r\n EdgeLabelRenderer,\r\n getNodesBounds,\r\n useReactFlow,\r\n} from \"reactflow\";\r\n\r\nimport { drag } from \"d3-drag\";\r\nimport { select } from \"d3-selection\";\r\nimport CustomEdgeLabel from \"../../CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\nimport { useDNDContext } from \"../../../dnd-context/DndContext\";\r\nimport React, { useCallback, useEffect, useMemo, useState, memo, useRef } from \"react\";\r\nimport {\r\n convertToRgba,\r\n extractPointsFromPath,\r\n findNearestIndex,\r\n getNodeHandlePositions,\r\n setEdgeAnchorTransform,\r\n updateJson,\r\n} from \"../../../../../CommanFunctions/commanFunctions\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { useSelector } from \"react-redux\";\r\nimport EdgeMarkers from \"../../EdgeMarkers\";\r\nimport { useUndoRedo } from \"../../../dndUndoRedo/UndoRedoProvider\";\r\nimport useNodeSelectionStarted from \"../../../../../Utils/hooks/useNodeSelectionStarted\";\r\n\r\nfunction removeShortSegments(segments) {\r\n if (segments.length < 2) {\r\n return segments;\r\n }\r\n\r\n function calculateLength(segment) {\r\n return segment.type === \"vertical\"\r\n ? Math.abs(segment.end.y - segment.start.y)\r\n : Math.abs(segment.end.x - segment.start.x);\r\n }\r\n\r\n const result = [];\r\n let currentMergedSegment = null;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n let current = segments[i];\r\n\r\n if (!currentMergedSegment) {\r\n currentMergedSegment = { ...current };\r\n } else {\r\n // Ensure the segments are connectable\r\n if (\r\n currentMergedSegment.end.x === current.start.x &&\r\n currentMergedSegment.end.y === current.start.y\r\n ) {\r\n currentMergedSegment.end = current.end;\r\n } else {\r\n // If not connectable, push the current merged segment and start a new one\r\n result.push(currentMergedSegment);\r\n currentMergedSegment = { ...current };\r\n continue;\r\n }\r\n }\r\n\r\n if (calculateLength(currentMergedSegment) >= 1) {\r\n result.push(currentMergedSegment);\r\n currentMergedSegment = null;\r\n }\r\n }\r\n\r\n // Add any remaining merged segment\r\n if (currentMergedSegment) {\r\n if (result.length > 0 && calculateLength(currentMergedSegment) < 1) {\r\n // If the last merged segment is short, combine it with the previous one\r\n const lastResult = result[result.length - 1];\r\n if (\r\n lastResult.end.x === currentMergedSegment.start.x &&\r\n lastResult.end.y === currentMergedSegment.start.y\r\n ) {\r\n lastResult.end = currentMergedSegment.end;\r\n } else {\r\n result.push(currentMergedSegment);\r\n }\r\n } else {\r\n result.push(currentMergedSegment);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nconst adjustLabelPositionForOverlap = (\r\n labelPosition,\r\n nodes,\r\n edgePathPoints\r\n) => {\r\n let newPosition = { ...labelPosition };\r\n\r\n // Check if the label overlaps with any node\r\n nodes.forEach((node) => {\r\n const nodeRect = {\r\n x: node.position.x,\r\n y: node.position.y,\r\n width: node.width || 100,\r\n height: node.height || 40,\r\n };\r\n\r\n // Check if the label's position is within the node's bounding box\r\n const isOverlapping =\r\n newPosition.x >= nodeRect.x - 10 &&\r\n newPosition.x <= nodeRect.x + nodeRect.width + 10 &&\r\n newPosition.y >= nodeRect.y - 10 &&\r\n newPosition.y <= nodeRect.y + nodeRect.height + 10;\r\n\r\n if (isOverlapping) {\r\n // Adjust the label position to avoid overlap by moving it along the edge\r\n // Find the next or previous point in the edge path\r\n const nearestPointIndex = findNearestIndex(edgePathPoints, labelPosition);\r\n let newPoint;\r\n\r\n // Move label to the next point if available, otherwise move it to the previous point\r\n if (nearestPointIndex + 1 < edgePathPoints.length) {\r\n newPoint = edgePathPoints[nearestPointIndex + 1];\r\n } else if (nearestPointIndex - 1 >= 0) {\r\n newPoint = edgePathPoints[nearestPointIndex - 1];\r\n } else {\r\n newPoint = edgePathPoints[nearestPointIndex]; // If no other point available, keep it at the same place\r\n }\r\n\r\n }\r\n });\r\n\r\n return newPosition;\r\n};\r\n\r\nfunction adjustPathForOverlaps(segments, nodes) {\r\n return segments.reduce((modifiedSegments, segment, index) => {\r\n // Detect if current segment overlaps with any node\r\n const overlappingNodes = nodes.filter((node) => {\r\n if (\r\n !node.data?.isGeneratedThroughAI ||\r\n node.data.type === \"group\" ||\r\n node.data.type === \"frame\"\r\n ) {\r\n return false; // Skip the node if isAiGenerated is false or undefined\r\n }\r\n\r\n const nodeRect = {\r\n x: node.position.x,\r\n y: node.position.y,\r\n width: node.width || 100,\r\n height: node.height || 40,\r\n };\r\n\r\n if (segment.type === \"horizontal\") {\r\n const segmentMinX = Math.min(segment.start.x, segment.end.x);\r\n const segmentMaxX = Math.max(segment.start.x, segment.end.x);\r\n return (\r\n segmentMinX < nodeRect.x + nodeRect.width &&\r\n segmentMaxX > nodeRect.x &&\r\n segment.start.y >= nodeRect.y &&\r\n segment.start.y <= nodeRect.y + nodeRect.height\r\n );\r\n } else if (segment.type === \"vertical\") {\r\n const segmentMinY = Math.min(segment.start.y, segment.end.y);\r\n const segmentMaxY = Math.max(segment.start.y, segment.end.y);\r\n return (\r\n segmentMinY < nodeRect.y + nodeRect.height &&\r\n segmentMaxY > nodeRect.y &&\r\n segment.start.x >= nodeRect.x &&\r\n segment.start.x <= nodeRect.x + nodeRect.width\r\n );\r\n }\r\n return false;\r\n });\r\n\r\n // If no overlapping nodes, keep the original segment\r\n if (overlappingNodes.length === 0) {\r\n return [...modifiedSegments, segment];\r\n }\r\n\r\n // For overlapping segments, adjust the path\r\n const offset = 20; // Offset to avoid the node\r\n const nodeRect = getNodesBounds(overlappingNodes);\r\n\r\n if (segment.type === \"horizontal\") {\r\n // Determine if edge is moving left to right or right to left\r\n const isLeftToRight = segment.end.x >= segment.start.x;\r\n\r\n // Decide whether to go above or below the node\r\n const goAbove = segment.start.y < nodeRect.y + nodeRect.height / 2;\r\n const yOffset = goAbove\r\n ? nodeRect.y - offset\r\n : nodeRect.y + nodeRect.height + offset;\r\n\r\n const x1 = segment.start.x;\r\n const x4 = segment.end.x;\r\n\r\n // Calculate diversion points based on direction\r\n const x2 = isLeftToRight\r\n ? Math.min(nodeRect.x - offset, x4)\r\n : Math.max(nodeRect.x + nodeRect.width + offset, x4);\r\n const x3 = isLeftToRight\r\n ? Math.max(nodeRect.x + nodeRect.width + offset, x2)\r\n : Math.min(nodeRect.x - offset, x2);\r\n\r\n const segmentsToAdd = [];\r\n\r\n // Segment from start.x to x2\r\n segmentsToAdd.push({\r\n type: \"horizontal\",\r\n start: { x: x1, y: segment.start.y },\r\n end: { x: x2, y: segment.start.y },\r\n });\r\n\r\n // Vertical segment to yOffset\r\n segmentsToAdd.push({\r\n type: \"vertical\",\r\n start: { x: x2, y: segment.start.y },\r\n end: { x: x2, y: yOffset },\r\n });\r\n\r\n // Horizontal segment across the node\r\n segmentsToAdd.push({\r\n type: \"horizontal\",\r\n start: { x: x2, y: yOffset },\r\n end: { x: x3, y: yOffset },\r\n });\r\n\r\n // Vertical segment back to end.y\r\n segmentsToAdd.push({\r\n type: \"vertical\",\r\n start: { x: x3, y: yOffset },\r\n end: { x: x3, y: segment.end.y },\r\n });\r\n\r\n // Segment from x3 to end.x\r\n segmentsToAdd.push({\r\n type: \"horizontal\",\r\n start: { x: x3, y: segment.end.y },\r\n end: { x: x4, y: segment.end.y },\r\n });\r\n\r\n modifiedSegments.push(...segmentsToAdd);\r\n } else if (segment.type === \"vertical\") {\r\n // Determine if edge is moving top to bottom or bottom to top\r\n const isTopToBottom = segment.end.y >= segment.start.y;\r\n\r\n // Decide whether to go left or right of the node\r\n const goLeft = segment.start.x < nodeRect.x + nodeRect.width / 2;\r\n const xOffset = goLeft\r\n ? nodeRect.x - offset\r\n : nodeRect.x + nodeRect.width + offset;\r\n\r\n const y1 = segment.start.y;\r\n const y4 = segment.end.y;\r\n\r\n // Calculate diversion points based on direction\r\n const y2 = isTopToBottom\r\n ? Math.min(nodeRect.y - offset, y4)\r\n : Math.max(nodeRect.y + nodeRect.height + offset, y4);\r\n const y3 = isTopToBottom\r\n ? Math.max(nodeRect.y + nodeRect.height + offset, y2)\r\n : Math.min(nodeRect.y - offset, y2);\r\n\r\n const segmentsToAdd = [];\r\n\r\n // Segment from start.y to y2\r\n segmentsToAdd.push({\r\n type: \"vertical\",\r\n start: { x: segment.start.x, y: y1 },\r\n end: { x: segment.start.x, y: y2 },\r\n });\r\n\r\n // Horizontal segment to xOffset\r\n segmentsToAdd.push({\r\n type: \"horizontal\",\r\n start: { x: segment.start.x, y: y2 },\r\n end: { x: xOffset, y: y2 },\r\n });\r\n\r\n // Vertical segment across the node\r\n segmentsToAdd.push({\r\n type: \"vertical\",\r\n start: { x: xOffset, y: y2 },\r\n end: { x: xOffset, y: y3 },\r\n });\r\n\r\n // Horizontal segment back to end.x\r\n segmentsToAdd.push({\r\n type: \"horizontal\",\r\n start: { x: xOffset, y: y3 },\r\n end: { x: segment.end.x, y: y3 },\r\n });\r\n\r\n // Segment from y3 to end.y\r\n segmentsToAdd.push({\r\n type: \"vertical\",\r\n start: { x: segment.end.x, y: y3 },\r\n end: { x: segment.end.x, y: y4 },\r\n });\r\n\r\n modifiedSegments.push(...segmentsToAdd);\r\n }\r\n\r\n return modifiedSegments;\r\n }, []);\r\n}\r\n\r\nfunction getInitialSegments(\r\n sourceNode,\r\n targetNode,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition\r\n) {\r\n if (\r\n sourceNode?.width &&\r\n targetNode?.width &&\r\n sourceNode?.height &&\r\n targetNode?.height &&\r\n sourceNode?.type === \"TreeView\" &&\r\n targetNode?.type === \"TreeView\"\r\n ) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n if (sourceNode?.type === \"stickyNoteEditor\") {\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n }\r\n\r\n if (targetNode?.type === \"stickyNoteEditor\") {\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const segments = [];\r\n const offset = 15; // Offset distance\r\n\r\n // Helper function to calculate new coordinates with offset\r\n function getOffsetCoordinates(x, y, position) {\r\n const direction = position === \"top\" || position === \"left\" ? -1 : 1;\r\n if (position === \"top\" || position === \"bottom\") {\r\n y += direction * offset;\r\n } else {\r\n x += direction * offset;\r\n }\r\n return { x, y };\r\n }\r\n\r\n // Adjust source and target coordinates based on offsets\r\n let { x: currentX, y: currentY } = sourcePosition\r\n ? getOffsetCoordinates(sourceX, sourceY, sourcePosition)\r\n : { x: sourceX, y: sourceY };\r\n let { x: adjustedTargetX, y: adjustedTargetY } = targetPosition\r\n ? getOffsetCoordinates(targetX, targetY, targetPosition)\r\n : { x: targetX, y: targetY };\r\n\r\n // Add source offset segment if needed\r\n if (sourcePosition) {\r\n segments.push({\r\n type:\r\n sourcePosition === \"top\" || sourcePosition === \"bottom\"\r\n ? \"vertical\"\r\n : \"horizontal\",\r\n start: { x: sourceX, y: sourceY },\r\n end: { x: currentX, y: currentY },\r\n });\r\n }\r\n\r\n // Check if source and target are aligned vertically or horizontally\r\n if (Math.abs(adjustedTargetX - currentX) < 0.5) {\r\n // Aligned vertically\r\n segments.push({\r\n type: \"vertical\",\r\n start: { x: currentX, y: currentY },\r\n end: { x: currentX, y: adjustedTargetY },\r\n });\r\n currentY = adjustedTargetY;\r\n } else if (Math.abs(adjustedTargetY - currentY) < 0.5) {\r\n // Aligned horizontally\r\n segments.push({\r\n type: \"horizontal\",\r\n start: { x: currentX, y: currentY },\r\n end: { x: adjustedTargetX, y: currentY },\r\n });\r\n currentX = adjustedTargetX;\r\n } else {\r\n // Determine segments based on source and target positions\r\n const scenarioKey = `${sourcePosition}->${targetPosition}`;\r\n const sourceIsTopLeft =\r\n currentX <= adjustedTargetX && currentY <= adjustedTargetY;\r\n const sourceIsTopRight =\r\n currentX >= adjustedTargetX && currentY <= adjustedTargetY;\r\n const sourceIsBottomLeft =\r\n currentX <= adjustedTargetX && currentY >= adjustedTargetY;\r\n const sourceIsBottomRight =\r\n currentX >= adjustedTargetX && currentY >= adjustedTargetY;\r\n\r\n let segmentPattern = [];\r\n\r\n // Select the appropriate pattern based on source and target positions\r\n if (sourceIsTopLeft) {\r\n switch (scenarioKey) {\r\n case \"top->top\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"top->left\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"top->bottom\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"top->right\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"left->top\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"left->left\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"left->bottom\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"left->right\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"bottom->top\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"bottom->left\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"bottom->bottom\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"bottom->right\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"right->top\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"right->left\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"right->bottom\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"right->right\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n default:\r\n segmentPattern = [];\r\n break;\r\n }\r\n } else if (sourceIsTopRight) {\r\n switch (scenarioKey) {\r\n case \"top->top\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"top->left\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"top->bottom\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"top->right\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"left->top\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"left->left\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"left->bottom\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"left->right\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"bottom->top\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"bottom->left\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"bottom->bottom\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"bottom->right\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"right->top\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"right->left\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"right->bottom\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"right->right\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n default:\r\n segmentPattern = [];\r\n break;\r\n }\r\n } else if (sourceIsBottomLeft) {\r\n switch (scenarioKey) {\r\n case \"top->top\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"top->left\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"top->bottom\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"top->right\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"left->top\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"left->left\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"left->bottom\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"left->right\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"bottom->top\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"bottom->left\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"bottom->bottom\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"bottom->right\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"right->top\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"right->left\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"right->bottom\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"right->right\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n default:\r\n segmentPattern = [];\r\n break;\r\n }\r\n } else if (sourceIsBottomRight) {\r\n switch (scenarioKey) {\r\n case \"top->top\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"top->left\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"top->bottom\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"top->right\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"left->top\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"left->left\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"left->bottom\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"left->right\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"bottom->top\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"bottom->left\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"bottom->bottom\":\r\n segmentPattern = [\"H\", \"V\"];\r\n break;\r\n case \"bottom->right\":\r\n segmentPattern = [\"H\", \"V\", \"H\"];\r\n break;\r\n case \"right->top\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n case \"right->left\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"right->bottom\":\r\n segmentPattern = [\"V\", \"H\", \"V\"];\r\n break;\r\n case \"right->right\":\r\n segmentPattern = [\"V\", \"H\"];\r\n break;\r\n default:\r\n segmentPattern = [];\r\n break;\r\n }\r\n }\r\n\r\n // Generate segments based on the selected pattern\r\n let intermediateX = currentX;\r\n let intermediateY = currentY;\r\n\r\n if (segmentPattern.length === 3) {\r\n segmentPattern.forEach((step, index) => {\r\n let start, end;\r\n start = { x: intermediateX, y: intermediateY };\r\n\r\n if (index === 0) {\r\n // First segment\r\n if (step === \"V\") {\r\n end = { x: start.x, y: (start.y + adjustedTargetY) / 2 };\r\n } else {\r\n end = { x: (start.x + adjustedTargetX) / 2, y: start.y };\r\n }\r\n } else if (index === 1) {\r\n // Second segment\r\n if (step === \"V\") {\r\n end = { x: start.x, y: adjustedTargetY };\r\n } else {\r\n end = { x: adjustedTargetX, y: start.y };\r\n }\r\n } else {\r\n // Third segment (when present)\r\n end = { x: adjustedTargetX, y: adjustedTargetY };\r\n }\r\n\r\n segments.push({\r\n type: step === \"V\" ? \"vertical\" : \"horizontal\",\r\n start: start,\r\n end: end,\r\n });\r\n\r\n intermediateX = end.x;\r\n intermediateY = end.y;\r\n });\r\n } else {\r\n segmentPattern.forEach((step) => {\r\n switch (step) {\r\n case \"V\":\r\n segments.push({\r\n type: \"vertical\",\r\n start: { x: currentX, y: currentY },\r\n end: { x: currentX, y: adjustedTargetY },\r\n });\r\n currentY = adjustedTargetY;\r\n break;\r\n case \"H\":\r\n segments.push({\r\n type: \"horizontal\",\r\n start: { x: currentX, y: currentY },\r\n end: { x: adjustedTargetX, y: currentY },\r\n });\r\n currentX = adjustedTargetX;\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n }\r\n }\r\n\r\n // Add target offset segment if needed\r\n if (targetPosition) {\r\n segments.push({\r\n type:\r\n targetPosition === \"top\" || targetPosition === \"bottom\"\r\n ? \"vertical\"\r\n : \"horizontal\",\r\n start: { x: adjustedTargetX, y: adjustedTargetY },\r\n end: { x: targetX, y: targetY },\r\n });\r\n }\r\n\r\n return segments;\r\n}\r\n\r\nfunction generateStepEdgePath(segments) {\r\n const minRadius = 1;\r\n const maxRadius = 8;\r\n\r\n return segments.reduce((path, segment, index, array) => {\r\n const prevSegment = array[index - 1];\r\n const nextSegment = array[index + 1];\r\n const shouldCurveStart = index > 0 && prevSegment.type !== segment.type;\r\n const shouldCurveEnd =\r\n index < array.length - 1 && nextSegment.type !== segment.type;\r\n\r\n let segmentPath = \"\";\r\n\r\n // Calculate dynamic radius based on current, previous, and next segment lengths\r\n const getSegmentLength = (seg) =>\r\n seg.type === \"horizontal\"\r\n ? Math.abs(seg.end.x - seg.start.x)\r\n : Math.abs(seg.end.y - seg.start.y);\r\n\r\n const currentSegmentLength = getSegmentLength(segment);\r\n const prevSegmentLength = prevSegment\r\n ? getSegmentLength(prevSegment)\r\n : maxRadius;\r\n const nextSegmentLength = nextSegment\r\n ? getSegmentLength(nextSegment)\r\n : maxRadius;\r\n\r\n const startRadius = Math.max(\r\n minRadius,\r\n Math.min(maxRadius, Math.min(currentSegmentLength, prevSegmentLength) / 4)\r\n );\r\n\r\n const endRadius = Math.max(\r\n minRadius,\r\n Math.min(maxRadius, Math.min(currentSegmentLength, nextSegmentLength) / 4)\r\n );\r\n\r\n if (index === 0) {\r\n segmentPath += `M ${segment.start.x} ${segment.start.y} `;\r\n }\r\n\r\n if (segment.type === \"horizontal\") {\r\n const startX = shouldCurveStart\r\n ? segment.start.x +\r\n (segment.end.x > segment.start.x ? startRadius : -startRadius)\r\n : segment.start.x;\r\n const endX = shouldCurveEnd\r\n ? segment.end.x +\r\n (segment.end.x > segment.start.x ? -endRadius : endRadius)\r\n : segment.end.x;\r\n\r\n if (shouldCurveStart) {\r\n segmentPath += `L ${startX} ${segment.start.y} `;\r\n }\r\n\r\n segmentPath += `H ${endX}`;\r\n\r\n if (shouldCurveEnd) {\r\n const nextY =\r\n nextSegment.end.y > segment.end.y\r\n ? segment.end.y + endRadius\r\n : segment.end.y - endRadius;\r\n segmentPath += ` Q ${segment.end.x} ${segment.end.y} ${segment.end.x} ${nextY}`;\r\n }\r\n } else {\r\n // vertical\r\n const startY = shouldCurveStart\r\n ? segment.start.y +\r\n (segment.end.y > segment.start.y ? startRadius : -startRadius)\r\n : segment.start.y;\r\n const endY = shouldCurveEnd\r\n ? segment.end.y +\r\n (segment.end.y > segment.start.y ? -endRadius : endRadius)\r\n : segment.end.y;\r\n\r\n if (shouldCurveStart) {\r\n segmentPath += `L ${segment.start.x} ${startY} `;\r\n }\r\n\r\n segmentPath += `V ${endY}`;\r\n\r\n if (shouldCurveEnd) {\r\n const nextX =\r\n nextSegment.end.x > segment.end.x\r\n ? segment.end.x + endRadius\r\n : segment.end.x - endRadius;\r\n segmentPath += ` Q ${segment.end.x} ${segment.end.y} ${nextX} ${segment.end.y}`;\r\n }\r\n }\r\n\r\n return path + segmentPath;\r\n }, \"\");\r\n}\r\n\r\nconst StepEdge = (edge) => {\r\n const {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n style = {},\r\n ...rest\r\n } = edge;\r\n\r\n const { boardRef } = useSelector((e) => e?.drawboard);\r\n\r\n const { getEdge, getNodes, setEdges, getZoom, getNode } = useReactFlow();\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n const currEdge = getEdge(id);\r\n const animationDirection = currEdge?.data?.animationDirection;\r\n\r\n useEffect(() => {\r\n if (boardRef) {\r\n // Get source and target elements\r\n const sourceElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-source\"\r\n );\r\n const targetElements = boardRef.querySelectorAll(\r\n \".react-flow__edgeupdater-target\"\r\n );\r\n\r\n // Apply transforms to source and target elements\r\n setEdgeAnchorTransform(sourceElements, sourceX, sourceY, sourcePosition);\r\n setEdgeAnchorTransform(targetElements, targetX, targetY, targetPosition);\r\n }\r\n }, [sourcePosition, targetPosition]);\r\n\r\n const dispatch = useDispatch();\r\n const { undo, takeSnapshot } = useUndoRedo();\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [projectedPath, setProjectedPath] = useState(null);\r\n const { isNodeSelectionStarted } = useNodeSelectionStarted({ selected: edge?.selected });\r\n\r\n const location = useLocation();\r\n const zoom = getZoom();\r\n const nodes = getNodes();\r\n\r\n const areAllSegmentCoordinatesValid = (segments) => {\r\n return (\r\n segments.length > 2 &&\r\n segments.every((segment) => {\r\n return (\r\n typeof segment.start.x === \"number\" &&\r\n !isNaN(segment.start.x) &&\r\n typeof segment.start.y === \"number\" &&\r\n !isNaN(segment.start.y) &&\r\n typeof segment.end.x === \"number\" &&\r\n !isNaN(segment.end.x) &&\r\n typeof segment.end.y === \"number\" &&\r\n !isNaN(segment.end.y)\r\n );\r\n })\r\n );\r\n };\r\n\r\n const adjustSegments = useCallback(\r\n (segments, dragIndex = null, newX = null, newY = null) => {\r\n let updatedSegments = segments.map((segment) => ({ ...segment }));\r\n if (dragIndex !== null && (newX !== null || newY !== null)) {\r\n const draggedSegment = updatedSegments[dragIndex];\r\n const prevSegment =\r\n dragIndex > 1 ? updatedSegments[dragIndex - 1] : null;\r\n const nextSegment =\r\n dragIndex < updatedSegments.length - 2\r\n ? updatedSegments[dragIndex + 1]\r\n : null;\r\n\r\n if (draggedSegment.type === \"horizontal\") {\r\n // Dragging a horizontal segment vertically\r\n const deltaY = newY - draggedSegment.start.y;\r\n draggedSegment.start.y = newY;\r\n draggedSegment.end.y = newY;\r\n\r\n if (prevSegment) {\r\n prevSegment.end.y = newY;\r\n if (Math.abs(deltaY) > 10) {\r\n // Insert a new vertical segment before the dragged segment\r\n updatedSegments.splice(dragIndex, 0, {\r\n type: \"vertical\",\r\n start: { x: prevSegment.end.x, y: prevSegment.start.y },\r\n end: { x: prevSegment.end.x, y: newY },\r\n });\r\n dragIndex++;\r\n }\r\n }\r\n\r\n if (nextSegment) {\r\n nextSegment.start.y = newY;\r\n if (Math.abs(deltaY) > 10) {\r\n // Insert a new vertical segment after the dragged segment\r\n updatedSegments.splice(dragIndex + 1, 0, {\r\n type: \"vertical\",\r\n start: { x: nextSegment.start.x, y: newY },\r\n end: { x: nextSegment.start.x, y: nextSegment.end.y },\r\n });\r\n }\r\n }\r\n } else {\r\n // Dragging a vertical segment horizontally\r\n const deltaX = newX - draggedSegment.start.x;\r\n draggedSegment.start.x = newX;\r\n draggedSegment.end.x = newX;\r\n\r\n if (prevSegment) {\r\n prevSegment.end.x = newX;\r\n if (Math.abs(deltaX) > 10) {\r\n // Insert a new horizontal segment before the dragged segment\r\n updatedSegments.splice(dragIndex, 0, {\r\n type: \"horizontal\",\r\n start: { x: prevSegment.start.x, y: prevSegment.end.y },\r\n end: { x: newX, y: prevSegment.end.y },\r\n });\r\n dragIndex++;\r\n }\r\n }\r\n\r\n if (nextSegment) {\r\n nextSegment.start.x = newX;\r\n if (Math.abs(deltaX) > 10) {\r\n // Insert a new horizontal segment after the dragged segment\r\n updatedSegments.splice(dragIndex + 1, 0, {\r\n type: \"horizontal\",\r\n start: { x: newX, y: nextSegment.start.y },\r\n end: { x: nextSegment.end.x, y: nextSegment.start.y },\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Ensure connection with source or target node\r\n if (dragIndex === 1 && updatedSegments.length === 3) {\r\n if (draggedSegment.type === \"horizontal\") {\r\n // Adding vertical segments to maintain connection with both source and target\r\n updatedSegments.splice(1, 0, {\r\n type: \"vertical\",\r\n start: {\r\n x: updatedSegments[0].end.x,\r\n y: updatedSegments[0].end.y,\r\n },\r\n end: { x: draggedSegment.start.x, y: draggedSegment.start.y },\r\n });\r\n updatedSegments.splice(3, 0, {\r\n type: \"vertical\",\r\n start: { x: draggedSegment.end.x, y: draggedSegment.end.y },\r\n end: {\r\n x: updatedSegments[3].start.x,\r\n y: updatedSegments[3].start.y,\r\n },\r\n });\r\n } else {\r\n // Adding horizontal segments to maintain connection with both source and target\r\n updatedSegments.splice(1, 0, {\r\n type: \"horizontal\",\r\n start: {\r\n x: updatedSegments[0].end.x,\r\n y: updatedSegments[0].end.y,\r\n },\r\n end: { x: draggedSegment.start.x, y: draggedSegment.start.y },\r\n });\r\n updatedSegments.splice(3, 0, {\r\n type: \"horizontal\",\r\n start: { x: draggedSegment.end.x, y: draggedSegment.end.y },\r\n end: {\r\n x: updatedSegments[3].start.x,\r\n y: updatedSegments[3].start.y,\r\n },\r\n });\r\n }\r\n } else if (dragIndex === 1) {\r\n if (draggedSegment.type === \"horizontal\") {\r\n // Adding a vertical segment to maintain connection with the source\r\n updatedSegments.splice(1, 0, {\r\n type: \"vertical\",\r\n start: {\r\n x: updatedSegments[0].end.x,\r\n y: updatedSegments[0].end.y,\r\n },\r\n end: { x: draggedSegment.start.x, y: draggedSegment.start.y },\r\n });\r\n } else {\r\n // Adding a horizontal segment to maintain connection with the source\r\n updatedSegments.splice(1, 0, {\r\n type: \"horizontal\",\r\n start: {\r\n x: updatedSegments[0].end.x,\r\n y: updatedSegments[0].end.y,\r\n },\r\n end: { x: draggedSegment.start.x, y: draggedSegment.start.y },\r\n });\r\n }\r\n } else if (dragIndex === updatedSegments.length - 2) {\r\n const lastSegment = updatedSegments[updatedSegments.length - 1];\r\n if (draggedSegment.type === \"horizontal\") {\r\n // Adding a vertical segment before the last segment\r\n updatedSegments.splice(updatedSegments.length - 1, 0, {\r\n type: \"vertical\",\r\n start: { x: draggedSegment.end.x, y: draggedSegment.end.y },\r\n end: { x: lastSegment.start.x, y: lastSegment.start.y },\r\n });\r\n } else {\r\n // Adding a horizontal segment before the last segment\r\n updatedSegments.splice(updatedSegments.length - 1, 0, {\r\n type: \"horizontal\",\r\n start: { x: draggedSegment.end.x, y: draggedSegment.end.y },\r\n end: { x: lastSegment.start.x, y: lastSegment.start.y },\r\n });\r\n }\r\n }\r\n } else {\r\n const sourceDeltaX = sourceX - updatedSegments[0].start.x;\r\n const sourceDeltaY = sourceY - updatedSegments[0].start.y;\r\n const targetDeltaX =\r\n targetX - updatedSegments[updatedSegments.length - 1].end.x;\r\n const targetDeltaY =\r\n targetY - updatedSegments[updatedSegments.length - 1].end.y;\r\n\r\n // Adjust middle segments (excluding first and last)\r\n for (let i = 0; i < updatedSegments.length - 1; i++) {\r\n const currentSegment = updatedSegments[i];\r\n const progress = i / (updatedSegments.length - 3);\r\n\r\n if (currentSegment.type === \"horizontal\") {\r\n const deltaX =\r\n sourceDeltaX + (targetDeltaX - sourceDeltaX) * progress;\r\n currentSegment.start.x += deltaX;\r\n currentSegment.end.x += deltaX;\r\n currentSegment.start.y +=\r\n sourceDeltaY + (targetDeltaY - sourceDeltaY) * progress;\r\n currentSegment.end.y = currentSegment.start.y;\r\n } else {\r\n // vertical segment\r\n const deltaY =\r\n sourceDeltaY + (targetDeltaY - sourceDeltaY) * progress;\r\n currentSegment.start.y += deltaY;\r\n currentSegment.end.y += deltaY;\r\n currentSegment.start.x +=\r\n sourceDeltaX + (targetDeltaX - sourceDeltaX) * progress;\r\n currentSegment.end.x = currentSegment.start.x;\r\n }\r\n }\r\n\r\n // Ensure first and last segments are connected to source and target\r\n updatedSegments[0].start.x = sourceX;\r\n updatedSegments[0].start.y = sourceY;\r\n updatedSegments[updatedSegments.length - 1].end.x = targetX;\r\n updatedSegments[updatedSegments.length - 1].end.y = targetY;\r\n\r\n // Maintain connections between segments\r\n for (let i = 1; i < updatedSegments.length; i++) {\r\n const currentSegment = updatedSegments[i];\r\n const prevSegment = updatedSegments[i - 1];\r\n\r\n currentSegment.start.x = prevSegment.end.x;\r\n currentSegment.start.y = prevSegment.end.y;\r\n }\r\n\r\n // Ensure the last segment connects properly with the target\r\n const lastSegment = updatedSegments[updatedSegments.length - 1];\r\n const secondLastSegment = updatedSegments[updatedSegments.length - 2];\r\n\r\n if (lastSegment.type === \"horizontal\") {\r\n if (secondLastSegment.type === \"horizontal\") {\r\n // Both last and second-to-last segments are horizontal\r\n lastSegment.start.y = targetY;\r\n secondLastSegment.end.y = targetY;\r\n secondLastSegment.start.y = targetY;\r\n\r\n // Adjust the vertical segment before the second-to-last segment\r\n if (updatedSegments.length > 2) {\r\n const thirdLastSegment =\r\n updatedSegments[updatedSegments.length - 3];\r\n if (thirdLastSegment.type === \"vertical\") {\r\n thirdLastSegment.end.y = targetY;\r\n }\r\n }\r\n } else {\r\n lastSegment.start.y = targetY;\r\n secondLastSegment.end.y = targetY;\r\n }\r\n } else {\r\n // lastSegment is vertical\r\n if (secondLastSegment?.type === \"vertical\") {\r\n // Both last and second-to-last segments are vertical\r\n lastSegment.start.x = targetX;\r\n secondLastSegment.end.x = targetX;\r\n secondLastSegment.start.x = targetX;\r\n\r\n // Adjust the horizontal segment before the second-to-last segment\r\n if (updatedSegments.length > 2) {\r\n const thirdLastSegment =\r\n updatedSegments[updatedSegments.length - 3];\r\n if (thirdLastSegment.type === \"horizontal\") {\r\n thirdLastSegment.end.x = targetX;\r\n }\r\n }\r\n } else {\r\n lastSegment.start.x = targetX;\r\n if (secondLastSegment?.end) secondLastSegment.end.x = targetX;\r\n }\r\n }\r\n\r\n const adjustLastSegments = (segments) => {\r\n // Check if the last two segments are of the same type\r\n const lastIndex = segments.length - 1;\r\n if (\r\n lastIndex >= 1 &&\r\n segments[lastIndex].type === segments[lastIndex - 1].type\r\n ) {\r\n const lastSegment = segments[lastIndex];\r\n const secondLastSegment = segments[lastIndex - 1];\r\n const thirdLastSegment = segments[lastIndex - 2];\r\n\r\n // Determine direction and adjust the last segment's start point\r\n if (lastSegment.type === \"vertical\") {\r\n if (targetPosition === \"top\") {\r\n lastSegment.start.y = lastSegment.end.y - 15;\r\n } else {\r\n lastSegment.start.y = lastSegment.end.y + 15;\r\n }\r\n } else if (lastSegment.type === \"horizontal\") {\r\n if (targetPosition === \"left\") {\r\n lastSegment.start.x = lastSegment.end.x - 15;\r\n } else {\r\n lastSegment.start.x = lastSegment.end.x + 15;\r\n }\r\n }\r\n\r\n // Adjust the second last segment's end point to connect to the last segment's start\r\n if (secondLastSegment.type === \"vertical\") {\r\n secondLastSegment.end.x = secondLastSegment.start.x;\r\n secondLastSegment.end.y = lastSegment.start.y;\r\n } else if (secondLastSegment.type === \"horizontal\") {\r\n secondLastSegment.end.x = lastSegment.start.x;\r\n secondLastSegment.end.y = secondLastSegment.start.y;\r\n }\r\n\r\n // Adjust the second last segment's start to connect to the third segment's end\r\n if (thirdLastSegment) {\r\n secondLastSegment.start.x = thirdLastSegment.end.x;\r\n secondLastSegment.start.y = thirdLastSegment.end.y;\r\n }\r\n }\r\n\r\n return segments;\r\n };\r\n\r\n updatedSegments = adjustLastSegments(updatedSegments);\r\n updatedSegments = adjustStartAndEnd(updatedSegments, sourceX, sourceY, targetX, targetY);\r\n updatedSegments = removeShortSegments(updatedSegments);\r\n updatedSegments = mergeAndRemoveSegmentsWhileAdjusting(updatedSegments);\r\n updatedSegments = adjustStartAndEnd(updatedSegments, sourceX, sourceY, targetX, targetY);\r\n }\r\n\r\n return updatedSegments;\r\n },\r\n [sourceX, sourceY, targetX, targetY]\r\n );\r\n\r\n const processSegments = (result, i, threshold, minLength) => {\r\n const prev = result[i - 1];\r\n const current = result[i];\r\n const next = result[i + 1];\r\n\r\n // Check if current segment can be removed\r\n if (prev.type === next.type) {\r\n if (\r\n prev.type === \"vertical\" &&\r\n Math.abs(prev.start.x - next.start.x) < threshold\r\n ) {\r\n // Remove current horizontal segment between aligned vertical segments\r\n result.splice(i - 1, 3, {\r\n type: \"vertical\",\r\n start: {\r\n x: prev.start.x,\r\n y: Math.min(prev.start.y, next.start.y),\r\n },\r\n end: {\r\n x: prev.start.x,\r\n y: Math.max(prev.end.y, next.end.y),\r\n },\r\n });\r\n return { index: Math.max(2, i - 1) };\r\n } else if (\r\n prev.type === \"horizontal\" &&\r\n Math.abs(prev.start.y - next.start.y) < threshold\r\n ) {\r\n // Remove current vertical segment between aligned horizontal segments\r\n result.splice(i - 1, 3, {\r\n type: \"horizontal\",\r\n start: {\r\n x: Math.min(prev.start.x, next.start.x),\r\n y: prev.start.y,\r\n },\r\n end: {\r\n x: Math.max(prev.end.x, next.end.x),\r\n y: prev.start.y,\r\n },\r\n });\r\n return { index: Math.max(2, i - 1) };\r\n }\r\n }\r\n\r\n // Check if current segment can be merged with previous or next\r\n if (current.type === prev.type) {\r\n if (\r\n current.type === \"vertical\" &&\r\n Math.abs(current.start.x - prev.start.x) < threshold\r\n ) {\r\n // Merge with previous vertical segment\r\n result.splice(i - 1, 2, {\r\n type: \"vertical\",\r\n start: {\r\n x: prev.start.x,\r\n y: Math.min(current.start.y, prev.start.y),\r\n },\r\n end: {\r\n x: prev.start.x,\r\n y: Math.max(current.end.y, prev.end.y),\r\n },\r\n });\r\n return { index: Math.max(2, i - 1) };\r\n } else if (\r\n current.type === \"horizontal\" &&\r\n Math.abs(current.start.y - prev.start.y) < threshold\r\n ) {\r\n // Merge with previous horizontal segment\r\n result.splice(i - 1, 2, {\r\n type: \"horizontal\",\r\n start: {\r\n x: Math.min(current.start.x, prev.start.x),\r\n y: prev.start.y,\r\n },\r\n end: {\r\n x: Math.max(current.end.x, prev.end.x),\r\n y: prev.start.y,\r\n },\r\n });\r\n return { index: Math.max(2, i - 1) };\r\n }\r\n } else if (current.type === next.type) {\r\n if (\r\n current.type === \"vertical\" &&\r\n Math.abs(current.start.x - next.start.x) < threshold\r\n ) {\r\n // Merge with next vertical segment\r\n result.splice(i, 2, {\r\n type: \"vertical\",\r\n start: {\r\n x: current.start.x,\r\n y: Math.min(current.start.y, next.start.y),\r\n },\r\n end: {\r\n x: current.start.x,\r\n y: Math.max(current.end.y, next.end.y),\r\n },\r\n });\r\n return { index: i };\r\n } else if (\r\n current.type === \"horizontal\" &&\r\n Math.abs(current.start.y - next.start.y) < threshold\r\n ) {\r\n // Merge with next horizontal segment\r\n result.splice(i, 2, {\r\n type: \"horizontal\",\r\n start: {\r\n x: Math.min(current.start.x, next.start.x),\r\n y: current.start.y,\r\n },\r\n end: {\r\n x: Math.max(current.end.x, next.end.x),\r\n y: current.start.y,\r\n },\r\n });\r\n return { index: i };\r\n }\r\n }\r\n\r\n // Check if the current segment is too short\r\n const segmentLength =\r\n current.type === \"vertical\"\r\n ? Math.abs(current.end.y - current.start.y)\r\n : Math.abs(current.end.x - current.start.x);\r\n\r\n if (segmentLength < minLength) {\r\n // Remove the short segment and connect the previous and next segments\r\n if (i > 1 && i < result.length - 2) {\r\n const prevPrev = result[i - 2];\r\n const nextNext = result[i + 2];\r\n\r\n if (prevPrev.type === nextNext.type) {\r\n if (prevPrev.type === \"vertical\") {\r\n result.splice(i - 2, 5, {\r\n type: \"vertical\",\r\n start: {\r\n x: prevPrev.start.x,\r\n y: Math.min(prevPrev.start.y, nextNext.start.y),\r\n },\r\n end: {\r\n x: prevPrev.start.x,\r\n y: Math.max(prevPrev.end.y, nextNext.end.y),\r\n },\r\n });\r\n } else {\r\n // horizontal\r\n result.splice(i - 2, 5, {\r\n type: \"horizontal\",\r\n start: {\r\n x: Math.min(prevPrev.start.x, nextNext.start.x),\r\n y: prevPrev.start.y,\r\n },\r\n end: {\r\n x: Math.max(prevPrev.end.x, nextNext.end.x),\r\n y: prevPrev.start.y,\r\n },\r\n });\r\n }\r\n return { index: Math.max(2, i - 2) };\r\n }\r\n }\r\n }\r\n\r\n return { index: i + 1 };\r\n };\r\n\r\n const mergeAndRemoveSegments = useCallback((segments) => {\r\n let result = [...segments];\r\n let i = 2; // Start from the third segment\r\n const threshold = 10; // For alignment detection\r\n const minLength = 0.2; // Minimum length for visibility\r\n\r\n while (i < result.length - 3) {\r\n const { index } = processSegments(result, i, threshold, minLength);\r\n i = index;\r\n }\r\n\r\n return result;\r\n }, []);\r\n\r\n const mergeAndRemoveSegmentsWhileAdjusting = useCallback((segments) => {\r\n let result = [...segments];\r\n let i = 2; // Start from the third segment\r\n const threshold = 10; // For alignment detection\r\n const minLength = 0.2; // Minimum length for visibility\r\n\r\n while (i < result.length - 2) {\r\n const { index } = processSegments(result, i, threshold, minLength);\r\n i = index;\r\n }\r\n\r\n return result;\r\n }, []);\r\n\r\n // const adjustStartAndEnd = useCallback((segments) => {\r\n // if (segments.length <= 1) return segments;\r\n\r\n // return segments.reduce((acc, currentSegment, index) => {\r\n // if (index === 0) {\r\n // // First segment remains unchanged\r\n // return [currentSegment];\r\n // }\r\n\r\n // const prevSegment = acc[acc.length - 1];\r\n // let adjustedSegment = { ...currentSegment };\r\n\r\n // // Always adjust the start to match the previous segment's end\r\n // adjustedSegment.start = { ...prevSegment.end };\r\n\r\n // // Adjust the end based on the segment type\r\n // if (adjustedSegment.type === \"vertical\") {\r\n // adjustedSegment.end = {\r\n // x: adjustedSegment.start.x,\r\n // y: adjustedSegment.end.y,\r\n // };\r\n // } else if (adjustedSegment.type === \"horizontal\") {\r\n // adjustedSegment.end = {\r\n // x: adjustedSegment.end.x,\r\n // y: adjustedSegment.start.y,\r\n // };\r\n // }\r\n\r\n // return [...acc, adjustedSegment];\r\n // }, []);\r\n // }, []);\r\n\r\n const adjustStartAndEnd = useCallback((segments, sourceX, sourceY, targetX, targetY) => {\r\n if (segments.length <= 1) return segments;\r\n\r\n let result = [...segments];\r\n\r\n // Step 1: Forward pass - adjust from source\r\n for (let i = 0; i < result.length; i++) {\r\n let currentSegment = { ...result[i] };\r\n\r\n if (i === 0) {\r\n // First segment starts from source\r\n currentSegment.start = { x: sourceX, y: sourceY };\r\n } else {\r\n // Other segments start where previous segment ended\r\n currentSegment.start = { ...result[i - 1].end };\r\n }\r\n\r\n // Adjust end point based on segment type while maintaining direction\r\n if (currentSegment.type === \"vertical\") {\r\n currentSegment.end = {\r\n x: currentSegment.start.x,\r\n y: currentSegment.end.y\r\n };\r\n } else if (currentSegment.type === \"horizontal\") {\r\n currentSegment.end = {\r\n x: currentSegment.end.x,\r\n y: currentSegment.start.y\r\n };\r\n }\r\n\r\n result[i] = currentSegment;\r\n }\r\n\r\n // Step 2: Backward pass - adjust from target\r\n for (let i = result.length - 1; i >= 0; i--) {\r\n let currentSegment = { ...result[i] };\r\n\r\n if (i === result.length - 1) {\r\n // Last segment ends at target\r\n currentSegment.end = { x: targetX, y: targetY };\r\n } else {\r\n // Other segments end where next segment starts\r\n currentSegment.end = { ...result[i + 1].start };\r\n }\r\n\r\n // Adjust start point based on segment type while maintaining direction\r\n if (currentSegment.type === \"vertical\") {\r\n currentSegment.start = {\r\n x: currentSegment.end.x,\r\n y: currentSegment.start.y\r\n };\r\n } else if (currentSegment.type === \"horizontal\") {\r\n currentSegment.start = {\r\n x: currentSegment.start.x,\r\n y: currentSegment.end.y\r\n };\r\n }\r\n\r\n result[i] = currentSegment;\r\n }\r\n\r\n return result;\r\n }, []);\r\n\r\n const isSegmentsValid = (segments) => {\r\n // Check if the number of segments is less than or equal to 5\r\n if (segments.length <= 5) {\r\n let verticalSegmentCount = 0;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const segment = segments[i];\r\n\r\n // Calculate the distance between the start and end points\r\n const distance =\r\n segment.type === \"vertical\"\r\n ? Math.abs(segment.end.y - segment.start.y)\r\n : Math.abs(segment.end.x - segment.start.x);\r\n\r\n // Count vertical segments\r\n if (segment.type === \"vertical\") {\r\n verticalSegmentCount++;\r\n }\r\n\r\n // Check if any segment's distance is 0\r\n if (distance === 0) {\r\n // If it's a vertical segment and its distance is 0, return false\r\n if (segment.type === \"vertical\" && verticalSegmentCount === 1) {\r\n return false;\r\n }\r\n // If distance is 0 for any segment, return true\r\n return true;\r\n }\r\n\r\n // Check if any segment's distance is less than 10\r\n if (distance < 10) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true; // Return true if all segments are valid\r\n };\r\n\r\n const [segments, edgePath] = useMemo(() => {\r\n const updatedEdge = structuredClone(getEdge(id));\r\n const nodes = getNodes();\r\n\r\n let newSegments;\r\n\r\n if (updatedEdge?.pathSegments) {\r\n const currSegments = adjustSegments(updatedEdge.pathSegments);\r\n // adjustSegments(updatedEdge.pathSegments);\r\n const sourceId = updatedEdge.source;\r\n const targetId = updatedEdge.target;\r\n const nonSourceTargetNodes = nodes.filter(\r\n (node) => node.id !== sourceId && node.id !== targetId\r\n );\r\n newSegments = adjustPathForOverlaps(currSegments, nonSourceTargetNodes);\r\n } else {\r\n const initialSegments = getInitialSegments(\r\n sourceNode,\r\n targetNode,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition\r\n );\r\n const nonSourceTargetNodes = nodes.filter(\r\n (node) =>\r\n node?.id !== updatedEdge?.source && node?.id !== updatedEdge?.target\r\n );\r\n newSegments = adjustPathForOverlaps(\r\n initialSegments,\r\n nonSourceTargetNodes\r\n );\r\n }\r\n\r\n if (!areAllSegmentCoordinatesValid(newSegments)) {\r\n newSegments = getInitialSegments(\r\n sourceNode,\r\n targetNode,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition\r\n );\r\n }\r\n\r\n const path = generateStepEdgePath(newSegments);\r\n\r\n return [newSegments, path];\r\n }, [\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n getEdge,\r\n getNodes,\r\n getInitialSegments,\r\n adjustSegments,\r\n adjustPathForOverlaps,\r\n areAllSegmentCoordinatesValid,\r\n generateStepEdgePath,\r\n ]);\r\n\r\n useEffect(() => {\r\n segments.forEach((segment, index) => {\r\n const d3Selection = select(\r\n document.getElementById(`segment-${id}-${index}`)\r\n );\r\n\r\n let isDragging = false; // Flag to track dragging\r\n let dragStartTimer; // Timer to differentiate between click and drag\r\n\r\n d3Selection.call(\r\n drag()\r\n .on(\"start\", (e) => {\r\n // Set a timeout to determine if it's a drag or a click\r\n dragStartTimer = setTimeout(() => {\r\n isDragging = true;\r\n setIsDragging(true);\r\n\r\n setEdges((prev) => {\r\n return prev.map((edge) =>\r\n edge.id === id\r\n ? { ...edge, selected: true }\r\n : { ...edge, selected: false }\r\n );\r\n });\r\n }, 150); // Adjust the delay for better responsiveness\r\n })\r\n .on(\"drag\", (e) => {\r\n if (!isDragging) return; // Ignore drag if it's not detected as dragging\r\n\r\n const newX = segment.start.x + e.dx / zoom;\r\n const newY = segment.start.y + e.dy / zoom;\r\n\r\n try {\r\n // Calculate the projected segments\r\n const projectedSegments = adjustSegments(\r\n segments,\r\n index,\r\n newX,\r\n newY\r\n );\r\n\r\n // Generate the path for these projected segments\r\n const projectedPathString = generateStepEdgePath(projectedSegments);\r\n setProjectedPath(projectedPathString);\r\n } catch (error) {\r\n setProjectedPath(null);\r\n setIsDragging(false);\r\n }\r\n\r\n // const updatedSegments = adjustSegments(segments, index, newX, newY);\r\n })\r\n .on(\"end\", (e) => {\r\n clearTimeout(dragStartTimer); // Clear timeout when drag ends\r\n\r\n if (!isDragging) return; // Ignore end if it was just a click\r\n\r\n const newX = segment.start.x + e.dx / zoom;\r\n const newY = segment.start.y + e.dy / zoom;\r\n\r\n try {\r\n const uSegments = adjustSegments(segments, index, newX, newY);\r\n let updatedSegments = mergeAndRemoveSegments(uSegments);\r\n\r\n updatedSegments = adjustStartAndEnd(updatedSegments, sourceX, sourceY, targetX, targetY);\r\n\r\n if (\r\n Math.abs(targetX - sourceX) < 0.5 ||\r\n Math.abs(targetY - sourceY) < 0.5\r\n ) {\r\n if (!isSegmentsValid(updatedSegments)) {\r\n updatedSegments = null;\r\n }\r\n }\r\n\r\n const search = new URLSearchParams(location.search);\r\n const a_id = search.get(\"a_id\");\r\n let updatedEdge;\r\n setEdges((prevEdges) => {\r\n const newEdges = prevEdges.map((edge) => {\r\n if (edge.id === id) {\r\n updatedEdge = { ...edge, pathSegments: updatedSegments };\r\n return updatedEdge;\r\n }\r\n return edge;\r\n });\r\n updateJson({\r\n json: {\r\n architecture_json: {\r\n edges: newEdges,\r\n },\r\n },\r\n id: localStorage.getItem(\"architectureId\"),\r\n dispatch,\r\n undo,\r\n a_id,\r\n takeSnapshot,\r\n });\r\n return structuredClone(newEdges);\r\n });\r\n } catch (error) {\r\n // Clear the projected path\r\n // setProjectedPath(null);\r\n // setIsDragging(false);\r\n }\r\n\r\n // Clear the projected path\r\n setProjectedPath(null);\r\n setIsDragging(false);\r\n isDragging = false; // Reset dragging flag\r\n })\r\n );\r\n });\r\n }, [segments, zoom, setEdges, id, adjustSegments]);\r\n\r\n const [labelData, setLabelData] = useState(rest?.data?.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n useEffect(() => {\r\n if (edgePath) {\r\n const pathPoints = extractPointsFromPath(edgePath, 300).slice(10, -10); // Extract edge path points\r\n const edgeLength = pathPoints.length;\r\n\r\n if (rest.data.label) {\r\n const newLabelData = rest.data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n // Find the nearest point along the edge path for each label\r\n const nearestIndex = findNearestIndex(pathPoints, label.position);\r\n let newPosition = {\r\n x: pathPoints[nearestIndex].x,\r\n y: pathPoints[nearestIndex].y,\r\n };\r\n\r\n // Adjust label position to avoid node overlap\r\n newPosition = adjustLabelPositionForOverlap(\r\n newPosition,\r\n nodes,\r\n pathPoints\r\n );\r\n\r\n return {\r\n ...label,\r\n position: newPosition,\r\n // position: pathPoints[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPoints[absoluteIndex],\r\n };\r\n });\r\n\r\n // Update label data only if it's changed\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }\r\n }, [rest?.data?.label, edgePath, labelData, nodes]);\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = rest.data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(rest.data?.label) !== JSON.stringify(labelData)) {\r\n if (rest.data?.label) {\r\n setLabelData(rest.data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [rest.data?.label]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const sourceOrTargetHide = nodes\r\n ?.filter((data) => [rest?.source, rest?.target]?.includes(data?.id))\r\n ?.map((val) => !!val?.data?.isHidden)\r\n ?.find((data) => !!data);\r\n\r\n useEffect(() => {\r\n if (isNodeSelectionStarted) {\r\n document.body.classList.add(\"is-selection-applied\");\r\n } else {\r\n document.body.classList.remove(\"is-selection-applied\");\r\n }\r\n }, [isNodeSelectionStarted]);\r\n\r\n return (\r\n <>\r\n {!sourceOrTargetHide && (\r\n <>\r\n \r\n {rest?.data?.isDashed ? (\r\n <>\r\n \r\n {projectedPath && (\r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n \r\n {projectedPath && (\r\n \r\n )}\r\n \r\n )}\r\n {!rest?.data?.isDashed && rest?.data?.animate === true && (\r\n \r\n \r\n \r\n )}\r\n\r\n {(!sourceNode?.data?.globalDragging && edge.selected) && \r\n {segments.map((segment, index) => {\r\n // Skip first and last segments\r\n if (index === 0 || index === segments.length - 1) return null;\r\n\r\n const middleX = (segment.start.x + segment.end.x) / 2;\r\n const middleY = (segment.start.y + segment.end.y) / 2;\r\n\r\n const segmentCenter =\r\n segment.type === \"horizontal\"\r\n ? { x: middleX, y: segment.start.y }\r\n : { x: segment.start.x, y: middleY };\r\n\r\n return (\r\n \r\n );\r\n })}\r\n }\r\n\r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default memo(StepEdge);\r\n\r\nconst ClickableBaseEdge = ({\r\n id,\r\n path,\r\n style,\r\n markerEnd,\r\n markerStart,\r\n interactionWidth = 20,\r\n edge,\r\n}) => {\r\n // const value = `${edge.data.animate ? \"1000\" : \"0\"};0`;\r\n const value = edge.data.animate\r\n ? `${edge.data.animationDirection === \"rtl\" ? \"0;1000\" : \"1000;0\"}`\r\n : \"0;0\";\r\n return (\r\n <>\r\n \r\n \r\n \r\n {interactionWidth && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n getBezierPath,\r\n getMarkerEnd\r\n} from \"react-flow-renderer\";\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from \"reactflow\";\r\nimport { convertToRgba, extractPointsFromPath, findNearestIndex, getNodeHandlePositions } from \"../../../CommanFunctions/commanFunctions\";\r\nimport EdgeMarkers from \"./EdgeMarkers\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nfunction TreeNodeEdgeType1(edge) {\r\n\r\n let {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n style = {},\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n data\r\n } = edge;\r\n\r\n const { getNode, getEdge, setEdges } = useReactFlow();\r\n const currEdge = getEdge(id);\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const isLeftHandle = targetPosition === \"left\";\r\n const isFromRoot = data?.fromRoot;\r\n // const sourceXOffset = isLeftHandle ? 10 : -10;\r\n // const targetXOffset = isLeftHandle ? -10 : 10;\r\n const sourceXOffset = 0;\r\n const targetXOffset = 0;\r\n\r\n const edgePath = getBezierPath({\r\n sourceX: sourceX + (isFromRoot ? 0 : sourceXOffset),\r\n sourceY: sourceY,\r\n sourcePosition,\r\n targetX: targetX + targetXOffset,\r\n targetY: targetY,\r\n targetPosition\r\n });\r\n\r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(edgePath, 300).slice(30, -30),\r\n [edgePath]\r\n );\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, edgePath, updateEdgeIfNeeded, labelData]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n return (\r\n <>\r\n \r\n {data?.animate === true && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nexport default memo(TreeNodeEdgeType1);\r\n","import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from \"reactflow\";\r\nimport { convertToRgba, extractPointsFromPath, findNearestIndex, getNodeHandlePositions } from \"../../../CommanFunctions/commanFunctions\";\r\nimport EdgeMarkers from \"./EdgeMarkers\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nfunction TreeNodeEdgeType2(edge) {\r\n\r\n let {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n style = {},\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n data\r\n } = edge;\r\n\r\n const { getNode, getEdge, setEdges } = useReactFlow();\r\n\r\n const currEdge = getEdge(id);\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const initialStraightOffset = 40;\r\n const controlPointOffset = 30;\r\n const distanceThreshold = 40;\r\n\r\n const isSourceOnRight = sourceX > targetX;\r\n const isSourceOnTop = sourceY > targetY;\r\n\r\n const isYFarApart = Math.abs(targetY - sourceY) > distanceThreshold;\r\n const isXFarApart = Math.abs(targetX - sourceX) > distanceThreshold;\r\n\r\n let edgePath;\r\n\r\n // Horizontal connection (left-right or right-left)\r\n if (\r\n (sourcePosition === \"left\" && targetPosition === \"right\") ||\r\n (sourcePosition === \"right\" && targetPosition === \"left\")\r\n ) {\r\n const straightLineEndX = isSourceOnRight\r\n ? sourceX - initialStraightOffset\r\n : sourceX + initialStraightOffset;\r\n\r\n if (isYFarApart) {\r\n const controlPoint1X = isSourceOnRight\r\n ? straightLineEndX - controlPointOffset + 30\r\n : straightLineEndX + controlPointOffset - 30;\r\n const controlPoint2X = isSourceOnRight\r\n ? targetX + controlPointOffset + 40\r\n : targetX - controlPointOffset - 40;\r\n\r\n if (sourceY < targetY) {\r\n const controlPoint1Y = sourceY + controlPointOffset;\r\n const controlPoint2Y = targetY;\r\n\r\n edgePath = `M ${sourceX},${sourceY} \r\n L ${straightLineEndX},${sourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n } else {\r\n const controlPoint1Y = sourceY - controlPointOffset;\r\n const controlPoint2Y = targetY;\r\n\r\n edgePath = `M ${sourceX},${sourceY}\r\n L ${straightLineEndX},${sourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n }\r\n } else {\r\n edgePath = `M ${sourceX},${sourceY}\r\n L ${straightLineEndX},${sourceY}\r\n L ${targetX},${targetY}`;\r\n }\r\n }\r\n // Vertical connection (top-bottom or bottom-top)\r\n else if (\r\n (sourcePosition === \"top\" && targetPosition === \"bottom\") ||\r\n (sourcePosition === \"bottom\" && targetPosition === \"top\")\r\n ) {\r\n const straightLineEndY = isSourceOnTop\r\n ? sourceY - initialStraightOffset\r\n : sourceY + initialStraightOffset;\r\n\r\n if (isXFarApart) {\r\n const controlPoint1Y = isSourceOnTop\r\n ? straightLineEndY - controlPointOffset + 30\r\n : straightLineEndY + controlPointOffset - 30;\r\n const controlPoint2Y = isSourceOnTop\r\n ? targetY + controlPointOffset + 40\r\n : targetY - controlPointOffset - 40;\r\n\r\n if (sourceX < targetX) {\r\n const controlPoint1X = sourceX + controlPointOffset;\r\n const controlPoint2X = targetX;\r\n\r\n edgePath = `M ${sourceX},${sourceY}\r\n L ${sourceX},${straightLineEndY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n } else {\r\n const controlPoint1X = sourceX - controlPointOffset;\r\n const controlPoint2X = targetX;\r\n\r\n edgePath = `M ${sourceX},${sourceY}\r\n L ${sourceX},${straightLineEndY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n }\r\n } else {\r\n edgePath = `M ${sourceX},${sourceY}\r\n L ${sourceX},${straightLineEndY}\r\n L ${targetX},${targetY}`;\r\n }\r\n }\r\n\r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(edgePath, 300).slice(30, -30),\r\n [edgePath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, edgePath, updateEdgeIfNeeded, labelData]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n return (\r\n <>\r\n \r\n {data?.animate === true && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nexport default memo(TreeNodeEdgeType2);","import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from \"reactflow\";\r\nimport { convertToRgba, extractPointsFromPath, findNearestIndex, getNodeHandlePositions } from \"../../../CommanFunctions/commanFunctions\";\r\nimport EdgeMarkers from \"./EdgeMarkers\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nfunction TreeNodeEdgeType3(edge) {\r\n\r\n let {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n style = {},\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n data,\r\n } = edge;\r\n\r\n const { getNode, getEdge, setEdges } = useReactFlow();\r\n\r\n const currEdge = getEdge(id);\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const controlPointOffset = 50;\r\n const distanceThreshold = 40;\r\n const horizontalOffset = data?.fromRoot ? 20 : 0;\r\n\r\n const isSourceOnRight = sourceX > targetX;\r\n const isSourceOnTop = sourceY > targetY;\r\n\r\n const isYFarApart = Math.abs(targetY - sourceY) > distanceThreshold;\r\n const isXFarApart = Math.abs(targetX - sourceX) > distanceThreshold;\r\n\r\n let edgePath;\r\n\r\n // Horizontal connection (left-right or right-left)\r\n if (\r\n (sourcePosition === \"left\" && targetPosition === \"right\") ||\r\n (sourcePosition === \"right\" && targetPosition === \"left\")\r\n ) {\r\n if (isYFarApart) {\r\n const adjustedSourceX = isSourceOnRight ? sourceX + horizontalOffset : sourceX - horizontalOffset;\r\n const controlPoint1X = isSourceOnRight\r\n ? adjustedSourceX - controlPointOffset + 30\r\n : adjustedSourceX + controlPointOffset - 30;\r\n const controlPoint2X = isSourceOnRight\r\n ? targetX + controlPointOffset + 40\r\n : targetX - controlPointOffset - 40;\r\n\r\n if (sourceY < targetY) {\r\n const controlPoint1Y = sourceY + controlPointOffset;\r\n const controlPoint2Y = targetY;\r\n\r\n edgePath = `M ${adjustedSourceX},${sourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n } else {\r\n const controlPoint1Y = sourceY - controlPointOffset;\r\n const controlPoint2Y = targetY;\r\n\r\n edgePath = `M ${adjustedSourceX},${sourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n }\r\n } else {\r\n // For close proximity, use a straight line\r\n const adjustedSourceX = isSourceOnRight ? sourceX + horizontalOffset : sourceX - horizontalOffset;\r\n edgePath = `M ${adjustedSourceX},${sourceY} L ${targetX},${targetY}`;\r\n }\r\n }\r\n // Vertical connection (top-bottom or bottom-top)\r\n else if (\r\n (sourcePosition === \"top\" && targetPosition === \"bottom\") ||\r\n (sourcePosition === \"bottom\" && targetPosition === \"top\")\r\n ) {\r\n if (isXFarApart) {\r\n const adjustedSourceY = isSourceOnTop ? sourceY + horizontalOffset : sourceY - horizontalOffset;\r\n const controlPoint1Y = isSourceOnTop\r\n ? adjustedSourceY - controlPointOffset + 30\r\n : adjustedSourceY + controlPointOffset - 30;\r\n const controlPoint2Y = isSourceOnTop\r\n ? targetY + controlPointOffset + 40\r\n : targetY - controlPointOffset - 40;\r\n\r\n if (sourceX < targetX) {\r\n const controlPoint1X = sourceX + controlPointOffset;\r\n const controlPoint2X = targetX;\r\n\r\n edgePath = `M ${sourceX},${adjustedSourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n } else {\r\n const controlPoint1X = sourceX - controlPointOffset;\r\n const controlPoint2X = targetX;\r\n\r\n edgePath = `M ${sourceX},${adjustedSourceY}\r\n C ${controlPoint1X},${controlPoint1Y}\r\n ${controlPoint2X},${controlPoint2Y}\r\n ${targetX},${targetY}`;\r\n }\r\n } else {\r\n // For close proximity, use a straight line\r\n const adjustedSourceY = isSourceOnTop ? sourceY + horizontalOffset : sourceY - horizontalOffset;\r\n edgePath = `M ${sourceX},${adjustedSourceY} L ${targetX},${targetY}`;\r\n }\r\n }\r\n \r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(edgePath, 300).slice(30, -30),\r\n [edgePath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, edgePath, updateEdgeIfNeeded, labelData]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n return (\r\n <>\r\n \r\n {data?.animate === true && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nexport default memo(TreeNodeEdgeType3);","import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n getBezierPath,\r\n getSmoothStepPath,\r\n getMarkerEnd\r\n} from \"react-flow-renderer\";\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from \"reactflow\";\r\nimport { convertToRgba, extractPointsFromPath, findNearestIndex, getNodeHandlePositions } from \"../../../CommanFunctions/commanFunctions\";\r\nimport EdgeMarkers from \"./EdgeMarkers\";\r\nimport CustomEdgeLabel from \"./CustomEdgeLabel\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nfunction TreeNodeEdgeType5(edge) {\r\n\r\n let {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n sourcePosition,\r\n targetPosition,\r\n style = {},\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n data\r\n } = edge;\r\n\r\n const { getNode, getEdge, setEdges } = useReactFlow();\r\n\r\n const currEdge = getEdge(id);\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n const offsetY = targetNode?.height / 2 || 30;\r\n const offsetX = 0;\r\n const sourceHeightOffset = sourceNode?.height / 2 || 30;\r\n const taregtWidthOffset = targetNode?.width + 10 || 157;\r\n\r\n const isLeftHandle = targetPosition === \"left\";\r\n\r\n let fullPath = null;\r\n let extraPath = null;\r\n\r\n if ((sourcePosition === \"left\" && targetPosition === \"right\") || (sourcePosition === \"right\" && targetPosition === \"left\")) {\r\n const edgePath = getBezierPath({\r\n sourceX: sourceX - (data.fromRoot ? isLeftHandle ? 60 : -60 : offsetX),\r\n sourceY: sourceY + (data.fromRoot ? 0 : sourceHeightOffset),\r\n sourcePosition,\r\n targetX: targetX + offsetX,\r\n targetY: targetY + offsetY,\r\n targetPosition\r\n });\r\n\r\n extraPath = getBezierPath({\r\n sourceX: sourceX - (data.fromRoot ? isLeftHandle ? 60 : -60 : offsetX),\r\n sourceY: sourceY + (data.fromRoot ? -3 : sourceHeightOffset - 3),\r\n sourcePosition,\r\n targetX: targetX + offsetX,\r\n targetY: targetY + offsetY,\r\n targetPosition\r\n });\r\n\r\n const borderBottomPath = getSmoothStepPath({\r\n sourcePosition,\r\n sourceX: targetX + offsetX,\r\n sourceY: targetY + offsetY,\r\n targetX: targetX + offsetX + (isLeftHandle ? taregtWidthOffset : -taregtWidthOffset),\r\n targetY: targetY + offsetY,\r\n targetPosition\r\n });\r\n\r\n fullPath = edgePath + borderBottomPath;\r\n } else if ((sourcePosition === \"top\" && targetPosition === \"bottom\") || (sourcePosition === \"bottom\" && targetPosition === \"top\")) {\r\n fullPath = getBezierPath({\r\n sourceX: sourceX,\r\n sourceY: sourceY,\r\n sourcePosition,\r\n targetX: targetX,\r\n targetY: targetY,\r\n targetPosition\r\n });\r\n }\r\n\r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(fullPath, 300).slice(30, -30),\r\n [fullPath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, fullPath, updateEdgeIfNeeded, labelData]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n return (\r\n <>\r\n \r\n {data?.animate && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n}\r\n\r\nexport default memo(TreeNodeEdgeType5);","import React, { memo, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow } from 'reactflow';\r\nimport {\r\n getBezierPath,\r\n getSmoothStepPath,\r\n} from \"react-flow-renderer\";\r\nimport { convertToRgba, extractPointsFromPath, findNearestIndex, getNodeHandlePositions } from '../../../CommanFunctions/commanFunctions';\r\nimport EdgeMarkers from './EdgeMarkers';\r\nimport CustomEdgeLabel from './CustomEdgeLabel';\r\nimport { Typography } from '@mui/material';\r\n\r\nconst TreeNodeEdgeType8 = (edge) => {\r\n\r\n let {\r\n id,\r\n sourceX,\r\n sourceY,\r\n targetX,\r\n targetY,\r\n targetPosition,\r\n sourcePosition,\r\n data,\r\n markerEnd,\r\n markerStart,\r\n source,\r\n target,\r\n style = {},\r\n } = edge;\r\n\r\n const { getNode, getEdge, setEdges } = useReactFlow();\r\n const currEdge = getEdge(id);\r\n const sourceNode = getNode(source);\r\n const targetNode = getNode(target);\r\n\r\n if (sourceNode?.width && targetNode?.width && sourceNode?.height && targetNode?.height) {\r\n // Calculate handle positions for both source and target nodes\r\n const sourceHandles = getNodeHandlePositions(sourceNode);\r\n const targetHandles = getNodeHandlePositions(targetNode);\r\n\r\n sourceX = sourceHandles[sourcePosition]?.x;\r\n sourceY = sourceHandles[sourcePosition]?.y;\r\n targetX = targetHandles[targetPosition]?.x;\r\n targetY = targetHandles[targetPosition]?.y;\r\n }\r\n\r\n // Common path calculation logic for various scenarios\r\n // const getCustomPath = () => {\r\n // const offsetX = 30; // Horizontal offset\r\n // const offsetY = 20; // Vertical offset\r\n // const dx = targetX - sourceX;\r\n // const dy = targetY - sourceY;\r\n\r\n // if (dx === 0 || dy === 0) {\r\n // return `M${sourceX},${sourceY} L${targetX},${targetY}`;\r\n // }\r\n\r\n // if (sourcePosition === 'left' && targetPosition === 'right') {\r\n // return `M${sourceX},${sourceY} L${sourceX - offsetX},${sourceY} L${targetX + offsetX},${targetY} L${targetX},${targetY}`;\r\n // } else if (sourcePosition === 'right' && targetPosition === 'left') {\r\n // return `M${sourceX},${sourceY} L${sourceX + offsetX},${sourceY} L${targetX - offsetX},${targetY} L${targetX},${targetY}`;\r\n // } else if (sourcePosition === 'top' && targetPosition === 'bottom') {\r\n // return `M${sourceX},${sourceY} L${sourceX},${sourceY - offsetY} L${targetX},${targetY + offsetY} L${targetX},${targetY}`;\r\n // } else if (sourcePosition === 'bottom' && targetPosition === 'top') {\r\n // return `M${sourceX},${sourceY} L${sourceX},${sourceY + offsetY} L${targetX},${targetY - offsetY} L${targetX},${targetY}`;\r\n // }\r\n // };\r\n\r\n // const edgePath = getCustomPath();\r\n\r\n const offsetY = targetNode?.height / 2 || 30;\r\n const sourceHeightOffset = sourceNode?.height / 2 || 30;\r\n const taregtWidthOffset = targetNode?.width + 10 || 157;\r\n\r\n const isLeftHandle = targetPosition === \"left\";\r\n\r\n let fullPath = null;\r\n let borderBottomPath = null;\r\n let edgePath = null;\r\n\r\n if ((sourcePosition === \"left\" && targetPosition === \"right\") || (sourcePosition === \"right\" && targetPosition === \"left\")) {\r\n edgePath = getBezierPath({\r\n sourceX: sourceX,\r\n sourceY: sourceY + (data.fromRoot ? 0 : sourceHeightOffset),\r\n sourcePosition,\r\n targetX: targetX,\r\n targetY: targetY + offsetY,\r\n targetPosition\r\n });\r\n\r\n borderBottomPath = getSmoothStepPath({\r\n sourcePosition,\r\n sourceX: targetX + (isLeftHandle ? -10 : 10),\r\n sourceY: targetY + offsetY,\r\n targetX: targetX + (isLeftHandle ? taregtWidthOffset : -taregtWidthOffset),\r\n targetY: targetY + offsetY,\r\n targetPosition\r\n });\r\n\r\n fullPath = edgePath + borderBottomPath;\r\n } else if ((sourcePosition === \"top\" && targetPosition === \"bottom\") || (sourcePosition === \"bottom\" && targetPosition === \"top\")) {\r\n fullPath = getBezierPath({\r\n sourceX: sourceX,\r\n sourceY: sourceY,\r\n sourcePosition,\r\n targetX: targetX,\r\n targetY: targetY,\r\n targetPosition\r\n });\r\n }\r\n\r\n const [labelData, setLabelData] = useState(data.label || []);\r\n\r\n const updateEdgeIfNeeded = useCallback(\r\n (newLabelData) => {\r\n let needsUpdate = false;\r\n\r\n // Check if any label's position or selected state has changed\r\n newLabelData.forEach((newLabel, index) => {\r\n const oldLabel = labelData[index];\r\n if (\r\n !oldLabel ||\r\n newLabel.position.x !== oldLabel.position.x ||\r\n newLabel.position.y !== oldLabel.position.y ||\r\n newLabel.selected !== oldLabel.selected\r\n ) {\r\n needsUpdate = true;\r\n }\r\n });\r\n\r\n if (needsUpdate) {\r\n setLabelData(newLabelData);\r\n\r\n setEdges((edges) => {\r\n localStorage.setItem(\r\n \"architectureJsonEdges\",\r\n JSON.stringify({\r\n architecture_json: {\r\n edges: edges,\r\n // lastUpdatedBy: userData?.user_id,\r\n lastEvent: ``,\r\n },\r\n })\r\n );\r\n return edges.map((e) => {\r\n if (e.id === id) {\r\n return {\r\n ...e,\r\n data: {\r\n ...e.data,\r\n label: newLabelData,\r\n },\r\n };\r\n }\r\n return e;\r\n });\r\n });\r\n }\r\n },\r\n [id, labelData, setEdges]\r\n );\r\n\r\n const pathPts = useMemo(\r\n () => extractPointsFromPath(fullPath, 300).slice(30, -30),\r\n [fullPath]\r\n );\r\n\r\n useEffect(() => {\r\n const isAnyLabelSelected = data?.label?.some((label) => label?.selected);\r\n if (!isAnyLabelSelected && JSON.stringify(data?.label) !== JSON.stringify(labelData)) {\r\n if (data?.label) {\r\n setLabelData(data?.label);\r\n } else {\r\n setLabelData([]);\r\n }\r\n }\r\n }, [data?.label]);\r\n\r\n useEffect(() => {\r\n const edgeLength = pathPts.length;\r\n if (data.label) {\r\n const newLabelData = data.label.map((label, index) => {\r\n if (!label.pathIndex) {\r\n const nearestIndex = findNearestIndex(pathPts, label.position);\r\n return {\r\n ...label,\r\n position: pathPts[nearestIndex],\r\n pathIndex: nearestIndex / edgeLength,\r\n };\r\n }\r\n\r\n const absoluteIndex = Math.round(label.pathIndex * edgeLength);\r\n return {\r\n ...label,\r\n position: pathPts[absoluteIndex],\r\n };\r\n });\r\n\r\n if (JSON.stringify(newLabelData) !== JSON.stringify(labelData)) {\r\n setLabelData(newLabelData);\r\n updateEdgeIfNeeded(newLabelData);\r\n }\r\n }\r\n }, [data.label, fullPath, updateEdgeIfNeeded, labelData]);\r\n\r\n const startMarker = markerStart?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerStart?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerStart?.includes(`=arrowclosed')`)\r\n ? markerStart\r\n : `url(#${currEdge?.markerStart?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n const endMarker = markerEnd?.includes(`=markerCircle')`)\r\n ? `url(#markerCircle_${id})`\r\n : markerEnd?.includes(`=markerCircleOutlined')`)\r\n ? `url(#markerCircleOutlined_${id})`\r\n : markerEnd?.includes(`=arrowclosed')`)\r\n ? markerEnd\r\n : `url(#${currEdge?.markerEnd?.type?.replace(/^(startM|endM)/, 'm')}_${id})`;\r\n\r\n return (\r\n <>\r\n \r\n {data?.animate === true && (\r\n \r\n \r\n \r\n )}\r\n {(sourcePosition === \"top\" && targetPosition === \"bottom\") || (sourcePosition === \"bottom\" && targetPosition === \"top\") ?\r\n :\r\n <>\r\n \r\n \r\n }\r\n \r\n\r\n {labelData.map((label, index) => (\r\n \r\n \r\n {label?.selected ? (\r\n \r\n ) : (\r\n \r\n {label.labelData}\r\n \r\n )}\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n\r\nexport default memo(TreeNodeEdgeType8);\r\n"],"names":["AnimatedDashedEdge","edge","_edge$data5","_edge$style","_edge$style2","boardRef","useSelector","e","drawboard","sourceX","targetX","sourceY","targetY","sourcePosition","targetPosition","edgePath","labelX","labelY","getBezierPath","_objectSpread","labelData","setLabelData","useState","data","label","setEdges","useReactFlow","updateEdgeIfNeeded","useCallback","newLabelData","needsUpdate","forEach","newLabel","index","oldLabel","position","x","y","selected","edges","localStorage","setItem","JSON","stringify","architecture_json","lastEvent","map","id","pathPoints","useMemo","extractPointsFromPath","slice","useEffect","_edge$data","_edge$data$label","_edge$data2","_edge$data3","_edge$data4","some","sourceElements","querySelectorAll","targetElements","setEdgeAnchorTransform","edgeLength","length","pathIndex","nearestIndex","findNearestIndex","absoluteIndex","Math","round","_jsxs","_Fragment","children","_jsx","ClickableBaseEdge","path","markerEnd","style","filter","r","fill","stroke","className","dur","repeatCount","_edge$data6","_edge$data6$style","_edge$style3","_edge$style4","EdgeLabelRenderer","transform","concat","background","fontSize","borderRadius","zIndex","CustomEdgeLabel","color","edgeLabel","isFocus","labelIndex","Typography","sx","convertToRgba","lineHeight","px","memo","_ref","markerStart","interactionWidth","strokeWidth","strokeDasharray","strokeDashoffset","animation","d","attributeName","values","type","markerWidth","markerHeight","refX","refY","orient","markerUnits","strokeOpacity","displayName","pathFunctions","straight","getStraightPath","smoothstep","getSmoothStepPath","bezier","CustomEdge","_edge$data$positionHa","_edge$data4$style","_edge$data5$style","screenToFlowPosition","getEdges","getNodes","positionHandlers","edgeSegmentsCount","dispatch","useDispatch","useParams","user_data","getItem","undo","takeSnapshot","useUndoRedo","location","useLocation","pathFunction","edgeSegmentsArray","Array","from","_","i","segmentSource","segmentTarget","handleMouseMove","event","handlerIndex","_event$target$dataset","activeEdge","parseInt","target","dataset","active","clientX","clientY","updatedEdges","random","handler","handleMouseUp","parsedData","parse","_e$data$positionHandl","a_id","URLSearchParams","search","get","updateJson","json","lastUpdatedBy","user_id","handleMouseDown","handleContextMenu","preventDefault","smoothPathData","_ref2","_ref3","onMouseMove","onMouseUp","onMouseDown","onContextMenu","doubleClicked","React","_ref4","_edge$data$label$labe","_edge$data$label$labe2","_edge$data$label$labe3","_edge$data$label$labe4","_edge$data$label$labe5","_edge$data$label$labe6","_edge$data$label$labe7","_edge$data$label$labe8","_edge$data$label$labe9","_edge$data$label$labe10","_edge$data$label$labe11","_edge$data$label$labe12","_edge$data$label$labe13","_edge$data$label$labe14","_edge$data$label$labe15","edgesLocalSave","nodesLocalSave","common","setLabel","handleChangeLabel","value","prevEdge","newLabels","idx","debouncedUpdate","debounce","_parsedData","onChange","cursor","border","padding","outline","textAlign","width","minWidth","maxWidth","fontFamily","textColor","isBold","isItalic","fontStyle","isUnderline","isStrikethrough","textDecoration","autoFocus","autoComplete","_edge$style5","_edge$style6","_edge$style7","_edge$style8","_edge$style9","_edge$style10","_edge$style11","_edge$style12","_edge$style13","_edge$style14","_edge$style15","_edge$style16","_edge$style17","_edge$style18","_edge$style19","_edge$style20","_edge$style21","_edge$style22","_edge$style23","_edge$style24","_edge$style25","_edge$style26","_edge$style27","_edge$style28","_edge$style29","_edge$style30","_edge$style31","_edge$style32","mainBackgroundStyles","useDNDContext","state","isTreeView","cx","cy","x1","y1","x2","y2","height","points","EdgeWithAminatedBall","ControlPoint","setControlPoints","onDragEnd","container","useStore","store","domNode","dragging","setDragging","ref","useRef","updatePosition","pos","flatMap","p","deletePoint","_ref$current","_ref$current$previous","previousControlPoint","current","previousElementSibling","tagName","classList","contains","window","requestAnimationFrame","focus","handleKeyPress","key","stopPropagation","handleDragEnd","onPointerMove","onPointerUp","removeEventListener","addEventListener","once","tabIndex","colorsConst","primaryColor","pointerEvents","onPointerDown","button","onKeyDown","calculateControlOffset","distance","curvature","sqrt","getControlWithCurvature","c","Position","Left","Right","Top","Bottom","getCatmullRomPath","arguments","undefined","sides","fromSide","toSide","_points","_points2","p1","p2","p0","calculateBezierP0","p3","calculateBezierP3","b1","b2","getCatmullRomControlPoints","controlPoints","_points3","_points4","isControlPoint","push","q","side","c1","c2","t","getControlPoints","algorithm","Algorithm","BezierCatmullRom","Linear","prev","crypto","randomUUID","getLinearControlPoints","CatmullRom","EditableEdge","_currEdge$markerStart","_currEdge$markerStart2","_currEdge$markerEnd","_currEdge$markerEnd$t","_getNodes","_getNodes$filter","_getNodes$filter$map","source","delegated","_objectWithoutProperties","_excluded","getEdge","getNode","sourceNode","targetNode","_sourceHandles$source","_sourceHandles$source2","_targetHandles$target","_targetHandles$target2","sourceHandles","getNodeHandlePositions","targetHandles","_sourceHandles$source3","_sourceHandles$source4","_targetHandles$target3","_targetHandles$target4","shouldShowPoints","sourceOrigin","targetOrigin","currEdge","isNodeSelectionStarted","useNodeSelectionStarted","markerEndRegex","markerStartRegex","typeValueMarkerEnd","str","match","match2","getMarkerEndTypeValue","typeValueMarkerStart","getMarkerStartTypeValue","update","_e$data$points","_e$data","isEditableEdgeDot","getLinearPath","getPath","pathPts","document","body","add","remove","_data$label","controlPointsWithIds","prevIds","newPoints","point","prevPoint","useIdsForInactiveControlPoints","startMarker","includes","replace","endMarker","sourceOrTargetHide","val","_val$data","isHidden","find","treeViewParents","nd","EdgeMarkers","isDashed","BaseEdge","display","animate","_data$style","adjustPathForOverlaps","segments","nodes","reduce","modifiedSegments","segment","overlappingNodes","node","_node$data","isGeneratedThroughAI","nodeRect","segmentMinX","min","start","end","segmentMaxX","max","segmentMinY","segmentMaxY","offset","getNodesBounds","isLeftToRight","yOffset","x4","x3","segmentsToAdd","isTopToBottom","xOffset","y4","y3","getInitialSegments","getOffsetCoordinates","direction","currentX","currentY","adjustedTargetX","adjustedTargetY","abs","scenarioKey","sourceIsTopRight","sourceIsBottomLeft","sourceIsBottomRight","segmentPattern","intermediateX","intermediateY","step","generateStepEdgePath","array","prevSegment","nextSegment","shouldCurveStart","shouldCurveEnd","segmentPath","getSegmentLength","seg","currentSegmentLength","prevSegmentLength","nextSegmentLength","startRadius","endRadius","startX","endX","nextY","startY","endY","nextX","StepEdge","_currEdge$data","_rest$data","_rest$data2","_rest$data7","_nodes$filter","_nodes$filter$map","_rest$data8","_rest$data9","_rest$data10","_sourceNode$data","rest","getZoom","animationDirection","isDragging","setIsDragging","projectedPath","setProjectedPath","zoom","areAllSegmentCoordinatesValid","every","isNaN","adjustSegments","dragIndex","newX","newY","updatedSegments","sourceDeltaX","sourceDeltaY","targetDeltaX","targetDeltaY","currentSegment","progress","deltaX","deltaY","lastSegment","secondLastSegment","thirdLastSegment","adjustLastSegments","lastIndex","adjustStartAndEnd","calculateLength","result","currentMergedSegment","lastResult","removeShortSegments","mergeAndRemoveSegmentsWhileAdjusting","draggedSegment","splice","processSegments","threshold","minLength","next","prevPrev","nextNext","mergeAndRemoveSegments","updatedEdge","structuredClone","newSegments","pathSegments","currSegments","sourceId","targetId","d3Selection","select","getElementById","dragStartTimer","call","drag","on","setTimeout","dx","dy","projectedPathString","error","clearTimeout","uSegments","verticalSegmentCount","isSegmentsValid","prevEdges","newEdges","newPosition","adjustLabelPositionForOverlap","labelPosition","edgePathPoints","nearestPointIndex","newPoint","_rest$data3","_rest$data3$label","_rest$data4","_rest$data5","_rest$data6","keyPoints","keyTimes","calcMode","globalDragging","middleX","middleY","segmentCenter","opacity","_rest$data11","_rest$data11$style","TreeNodeEdgeType1","fromRoot","TreeNodeEdgeType2","controlPointOffset","isSourceOnRight","isSourceOnTop","isYFarApart","isXFarApart","straightLineEndX","controlPoint1X","controlPoint2X","controlPoint1Y","controlPoint2Y","straightLineEndY","TreeNodeEdgeType3","horizontalOffset","adjustedSourceX","adjustedSourceY","TreeNodeEdgeType5","offsetY","sourceHeightOffset","taregtWidthOffset","isLeftHandle","fullPath","extraPath","borderBottomPath","gradientUnits","stopColor","stopOpacity","TreeNodeEdgeType8"],"sourceRoot":""}