diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index 52e0e3a2c..bb9423324 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -1,5 +1,5 @@ import { Variable } from "lucide-react"; -import { ReactNode, useContext, useRef, useState } from "react"; +import { ReactNode, forwardRef, useContext, useState } from "react"; import CodeAreaComponent from "../../components/codeAreaComponent"; import Dropdown from "../../components/dropdownComponent"; import FloatComponent from "../../components/floatComponent"; @@ -27,142 +27,249 @@ import { NodeDataType } from "../../types/flow"; import { classNames, limitScrollFieldsModal } from "../../utils"; import BaseModal from "../baseModal"; -export default function EditNodeModal({ - data, - children, -}: { - data: NodeDataType; - children: ReactNode; -}) { - const [modalOpen, setModalOpen] = useState(false); +const EditNodeModal = forwardRef( + ( + { + data, + children, + }: { + data: NodeDataType; + children: ReactNode; + }, + ref + ) => { + const [modalOpen, setModalOpen] = useState(false); - const [nodeLength, setNodeLength] = useState( - Object.keys(data.node.template).filter( - (t) => - t.charAt(0) !== "_" && - data.node.template[t].show && - (data.node.template[t].type === "str" || - data.node.template[t].type === "bool" || - data.node.template[t].type === "float" || - data.node.template[t].type === "code" || - data.node.template[t].type === "prompt" || - data.node.template[t].type === "file" || - data.node.template[t].type === "int") - ).length - ); - const [nodeValue, setNodeValue] = useState(null); - const { closePopUp } = useContext(PopUpContext); - const { types } = useContext(typesContext); - const ref = useRef(); - const { setTabsState, tabId } = useContext(TabsContext); - const { reactFlowInstance } = useContext(typesContext); + const [nodeLength, setNodeLength] = useState( + Object.keys(data.node.template).filter( + (t) => + t.charAt(0) !== "_" && + data.node.template[t].show && + (data.node.template[t].type === "str" || + data.node.template[t].type === "bool" || + data.node.template[t].type === "float" || + data.node.template[t].type === "code" || + data.node.template[t].type === "prompt" || + data.node.template[t].type === "file" || + data.node.template[t].type === "int") + ).length + ); + const [nodeValue, setNodeValue] = useState(null); + const { closePopUp } = useContext(PopUpContext); + const { types } = useContext(typesContext); + const { setTabsState, tabId } = useContext(TabsContext); + const { reactFlowInstance } = useContext(typesContext); - let disabled = - reactFlowInstance?.getEdges().some((e) => e.targetHandle === data.id) ?? - false; - if (nodeLength == 0) { - closePopUp(); - } + let disabled = + reactFlowInstance?.getEdges().some((e) => e.targetHandle === data.id) ?? + false; + if (nodeLength == 0) { + closePopUp(); + } - function changeAdvanced(node) { - Object.keys(data.node.template).map((n, i) => { - if (n === node.name) { - data.node.template[n].advanced = !data.node.template[n].advanced; - } - return n; - }); - setNodeValue(!nodeValue); - } + function changeAdvanced(node) { + Object.keys(data.node.template).map((n, i) => { + if (n === node.name) { + data.node.template[n].advanced = !data.node.template[n].advanced; + } + return n; + }); + setNodeValue(!nodeValue); + } - const handleOnNewValue = (newValue: any, name) => { - data.node.template[name].value = newValue; - // Set state to pending - setTabsState((prev) => { - return { - ...prev, - [tabId]: { - ...prev[tabId], - isPending: true, - }, - }; - }); - }; + const handleOnNewValue = (newValue: any, name) => { + data.node.template[name].value = newValue; + // Set state to pending + setTabsState((prev) => { + return { + ...prev, + [tabId]: { + ...prev[tabId], + isPending: true, + }, + }; + }); + }; - return ( - - {children} - - {data.type} - ID: {data.id} - - -
- - Parameters -
+ return ( + + {children} + + {data.type} + ID: {data.id} + + +
+ + Parameters +
-
-
limitScrollFieldsModal - ? "overflow-scroll overflow-x-hidden custom-scroll" - : "overflow-hidden" - )} - > - {nodeLength > 0 && ( -
- - - - PARAM - - VALUE - - SHOW - - - - {Object.keys(data.node.template) - .filter( - (t) => - t.charAt(0) !== "_" && - data.node.template[t].show && - (data.node.template[t].type === "str" || - data.node.template[t].type === "bool" || - data.node.template[t].type === "float" || - data.node.template[t].type === "code" || - data.node.template[t].type === "prompt" || - data.node.template[t].type === "file" || - data.node.template[t].type === "int") - ) - .map((n, i) => ( - - - {data.node.template[n].name - ? data.node.template[n].name - : data.node.template[n].display_name} - - - {data.node.template[n].type === "str" && - !data.node.template[n].options ? ( -
- {data.node.template[n].list ? ( - +
limitScrollFieldsModal + ? "overflow-scroll overflow-x-hidden custom-scroll" + : "overflow-hidden" + )} + > + {nodeLength > 0 && ( +
+
+ + + PARAM + + VALUE + + SHOW + + + + {Object.keys(data.node.template) + .filter( + (t) => + t.charAt(0) !== "_" && + data.node.template[t].show && + (data.node.template[t].type === "str" || + data.node.template[t].type === "bool" || + data.node.template[t].type === "float" || + data.node.template[t].type === "code" || + data.node.template[t].type === "prompt" || + data.node.template[t].type === "file" || + data.node.template[t].type === "int") + ) + .map((n, i) => ( + + + {data.node.template[n].name + ? data.node.template[n].name + : data.node.template[n].display_name} + + + {data.node.template[n].type === "str" && + !data.node.template[n].options ? ( +
+ {data.node.template[n].list ? ( + { + handleOnNewValue(t, n); + }} + /> + ) : data.node.template[n].multiline ? ( + { + handleOnNewValue(t, n); + }} + /> + ) : ( + { + handleOnNewValue(t, n); + }} + /> + )} +
+ ) : data.node.template[n].type === "bool" ? ( +
+ {" "} + { + handleOnNewValue(t, n); + }} + size="small" + /> +
+ ) : data.node.template[n].type === "float" ? ( +
+ { + data.node.template[n].value = t; + }} + /> +
+ ) : data.node.template[n].type === "str" && + data.node.template[n].options ? ( +
+ handleOnNewValue(t, n)} value={ - !data.node.template[n].value || - data.node.template[n].value === "" - ? [""] - : data.node.template[n].value + data.node.template[n].value ?? + "Choose an option" } - onChange={(t: string[]) => { + > +
+ ) : data.node.template[n].type === "int" ? ( +
+ { handleOnNewValue(t, n); }} /> - ) : data.node.template[n].multiline ? ( - + ) : data.node.template[n].type === "file" ? ( +
+ { + handleOnNewValue(t, n); + }} + fileTypes={data.node.template[n].fileTypes} + suffixes={data.node.template[n].suffixes} + onFileChange={(t: string) => { + handleOnNewValue(t, n); + }} + > +
+ ) : data.node.template[n].type === "prompt" ? ( +
+ { + data.node = nodeClass; + }} + value={data.node.template[n].value ?? ""} + onChange={(t: string) => { + handleOnNewValue(t, n); + }} + /> +
+ ) : data.node.template[n].type === "code" ? ( +
+ - ) : ( - { - handleOnNewValue(t, n); - }} - /> - )} -
- ) : data.node.template[n].type === "bool" ? ( -
- {" "} +
+ ) : data.node.template[n].type === "Any" ? ( + "-" + ) : ( +
+ )} + + +
+ changeAdvanced(data.node.template[n]) + } disabled={disabled} - enabled={data.node.template[n].value} - setEnabled={(t) => { - handleOnNewValue(t, n); - }} size="small" />
- ) : data.node.template[n].type === "float" ? ( -
- { - data.node.template[n].value = t; - }} - /> -
- ) : data.node.template[n].type === "str" && - data.node.template[n].options ? ( -
- handleOnNewValue(t, n)} - value={ - data.node.template[n].value ?? - "Choose an option" - } - > -
- ) : data.node.template[n].type === "int" ? ( -
- { - handleOnNewValue(t, n); - }} - /> -
- ) : data.node.template[n].type === "file" ? ( -
- { - handleOnNewValue(t, n); - }} - fileTypes={data.node.template[n].fileTypes} - suffixes={data.node.template[n].suffixes} - onFileChange={(t: string) => { - handleOnNewValue(t, n); - }} - > -
- ) : data.node.template[n].type === "prompt" ? ( -
- { - data.node = nodeClass; - }} - value={data.node.template[n].value ?? ""} - onChange={(t: string) => { - handleOnNewValue(t, n); - }} - /> -
- ) : data.node.template[n].type === "code" ? ( -
- { - handleOnNewValue(t, n); - }} - /> -
- ) : data.node.template[n].type === "Any" ? ( - "-" - ) : ( -
- )} -
- -
- - changeAdvanced(data.node.template[n]) - } - disabled={disabled} - size="small" - /> -
-
- - ))} - -
-
- )} + + + ))} + + +
+ )} +
- -
+
- - - -
- ); -} + + + + + ); + } +); + +export default EditNodeModal;