From 4b91383efcabaa21b7006c9663f9efbceca64265 Mon Sep 17 00:00:00 2001 From: zxhlyh Date: Thu, 30 May 2024 18:54:58 +0800 Subject: [PATCH] feat: workflow variable aggregator support group (#4811) Co-authored-by: Yeuoly --- .../nodes/variable_aggregator/entities.py | 4 +- .../variable_aggregator_node.py | 8 +- .../workflow/hooks/use-nodes-interactions.ts | 67 +++++------- web/app/components/workflow/index.tsx | 2 +- .../add-variable-popup-with-position.tsx | 4 +- .../nodes/_base/components/node-handle.tsx | 4 +- .../components/workflow/nodes/_base/node.tsx | 2 +- .../components/add-variable/index.tsx | 36 ++++--- .../components/node-group-item.tsx | 72 +++++++++---- .../components/node-handle.tsx | 69 ------------ .../components/node-variable-item.tsx | 8 +- .../workflow/nodes/variable-assigner/hooks.ts | 102 +----------------- .../workflow/nodes/variable-assigner/node.tsx | 2 +- .../nodes/variable-assigner/panel.tsx | 20 ++-- .../nodes/variable-assigner/use-config.ts | 6 +- web/app/components/workflow/store.ts | 5 +- web/app/components/workflow/utils.ts | 12 ++- 17 files changed, 147 insertions(+), 276 deletions(-) delete mode 100644 web/app/components/workflow/nodes/variable-assigner/components/node-handle.tsx diff --git a/api/core/workflow/nodes/variable_aggregator/entities.py b/api/core/workflow/nodes/variable_aggregator/entities.py index 21ab76670f..d38e934451 100644 --- a/api/core/workflow/nodes/variable_aggregator/entities.py +++ b/api/core/workflow/nodes/variable_aggregator/entities.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from core.workflow.entities.base_node_data_entities import BaseNodeData -class AdvancedSetting(BaseModel): +class AdvancedSettings(BaseModel): """ Advanced setting. """ @@ -30,4 +30,4 @@ class VariableAssignerNodeData(BaseNodeData): type: str = 'variable-assigner' output_type: str variables: list[list[str]] - advanced_setting: Optional[AdvancedSetting] \ No newline at end of file + advanced_settings: Optional[AdvancedSettings] \ No newline at end of file diff --git a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py index b18a4d7fbf..63ce790625 100644 --- a/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py +++ b/api/core/workflow/nodes/variable_aggregator/variable_aggregator_node.py @@ -18,7 +18,7 @@ class VariableAggregatorNode(BaseNode): outputs = {} inputs = {} - if not node_data.advanced_setting or node_data.advanced_setting.group_enabled: + if not node_data.advanced_settings or not node_data.advanced_settings.group_enabled: for variable in node_data.variables: value = variable_pool.get_variable_value(variable) @@ -32,12 +32,14 @@ class VariableAggregatorNode(BaseNode): } break else: - for group in node_data.advanced_setting.groups: + for group in node_data.advanced_settings.groups: for variable in group.variables: value = variable_pool.get_variable_value(variable) if value is not None: - outputs[f'{group.group_name}_output'] = value + outputs[group.group_name] = { + 'output': value + } inputs['.'.join(variable[1:])] = value break diff --git a/web/app/components/workflow/hooks/use-nodes-interactions.ts b/web/app/components/workflow/hooks/use-nodes-interactions.ts index 486a3267a6..64cba1c790 100644 --- a/web/app/components/workflow/hooks/use-nodes-interactions.ts +++ b/web/app/components/workflow/hooks/use-nodes-interactions.ts @@ -164,6 +164,7 @@ export const useNodesInteractions = () => { if (sameLevel) { setEnteringNodePayload({ nodeId: node.id, + nodeData: node.data as VariableAssignerNodeType, }) const fromType = connectingNodePayload.handleType @@ -360,6 +361,11 @@ export const useNodesInteractions = () => { const { getNodes } = store.getState() const node = getNodes().find(n => n.id === nodeId)! + if (node.data.type === BlockEnum.VariableAggregator || node.data.type === BlockEnum.VariableAssigner) { + if (handleType === 'target') + return + } + if (!node.data.isIterationStart) { setConnectingNodePayload({ nodeId, @@ -395,7 +401,6 @@ export const useNodesInteractions = () => { const fromHandleType = connectingNodePayload.handleType const fromHandleId = connectingNodePayload.handleId const fromNode = nodes.find(n => n.id === connectingNodePayload.nodeId)! - const fromNodeParent = nodes.find(n => n.id === fromNode.parentId) const toNode = nodes.find(n => n.id === enteringNodePayload.nodeId)! const toParentNode = nodes.find(n => n.id === toNode.parentId) @@ -406,39 +411,15 @@ export const useNodesInteractions = () => { if (fromHandleType === 'source' && (toNode.data.type === BlockEnum.VariableAssigner || toNode.data.type === BlockEnum.VariableAggregator)) { const groupEnabled = toNode.data.advanced_settings?.group_enabled + const firstGroupId = toNode.data.advanced_settings?.groups[0].groupId + let handleId = 'target' - if ( - (groupEnabled && hoveringAssignVariableGroupId) - || !groupEnabled - ) { - const newNodes = produce(nodes, (draft) => { - draft.forEach((node) => { - if (node.id === toNode.id) { - node.data._showAddVariablePopup = true - node.data._holdAddVariablePopup = true - } - }) - }) - setNodes(newNodes) - setShowAssignVariablePopup({ - nodeId: fromNode.id, - nodeData: fromNode.data, - variableAssignerNodeId: toNode.id, - variableAssignerNodeData: toNode.data, - variableAssignerNodeHandleId: hoveringAssignVariableGroupId || 'target', - parentNode: toParentNode, - x: x - toNode.positionAbsolute!.x, - y: y - toNode.positionAbsolute!.y, - }) - handleNodeConnect({ - source: fromNode.id, - sourceHandle: fromHandleId, - target: toNode.id, - targetHandle: hoveringAssignVariableGroupId || 'target', - }) + if (groupEnabled) { + if (hoveringAssignVariableGroupId) + handleId = hoveringAssignVariableGroupId + else + handleId = firstGroupId } - } - if (fromHandleType === 'target' && (fromNode.data.type === BlockEnum.VariableAssigner || fromNode.data.type === BlockEnum.VariableAggregator) && toNode.data.type !== BlockEnum.IfElse && toNode.data.type !== BlockEnum.QuestionClassifier) { const newNodes = produce(nodes, (draft) => { draft.forEach((node) => { if (node.id === toNode.id) { @@ -449,20 +430,20 @@ export const useNodesInteractions = () => { }) setNodes(newNodes) setShowAssignVariablePopup({ - nodeId: toNode.id, - nodeData: toNode.data, - variableAssignerNodeId: fromNode.id, - variableAssignerNodeData: fromNode.data, - variableAssignerNodeHandleId: fromHandleId || 'target', - parentNode: fromNodeParent, + nodeId: fromNode.id, + nodeData: fromNode.data, + variableAssignerNodeId: toNode.id, + variableAssignerNodeData: toNode.data, + variableAssignerNodeHandleId: handleId, + parentNode: toParentNode, x: x - toNode.positionAbsolute!.x, y: y - toNode.positionAbsolute!.y, }) handleNodeConnect({ - source: toNode.id, - sourceHandle: 'source', - target: fromNode.id, - targetHandle: fromHandleId, + source: fromNode.id, + sourceHandle: fromHandleId, + target: toNode.id, + targetHandle: 'target', }) } } @@ -1111,7 +1092,7 @@ export const useNodesInteractions = () => { setNodes([...nodes, ...nodesToPaste]) handleSyncWorkflowDraft() } - }, [t, getNodesReadOnly, store, workflowStore, handleSyncWorkflowDraft, reactflow, handleNodeIterationChildrenCopy]) + }, [getNodesReadOnly, store, workflowStore, handleSyncWorkflowDraft, reactflow, handleNodeIterationChildrenCopy]) const handleNodesDuplicate = useCallback(() => { if (getNodesReadOnly()) diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 74890f50b2..882ed2f3ac 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -207,7 +207,7 @@ const Workflow: FC = memo(({ }) useKeyPress('delete', handleNodesDelete) - useKeyPress('delete', handleEdgeDelete) + useKeyPress(['delete', 'backspace'], handleEdgeDelete) useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.c`, handleNodesCopy, { exactMatch: true, useCapture: true }) useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.v`, handleNodesPaste, { exactMatch: true, useCapture: true }) useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.d`, handleNodesDuplicate, { exactMatch: true, useCapture: true }) diff --git a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx index 8ae7bf9da5..9800931525 100644 --- a/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx +++ b/web/app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx @@ -43,7 +43,9 @@ const AddVariablePopupWithPosition = ({ if (!showAssignVariablePopup) return '' - if (showAssignVariablePopup.variableAssignerNodeHandleId === 'target') + const groupEnabled = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.group_enabled + + if (!groupEnabled) return showAssignVariablePopup.variableAssignerNodeData.output_type const group = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === showAssignVariablePopup.variableAssignerNodeHandleId) diff --git a/web/app/components/workflow/nodes/_base/components/node-handle.tsx b/web/app/components/workflow/nodes/_base/components/node-handle.tsx index 3885b6805a..56870f79d6 100644 --- a/web/app/components/workflow/nodes/_base/components/node-handle.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-handle.tsx @@ -113,13 +113,11 @@ export const NodeSourceHandle = memo(({ nodeSelectorClassName, }: NodeHandleProps) => { const notInitialWorkflow = useStore(s => s.notInitialWorkflow) - const connectingNodePayload = useStore(s => s.connectingNodePayload) const [open, setOpen] = useState(false) const { handleNodeAdd } = useNodesInteractions() const { getNodesReadOnly } = useNodesReadOnly() const { availableNextBlocks } = useAvailableBlocks(data.type, data.isInIteration) - const isUnConnectable = !availableNextBlocks.length || ((connectingNodePayload?.nodeType === BlockEnum.VariableAssigner || connectingNodePayload?.nodeType === BlockEnum.VariableAggregator) && connectingNodePayload?.handleType === 'target') - const isConnectable = !isUnConnectable + const isConnectable = !!availableNextBlocks.length const connected = data._connectedSourceHandleIds?.includes(handleId) const handleOpenChange = useCallback((v: boolean) => { diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx index 2b614f936a..34d73337bd 100644 --- a/web/app/components/workflow/nodes/_base/node.tsx +++ b/web/app/components/workflow/nodes/_base/node.tsx @@ -117,7 +117,7 @@ const BaseNode: FC = ({ ) } { - data.type !== BlockEnum.VariableAssigner && data.type !== BlockEnum.VariableAggregator && !data._isCandidate && ( + !data._isCandidate && ( void variableAssignerNodeId: string variableAssignerNodeData: VariableAssignerNodeType availableVars: NodeOutPutVar[] handleId?: string } const AddVariable = ({ - open, - onOpenChange, availableVars, variableAssignerNodeId, variableAssignerNodeData, handleId, }: AddVariableProps) => { + const [open, setOpen] = useState(false) const { handleAssignVariableValueChange } = useVariableAssigner() const handleSelectVariable = useCallback((v: ValueSelector, varDetail: Var) => { @@ -43,34 +41,38 @@ const AddVariable = ({ varDetail, handleId, ) - onOpenChange(false) - }, [handleAssignVariableValueChange, variableAssignerNodeId, handleId, onOpenChange]) + setOpen(false) + }, [handleAssignVariableValueChange, variableAssignerNodeId, handleId, setOpen]) return (
onOpenChange(!open)} + onClick={() => setOpen(!open)} >
- +
diff --git a/web/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx b/web/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx index 18886a79fb..ce40c17f3a 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/components/node-group-item.tsx @@ -18,7 +18,7 @@ import { useVariableAssigner, } from '../hooks' import { filterVar } from '../utils' -import NodeHandle from './node-handle' +import AddVariable from './add-variable' import NodeVariableItem from './node-variable-item' import { isSystemVar } from '@/app/components/workflow/nodes/_base/components/variable/utils' @@ -47,40 +47,75 @@ const NodeGroupItem = ({ handleGroupItemMouseLeave, } = useVariableAssigner() const getAvailableVars = useGetAvailableVars() + const groupEnabled = item.groupEnabled const outputType = useMemo(() => { - if (item.targetHandleId === 'target') + if (!groupEnabled) return item.variableAssignerNodeData.output_type const group = item.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === item.targetHandleId) return group?.output_type || '' - }, [item.variableAssignerNodeData, item.targetHandleId]) + }, [item.variableAssignerNodeData, item.targetHandleId, groupEnabled]) const availableVars = getAvailableVars(item.variableAssignerNodeId, item.targetHandleId, filterVar(outputType as VarType)) - const showSelectionBorder = enteringNodePayload?.nodeId === item.variableAssignerNodeId && item.groupEnabled && hoveringAssignVariableGroupId === item.targetHandleId - const connected = item.variableAssignerNodeData._connectedTargetHandleIds?.includes(item.targetHandleId) + const showSelectionBorder = useMemo(() => { + if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) { + if (hoveringAssignVariableGroupId) + return hoveringAssignVariableGroupId !== item.targetHandleId + else + return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId !== item.targetHandleId + } + + return false + }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId]) + const showSelectedBorder = useMemo(() => { + if (groupEnabled && enteringNodePayload?.nodeId === item.variableAssignerNodeId) { + if (hoveringAssignVariableGroupId) + return hoveringAssignVariableGroupId === item.targetHandleId + else + return enteringNodePayload?.nodeData.advanced_settings?.groups[0].groupId === item.targetHandleId + } + + return false + }, [enteringNodePayload, groupEnabled, hoveringAssignVariableGroupId, item.targetHandleId, item.variableAssignerNodeId]) return (
handleGroupItemMouseEnter(item.targetHandleId)} + onMouseEnter={() => groupEnabled && handleGroupItemMouseEnter(item.targetHandleId)} onMouseLeave={handleGroupItemMouseLeave} >
- - {item.title} - {item.type} + + {item.title} + +
+ {item.type} +
+ +
{ !item.variables.length && ( -
+
{t(`${i18nPrefix}.varNotSet`)}
) @@ -96,6 +131,7 @@ const NodeGroupItem = ({ key={index} node={node as Node} varName={varName} + showBorder={showSelectedBorder || showSelectionBorder} /> ) }) diff --git a/web/app/components/workflow/nodes/variable-assigner/components/node-handle.tsx b/web/app/components/workflow/nodes/variable-assigner/components/node-handle.tsx deleted file mode 100644 index 2edd0c8880..0000000000 --- a/web/app/components/workflow/nodes/variable-assigner/components/node-handle.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import type { MouseEvent } from 'react' -import { - memo, - useCallback, - useState, -} from 'react' -import cn from 'classnames' -import { - Handle, - Position, -} from 'reactflow' -import type { VariableAssignerNodeType } from '../types' -import AddVariable from './add-variable' -import type { NodeOutPutVar } from '@/app/components/workflow/types' -import { useStore } from '@/app/components/workflow/store' - -type NodeHandleProps = { - handleId?: string - connected?: boolean - variableAssignerNodeId: string - availableVars: NodeOutPutVar[] - variableAssignerNodeData: VariableAssignerNodeType -} -const NodeHandle = ({ - connected, - variableAssignerNodeId, - handleId = 'target', - availableVars, - variableAssignerNodeData, -}: NodeHandleProps) => { - const [open, setOpen] = useState(false) - const connectingNodePayload = useStore(s => s.connectingNodePayload) - const isUnConnectable = connectingNodePayload?.handleType === 'source' - - const handleOpenChange = useCallback((v: boolean) => { - setOpen(v) - }, []) - - const handleHandleClick = useCallback((e: MouseEvent) => { - e.stopPropagation() - setOpen(v => !v) - }, []) - - return ( - - - - ) -} - -export default memo(NodeHandle) diff --git a/web/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx b/web/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx index 074d0ccf15..9628d59038 100644 --- a/web/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/components/node-variable-item.tsx @@ -1,4 +1,5 @@ import { memo } from 'react' +import cn from 'classnames' import { VarBlockIcon } from '@/app/components/workflow/block-icon' import { Line3 } from '@/app/components/base/icons/src/public/common' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' @@ -8,13 +9,18 @@ import { BlockEnum } from '@/app/components/workflow/types' type NodeVariableItemProps = { node: Node varName: string + showBorder?: boolean } const NodeVariableItem = ({ node, varName, + showBorder, }: NodeVariableItemProps) => { return ( -
+
{ handleAssignVariableValueChange(variableAssignerNodeId, value, varDetail, variableAssignerNodeHandleId) }, [store, workflowStore, handleAssignVariableValueChange]) - const handleRemoveEdges = useCallback((nodeId: string, enabled: boolean) => { - const { - getNodes, - setNodes, - edges, - setEdges, - } = store.getState() - const nodes = getNodes() - const needDeleteEdges = edges.filter(edge => edge.target === nodeId) - - if (!needDeleteEdges.length) - return - - const currentNode = nodes.find(node => node.id === nodeId)! - const groups = currentNode.data.advanced_settings?.groups || [] - - let shouldKeepEdges: Edge[] = [] - - if (enabled) { - shouldKeepEdges = edges.filter((edge) => { - return edge.target === nodeId && edge.targetHandle === 'target' - }).map((edge) => { - return { - ...edge, - targetHandle: groups[0].groupId, - } - }) - } - else { - shouldKeepEdges = edges.filter((edge) => { - return edge.target === nodeId && edge.targetHandle === groups[0].groupId - }).map((edge) => { - return { - ...edge, - targetHandle: 'target', - } - }) - } - - const nodesConnectedSourceOrTargetHandleIdsMap = getNodesConnectedSourceOrTargetHandleIdsMap( - [ - ...needDeleteEdges.map((needDeleteEdge) => { - return { - type: 'remove', - edge: needDeleteEdge, - } - }), - ...shouldKeepEdges.map((shouldKeepEdge) => { - return { - type: 'add', - edge: shouldKeepEdge, - } - }), - ], - nodes, - ) - - const newNodes = produce(nodes, (draft) => { - draft.forEach((node) => { - if (nodesConnectedSourceOrTargetHandleIdsMap[node.id]) { - node.data = { - ...node.data, - ...nodesConnectedSourceOrTargetHandleIdsMap[node.id], - } - } - }) - }) - setNodes(newNodes) - const newEdges = produce(edges, (draft) => { - draft = draft.filter(edge => edge.target !== nodeId) - draft.push(...shouldKeepEdges) - return draft - }) - setEdges(newEdges) - }, [store]) - const handleGroupItemMouseEnter = useCallback((groupId: string) => { const { setHoveringAssignVariableGroupId, @@ -195,7 +116,6 @@ export const useVariableAssigner = () => { return { handleAddVariableInAddVariablePopupWithPosition, - handleRemoveEdges, handleGroupItemMouseEnter, handleGroupItemMouseLeave, handleAssignVariableValueChange, @@ -205,8 +125,7 @@ export const useVariableAssigner = () => { export const useGetAvailableVars = () => { const { t } = useTranslation() const nodes: Node[] = useNodes() - const edges: Edge[] = useEdges() - const { getBeforeNodesInSameBranch } = useWorkflow() + const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow() const isChatMode = useIsChatMode() const getAvailableVars = useCallback((nodeId: string, handleId: string, filterVar: (v: Var) => boolean) => { const availableNodes: Node[] = [] @@ -214,21 +133,10 @@ export const useGetAvailableVars = () => { if (!currentNode) return [] + + const beforeNodes = getBeforeNodesInSameBranchIncludeParent(nodeId) + availableNodes.push(...beforeNodes) const parentNode = nodes.find(node => node.id === currentNode.parentId) - const connectedEdges = edges.filter(edge => edge.target === nodeId && edge.targetHandle === handleId) - - if (parentNode && !connectedEdges.length) { - const beforeNodes = getBeforeNodesInSameBranch(parentNode.id) - availableNodes.push(...beforeNodes) - } - else { - connectedEdges.forEach((connectedEdge) => { - const beforeNodes = getBeforeNodesInSameBranch(connectedEdge.source) - const connectedNode = nodes.find(node => node.id === connectedEdge.source)! - - availableNodes.push(connectedNode, ...beforeNodes) - }) - } return toNodeAvailableVars({ parentNode, @@ -237,7 +145,7 @@ export const useGetAvailableVars = () => { isChatMode, filterVar, }) - }, [nodes, edges, t, isChatMode, getBeforeNodesInSameBranch]) + }, [nodes, t, isChatMode, getBeforeNodesInSameBranchIncludeParent]) return getAvailableVars } diff --git a/web/app/components/workflow/nodes/variable-assigner/node.tsx b/web/app/components/workflow/nodes/variable-assigner/node.tsx index 64e1485e50..326bd07ded 100644 --- a/web/app/components/workflow/nodes/variable-assigner/node.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/node.tsx @@ -43,7 +43,7 @@ const Node: FC> = (props) => { }, [t, advanced_settings, data, id]) return ( -
+
{ groups.map((item) => { return ( diff --git a/web/app/components/workflow/nodes/variable-assigner/panel.tsx b/web/app/components/workflow/nodes/variable-assigner/panel.tsx index 3626241643..5e50663732 100644 --- a/web/app/components/workflow/nodes/variable-assigner/panel.tsx +++ b/web/app/components/workflow/nodes/variable-assigner/panel.tsx @@ -1,16 +1,16 @@ import type { FC } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' -// import cn from 'classnames' -// import Field from '../_base/components/field' +import cn from 'classnames' +import Field from '../_base/components/field' import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm' import useConfig from './use-config' import type { VariableAssignerNodeType } from './types' import VarGroupItem from './components/var-group-item' import { type NodePanelProps } from '@/app/components/workflow/types' import Split from '@/app/components/workflow/nodes/_base/components/split' -// import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' -// import Switch from '@/app/components/base/switch' +import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' +import Switch from '@/app/components/base/switch' import AddButton from '@/app/components/workflow/nodes/_base/components/add-button' const i18nPrefix = 'workflow.nodes.variableAssigner' @@ -25,7 +25,7 @@ const Panel: FC> = ({ inputs, handleListOrTypeChange, isEnableGroup, - // handleGroupEnabledChange, + handleGroupEnabledChange, handleAddGroup, handleListOrTypeChangeInGroup, handleGroupRemoved, @@ -81,8 +81,8 @@ const Panel: FC> = ({ />
)}
- {/* */} - {/*
+ +
> = ({ /> } /> -
*/} - {/* {isEnableGroup && ( +
+ {isEnableGroup && ( <>
@@ -116,7 +116,7 @@ const Panel: FC> = ({
- )} */} + )} { const { inputs, setInputs } = useNodeCrud(id, payload) const isEnableGroup = !!inputs.advanced_settings?.group_enabled - const { handleRemoveEdges } = useVariableAssigner() // Not Enable Group const handleListOrTypeChange = useCallback((payload: VarGroupItem) => { @@ -114,8 +113,7 @@ const useConfig = (id: string, payload: VariableAssignerNodeType) => { draft.advanced_settings.group_enabled = enabled }) setInputs(newInputs) - handleRemoveEdges(id, enabled) - }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm, handleRemoveEdges]) + }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm]) const handleAddGroup = useCallback(() => { let maxInGroupName = 1 diff --git a/web/app/components/workflow/store.ts b/web/app/components/workflow/store.ts index 7b8c1d8c99..5aeb320164 100644 --- a/web/app/components/workflow/store.ts +++ b/web/app/components/workflow/store.ts @@ -120,7 +120,10 @@ type Shape = { setHoveringAssignVariableGroupId: (hoveringAssignVariableGroupId?: string) => void connectingNodePayload?: { nodeId: string; nodeType: string; handleType: string; handleId: string | null } setConnectingNodePayload: (startConnectingPayload?: Shape['connectingNodePayload']) => void - enteringNodePayload?: { nodeId: string } + enteringNodePayload?: { + nodeId: string + nodeData: VariableAssignerNodeType + } setEnteringNodePayload: (enteringNodePayload?: Shape['enteringNodePayload']) => void } diff --git a/web/app/components/workflow/utils.ts b/web/app/components/workflow/utils.ts index 723594ef35..60e9f69ddf 100644 --- a/web/app/components/workflow/utils.ts +++ b/web/app/components/workflow/utils.ts @@ -257,16 +257,20 @@ export const getNodesConnectedSourceOrTargetHandleIdsMap = (changes: ConnectedSo } if (sourceNode) { - if (type === 'remove') - nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds = nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.filter((handleId: string) => handleId !== edge.sourceHandle) + if (type === 'remove') { + const index = nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.findIndex((handleId: string) => handleId === edge.sourceHandle) + nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.splice(index, 1) + } if (type === 'add') nodesConnectedSourceOrTargetHandleIdsMap[sourceNode.id]._connectedSourceHandleIds.push(edge.sourceHandle || 'source') } if (targetNode) { - if (type === 'remove') - nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds = nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.filter((handleId: string) => handleId !== edge.targetHandle) + if (type === 'remove') { + const index = nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.findIndex((handleId: string) => handleId === edge.targetHandle) + nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.splice(index, 1) + } if (type === 'add') nodesConnectedSourceOrTargetHandleIdsMap[targetNode.id]._connectedTargetHandleIds.push(edge.targetHandle || 'target')