fix(GenericNode): import XYPosition from reactflow to fix type error
feat(GenericNode): add position prop to GenericNode component to pass the position of the node fix(nodeToolbarComponent): import updateFlowPosition from reactflowUtils to fix reference error feat(nodeToolbarComponent): add position prop to NodeToolbarComponent to pass the position of the node fix(components): import XYPosition from reactflow to fix type error feat(components): add position prop to nodeToolbarPropsType to pass the position of the node feat(reactflowUtils): add expandGroupNode function to expand a group node and update the flow
This commit is contained in:
parent
7de65ed709
commit
04f2941a7d
4 changed files with 90 additions and 3 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
import { cloneDeep } from "lodash";
|
import { cloneDeep } from "lodash";
|
||||||
import { useContext, useEffect, useState } from "react";
|
import { useContext, useEffect, useState } from "react";
|
||||||
import { NodeToolbar, useUpdateNodeInternals } from "reactflow";
|
import { NodeToolbar, XYPosition, useUpdateNodeInternals } from "reactflow";
|
||||||
import ShadTooltip from "../../components/ShadTooltipComponent";
|
import ShadTooltip from "../../components/ShadTooltipComponent";
|
||||||
import Tooltip from "../../components/TooltipComponent";
|
import Tooltip from "../../components/TooltipComponent";
|
||||||
import IconComponent from "../../components/genericIconComponent";
|
import IconComponent from "../../components/genericIconComponent";
|
||||||
|
|
@ -17,10 +17,12 @@ import ParameterComponent from "./components/parameterComponent";
|
||||||
|
|
||||||
export default function GenericNode({
|
export default function GenericNode({
|
||||||
data: olddata,
|
data: olddata,
|
||||||
|
position,
|
||||||
selected,
|
selected,
|
||||||
}: {
|
}: {
|
||||||
data: NodeDataType;
|
data: NodeDataType;
|
||||||
selected: boolean;
|
selected: boolean;
|
||||||
|
position: XYPosition;
|
||||||
}): JSX.Element {
|
}): JSX.Element {
|
||||||
const [data, setData] = useState(olddata);
|
const [data, setData] = useState(olddata);
|
||||||
const { updateFlow, flows, tabId } = useContext(TabsContext);
|
const { updateFlow, flows, tabId } = useContext(TabsContext);
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,13 @@ import { TabsContext } from "../../../../contexts/tabsContext";
|
||||||
import EditNodeModal from "../../../../modals/EditNodeModal";
|
import EditNodeModal from "../../../../modals/EditNodeModal";
|
||||||
import { nodeToolbarPropsType } from "../../../../types/components";
|
import { nodeToolbarPropsType } from "../../../../types/components";
|
||||||
import { classNames } from "../../../../utils/utils";
|
import { classNames } from "../../../../utils/utils";
|
||||||
import { ungroupNode } from "../../../../utils/reactflowUtils";
|
import { ungroupNode, updateFlowPosition } from "../../../../utils/reactflowUtils";
|
||||||
|
|
||||||
export default function NodeToolbarComponent({
|
export default function NodeToolbarComponent({
|
||||||
data,
|
data,
|
||||||
setData,
|
setData,
|
||||||
deleteNode,
|
deleteNode,
|
||||||
|
position,
|
||||||
}: nodeToolbarPropsType): JSX.Element {
|
}: nodeToolbarPropsType): JSX.Element {
|
||||||
const [nodeLength, setNodeLength] = useState(
|
const [nodeLength, setNodeLength] = useState(
|
||||||
Object.keys(data.node!.template).filter(
|
Object.keys(data.node!.template).filter(
|
||||||
|
|
@ -127,6 +128,7 @@ export default function NodeToolbarComponent({
|
||||||
)}
|
)}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
updateFlowPosition(position,data.node?.flow!)
|
||||||
ungroupNode(data, { edges: reactFlowInstance.getEdges(),
|
ungroupNode(data, { edges: reactFlowInstance.getEdges(),
|
||||||
nodes: reactFlowInstance.getNodes(),
|
nodes: reactFlowInstance.getNodes(),
|
||||||
viewport: reactFlowInstance.getViewport() })
|
viewport: reactFlowInstance.getViewport() })
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { ReactElement, ReactNode } from "react";
|
import { ReactElement, ReactNode } from "react";
|
||||||
import { ReactFlowJsonObject } from "reactflow";
|
import { ReactFlowJsonObject, XYPosition } from "reactflow";
|
||||||
import { APIClassType, APITemplateType, TemplateVariableType } from "../api";
|
import { APIClassType, APITemplateType, TemplateVariableType } from "../api";
|
||||||
import { ChatMessageType } from "../chat";
|
import { ChatMessageType } from "../chat";
|
||||||
import { FlowStyleType, FlowType, NodeDataType, NodeType } from "../flow/index";
|
import { FlowStyleType, FlowType, NodeDataType, NodeType } from "../flow/index";
|
||||||
|
|
@ -389,6 +389,7 @@ export type nodeToolbarPropsType = {
|
||||||
data: NodeDataType;
|
data: NodeDataType;
|
||||||
deleteNode: (idx: string) => void;
|
deleteNode: (idx: string) => void;
|
||||||
setData: (newState: NodeDataType) => void;
|
setData: (newState: NodeDataType) => void;
|
||||||
|
position:XYPosition;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type parsedDataType = {
|
export type parsedDataType = {
|
||||||
|
|
|
||||||
|
|
@ -779,6 +779,88 @@ export function ungroupNode(
|
||||||
BaseFlow.edges = edges;
|
BaseFlow.edges = edges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function expandGroupNode(
|
||||||
|
groupNode: NodeDataType,
|
||||||
|
ReactFlowInstance: ReactFlowInstance,
|
||||||
|
) {
|
||||||
|
const {template} = groupNode.node
|
||||||
|
const {flow} = groupNode.node;
|
||||||
|
const gNodes = _.cloneDeep(flow.data.nodes);
|
||||||
|
const gEdges = flow.data.edges;
|
||||||
|
//redirect edges to correct proxy node
|
||||||
|
let updatedEdges: Edge[] = [];
|
||||||
|
ReactFlowInstance.getEdges().forEach((edge) => {
|
||||||
|
let newEdge = _.cloneDeep(edge);
|
||||||
|
if (newEdge.target === groupNode.id) {
|
||||||
|
if (newEdge.targetHandle.split("|").length > 3) {
|
||||||
|
let type = newEdge.targetHandle.split("|")[0];
|
||||||
|
let field = newEdge.targetHandle.split("|")[4];
|
||||||
|
let proxy = newEdge.targetHandle.split("|")[3];
|
||||||
|
let node = gNodes.find((n) => n.id === proxy);
|
||||||
|
console.log(node);
|
||||||
|
if (node) {
|
||||||
|
newEdge.target = proxy;
|
||||||
|
if (node.type === "groupNode") {
|
||||||
|
newEdge.targetHandle =
|
||||||
|
type +
|
||||||
|
"|" +
|
||||||
|
field +
|
||||||
|
"|" +
|
||||||
|
proxy +
|
||||||
|
"|" +
|
||||||
|
node.data.node.template[field].proxy.id +
|
||||||
|
"|" +
|
||||||
|
node.data.node.template[field].proxy.field;
|
||||||
|
} else {
|
||||||
|
newEdge.targetHandle = type + "|" + field + "|" + proxy;
|
||||||
|
}
|
||||||
|
updatedEdges.push(newEdge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newEdge.source === groupNode.id) {
|
||||||
|
const lastNode = _.cloneDeep(findLastNode(flow.data));
|
||||||
|
newEdge.source = lastNode.id;
|
||||||
|
let sourceHandle = newEdge.sourceHandle.split("|");
|
||||||
|
sourceHandle[1] = lastNode.id;
|
||||||
|
newEdge.sourceHandle = sourceHandle.join("|");
|
||||||
|
updatedEdges.push(newEdge);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.keys(template).forEach((key) => {
|
||||||
|
let { field, id } = template[key].proxy;
|
||||||
|
let nodeIndex = gNodes.findIndex((n) => n.id === id);
|
||||||
|
if (nodeIndex !== -1) {
|
||||||
|
let display_name: string;
|
||||||
|
let show = gNodes[nodeIndex].data.node.template[field].show;
|
||||||
|
let advanced = gNodes[nodeIndex].data.node.template[field].advanced;
|
||||||
|
if (gNodes[nodeIndex].data.node.template[field].display_name) {
|
||||||
|
display_name = gNodes[nodeIndex].data.node.template[field].display_name;
|
||||||
|
} else {
|
||||||
|
display_name = gNodes[nodeIndex].data.node.template[field].name;
|
||||||
|
}
|
||||||
|
gNodes[nodeIndex].data.node.template[field] = template[key];
|
||||||
|
gNodes[nodeIndex].data.node.template[field].show = show;
|
||||||
|
gNodes[nodeIndex].data.node.template[field].advanced = advanced;
|
||||||
|
gNodes[nodeIndex].data.node.template[field].display_name = display_name;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const nodes = [
|
||||||
|
...ReactFlowInstance.getNodes().filter((n) => n.id !== groupNode.id),
|
||||||
|
...gNodes,
|
||||||
|
];
|
||||||
|
const edges = [
|
||||||
|
...ReactFlowInstance.getEdges().filter(
|
||||||
|
(e) => e.target !== groupNode.id && e.source !== groupNode.id
|
||||||
|
),
|
||||||
|
...gEdges,
|
||||||
|
...updatedEdges,
|
||||||
|
];
|
||||||
|
ReactFlowInstance.setNodes(nodes);
|
||||||
|
ReactFlowInstance.setEdges(edges);
|
||||||
|
}
|
||||||
export function processFLow(FlowObject: ReactFlowJsonObject) {
|
export function processFLow(FlowObject: ReactFlowJsonObject) {
|
||||||
let clonedFLow = _.cloneDeep(FlowObject);
|
let clonedFLow = _.cloneDeep(FlowObject);
|
||||||
clonedFLow.nodes.forEach((node: NodeType) => {
|
clonedFLow.nodes.forEach((node: NodeType) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue