From a66d9d2e9844f5576a5925ef5b17166acd60d8d1 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Fri, 4 Oct 2024 10:25:20 +0800 Subject: [PATCH] 4.8.11 test (#2850) * fix: variables check * remove log * fix: variables refresh * perf: team select button * perf: remove change fn --- .../support/user/team/TeamMenu/index.tsx | 84 ++++++++++--------- .../pages/account/components/InformTable.tsx | 3 - .../Flow/components/ButtonEdge.tsx | 14 ++-- .../Flow/hooks/useWorkflow.tsx | 69 +++++++-------- .../Flow/nodes/NodeHttp/index.tsx | 2 +- .../Flow/nodes/NodeVariableUpdate.tsx | 2 +- .../render/RenderInput/templates/Textarea.tsx | 2 +- 7 files changed, 91 insertions(+), 85 deletions(-) diff --git a/projects/app/src/components/support/user/team/TeamMenu/index.tsx b/projects/app/src/components/support/user/team/TeamMenu/index.tsx index 61ab1440f..27e866e34 100644 --- a/projects/app/src/components/support/user/team/TeamMenu/index.tsx +++ b/projects/app/src/components/support/user/team/TeamMenu/index.tsx @@ -7,6 +7,7 @@ import dynamic from 'next/dynamic'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useToast } from '@fastgpt/web/hooks/useToast'; import Avatar from '@fastgpt/web/components/common/Avatar'; +import MyIcon from '@fastgpt/web/components/common/Icon'; const TeamManageModal = dynamic(() => import('../TeamManageModal')); @@ -19,47 +20,50 @@ const TeamMenu = () => { const { isOpen, onOpen, onClose } = useDisclosure(); return ( - {isOpen && } - + ); }; diff --git a/projects/app/src/pages/account/components/InformTable.tsx b/projects/app/src/pages/account/components/InformTable.tsx index edda572d8..101d50209 100644 --- a/projects/app/src/pages/account/components/InformTable.tsx +++ b/projects/app/src/pages/account/components/InformTable.tsx @@ -3,8 +3,6 @@ import { Box, Button, Flex, useTheme } from '@chakra-ui/react'; import { getInforms, readInform } from '@/web/support/user/inform/api'; import type { UserInformSchema } from '@fastgpt/global/support/user/inform/type'; import { formatTimeToChatTime } from '@fastgpt/global/common/string/time'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; -import MyIcon from '@fastgpt/web/components/common/Icon'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; import { useTranslation } from 'next-i18next'; @@ -15,7 +13,6 @@ const InformTable = () => { const { t } = useTranslation(); const theme = useTheme(); const { Loading } = useLoading(); - const { isPc } = useSystem(); const { data: informs, diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/components/ButtonEdge.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/components/ButtonEdge.tsx index 46e3765c4..680504959 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/components/ButtonEdge.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/components/ButtonEdge.tsx @@ -8,7 +8,7 @@ import { WorkflowContext } from '../../context'; import { useThrottleEffect } from 'ahooks'; const ButtonEdge = (props: EdgeProps) => { - const { nodes, nodeList, setEdges, workflowDebugData, hoverEdgeId } = useContextSelector( + const { nodes, nodeList, onEdgesChange, workflowDebugData, hoverEdgeId } = useContextSelector( WorkflowContext, (v) => v ); @@ -43,12 +43,14 @@ const ButtonEdge = (props: EdgeProps) => { const onDelConnect = useCallback( (id: string) => { - setEdges((state) => { - const newState = state.filter((item) => item.id !== id); - return newState; - }); + onEdgesChange([ + { + type: 'remove', + id + } + ]); }, - [setEdges] + [onEdgesChange] ); // Selected edge or source/target node selected diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx index e27d1994b..65db3e116 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/hooks/useWorkflow.tsx @@ -14,7 +14,7 @@ import { Rect, NodeRemoveChange, NodeSelectionChange, - Position + EdgeRemoveChange } from 'reactflow'; import { EDGE_TYPE, FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant'; import 'reactflow/dist/style.css'; @@ -276,6 +276,7 @@ export const useWorkflow = () => { const { isDowningCtrl } = useKeyboard(); const { setConnectingEdge, + edges, nodes, nodeList, onNodesChange, @@ -413,38 +414,29 @@ export const useWorkflow = () => { }); /* node */ - const handleRemoveNode = useMemoizedFn((change: NodeRemoveChange, node: Node) => { - if (node.data.forbidDelete) { - toast({ - status: 'warning', - title: t('common:core.workflow.Can not delete node') - }); - return false; - } - + const handleRemoveNode = useMemoizedFn((change: NodeRemoveChange, nodeId: string) => { // If the node has child nodes, remove the child nodes - const childNodes = nodes.filter((n) => n.data.parentNodeId === node.id); + const childNodes = nodes.filter((n) => n.data.parentNodeId === nodeId); if (childNodes.length > 0) { - const childNodeIds = childNodes.map((n) => n.id); - const childNodesChange = childNodes.map((node) => ({ - ...change, - id: node.id - })); - onNodesChange(childNodesChange); - setEdges((state) => - state.filter( - (edge) => - edge.source !== change.id && - edge.target !== change.id && - !childNodeIds.includes(edge.source) && - !childNodeIds.includes(edge.target) - ) + const childNodeIds = childNodes.map((node) => node.id); + const childEdges = edges.filter( + (edge) => childNodeIds.includes(edge.source) || childNodeIds.includes(edge.target) + ); + + onNodesChange( + childNodes.map((node) => ({ + type: 'remove', + id: node.id + })) + ); + onEdgesChange( + childEdges.map((edge) => ({ + type: 'remove', + id: edge.id + })) ); } - setEdges((state) => - state.filter((edge) => edge.source !== change.id && edge.target !== change.id) - ); onNodesChange([change]); return; @@ -516,9 +508,20 @@ export const useWorkflow = () => { for (const change of changes) { if (change.type === 'remove') { const node = nodes.find((n) => n.id === change.id); - // 如果删除失败,则不继续执行 - node && handleRemoveNode(change, node); - return; + if (!node) continue; + + const parentNodeDeleted = changes.find( + (c) => c.type === 'remove' && c.id === node?.data.parentNodeId + ); + // Forbidden delete && Parents are not deleted together + if (node.data.forbidDelete && !parentNodeDeleted) { + toast({ + status: 'warning', + title: t('common:core.workflow.Can not delete node') + }); + continue; + } + handleRemoveNode(change, node.id); } else if (change.type === 'select') { handleSelectNode(change); } else if (change.type === 'position') { @@ -529,8 +532,8 @@ export const useWorkflow = () => { } } - // default changes - onNodesChange(changes); + // Remove separately + onNodesChange(changes.filter((c) => c.type !== 'remove')); }); const handleEdgeChange = useCallback( diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeHttp/index.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeHttp/index.tsx index 673683508..2c50d3c3e 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeHttp/index.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeHttp/index.tsx @@ -257,7 +257,7 @@ export function RenderHttpProps({ appDetail, t }); - }, [nodeList, edges, inputs, t]); + }, [nodeId, nodeList, edges, appDetail, t]); const variableText = useMemo(() => { return variables diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeVariableUpdate.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeVariableUpdate.tsx index 9bd2eed8a..80b4e6c7b 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeVariableUpdate.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeVariableUpdate.tsx @@ -65,7 +65,7 @@ const NodeVariableUpdate = ({ data, selected }: NodeProps) => appDetail, t }); - }, [nodeList, edges, inputs, t]); + }, [nodeId, nodeList, edges, appDetail, t]); const updateList = useMemo( () => diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx index f8f47b8f4..78a6bcb91 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx @@ -25,7 +25,7 @@ const TextareaRender = ({ inputs = [], item, nodeId }: RenderInputProps) => { appDetail, t }); - }, [nodeList, edges, inputs, t]); + }, [nodeId, nodeList, edges, appDetail, t]); const onChange = useCallback( (e: string) => {