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) => {