From 2e7f362867ddee2e2c04ec2cfe6dee3ff6ffe5ec Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 8 Sep 2023 12:02:41 -0300 Subject: [PATCH] feat(reactflowUtils.ts): add findLastNodeType type to represent the input for findLastNode function feat(reactflowUtils.ts): add filterFlow function to filter out selected nodes and edges from the flow feat(reactflowUtils.ts): add updateFlowPosition function to update the position of nodes in the flow based on a new position fix(reactflowUtils.ts): fix return type of generateFlow function to use generateFlowType type instead of inline type definition --- .../src/types/utils/reactflowUtils.ts | 7 +++- src/frontend/src/utils/reactflowUtils.ts | 40 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/types/utils/reactflowUtils.ts b/src/frontend/src/types/utils/reactflowUtils.ts index 8db47fb7b..e9b8ee473 100644 --- a/src/frontend/src/types/utils/reactflowUtils.ts +++ b/src/frontend/src/types/utils/reactflowUtils.ts @@ -20,4 +20,9 @@ export type updateEdgesHandleIdsType = { edges: Edge[]; }; -export type generateFlowType = { newFlow: FlowType; removedEdges: Edge[] } \ No newline at end of file +export type generateFlowType = { newFlow: FlowType; removedEdges: Edge[] } + +export type findLastNodeType = { + nodes: NodeType[]; + edges: Edge[]; +} \ No newline at end of file diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index c6f8ec3f0..726d1645e 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -6,6 +6,7 @@ import { OnSelectionChangeParams, ReactFlowInstance, ReactFlowJsonObject, + XYPosition, } from "reactflow"; import { specialCharsRegex } from "../constants/constants"; import { APITemplateType } from "../types/api"; @@ -17,6 +18,8 @@ import { } from "../types/flow"; import { cleanEdgesType, + findLastNodeType, + generateFlowType, unselectAllNodesType, updateEdgesHandleIdsType, } from "../types/utils/reactflowUtils"; @@ -409,7 +412,7 @@ export function generateFlow( selection: OnSelectionChangeParams, reactFlowInstance: ReactFlowInstance, name: string -): { newFlow: FlowType; removedEdges: Edge[] } { +): generateFlowType { const newFlowData = reactFlowInstance.toObject(); /* remove edges that are not connected to selected nodes on both ends @@ -439,3 +442,38 @@ export function generateFlow( ), }; } + +export function filterFlow( + selection: OnSelectionChangeParams, + reactFlowInstance: ReactFlowInstance +) { + reactFlowInstance.setNodes((nodes) => + nodes.filter((node) => !selection.nodes.includes(node)) + ); + reactFlowInstance.setEdges((edges) => + edges.filter((edge) => !selection.edges.includes(edge)) + ); +} + +export function findLastNode({ + nodes, + edges, +}: findLastNodeType) { + /* + this function receives a flow and return the last node + */ + let lastNode = nodes.find((n) => !edges.some((e) => e.source === n.id)); + return lastNode; +} + +export function updateFlowPosition(NewPosition: XYPosition, flow: FlowType) { + const middlePoint = getMiddlePoint(flow.data!.nodes); + let deltaPosition = { + x: NewPosition.x - middlePoint.x, + y: NewPosition.y - middlePoint.y, + }; + flow.data!.nodes.forEach((node) => { + node.position.x += deltaPosition.x; + node.position.y += deltaPosition.y; + }); +} \ No newline at end of file