mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? feat: remove dagre and elkjs #918 ### Type of change - [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
@ -1,35 +0,0 @@
|
||||
import { useCallback, useLayoutEffect } from 'react';
|
||||
import { getLayoutedElements } from './elk-utils';
|
||||
|
||||
export const elkOptions = {
|
||||
'elk.algorithm': 'layered',
|
||||
'elk.layered.spacing.nodeNodeBetweenLayers': '100',
|
||||
'elk.spacing.nodeNode': '80',
|
||||
};
|
||||
|
||||
export const useLayoutGraph = (
|
||||
initialNodes,
|
||||
initialEdges,
|
||||
setNodes,
|
||||
setEdges,
|
||||
) => {
|
||||
const onLayout = useCallback(({ direction, useInitialNodes = false }) => {
|
||||
const opts = { 'elk.direction': direction, ...elkOptions };
|
||||
const ns = initialNodes;
|
||||
const es = initialEdges;
|
||||
|
||||
getLayoutedElements(ns, es, opts).then(
|
||||
({ nodes: layoutedNodes, edges: layoutedEdges }) => {
|
||||
setNodes(layoutedNodes);
|
||||
setEdges(layoutedEdges);
|
||||
|
||||
// window.requestAnimationFrame(() => fitView());
|
||||
},
|
||||
);
|
||||
}, []);
|
||||
|
||||
// Calculate the initial layout on mount.
|
||||
useLayoutEffect(() => {
|
||||
onLayout({ direction: 'RIGHT', useInitialNodes: true });
|
||||
}, [onLayout]);
|
||||
};
|
||||
@ -1,42 +0,0 @@
|
||||
import ELK from 'elkjs/lib/elk.bundled.js';
|
||||
import { Edge, Node } from 'reactflow';
|
||||
|
||||
const elk = new ELK();
|
||||
|
||||
export const getLayoutedElements = (
|
||||
nodes: Node[],
|
||||
edges: Edge[],
|
||||
options = {},
|
||||
) => {
|
||||
const isHorizontal = options?.['elk.direction'] === 'RIGHT';
|
||||
const graph = {
|
||||
id: 'root',
|
||||
layoutOptions: options,
|
||||
children: nodes.map((node) => ({
|
||||
...node,
|
||||
// Adjust the target and source handle positions based on the layout
|
||||
// direction.
|
||||
targetPosition: isHorizontal ? 'left' : 'top',
|
||||
sourcePosition: isHorizontal ? 'right' : 'bottom',
|
||||
|
||||
// Hardcode a width and height for elk to use when layouting.
|
||||
width: 150,
|
||||
height: 50,
|
||||
})),
|
||||
edges: edges,
|
||||
};
|
||||
|
||||
return elk
|
||||
.layout(graph)
|
||||
.then((layoutedGraph) => ({
|
||||
nodes: layoutedGraph.children.map((node) => ({
|
||||
...node,
|
||||
// React Flow expects a position property on the node instead of `x`
|
||||
// and `y` fields.
|
||||
position: { x: node.x, y: node.y },
|
||||
})),
|
||||
|
||||
edges: layoutedGraph.edges,
|
||||
}))
|
||||
.catch(console.error);
|
||||
};
|
||||
@ -1,6 +1,5 @@
|
||||
import { DSLComponents } from '@/interfaces/database/flow';
|
||||
import { removeUselessFieldsFromValues } from '@/utils/form';
|
||||
import dagre from 'dagre';
|
||||
import { humanId } from 'human-id';
|
||||
import { curry, sample } from 'lodash';
|
||||
import pipe from 'lodash/fp/pipe';
|
||||
@ -80,48 +79,6 @@ export const buildNodesAndEdgesFromDSLComponents = (data: DSLComponents) => {
|
||||
return { nodes, edges };
|
||||
};
|
||||
|
||||
const dagreGraph = new dagre.graphlib.Graph();
|
||||
dagreGraph.setDefaultEdgeLabel(() => ({}));
|
||||
|
||||
const nodeWidth = 172;
|
||||
const nodeHeight = 36;
|
||||
|
||||
export const getLayoutedElements = (
|
||||
nodes: Node[],
|
||||
edges: Edge[],
|
||||
direction = 'TB',
|
||||
) => {
|
||||
const isHorizontal = direction === 'LR';
|
||||
dagreGraph.setGraph({ rankdir: direction });
|
||||
|
||||
nodes.forEach((node) => {
|
||||
dagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });
|
||||
});
|
||||
|
||||
edges.forEach((edge) => {
|
||||
dagreGraph.setEdge(edge.source, edge.target);
|
||||
});
|
||||
|
||||
dagre.layout(dagreGraph);
|
||||
|
||||
nodes.forEach((node) => {
|
||||
const nodeWithPosition = dagreGraph.node(node.id);
|
||||
node.targetPosition = isHorizontal ? Position.Left : Position.Top;
|
||||
node.sourcePosition = isHorizontal ? Position.Right : Position.Bottom;
|
||||
|
||||
// We are shifting the dagre node position (anchor=center center) to the top left
|
||||
// so it matches the React Flow node anchor point (top left).
|
||||
node.position = {
|
||||
x: nodeWithPosition.x - nodeWidth / 2,
|
||||
y: nodeWithPosition.y - nodeHeight / 2,
|
||||
};
|
||||
|
||||
return node;
|
||||
});
|
||||
|
||||
return { nodes, edges };
|
||||
};
|
||||
|
||||
const buildComponentDownstreamOrUpstream = (
|
||||
edges: Edge[],
|
||||
nodeId: string,
|
||||
|
||||
Reference in New Issue
Block a user