diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
index 7201bba3b..936e65893 100644
--- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
+++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx
@@ -304,7 +304,10 @@ export default function ParameterComponent({
) : (
<>
) : left === true && type === "code" ? (
-
+
state.dark);
@@ -43,6 +44,10 @@ export default function CodeAreaModal({
}
}, []);
+ useEffect(() => {
+ if (openModal) setOpen(true);
+ }, [openModal]);
+
function processNonDynamicField() {
postValidateCode(code)
.then((apiReturn) => {
diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx
index e25544bdf..8a52abdb9 100644
--- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx
+++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx
@@ -1,6 +1,7 @@
import { cloneDeep } from "lodash";
import { useEffect, useState } from "react";
import ShadTooltip from "../../../../components/ShadTooltipComponent";
+import CodeAreaComponent from "../../../../components/codeAreaComponent";
import IconComponent from "../../../../components/genericIconComponent";
import {
Select,
@@ -15,6 +16,7 @@ import { useDarkStore } from "../../../../stores/darkStore";
import useFlowStore from "../../../../stores/flowStore";
import useFlowsManagerStore from "../../../../stores/flowsManagerStore";
import { useStoreStore } from "../../../../stores/storeStore";
+import { APIClassType } from "../../../../types/api";
import { nodeToolbarPropsType } from "../../../../types/components";
import { FlowType } from "../../../../types/flow";
import {
@@ -32,6 +34,7 @@ export default function NodeToolbarComponent({
setShowNode,
numberOfHandles,
showNode,
+ name = "code",
}: nodeToolbarPropsType): JSX.Element {
const nodeLength = Object.keys(data.node!.template).filter(
(templateField) =>
@@ -123,6 +126,9 @@ export default function NodeToolbarComponent({
case "override":
setShowOverrideModal(true);
break;
+ case "delete":
+ deleteNode(data.id);
+ break;
}
};
@@ -130,19 +136,84 @@ export default function NodeToolbarComponent({
Object.values(flow).includes(data.node?.display_name!)
);
+ const setNode = useFlowStore((state) => state.setNode);
+
+ const handleOnNewValue = (
+ newValue: string | string[] | boolean | Object[]
+ ): void => {
+ if (data.node!.template[name].value !== newValue) {
+ takeSnapshot();
+ }
+
+ data.node!.template[name].value = newValue; // necessary to enable ctrl+z inside the input
+
+ setNode(data.id, (oldNode) => {
+ let newNode = cloneDeep(oldNode);
+
+ newNode.data = {
+ ...newNode.data,
+ };
+
+ newNode.data.node.template[name].value = newValue;
+
+ return newNode;
+ });
+ };
+
+ const handleNodeClass = (newNodeClass: APIClassType, code?: string): void => {
+ if (!data.node) return;
+ if (data.node!.template[name].value !== code) {
+ takeSnapshot();
+ }
+
+ setNode(data.id, (oldNode) => {
+ let newNode = cloneDeep(oldNode);
+
+ newNode.data = {
+ ...newNode.data,
+ node: newNodeClass,
+ description: newNodeClass.description ?? data.node!.description,
+ display_name: newNodeClass.display_name ?? data.node!.display_name,
+ };
+
+ newNode.data.node.template[name].value = code;
+
+ return newNode;
+ });
+ };
+
+ const [openModal, setOpenModal] = useState(false);
+
return (
<>
-
+
@@ -288,6 +359,16 @@ export default function NodeToolbarComponent({
)}
+
+
+
+ {" "}
+ Delete{" "}
+
+
diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts
index 1bb25c686..3e3807e50 100644
--- a/src/frontend/src/types/components/index.ts
+++ b/src/frontend/src/types/components/index.ts
@@ -112,6 +112,7 @@ export type CodeAreaComponentType = {
dynamic?: boolean;
id?: string;
readonly?: boolean;
+ openModal?: boolean;
};
export type FileComponentType = {
@@ -480,6 +481,7 @@ export type nodeToolbarPropsType = {
setShowNode: (boolean: any) => void;
numberOfHandles: number;
showNode: boolean;
+ name?: string;
};
export type parsedDataType = {
@@ -513,6 +515,7 @@ export type codeAreaModalPropsType = {
children: ReactNode;
dynamic?: boolean;
readonly?: boolean;
+ openModal?: boolean;
};
export type chatMessagePropsType = {
diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts
index 41ec2d047..5a7676453 100644
--- a/src/frontend/src/utils/styleUtils.ts
+++ b/src/frontend/src/utils/styleUtils.ts
@@ -16,6 +16,7 @@ import {
ChevronsUpDown,
Circle,
Clipboard,
+ Code,
Code2,
Combine,
Compass,
@@ -395,4 +396,5 @@ export const nodeIconsLucide: iconsType = {
Repeat,
io: ArrowDownUp,
ScreenShare,
+ Code,
};