feat(react, svelte) added getIncomers & getOutgoers to use...Flow()
This commit is contained in:
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user