diff --git a/components/canvas/Canvas.tsx b/components/canvas/Canvas.tsx index 2d70965..a6a30a4 100644 --- a/components/canvas/Canvas.tsx +++ b/components/canvas/Canvas.tsx @@ -3,6 +3,7 @@ import { ManageLabelBox } from "components/Labels/ManageLabelBox"; import { ResetProcessButton } from "components/ResetProcessButton"; import { useLayoutEffect, useState } from "react"; import ReactFlow, { + BaseEdge, Controls, Edge, Node, @@ -34,6 +35,8 @@ import { useWebSocket } from "./hooks/useWebSocket"; import { getQIPRContainerWidth } from "./utils/getQIPRContainerWidth"; import { useProjectId } from "@/hooks/useProjectId"; import { MiniMapCustom } from "@/components/canvas/MiniMapCustom"; +import { EdgeDataApi } from "@/types/EdgeDataApi"; +import { ChoiceEdge } from "@/components/canvas/ChoiceEdge"; type CanvasProps = { graph: Graph; @@ -56,10 +59,23 @@ const Canvas = ({ new Date("2024-04-24T00:08:00.000000Z").getTime(); let tempNodes: Node[] = []; - let tempEdges: Edge[] = apiEdges; + let tempEdges: Edge[] = []; + apiEdges.map((edge: EdgeDataApi) => { + const nodeSource = apiNodes.filter((node) => node.id === edge.source); + if (nodeSource[0] && nodeSource[0].type === NodeTypes.choice) { + tempEdges.push({ ...edge, label: "test", type: "choice" }); + } else { + tempEdges.push({ ...edge }); + } + }); + const [nodes, setNodes, onNodesChange] = useNodesState([]); const [edges, setEdges, onEdgesChange] = useEdgesState([]); + const edgeTypes = { + choice: ChoiceEdge, + }; + const [visibleDeleteScrim, setVisibleDeleteScrim] = useState(false); const [visibleLabelScrim, setVisibleLabelScrim] = useState(false); @@ -199,12 +215,14 @@ const Canvas = ({ id: `${tempParentNodeId}=>${id}`, source: tempParentNodeId, target: id, + labelShowBg: true, }); tempEdges.push({ id: `${id}=>${id}`, source: id, target: id, type: "straight", + labelShowBg: true, }); tempParentNodeId = id; } @@ -213,6 +231,7 @@ const Canvas = ({ id: `${tempParentNodeId}=>${node.id}`, source: tempParentNodeId, target: node.id, + labelShowBg: true, }); } }); @@ -341,6 +360,7 @@ const Canvas = ({ nodes={nodes} edges={edges} nodeTypes={nodeElementTypes} + edgeTypes={edgeTypes} onNodesChange={onNodesChange} onEdgesChange={onEdgesChange} onPaneClick={() => setSelectedNode(undefined)} diff --git a/components/canvas/ChoiceEdge.tsx b/components/canvas/ChoiceEdge.tsx new file mode 100644 index 0000000..5f47101 --- /dev/null +++ b/components/canvas/ChoiceEdge.tsx @@ -0,0 +1,58 @@ +import { + BaseEdge, + EdgeLabelRenderer, + EdgeProps, + getBezierPath, + useReactFlow, +} from "reactflow"; +import colors from "../../theme/colors"; +import { Input } from "@equinor/eds-core-react"; +import { useState } from "react"; +import { EdgeLabel } from "@/components/canvas/ChoiceEdgeLabel"; + +export function ChoiceEdge({ + id, + sourceX, + sourceY, + targetX, + targetY, + sourcePosition, + targetPosition, + style = {}, + markerEnd, + label, +}: EdgeProps) { + const [edgePath, labelX, labelY] = getBezierPath({ + sourceX, + sourceY, + sourcePosition, + targetX, + targetY, + targetPosition, + }); + + return ( + <> + + +
+ +
+
+ + ); +} diff --git a/components/canvas/ChoiceEdgeLabel.tsx b/components/canvas/ChoiceEdgeLabel.tsx new file mode 100644 index 0000000..d870d20 --- /dev/null +++ b/components/canvas/ChoiceEdgeLabel.tsx @@ -0,0 +1,34 @@ +import { useReactFlow } from "reactflow"; +import { useState } from "react"; + +type EdgeLabelProps = { + id: string; + labelText?: string; +}; +export function EdgeLabel({ id, labelText }: EdgeLabelProps) { + const { setEdges } = useReactFlow(); + const [value, setValue] = useState(labelText); + + const updateLabel = () => { + setEdges((edges) => + edges.map((edge) => (edge.id === id ? { ...edge, label: value } : edge)) + ); + }; + + return ( + setValue(e.target.value)} + onBlur={updateLabel} + /> + ); +} diff --git a/types/EdgeDataApi.ts b/types/EdgeDataApi.ts index 19cd945..e4f7158 100644 --- a/types/EdgeDataApi.ts +++ b/types/EdgeDataApi.ts @@ -3,4 +3,6 @@ export type EdgeDataApi = { projectId: string; source: string; // Source node ID target: string; // Target node ID + label?: string; + type?: string; };