update group node function to reconnect edges when create groupNode
This commit is contained in:
parent
e93c512f37
commit
f591c480ce
3 changed files with 462 additions and 488 deletions
888
src/frontend/package-lock.json
generated
888
src/frontend/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -24,6 +24,7 @@ import {
|
||||||
generateNodeFromFlow,
|
generateNodeFromFlow,
|
||||||
getNodeId,
|
getNodeId,
|
||||||
isValidConnection,
|
isValidConnection,
|
||||||
|
reconnectEdges,
|
||||||
validateSelection,
|
validateSelection,
|
||||||
} from "../../../../utils/reactflowUtils";
|
} from "../../../../utils/reactflowUtils";
|
||||||
import { getRandomName, isWrappedWithClass } from "../../../../utils/utils";
|
import { getRandomName, isWrappedWithClass } from "../../../../utils/utils";
|
||||||
|
|
@ -379,16 +380,21 @@ export default function Page({
|
||||||
if (
|
if (
|
||||||
validateSelection(lastSelection!, edges).length === 0
|
validateSelection(lastSelection!, edges).length === 0
|
||||||
) {
|
) {
|
||||||
const { newFlow } = generateFlow(
|
const { newFlow, removedEdges } = generateFlow(
|
||||||
lastSelection!,
|
lastSelection!,
|
||||||
nodes,
|
nodes,
|
||||||
edges,
|
edges,
|
||||||
getRandomName()
|
getRandomName()
|
||||||
);
|
);
|
||||||
|
console.log("removed edges", removedEdges);
|
||||||
const newGroupNode = generateNodeFromFlow(
|
const newGroupNode = generateNodeFromFlow(
|
||||||
newFlow,
|
newFlow,
|
||||||
getNodeId
|
getNodeId
|
||||||
);
|
);
|
||||||
|
const newEdges = reconnectEdges(
|
||||||
|
newGroupNode,
|
||||||
|
removedEdges
|
||||||
|
);
|
||||||
setNodes((oldNodes) => [
|
setNodes((oldNodes) => [
|
||||||
...oldNodes.filter(
|
...oldNodes.filter(
|
||||||
(oldNodes) =>
|
(oldNodes) =>
|
||||||
|
|
@ -399,16 +405,17 @@ export default function Page({
|
||||||
),
|
),
|
||||||
newGroupNode,
|
newGroupNode,
|
||||||
]);
|
]);
|
||||||
setEdges((oldEdges) =>
|
setEdges((oldEdges) => [
|
||||||
oldEdges.filter(
|
...oldEdges.filter(
|
||||||
(oldEdge) =>
|
(oldEdge) =>
|
||||||
!lastSelection!.nodes.some(
|
!lastSelection!.nodes.some(
|
||||||
(selectionNode) =>
|
(selectionNode) =>
|
||||||
selectionNode.id === oldEdge.target ||
|
selectionNode.id === oldEdge.target ||
|
||||||
selectionNode.id === oldEdge.source
|
selectionNode.id === oldEdge.source
|
||||||
)
|
)
|
||||||
)
|
),
|
||||||
);
|
...newEdges,
|
||||||
|
]);
|
||||||
} else {
|
} else {
|
||||||
setErrorData({
|
setErrorData({
|
||||||
title: "Invalid selection",
|
title: "Invalid selection",
|
||||||
|
|
|
||||||
|
|
@ -600,8 +600,7 @@ export function generateFlow(
|
||||||
const newFlowData = { nodes, edges, viewport: { zoom: 1, x: 0, y: 0 } };
|
const newFlowData = { nodes, edges, viewport: { zoom: 1, x: 0, y: 0 } };
|
||||||
const uid = new ShortUniqueId({ length: 5 });
|
const uid = new ShortUniqueId({ length: 5 });
|
||||||
/* remove edges that are not connected to selected nodes on both ends
|
/* remove edges that are not connected to selected nodes on both ends
|
||||||
in future we can save this edges to when ungrouping reconect to the old nodes
|
*/
|
||||||
*/
|
|
||||||
newFlowData.edges = selection.edges.filter(
|
newFlowData.edges = selection.edges.filter(
|
||||||
(edge) =>
|
(edge) =>
|
||||||
selection.nodes.some((node) => node.id === edge.target) &&
|
selection.nodes.some((node) => node.id === edge.target) &&
|
||||||
|
|
@ -622,12 +621,50 @@ export function generateFlow(
|
||||||
// in the future we can use a better aproach using a set
|
// in the future we can use a better aproach using a set
|
||||||
return {
|
return {
|
||||||
newFlow,
|
newFlow,
|
||||||
removedEdges: selection.edges.filter(
|
removedEdges: edges.filter(
|
||||||
(edge) => !newFlowData.edges.includes(edge)
|
(edge) =>
|
||||||
|
(selection.nodes.some((node) => node.id === edge.target) ||
|
||||||
|
selection.nodes.some((node) => node.id === edge.source)) &&
|
||||||
|
newFlowData.edges.every((e) => e.id !== edge.id)
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function reconnectEdges(groupNode: NodeType, excludedEdges: Edge[]) {
|
||||||
|
console.log("excluded", excludedEdges);
|
||||||
|
let newEdges = cloneDeep(excludedEdges);
|
||||||
|
if (!groupNode.data.node!.flow) return [];
|
||||||
|
const { nodes, edges } = groupNode.data.node!.flow!.data!;
|
||||||
|
const lastNode = findLastNode(groupNode.data.node!.flow!.data!);
|
||||||
|
newEdges.forEach((edge) => {
|
||||||
|
if (lastNode && edge.source === lastNode.id) {
|
||||||
|
edge.source = groupNode.id;
|
||||||
|
let newSourceHandle: sourceHandleType = scapeJSONParse(
|
||||||
|
edge.sourceHandle!
|
||||||
|
);
|
||||||
|
newSourceHandle.id = groupNode.id;
|
||||||
|
edge.sourceHandle = scapedJSONStringfy(newSourceHandle);
|
||||||
|
edge.data.sourceHandle = newSourceHandle;
|
||||||
|
}
|
||||||
|
if (nodes.some((node) => node.id === edge.target)) {
|
||||||
|
const targetNode = nodes.find((node) => node.id === edge.target)!;
|
||||||
|
console.log("targetNode", targetNode);
|
||||||
|
const targetHandle: targetHandleType = scapeJSONParse(edge.targetHandle!);
|
||||||
|
console.log("targetHandle", targetHandle);
|
||||||
|
const proxy = { id: targetNode.id, field: targetHandle.fieldName };
|
||||||
|
let newTargetHandle: targetHandleType = cloneDeep(targetHandle);
|
||||||
|
newTargetHandle.id = groupNode.id;
|
||||||
|
newTargetHandle.proxy = proxy;
|
||||||
|
edge.target = groupNode.id;
|
||||||
|
newTargetHandle.fieldName = targetHandle.fieldName + "_" + targetNode.id;
|
||||||
|
edge.targetHandle = scapedJSONStringfy(newTargetHandle);
|
||||||
|
edge.data.targetHandle = newTargetHandle;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
console.log(newEdges);
|
||||||
|
return newEdges;
|
||||||
|
}
|
||||||
|
|
||||||
export function filterFlow(
|
export function filterFlow(
|
||||||
selection: OnSelectionChangeParams,
|
selection: OnSelectionChangeParams,
|
||||||
setNodes: (update: Node[] | ((oldState: Node[]) => Node[])) => void,
|
setNodes: (update: Node[] | ((oldState: Node[]) => Node[])) => void,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue