diff --git a/web/app/components/workflow/hooks.ts b/web/app/components/workflow/hooks.ts index 1dfcd01eb0..4408ac42f8 100644 --- a/web/app/components/workflow/hooks.ts +++ b/web/app/components/workflow/hooks.ts @@ -8,7 +8,9 @@ import { getConnectedEdges, useStoreApi, } from 'reactflow' -import type { SelectedNode } from './types' +import type { + SelectedNode, +} from './types' import { useStore } from './store' export const useWorkflow = () => { @@ -113,6 +115,19 @@ export const useWorkflow = () => { setNodes(newNodes) } }, [setSelectedNode, store]) + const handleUpdateNodeData = useCallback(({ id, data }: SelectedNode) => { + const { + getNodes, + setNodes, + } = store.getState() + const newNodes = produce(getNodes(), (draft) => { + const currentNode = draft.find(n => n.id === id) + if (currentNode) + currentNode.data = { ...currentNode.data, ...data } + }) + setNodes(newNodes) + setSelectedNode({ id, data }) + }, [store, setSelectedNode]) return { handleEnterNode, @@ -120,5 +135,6 @@ export const useWorkflow = () => { handleEnterEdge, handleLeaveEdge, handleSelectNode, + handleUpdateNodeData, } } diff --git a/web/app/components/workflow/nodes/_base/components/title-description-input.tsx b/web/app/components/workflow/nodes/_base/components/title-description-input.tsx new file mode 100644 index 0000000000..b18357397d --- /dev/null +++ b/web/app/components/workflow/nodes/_base/components/title-description-input.tsx @@ -0,0 +1,69 @@ +import { + memo, + useCallback, + useState, +} from 'react' +import Textarea from 'rc-textarea' + +type InputProps = { + value: string + onChange: (value: string) => void +} + +export const TitleInput = memo(({ + value, + onChange, +}: InputProps) => { + return ( + onChange(e.target.value)} + className={` + grow mr-2 px-1 h-6 text-base text-gray-900 font-semibold rounded-lg border border-transparent appearance-none outline-none + hover:bg-gray-50 + focus:border-gray-300 focus:shadow-xs focus:bg-white + `} + placeholder='Add title...' + /> + ) +}) +TitleInput.displayName = 'TitleInput' + +export const DescriptionInput = memo(({ + value, + onChange, +}: InputProps) => { + const [focus, setFocus] = useState(false) + const handleFocus = useCallback(() => { + setFocus(true) + }, []) + const handleBlur = useCallback(() => { + setFocus(false) + }, []) + + return ( +