feat(react, svelte) added getIncomers & getOutgoers to use...Flow()

This commit is contained in:
Peter
2023-10-05 13:28:04 +02:00
parent 1b0790e79f
commit 6fd9d19797
4 changed files with 64 additions and 6 deletions
+34 -2
View File
@@ -1,5 +1,13 @@
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { getElementsToRemove, getOverlappingArea, isRectObject, nodeToRect, type Rect } from '@xyflow/system'; import {
getElementsToRemove,
getIncomersBase,
getOutgoersBase,
getOverlappingArea,
isRectObject,
nodeToRect,
type Rect,
} from '@xyflow/system';
import useViewportHelper from './useViewportHelper'; import useViewportHelper from './useViewportHelper';
import { useStoreApi } from '../hooks/useStore'; import { useStoreApi } from '../hooks/useStore';
@@ -224,7 +232,7 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
); );
const getConnectedEdges = useCallback<Instance.getConnectedEdges>((node) => { const getConnectedEdges = useCallback<Instance.getConnectedEdges>((node) => {
const edges = store.getState().edges; const { edges } = store.getState();
const nodeIds = new Set(); const nodeIds = new Set();
if (typeof node === 'string') { if (typeof node === 'string') {
@@ -238,6 +246,26 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target)); return edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target));
}, []); }, []);
const getIncomers = useCallback<Instance.getIncomers>((node) => {
const { nodes, edges } = store.getState();
if (typeof node === 'string') {
return getIncomersBase({ id: node }, nodes, edges);
}
return getIncomersBase(node, nodes, edges);
}, []);
const getOutgoers = useCallback<Instance.getOutgoers>((node) => {
const { nodes, edges } = store.getState();
if (typeof node == 'string') {
return getOutgoersBase({ id: node }, nodes, edges);
}
return getOutgoersBase(node, nodes, edges);
}, []);
return useMemo(() => { return useMemo(() => {
return { return {
...viewportHelper, ...viewportHelper,
@@ -254,6 +282,8 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
getIntersectingNodes, getIntersectingNodes,
isNodeIntersecting, isNodeIntersecting,
getConnectedEdges, getConnectedEdges,
getIncomers,
getOutgoers,
}; };
}, [ }, [
viewportHelper, viewportHelper,
@@ -270,5 +300,7 @@ export default function useReactFlow<NodeData = any, EdgeData = any>(): ReactFlo
getIntersectingNodes, getIntersectingNodes,
isNodeIntersecting, isNodeIntersecting,
getConnectedEdges, getConnectedEdges,
getIncomers,
getOutgoers,
]); ]);
} }
+2
View File
@@ -40,6 +40,8 @@ export namespace Instance {
partially?: boolean partially?: boolean
) => boolean; ) => boolean;
export type getConnectedEdges = (id: string | (Partial<Node> & { id: Node['id'] })[]) => Edge[]; export type getConnectedEdges = (id: string | (Partial<Node> & { id: Node['id'] })[]) => Edge[];
export type getIncomers = (node: string | (Partial<Node> & { id: Node['id'] })) => Node[];
export type getOutgoers = (node: string | (Partial<Node> & { id: Node['id'] })) => Node[];
} }
export type ReactFlowInstance<NodeData = any, EdgeData = any> = { export type ReactFlowInstance<NodeData = any, EdgeData = any> = {
@@ -1,5 +1,7 @@
import { get, type Writable } from 'svelte/store'; import { get, type Writable } from 'svelte/store';
import { import {
getIncomersBase,
getOutgoersBase,
pointToRendererPoint, pointToRendererPoint,
type Project, type Project,
type SetCenterOptions, type SetCenterOptions,
@@ -27,6 +29,8 @@ export function useSvelteFlow(): {
nodes: SvelteFlowStore['nodes']; nodes: SvelteFlowStore['nodes'];
edges: SvelteFlowStore['edges']; edges: SvelteFlowStore['edges'];
getConnectedEdges: (id: string | (Partial<Node> & { id: Node['id'] })[]) => Edge[]; getConnectedEdges: (id: string | (Partial<Node> & { id: Node['id'] })[]) => Edge[];
getIncomers: (node: string | (Partial<Node> & { id: Node['id'] })) => Node[];
getOutgoers: (node: string | (Partial<Node> & { id: Node['id'] })) => Node[];
} { } {
const { const {
zoomIn, zoomIn,
@@ -101,6 +105,26 @@ export function useSvelteFlow(): {
return _edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target)); return _edges.filter((edge) => nodeIds.has(edge.source) || nodeIds.has(edge.target));
}, },
getIncomers: (node) => {
const _edges = get(edges);
const _nodes = get(nodes);
if (typeof node === 'string') {
return getIncomersBase({ id: node }, _nodes, _edges);
}
return getIncomersBase(node, _nodes, _edges);
},
getOutgoers: (node) => {
const _edges = get(edges);
const _nodes = get(nodes);
if (typeof node == 'string') {
return getOutgoersBase({ id: node }, _nodes, _edges);
}
return getOutgoersBase(node, _nodes, _edges);
},
viewport: viewport viewport: viewport
}; };
} }
+4 -4
View File
@@ -35,11 +35,11 @@ export const isNodeBase = <NodeType extends NodeBase = NodeBase, EdgeType extend
): element is NodeType => 'id' in element && !('source' in element) && !('target' in element); ): element is NodeType => 'id' in element && !('source' in element) && !('target' in element);
export const getOutgoersBase = <NodeType extends NodeBase = NodeBase, EdgeType extends EdgeBase = EdgeBase>( export const getOutgoersBase = <NodeType extends NodeBase = NodeBase, EdgeType extends EdgeBase = EdgeBase>(
node: NodeType, node: Partial<NodeType> & { id: string },
nodes: NodeType[], nodes: NodeType[],
edges: EdgeType[] edges: EdgeType[]
): NodeType[] => { ): NodeType[] => {
if (!isNodeBase(node)) { if (!node.id) {
return []; return [];
} }
@@ -54,11 +54,11 @@ export const getOutgoersBase = <NodeType extends NodeBase = NodeBase, EdgeType e
}; };
export const getIncomersBase = <NodeType extends NodeBase = NodeBase, EdgeType extends EdgeBase = EdgeBase>( export const getIncomersBase = <NodeType extends NodeBase = NodeBase, EdgeType extends EdgeBase = EdgeBase>(
node: NodeType, node: Partial<NodeType> & { id: string },
nodes: NodeType[], nodes: NodeType[],
edges: EdgeType[] edges: EdgeType[]
): NodeType[] => { ): NodeType[] => {
if (!isNodeBase(node)) { if (!node.id) {
return []; return [];
} }
const incomersIds = new Set(); const incomersIds = new Set();