From f84df04f8adbb4e62edeb46658b02ab4011320c0 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Thu, 14 Sep 2023 19:01:09 -0300 Subject: [PATCH] fix(GenericNode): import missing InputComponent and Textarea components feat(GenericNode): add support for editing node name and description fix(InputComponent): add autoFocus and onBlur props fix(tabsContext): update sourceHandle object in edge data fix(PageComponent): generate random name for new group node fix(reactflowUtils): update handleKeyDown function to accept HTMLTextAreaElement --- .../src/CustomNodes/GenericNode/index.tsx | 88 +++++++++++++++---- .../src/components/inputComponent/index.tsx | 15 +++- src/frontend/src/contexts/tabsContext.tsx | 1 + .../components/PageComponent/index.tsx | 4 +- src/frontend/src/types/components/index.ts | 3 + src/frontend/src/utils/reactflowUtils.ts | 4 +- 6 files changed, 93 insertions(+), 22 deletions(-) diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 03c3af4c6..3efefd9ac 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -10,10 +10,12 @@ import { typesContext } from "../../contexts/typesContext"; import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; import { validationStatusType } from "../../types/components"; import { NodeDataType } from "../../types/flow"; -import { cleanEdges, getGroupStatus, scapedJSONStringfy } from "../../utils/reactflowUtils"; +import { cleanEdges, getGroupStatus, handleKeyDown, scapedJSONStringfy } from "../../utils/reactflowUtils"; import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; import { classNames, toTitleCase } from "../../utils/utils"; import ParameterComponent from "./components/parameterComponent"; +import InputComponent from "../../components/inputComponent"; +import { Textarea } from "../../components/ui/textarea"; export default function GenericNode({ data: olddata, @@ -31,6 +33,12 @@ export default function GenericNode({ const updateNodeInternals = useUpdateNodeInternals(); const { types, deleteNode, reactFlowInstance } = useContext(typesContext); const name = nodeIconsLucide[data.type] ? data.type : types[data.type]; + const [inputName, setInputName] = useState(true); + const [nodeName, setNodeName] = useState(data.node!.display_name); + const [inputDescription, setInputDescription] = useState(false); + const [nodeDescription, setNodeDescription] = useState( + data.node?.description! + ); const [validationStatus, setValidationStatus] = useState(null); // State for outline color @@ -58,7 +66,7 @@ export default function GenericNode({ // New useEffect to watch for changes in sseData and update validation status useEffect(() => { - const relevantData = data.node?.flow?getGroupStatus(data.node.flow,sseData):sseData[data.id]; + const relevantData = data.node?.flow ? getGroupStatus(data.node.flow, sseData) : sseData[data.id]; if (relevantData) { // Extract validation information from relevantData and update the validationStatus state setValidationStatus(relevantData); @@ -97,11 +105,31 @@ export default function GenericNode({ iconColor={`${nodeColors[types[data.type]]}`} />
- -
- {data.node?.display_name} -
-
+ {data.node?.flow && inputName ? +
+ { + setInputName(false); + if (nodeName.trim() !== "") { + setNodeName(nodeName); + data.node!.display_name = nodeName; + } else { + setNodeName(data.node!.display_name); + } + }} + value={nodeName} + onChange={setNodeName} + password={false} + blurOnEnter={true} + /> +
: +
setInputName(true)}> + {nodeName} +
+
+ } +
@@ -123,10 +151,10 @@ export default function GenericNode({
{typeof validationStatus.params === "string" ? validationStatus.params - .split("\n") - .map((line: string, index: number) => ( -
{line}
- )) + .split("\n") + .map((line: string, index: number) => ( +
{line}
+ )) : ""}
) @@ -164,7 +192,35 @@ export default function GenericNode({
-
{data.node?.description}
+ {data.node?.flow && inputDescription ? +