refactor(deleteElements): use onbeforedelete from store

This commit is contained in:
moklick
2024-01-11 11:19:23 +01:00
parent a35428d8a0
commit 08c6ed4a06
7 changed files with 43 additions and 20 deletions
@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { useNodes, useSvelteFlow } from '@xyflow/svelte'; import { useEdges, useNodes, useSvelteFlow } from '@xyflow/svelte';
const { const {
zoomIn, zoomIn,
@@ -10,10 +10,12 @@
setViewport, setViewport,
getViewport, getViewport,
viewport, viewport,
toObject toObject,
deleteElements
} = useSvelteFlow(); } = useSvelteFlow();
const nodes = useNodes(); const nodes = useNodes();
const edges = useEdges();
</script> </script>
<aside> <aside>
@@ -25,6 +27,14 @@
<button on:click={() => setCenter(0, 0)}>setCenter 0, 0</button> <button on:click={() => setCenter(0, 0)}>setCenter 0, 0</button>
<button on:click={() => setViewport({ x: 100, y: 100, zoom: 2 })}>setViewport</button> <button on:click={() => setViewport({ x: 100, y: 100, zoom: 2 })}>setViewport</button>
<button on:click={() => console.log(getViewport())}>getViewport</button> <button on:click={() => console.log(getViewport())}>getViewport</button>
<button on:click={() => deleteElements({ edges: $edges.map((edge) => ({ id: edge.id })) })}
>delete edges</button
>
<button on:click={() => deleteElements({ nodes: [{ id: $nodes[0].id }] })}>delete node</button>
<button on:click={() => deleteElements({ nodes: $nodes.map((node) => ({ id: node.id })) })}
>deleteElements</button
>
<button <button
on:click={() => { on:click={() => {
const { nodes, edges, viewport } = toObject(); const { nodes, edges, viewport } = toObject();
+6
View File
@@ -1,5 +1,11 @@
# @xyflow/react # @xyflow/react
## 12.0.0-next.6
### Minor changes
- fix `deleteElements`
## 12.0.0-next.5 ## 12.0.0-next.5
### Minor changes ### Minor changes
@@ -30,8 +30,8 @@ export function useGlobalKeyHandler({
useEffect(() => { useEffect(() => {
if (deleteKeyPressed) { if (deleteKeyPressed) {
const { edges, nodes, onBeforeDelete } = store.getState(); const { edges, nodes } = store.getState();
deleteElements({ nodes: nodes.filter(selected), edges: edges.filter(selected), onBeforeDelete }); deleteElements({ nodes: nodes.filter(selected), edges: edges.filter(selected) });
store.setState({ nodesSelectionActive: false }); store.setState({ nodesSelectionActive: false });
} }
}, [deleteKeyPressed]); }, [deleteKeyPressed]);
+2 -1
View File
@@ -118,7 +118,7 @@ export function useReactFlow<NodeType extends Node = Node, EdgeType extends Edge
}, []); }, []);
const deleteElements = useCallback<Instance.DeleteElements>( const deleteElements = useCallback<Instance.DeleteElements>(
async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [], onBeforeDelete }) => { async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [] }) => {
const { const {
nodes, nodes,
edges, edges,
@@ -129,6 +129,7 @@ export function useReactFlow<NodeType extends Node = Node, EdgeType extends Edge
onNodesChange, onNodesChange,
onEdgesChange, onEdgesChange,
onDelete, onDelete,
onBeforeDelete,
} = store.getState(); } = store.getState();
const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({
nodesToRemove, nodesToRemove,
+1 -2
View File
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-namespace */ /* eslint-disable @typescript-eslint/no-namespace */
import type { OnBeforeDelete, Rect, Viewport } from '@xyflow/system'; import type { Rect, Viewport } from '@xyflow/system';
import type { Node, Edge, ViewportHelperFunctions } from '.'; import type { Node, Edge, ViewportHelperFunctions } from '.';
export type ReactFlowJsonObject<NodeType extends Node = Node, EdgeType extends Edge = Edge> = { export type ReactFlowJsonObject<NodeType extends Node = Node, EdgeType extends Edge = Edge> = {
@@ -12,7 +12,6 @@ export type ReactFlowJsonObject<NodeType extends Node = Node, EdgeType extends E
export type DeleteElementsOptions = { export type DeleteElementsOptions = {
nodes?: (Node | { id: Node['id'] })[]; nodes?: (Node | { id: Node['id'] })[];
edges?: (Edge | { id: Edge['id'] })[]; edges?: (Edge | { id: Edge['id'] })[];
onBeforeDelete?: OnBeforeDelete;
}; };
export namespace Instance { export namespace Instance {
+10
View File
@@ -1,5 +1,15 @@
# @xyflow/svelte # @xyflow/svelte
## 0.0.33
### Bugfix
- fix `deleteElements`
### ⚠️ Breaking
- `deleteElements` function now takes one object as an argument `{ nodes: [], edges: [] }` instead of two `(nodes, edges)`
## 0.0.32 ## 0.0.32
### Features ### Features
+10 -13
View File
@@ -13,8 +13,7 @@ import {
type Rect, type Rect,
getViewportForBounds, getViewportForBounds,
getElementsToRemove, getElementsToRemove,
rendererPointToPoint, rendererPointToPoint
type OnBeforeDelete
} from '@xyflow/system'; } from '@xyflow/system';
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
@@ -47,11 +46,13 @@ export function useSvelteFlow(): {
partially?: boolean partially?: boolean
) => boolean; ) => boolean;
fitBounds: (bounds: Rect, options?: FitBoundsOptions) => void; fitBounds: (bounds: Rect, options?: FitBoundsOptions) => void;
deleteElements: ( deleteElements: ({
nodesToRemove?: (Node | { id: Node['id'] })[], nodes,
edgesToRemove?: (Edge | { id: Edge['id'] })[], edges
onBeforeDelete?: OnBeforeDelete }: {
) => Promise<{ deletedNodes: Node[]; deletedEdges: Edge[] }>; nodes?: (Node | { id: Node['id'] })[];
edges?: (Edge | { id: Edge['id'] })[];
}) => Promise<{ deletedNodes: Node[]; deletedEdges: Edge[] }>;
screenToFlowPosition: (position: XYPosition) => XYPosition; screenToFlowPosition: (position: XYPosition) => XYPosition;
flowToScreenPosition: (position: XYPosition) => XYPosition; flowToScreenPosition: (position: XYPosition) => XYPosition;
viewport: Writable<Viewport>; viewport: Writable<Viewport>;
@@ -201,17 +202,13 @@ export function useSvelteFlow(): {
return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height; return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height;
}, },
deleteElements: async ( deleteElements: async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [] }) => {
nodesToRemove: (Node | { id: Node['id'] })[] = [],
edgesToRemove: (Edge | { id: Edge['id'] })[] = [],
onBeforeDelete?: OnBeforeDelete
) => {
const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({
nodesToRemove, nodesToRemove,
edgesToRemove, edgesToRemove,
nodes: get(nodes), nodes: get(nodes),
edges: get(edges), edges: get(edges),
onBeforeDelete onBeforeDelete: get(onbeforedelete)
}); });
if (matchingNodes) { if (matchingNodes) {