Fix handleNodeClass and handleOnNewValue to use interceptor saving, added cleanEdges on interceptor
This commit is contained in:
parent
319e70863a
commit
6e2673e1d5
6 changed files with 108 additions and 100 deletions
|
|
@ -35,7 +35,6 @@ import { APIClassType } from "../../../../types/api";
|
||||||
import { ParameterComponentType } from "../../../../types/components";
|
import { ParameterComponentType } from "../../../../types/components";
|
||||||
import { NodeDataType } from "../../../../types/flow";
|
import { NodeDataType } from "../../../../types/flow";
|
||||||
import {
|
import {
|
||||||
cleanEdges,
|
|
||||||
convertObjToArray,
|
convertObjToArray,
|
||||||
convertValuesToNumbers,
|
convertValuesToNumbers,
|
||||||
hasDuplicateKeys,
|
hasDuplicateKeys,
|
||||||
|
|
@ -71,8 +70,15 @@ export default function ParameterComponent({
|
||||||
const { setErrorData, modalContextOpen } = useContext(alertContext);
|
const { setErrorData, modalContextOpen } = useContext(alertContext);
|
||||||
const updateNodeInternals = useUpdateNodeInternals();
|
const updateNodeInternals = useUpdateNodeInternals();
|
||||||
const [position, setPosition] = useState(0);
|
const [position, setPosition] = useState(0);
|
||||||
const { setTabsState, tabId, flows, tabsState, updateFlow, nodes, edges, setEdges } =
|
const {
|
||||||
useContext(FlowsContext);
|
tabId,
|
||||||
|
flows,
|
||||||
|
updateFlow,
|
||||||
|
nodes,
|
||||||
|
edges,
|
||||||
|
setEdges,
|
||||||
|
setNode,
|
||||||
|
} = useContext(FlowsContext);
|
||||||
|
|
||||||
const [dataRef, setDataRef] = useState(data);
|
const [dataRef, setDataRef] = useState(data);
|
||||||
|
|
||||||
|
|
@ -98,11 +104,9 @@ export default function ParameterComponent({
|
||||||
|
|
||||||
const { setFilterEdge } = useContext(typesContext);
|
const { setFilterEdge } = useContext(typesContext);
|
||||||
let disabled =
|
let disabled =
|
||||||
edges
|
edges.some(
|
||||||
.some(
|
|
||||||
(edge) =>
|
(edge) =>
|
||||||
edge.targetHandle ===
|
edge.targetHandle === scapedJSONStringfy(proxy ? { ...id, proxy } : id)
|
||||||
scapedJSONStringfy(proxy ? { ...id, proxy } : id)
|
|
||||||
) ?? false;
|
) ?? false;
|
||||||
|
|
||||||
const { data: myData } = useContext(typesContext);
|
const { data: myData } = useContext(typesContext);
|
||||||
|
|
@ -132,8 +136,18 @@ export default function ParameterComponent({
|
||||||
if (data.node!.template[name].value !== newValue) {
|
if (data.node!.template[name].value !== newValue) {
|
||||||
takeSnapshot();
|
takeSnapshot();
|
||||||
}
|
}
|
||||||
data.node!.template[name].value = newValue;
|
|
||||||
updateNodeInternals(data.id);
|
setNode(data.id, (oldNode) => {
|
||||||
|
let newNode = cloneDeep(oldNode);
|
||||||
|
|
||||||
|
newNode.data = {
|
||||||
|
...newNode.data
|
||||||
|
}
|
||||||
|
|
||||||
|
newNode.data.node.template[name].value = newValue;
|
||||||
|
|
||||||
|
return newNode;
|
||||||
|
});
|
||||||
|
|
||||||
setDataRef((old) => {
|
setDataRef((old) => {
|
||||||
let newData = cloneDeep(old);
|
let newData = cloneDeep(old);
|
||||||
|
|
@ -141,59 +155,31 @@ export default function ParameterComponent({
|
||||||
return newData;
|
return newData;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set state to pending
|
|
||||||
//@ts-ignore
|
|
||||||
if (data.node!.template[name].value !== newValue) {
|
|
||||||
const tabs = cloneDeep(tabsState);
|
|
||||||
tabs[tabId].isPending = false;
|
|
||||||
tabs[tabId].formKeysData = tabsState[tabId].formKeysData;
|
|
||||||
setTabsState({
|
|
||||||
...tabs,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
renderTooltips();
|
renderTooltips();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => {
|
const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => {
|
||||||
if (!data.node) return;
|
if (!data.node) return;
|
||||||
if (data.node!.template[name].value !== newNodeClass.template[name].value) {
|
if (data.node!.template[name].value !== code) {
|
||||||
takeSnapshot();
|
takeSnapshot();
|
||||||
}
|
}
|
||||||
data.node! = {
|
|
||||||
...newNodeClass,
|
setNode(data.id, (oldNode) => {
|
||||||
|
let newNode = cloneDeep(oldNode);
|
||||||
|
|
||||||
|
newNode.data = {
|
||||||
|
...newNode.data,
|
||||||
|
node: newNodeClass,
|
||||||
description: newNodeClass.description ?? data.node!.description,
|
description: newNodeClass.description ?? data.node!.description,
|
||||||
display_name: newNodeClass.display_name ?? data.node!.display_name,
|
display_name: newNodeClass.display_name ?? data.node!.display_name,
|
||||||
};
|
};
|
||||||
data.node!.template[name].value = code;
|
|
||||||
updateNodeInternals(data.id);
|
newNode.data.node.template[name].value = code;
|
||||||
// Set state to pending
|
|
||||||
//@ts-ignore
|
return newNode;
|
||||||
if (data.node!.template[name].value !== code) {
|
|
||||||
const tabs = cloneDeep(tabsState);
|
|
||||||
tabs[tabId].isPending = false;
|
|
||||||
tabs[tabId].formKeysData = tabsState[tabId].formKeysData;
|
|
||||||
setTabsState({
|
|
||||||
...tabs,
|
|
||||||
});
|
});
|
||||||
}
|
|
||||||
renderTooltips();
|
renderTooltips();
|
||||||
let flow = flows.find((flow) => flow.id === tabId);
|
|
||||||
setTimeout(() => {
|
|
||||||
//timeout necessary because ReactFlow updates are not async
|
|
||||||
if (flow && flow.data) {
|
|
||||||
cleanEdges({
|
|
||||||
flow: {
|
|
||||||
edges: flow.data!.edges,
|
|
||||||
nodes: flow.data!.nodes,
|
|
||||||
},
|
|
||||||
updateEdge: (edge) => {
|
|
||||||
setEdges(edge);
|
|
||||||
updateNodeInternals(data.id);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
updateFlow(flow);
|
|
||||||
}
|
|
||||||
}, 50);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const [errorDuplicateKey, setErrorDuplicateKey] = useState(false);
|
const [errorDuplicateKey, setErrorDuplicateKey] = useState(false);
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ import { FlowsContextType, FlowsState } from "../types/tabs";
|
||||||
import {
|
import {
|
||||||
addVersionToDuplicates,
|
addVersionToDuplicates,
|
||||||
checkOldEdgesHandles,
|
checkOldEdgesHandles,
|
||||||
|
cleanEdges,
|
||||||
createFlowComponent,
|
createFlowComponent,
|
||||||
removeFileNameFromComponents,
|
removeFileNameFromComponents,
|
||||||
scapeJSONParse,
|
scapeJSONParse,
|
||||||
|
|
@ -85,6 +86,8 @@ const FlowsContextInitialValue: FlowsContextType = {
|
||||||
saveFlow: async (flow: FlowType, silent?: boolean) => {},
|
saveFlow: async (flow: FlowType, silent?: boolean) => {},
|
||||||
lastCopiedSelection: null,
|
lastCopiedSelection: null,
|
||||||
setLastCopiedSelection: (selection: any) => {},
|
setLastCopiedSelection: (selection: any) => {},
|
||||||
|
isPending: false,
|
||||||
|
setPending: (pending: boolean) => {},
|
||||||
tabsState: {},
|
tabsState: {},
|
||||||
setTabsState: (state: FlowsState) => {},
|
setTabsState: (state: FlowsState) => {},
|
||||||
saveCurrentFlow: () => {},
|
saveCurrentFlow: () => {},
|
||||||
|
|
@ -100,6 +103,8 @@ const FlowsContextInitialValue: FlowsContextType = {
|
||||||
version: "",
|
version: "",
|
||||||
nodes: [],
|
nodes: [],
|
||||||
setNodes: () => {},
|
setNodes: () => {},
|
||||||
|
setNode: () => {},
|
||||||
|
getNode: () => undefined,
|
||||||
onNodesChange: () => {},
|
onNodesChange: () => {},
|
||||||
edges: [],
|
edges: [],
|
||||||
setEdges: () => {},
|
setEdges: () => {},
|
||||||
|
|
@ -111,8 +116,7 @@ export const FlowsContext = createContext<FlowsContextType>(
|
||||||
);
|
);
|
||||||
|
|
||||||
export function FlowsProvider({ children }: { children: ReactNode }) {
|
export function FlowsProvider({ children }: { children: ReactNode }) {
|
||||||
const { setErrorData, setSuccessData } =
|
const { setErrorData, setSuccessData } = useContext(alertContext);
|
||||||
useContext(alertContext);
|
|
||||||
const { getAuthentication, isAuthenticated } = useContext(AuthContext);
|
const { getAuthentication, isAuthenticated } = useContext(AuthContext);
|
||||||
|
|
||||||
const [tabId, setTabId] = useState("");
|
const [tabId, setTabId] = useState("");
|
||||||
|
|
@ -131,41 +135,67 @@ export function FlowsProvider({ children }: { children: ReactNode }) {
|
||||||
|
|
||||||
const [edges, setEdgesInternal, onEdgesChangeInternal] = useEdgesState([]);
|
const [edges, setEdgesInternal, onEdgesChangeInternal] = useEdgesState([]);
|
||||||
|
|
||||||
const onNodesChange = useCallback((nodes: NodeChange[]) => {
|
const setPending = useCallback(
|
||||||
onNodesChangeInternal(nodes);
|
(pending: boolean) => {
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
setTabsState((prev: FlowsState) => {
|
setTabsState((prev: FlowsState) => {
|
||||||
return {
|
return {
|
||||||
...prev,
|
...prev,
|
||||||
[tabId]: {
|
[tabId]: {
|
||||||
...prev[tabId],
|
...prev[tabId],
|
||||||
isPending: true,
|
isPending: pending,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
//SAVE FLOW IN FLOWS
|
},
|
||||||
}, [onNodesChangeInternal, setTabsState, tabId]);
|
[setTabsState]
|
||||||
|
);
|
||||||
|
|
||||||
|
const isPending = tabsState[tabId]?.isPending ?? false;
|
||||||
|
|
||||||
|
const onNodesChange = useCallback(
|
||||||
|
(nodes: NodeChange[]) => {
|
||||||
|
onNodesChangeInternal(nodes);
|
||||||
|
console.log("nodesChangou")
|
||||||
|
|
||||||
|
setPending(true);
|
||||||
|
},
|
||||||
|
[onNodesChangeInternal, setTabsState, tabId]
|
||||||
|
);
|
||||||
|
|
||||||
const onEdgesChange = useCallback(
|
const onEdgesChange = useCallback(
|
||||||
(edges: EdgeChange[]) => {
|
(edges: EdgeChange[]) => {
|
||||||
onEdgesChangeInternal(edges);
|
onEdgesChangeInternal(edges);
|
||||||
//@ts-ignore
|
console.log("edgesChangou")
|
||||||
setTabsState((prev: FlowsState) => {
|
setPending(true);
|
||||||
return {
|
|
||||||
...prev,
|
|
||||||
[tabId]: {
|
|
||||||
...prev[tabId],
|
|
||||||
isPending: true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
[onEdgesChangeInternal, setTabsState, tabId]
|
[onEdgesChangeInternal, setTabsState, tabId]
|
||||||
);
|
);
|
||||||
|
|
||||||
const setNodes = (nodes: Node[] | ((oldState: Node[]) => Node[])) => {
|
const setNodes = (change: Node[] | ((oldState: Node[]) => Node[])) => {
|
||||||
setNodesInternal(nodes)
|
let newChange = typeof change === "function" ? change(nodes) : change;
|
||||||
|
|
||||||
|
|
||||||
|
setEdgesInternal(cleanEdges(newChange, edges));
|
||||||
|
setNodesInternal(newChange);
|
||||||
|
};
|
||||||
|
|
||||||
|
const setNode = (id: string, change: Node | ((oldState: Node) => Node)) => {
|
||||||
|
let newChange = typeof change === "function" ? change(nodes.find((node) => node.id === id)!) : change;
|
||||||
|
|
||||||
|
setNodes((oldNodes) =>
|
||||||
|
oldNodes.map((node) => {
|
||||||
|
if (node.id === id) {
|
||||||
|
return newChange;
|
||||||
}
|
}
|
||||||
|
return node;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getNode = (id: string) => {
|
||||||
|
return nodes.find((node) => node.id === id);
|
||||||
|
};
|
||||||
|
|
||||||
const setEdges = (edges: Edge[] | ((oldState: Edge[]) => Edge[])) => {
|
const setEdges = (edges: Edge[] | ((oldState: Edge[]) => Edge[])) => {
|
||||||
setEdgesInternal(edges);
|
setEdgesInternal(edges);
|
||||||
|
|
@ -787,6 +817,8 @@ export function FlowsProvider({ children }: { children: ReactNode }) {
|
||||||
uploadFlows,
|
uploadFlows,
|
||||||
uploadFlow,
|
uploadFlow,
|
||||||
getNodeId,
|
getNodeId,
|
||||||
|
isPending,
|
||||||
|
setPending,
|
||||||
tabsState,
|
tabsState,
|
||||||
setTabsState,
|
setTabsState,
|
||||||
paste,
|
paste,
|
||||||
|
|
@ -797,6 +829,8 @@ export function FlowsProvider({ children }: { children: ReactNode }) {
|
||||||
deleteComponent,
|
deleteComponent,
|
||||||
nodes,
|
nodes,
|
||||||
setNodes,
|
setNodes,
|
||||||
|
setNode,
|
||||||
|
getNode,
|
||||||
onNodesChange,
|
onNodesChange,
|
||||||
edges,
|
edges,
|
||||||
setEdges,
|
setEdges,
|
||||||
|
|
|
||||||
|
|
@ -228,10 +228,6 @@ export default function Page({
|
||||||
eds
|
eds
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
setNodes((node) => {
|
|
||||||
let newX = _.cloneDeep(node);
|
|
||||||
return newX;
|
|
||||||
});
|
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
setTabsState((prev: FlowsState) => {
|
setTabsState((prev: FlowsState) => {
|
||||||
return {
|
return {
|
||||||
|
|
@ -244,7 +240,7 @@ export default function Page({
|
||||||
});
|
});
|
||||||
saveCurrentFlowTimeout();
|
saveCurrentFlowTimeout();
|
||||||
},
|
},
|
||||||
[setEdges, setNodes, takeSnapshot, addEdge]
|
[setEdges, takeSnapshot, addEdge]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onNodeDragStart: NodeDragHandler = useCallback(() => {
|
const onNodeDragStart: NodeDragHandler = useCallback(() => {
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@ export type FlowsContextType = {
|
||||||
}) => Promise<String | never>;
|
}) => Promise<String | never>;
|
||||||
hardReset: () => void;
|
hardReset: () => void;
|
||||||
getNodeId: (nodeType: string) => string;
|
getNodeId: (nodeType: string) => string;
|
||||||
|
isPending: boolean;
|
||||||
|
setPending: (pending: boolean) => void;
|
||||||
tabsState: FlowsState;
|
tabsState: FlowsState;
|
||||||
setTabsState: (state: FlowsState) => void;
|
setTabsState: (state: FlowsState) => void;
|
||||||
paste: (
|
paste: (
|
||||||
|
|
@ -61,6 +63,8 @@ export type FlowsContextType = {
|
||||||
version: string;
|
version: string;
|
||||||
nodes: Array<Node>;
|
nodes: Array<Node>;
|
||||||
setNodes: (update: Node[] | ((oldState: Node[]) => Node[])) => void;
|
setNodes: (update: Node[] | ((oldState: Node[]) => Node[])) => void;
|
||||||
|
setNode: (id: string, update: Node | ((oldState: Node) => Node)) => void;
|
||||||
|
getNode: (id: string) => Node | undefined;
|
||||||
onNodesChange: OnChange<NodeChange>;
|
onNodesChange: OnChange<NodeChange>;
|
||||||
edges: Array<Edge>;
|
edges: Array<Edge>;
|
||||||
setEdges: (update: Edge[] | ((oldState: Edge[]) => Edge[])) => void;
|
setEdges: (update: Edge[] | ((oldState: Edge[]) => Edge[])) => void;
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,6 @@
|
||||||
import { Edge, Node } from "reactflow";
|
import { Edge, Node } from "reactflow";
|
||||||
import { FlowType, NodeType } from "../flow";
|
import { FlowType, NodeType } from "../flow";
|
||||||
|
|
||||||
export type cleanEdgesType = {
|
|
||||||
flow: {
|
|
||||||
edges: Edge[];
|
|
||||||
nodes: NodeType[];
|
|
||||||
};
|
|
||||||
updateEdge: (edge: Edge[]) => void;
|
|
||||||
};
|
|
||||||
|
|
||||||
export type unselectAllNodesType = {
|
export type unselectAllNodesType = {
|
||||||
updateNodes: (nodes: Node[]) => void;
|
updateNodes: (nodes: Node[]) => void;
|
||||||
data: Node[];
|
data: Node[];
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import {
|
||||||
targetHandleType,
|
targetHandleType,
|
||||||
} from "../types/flow";
|
} from "../types/flow";
|
||||||
import {
|
import {
|
||||||
cleanEdgesType,
|
|
||||||
findLastNodeType,
|
findLastNodeType,
|
||||||
generateFlowType,
|
generateFlowType,
|
||||||
unselectAllNodesType,
|
unselectAllNodesType,
|
||||||
|
|
@ -30,10 +29,7 @@ import {
|
||||||
} from "../types/utils/reactflowUtils";
|
} from "../types/utils/reactflowUtils";
|
||||||
import { getFieldTitle, toTitleCase } from "./utils";
|
import { getFieldTitle, toTitleCase } from "./utils";
|
||||||
|
|
||||||
export function cleanEdges({
|
export function cleanEdges(nodes: Node[], edges: Edge[]) {
|
||||||
flow: { edges, nodes },
|
|
||||||
updateEdge,
|
|
||||||
}: cleanEdgesType) {
|
|
||||||
let newEdges = _.cloneDeep(edges);
|
let newEdges = _.cloneDeep(edges);
|
||||||
edges.forEach((edge) => {
|
edges.forEach((edge) => {
|
||||||
// check if the source and target node still exists
|
// check if the source and target node still exists
|
||||||
|
|
@ -73,7 +69,7 @@ export function cleanEdges({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
updateEdge(newEdges);
|
return newEdges;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function unselectAllNodes({ updateNodes, data }: unselectAllNodesType) {
|
export function unselectAllNodes({ updateNodes, data }: unselectAllNodesType) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue