diff --git a/examples/react/src/examples/Overview/index.tsx b/examples/react/src/examples/Overview/index.tsx index b6c2a310..3f5c72d0 100644 --- a/examples/react/src/examples/Overview/index.tsx +++ b/examples/react/src/examples/Overview/index.tsx @@ -47,9 +47,10 @@ const onEdgeMouseEnter = (_: ReactMouseEvent, edge: Edge) => console.log('edge m const onEdgeMouseMove = (_: ReactMouseEvent, edge: Edge) => console.log('edge mouse move', edge); const onEdgeMouseLeave = (_: ReactMouseEvent, edge: Edge) => console.log('edge mouse leave', edge); const onEdgeDoubleClick = (_: ReactMouseEvent, edge: Edge) => console.log('edge double click', edge); -const onBeforeDelete: OnBeforeDelete = ({ nodes, edges }) => { +const onBeforeDelete: OnBeforeDelete = async ({ nodes, edges }) => { console.log('on before delete', nodes, edges); - return true; + const deleteElements = confirm('Do you want to remove the selected elements?'); + return deleteElements; }; const onDelete: OnDelete = ({ nodes, edges }) => console.log('on delete', nodes, edges); const onPaneMouseMove = (e: ReactMouseEvent) => console.log('pane move', e.clientX, e.clientY); diff --git a/examples/react/src/examples/Validation/index.tsx b/examples/react/src/examples/Validation/index.tsx index 3766ec1f..3e89b3f8 100644 --- a/examples/react/src/examples/Validation/index.tsx +++ b/examples/react/src/examples/Validation/index.tsx @@ -86,7 +86,7 @@ const ValidationFlow = () => { [setEdges] ); - const onBeforeDelete: OnBeforeDelete = useCallback(() => { + const onBeforeDelete: OnBeforeDelete = useCallback(async () => { return true; }, []); diff --git a/examples/svelte/src/routes/examples/overview/+page.svelte b/examples/svelte/src/routes/examples/overview/+page.svelte index 9b285782..44d54544 100644 --- a/examples/svelte/src/routes/examples/overview/+page.svelte +++ b/examples/svelte/src/routes/examples/overview/+page.svelte @@ -177,9 +177,10 @@ }} on:selectionclick={(event) => console.log('on selection click', event)} on:selectioncontextmenu={(event) => console.log('on selection contextmenu', event)} - onbeforedelete={({ nodes, edges }) => { + onbeforedelete={async ({ nodes, edges }) => { console.log('on before delete', nodes, edges); - return true; + const deleteElements = confirm('Are you sure you want to delete the selected elements?'); + return deleteElements; }} autoPanOnConnect autoPanOnNodeDrag diff --git a/packages/react/src/hooks/useReactFlow.ts b/packages/react/src/hooks/useReactFlow.ts index e8622bcc..eb07cc6a 100644 --- a/packages/react/src/hooks/useReactFlow.ts +++ b/packages/react/src/hooks/useReactFlow.ts @@ -118,7 +118,7 @@ export default function useReactFlow( - ({ nodes: nodesToRemove = [], edges: edgesToRemove = [], onBeforeDelete }) => { + async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [], onBeforeDelete }) => { const { nodes, edges, @@ -130,7 +130,7 @@ export default function useReactFlow; - export type DeleteElements = (params: DeleteElementsOptions) => { + export type DeleteElements = (params: DeleteElementsOptions) => Promise<{ deletedNodes: Node[]; deletedEdges: Edge[]; - }; + }>; export type GetIntersectingNodes = ( node: NodeType | { id: Node['id'] } | Rect, partially?: boolean, diff --git a/packages/svelte/src/lib/hooks/useSvelteFlow.ts b/packages/svelte/src/lib/hooks/useSvelteFlow.ts index f242a427..ec370dbf 100644 --- a/packages/svelte/src/lib/hooks/useSvelteFlow.ts +++ b/packages/svelte/src/lib/hooks/useSvelteFlow.ts @@ -51,7 +51,7 @@ export function useSvelteFlow(): { nodesToRemove?: (Node | { id: Node['id'] })[], edgesToRemove?: (Edge | { id: Edge['id'] })[], onBeforeDelete?: OnBeforeDelete - ) => { deletedNodes: Node[]; deletedEdges: Edge[] }; + ) => Promise<{ deletedNodes: Node[]; deletedEdges: Edge[] }>; screenToFlowPosition: (position: XYPosition) => XYPosition; flowToScreenPosition: (position: XYPosition) => XYPosition; viewport: Writable; @@ -201,12 +201,12 @@ export function useSvelteFlow(): { return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height; }, - deleteElements: ( + deleteElements: async ( nodesToRemove: (Node | { id: Node['id'] })[] = [], edgesToRemove: (Edge | { id: Edge['id'] })[] = [], onBeforeDelete?: OnBeforeDelete ) => { - const { nodes: matchingNodes, edges: matchingEdges } = getElementsToRemove({ + const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ nodesToRemove, edgesToRemove, nodes: get(nodes), diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 53515a42..75036a80 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -208,14 +208,14 @@ export function createStore({ } } - store.deleteKeyPressed.subscribe((deleteKeyPressed) => { + store.deleteKeyPressed.subscribe(async (deleteKeyPressed) => { if (deleteKeyPressed) { const nodes = get(store.nodes); const edges = get(store.edges); const selectedNodes = nodes.filter((node) => node.selected); const selectedEdges = edges.filter((edge) => edge.selected); - const { nodes: matchingNodes, edges: matchingEdges } = getElementsToRemove({ + const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ nodesToRemove: selectedNodes, edgesToRemove: selectedEdges, nodes, diff --git a/packages/system/src/types/general.ts b/packages/system/src/types/general.ts index 90b3c220..5fe4a844 100644 --- a/packages/system/src/types/general.ts +++ b/packages/system/src/types/general.ts @@ -148,4 +148,4 @@ export type OnBeforeDelete = boolean | { nodes: NodeType[]; edges: EdgeType[] }; +}) => Promise; diff --git a/packages/system/src/utils/graph.ts b/packages/system/src/utils/graph.ts index adfc2467..68024ce5 100644 --- a/packages/system/src/utils/graph.ts +++ b/packages/system/src/utils/graph.ts @@ -336,7 +336,7 @@ export function calcNextPosition( * @param param.onBeforeDelete - Callback to check which nodes and edges can be deleted * @returns nodes: nodes that can be deleted, edges: edges that can be deleted */ -export function getElementsToRemove({ +export async function getElementsToRemove({ nodesToRemove = [], edgesToRemove = [], nodes, @@ -348,10 +348,10 @@ export function getElementsToRemove { const nodeIds = nodesToRemove.map((node) => node.id); const matchingNodes: NodeType[] = []; @@ -388,7 +388,7 @@ export function getElementsToRemove