mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-22 20:37:48 +00:00
4.8.11 test (#2850)
* fix: variables check * remove log * fix: variables refresh * perf: team select button * perf: remove change fn
This commit is contained in:
@@ -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 (
|
||||
<Button
|
||||
variant={'whitePrimary'}
|
||||
userSelect={'none'}
|
||||
w={'100%'}
|
||||
display={'block'}
|
||||
h={'34px'}
|
||||
px={3}
|
||||
css={{
|
||||
'& span': {
|
||||
display: 'block'
|
||||
}
|
||||
}}
|
||||
transform={'none !important'}
|
||||
onClick={() => {
|
||||
if (feConfigs.isPlus) {
|
||||
onOpen();
|
||||
} else {
|
||||
toast({
|
||||
status: 'warning',
|
||||
title: t('common:common.system.Commercial version function')
|
||||
});
|
||||
}
|
||||
}}
|
||||
>
|
||||
<MyTooltip label={t('common:user.team.Select Team')}>
|
||||
<Flex w={'100%'} alignItems={'center'}>
|
||||
{userInfo?.team ? (
|
||||
<>
|
||||
<Avatar src={userInfo.team.avatar} w={'1rem'} />
|
||||
<Box ml={2}>{userInfo.team.teamName}</Box>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Box w={'8px'} h={'8px'} mr={3} borderRadius={'50%'} bg={'#67c13b'} />
|
||||
{t('common:user.team.Personal Team')}
|
||||
</>
|
||||
)}
|
||||
</Flex>
|
||||
</MyTooltip>
|
||||
<>
|
||||
<Button
|
||||
variant={'whitePrimary'}
|
||||
userSelect={'none'}
|
||||
w={'100%'}
|
||||
h={'34px'}
|
||||
justifyContent={'space-between'}
|
||||
px={3}
|
||||
css={{
|
||||
'& span': {
|
||||
display: 'block'
|
||||
}
|
||||
}}
|
||||
transform={'none !important'}
|
||||
rightIcon={<MyIcon w={'1rem'} name={'common/select'} />}
|
||||
onClick={() => {
|
||||
if (feConfigs.isPlus) {
|
||||
onOpen();
|
||||
} else {
|
||||
toast({
|
||||
status: 'warning',
|
||||
title: t('common:common.system.Commercial version function')
|
||||
});
|
||||
}
|
||||
}}
|
||||
>
|
||||
<MyTooltip label={t('common:user.team.Select Team')}>
|
||||
<Flex w={'100%'} alignItems={'center'}>
|
||||
{userInfo?.team ? (
|
||||
<>
|
||||
<Avatar src={userInfo.team.avatar} w={'1rem'} />
|
||||
<Box ml={2}>{userInfo.team.teamName}</Box>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Box w={'8px'} h={'8px'} mr={3} borderRadius={'50%'} bg={'#67c13b'} />
|
||||
{t('common:user.team.Personal Team')}
|
||||
</>
|
||||
)}
|
||||
</Flex>
|
||||
</MyTooltip>
|
||||
</Button>
|
||||
{isOpen && <TeamManageModal onClose={onClose} />}
|
||||
</Button>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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
|
||||
|
@@ -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<NodeRemoveChange>((node) => ({
|
||||
type: 'remove',
|
||||
id: node.id
|
||||
}))
|
||||
);
|
||||
onEdgesChange(
|
||||
childEdges.map<EdgeRemoveChange>((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(
|
||||
|
@@ -257,7 +257,7 @@ export function RenderHttpProps({
|
||||
appDetail,
|
||||
t
|
||||
});
|
||||
}, [nodeList, edges, inputs, t]);
|
||||
}, [nodeId, nodeList, edges, appDetail, t]);
|
||||
|
||||
const variableText = useMemo(() => {
|
||||
return variables
|
||||
|
@@ -65,7 +65,7 @@ const NodeVariableUpdate = ({ data, selected }: NodeProps<FlowNodeItemType>) =>
|
||||
appDetail,
|
||||
t
|
||||
});
|
||||
}, [nodeList, edges, inputs, t]);
|
||||
}, [nodeId, nodeList, edges, appDetail, t]);
|
||||
|
||||
const updateList = useMemo(
|
||||
() =>
|
||||
|
@@ -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) => {
|
||||
|
Reference in New Issue
Block a user