From 2d2f642c82e397265870fe7b60799d4f5baf63b9 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 5 Oct 2023 10:34:58 +0200 Subject: [PATCH 1/2] feat(react) added screenToFlowCoordinate & flowToScreenCoordinate --- .../react/src/examples/DragNDrop/index.tsx | 4 +- packages/react/src/hooks/useViewportHelper.ts | 38 ++++++++++++++++++- packages/react/src/types/general.ts | 2 + 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/examples/react/src/examples/DragNDrop/index.tsx b/examples/react/src/examples/DragNDrop/index.tsx index 16e9737e..a3e09d8d 100644 --- a/examples/react/src/examples/DragNDrop/index.tsx +++ b/examples/react/src/examples/DragNDrop/index.tsx @@ -49,9 +49,9 @@ const DnDFlow = () => { if (reactFlowInstance) { const type = event.dataTransfer.getData('application/reactflow'); - const position = reactFlowInstance.project({ + const position = reactFlowInstance.screenToFlowCoordinate({ x: event.clientX, - y: event.clientY - 40, + y: event.clientY, }); const newNode: Node = { id: getId(), diff --git a/packages/react/src/hooks/useViewportHelper.ts b/packages/react/src/hooks/useViewportHelper.ts index aded1f17..1872d414 100644 --- a/packages/react/src/hooks/useViewportHelper.ts +++ b/packages/react/src/hooks/useViewportHelper.ts @@ -1,5 +1,11 @@ import { useMemo } from 'react'; -import { pointToRendererPoint, getTransformForBounds, fitView, type XYPosition } from '@xyflow/system'; +import { + pointToRendererPoint, + getTransformForBounds, + fitView, + type XYPosition, + rendererPointToPoint, +} from '@xyflow/system'; import { useStoreApi, useStore } from '../hooks/useStore'; import type { ViewportHelperFunctions, ReactFlowState } from '../types'; @@ -85,6 +91,36 @@ const useViewportHelper = (): ViewportHelperFunctions => { const { transform, snapToGrid, snapGrid } = store.getState(); return pointToRendererPoint(position, transform, snapToGrid, snapGrid); }, + screenToFlowCoordinate: (position: XYPosition) => { + const { transform, snapToGrid, snapGrid, domNode } = store.getState(); + if (domNode) { + const { x: domX, y: domY } = domNode.getBoundingClientRect(); + + const correctedPosition = { + x: position.x - domX, + y: position.y - domY, + }; + + return pointToRendererPoint(correctedPosition, transform, snapToGrid, snapGrid || [1, 1]); + } + + return { x: 0, y: 0 }; + }, + flowToScreenCoordinate: (position: XYPosition) => { + const { transform, domNode } = store.getState(); + if (domNode) { + const { x: domX, y: domY } = domNode.getBoundingClientRect(); + + const rendererPosition = rendererPointToPoint(position, transform); + + return { + x: rendererPosition.x + domX, + y: rendererPosition.y + domY, + }; + } + + return { x: 0, y: 0 }; + }, viewportInitialized: panZoomInitialized, }; }, [panZoomInitialized]); diff --git a/packages/react/src/types/general.ts b/packages/react/src/types/general.ts index 8108c3dd..2b2945a6 100644 --- a/packages/react/src/types/general.ts +++ b/packages/react/src/types/general.ts @@ -55,5 +55,7 @@ export type ViewportHelperFunctions = { setCenter: SetCenter; fitBounds: FitBounds; project: Project; + screenToFlowCoordinate: Project; + flowToScreenCoordinate: Project; viewportInitialized: boolean; }; From b6ea01f51bb2c5c63dd12f7e48aa46d0b9fbb4e9 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 5 Oct 2023 10:39:52 +0200 Subject: [PATCH 2/2] chore(react) deleteElements now returns deletedEdges & deletedNodes --- packages/react/src/hooks/useReactFlow.ts | 2 ++ packages/react/src/types/instance.ts | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/react/src/hooks/useReactFlow.ts b/packages/react/src/hooks/useReactFlow.ts index 45a8dbe1..f66ac38b 100644 --- a/packages/react/src/hooks/useReactFlow.ts +++ b/packages/react/src/hooks/useReactFlow.ts @@ -164,6 +164,8 @@ export default function useReactFlow(): ReactFlo } } } + + return { deletedNodes: matchingNodes, deletedEdges: matchingEdges }; }, []); const getNodeRect = useCallback( diff --git a/packages/react/src/types/instance.ts b/packages/react/src/types/instance.ts index 239d339f..531e518e 100644 --- a/packages/react/src/types/instance.ts +++ b/packages/react/src/types/instance.ts @@ -28,7 +28,10 @@ export namespace Instance { export type GetEdge = (id: string) => Edge | undefined; export type AddEdges = (payload: Edge[] | Edge) => void; export type ToObject = () => ReactFlowJsonObject; - export type DeleteElements = ({ nodes, edges }: DeleteElementsOptions) => void; + export type DeleteElements = ({ nodes, edges }: DeleteElementsOptions) => { + deletedNodes: Node[]; + deletedEdges: Edge[]; + }; export type GetIntersectingNodes = ( node: (Partial> & { id: Node['id'] }) | Rect, partially?: boolean,