diff --git a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts index 5c326ccc34..86e44dced7 100644 --- a/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts +++ b/web/app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts @@ -10,7 +10,6 @@ import { import { API_PREFIX } from '@/config' import { syncWorkflowDraft } from '@/service/workflow' import { usePipelineRefreshDraft } from '.' -import { CUSTOM_DATA_SOURCE_EMPTY_NODE } from '@/app/components/workflow/nodes/data-source-empty/constants' export const useNodesSyncDraft = () => { const store = useStoreApi() @@ -25,7 +24,7 @@ export const useNodesSyncDraft = () => { transform, } = store.getState() const nodesOriginal = getNodes() - const nodes = nodesOriginal.filter(node => node.type !== CUSTOM_DATA_SOURCE_EMPTY_NODE) + const nodes = nodesOriginal.filter(node => !node.data._isTempNode) const [x, y, zoom] = transform const { pipelineId, diff --git a/web/app/components/rag-pipeline/utils/nodes.ts b/web/app/components/rag-pipeline/utils/nodes.ts index 5b1b811f89..7775a0c38b 100644 --- a/web/app/components/rag-pipeline/utils/nodes.ts +++ b/web/app/components/rag-pipeline/utils/nodes.ts @@ -9,11 +9,8 @@ import { CUSTOM_NODE } from '@/app/components/workflow/constants' export const processNodesWithoutDataSource = (nodes: Node[]) => { let leftNode - let hasNoteBySystem for (let i = 0; i < nodes.length; i++) { const node = nodes[i] - if (node.type === CUSTOM_NOTE_NODE && node.data.noteBySystem) - hasNoteBySystem = true if (node.data.type === BlockEnum.DataSource) return nodes @@ -34,38 +31,36 @@ export const processNodesWithoutDataSource = (nodes: Node[]) => { desc: '', type: BlockEnum.DataSourceEmpty, width: 240, + _isTempNode: true, }, position: { x: leftNode.position.x - 500, y: leftNode.position.y, }, }) - let newNoteNode - if (!hasNoteBySystem) { - newNoteNode = generateNewNode({ - id: 'note', - type: CUSTOM_NOTE_NODE, - data: { - title: '', - desc: '', - type: '' as any, - text: '{"root":{"children":[{"children":[{"detail":0,"format":1,"mode":"normal","style":"font-size: 14px;","text":"Get started with a blank pipeline","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":1,"textStyle":"font-size: 14px;"},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":1,"textStyle":""},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"A Knowledge Pipeline starts with Data Source as the starting node and ends with the knowledge base node. The general steps are: import documents from the data source → use extractor to extract document content → split and clean content into structured chunks → store in the knowledge base.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""},{"children":[{"children":[{"detail":0,"format":2,"mode":"normal","style":"","text":"Link to documentation","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"link","version":1,"textFormat":2,"rel":"noreferrer","target":null,"title":null,"url":"https://dify.ai"}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":2,"textStyle":""},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""}],"direction":"ltr","format":"","indent":0,"type":"root","version":1,"textFormat":1,"textStyle":"font-size: 14px;"}}', - theme: NoteTheme.blue, - author: '', - showAuthor: true, - width: 240, - height: 300, - noteBySystem: true, - } as NoteNodeType, - position: { - x: leftNode.position.x - 500, - y: leftNode.position.y + 100, - }, - }).newNode - } + const newNoteNode = generateNewNode({ + id: 'note', + type: CUSTOM_NOTE_NODE, + data: { + title: '', + desc: '', + type: '' as any, + text: '{"root":{"children":[{"children":[{"detail":0,"format":1,"mode":"normal","style":"font-size: 14px;","text":"Get started with a blank pipeline","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":1,"textStyle":"font-size: 14px;"},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":1,"textStyle":""},{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"A Knowledge Pipeline starts with Data Source as the starting node and ends with the knowledge base node. The general steps are: import documents from the data source → use extractor to extract document content → split and clean content into structured chunks → store in the knowledge base.","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""},{"children":[{"children":[{"detail":0,"format":2,"mode":"normal","style":"","text":"Link to documentation","type":"text","version":1}],"direction":"ltr","format":"","indent":0,"type":"link","version":1,"textFormat":2,"rel":"noreferrer","target":"_blank","title":null,"url":"https://dify.ai"}],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":2,"textStyle":""},{"children":[],"direction":"ltr","format":"","indent":0,"type":"paragraph","version":1,"textFormat":0,"textStyle":""}],"direction":"ltr","format":"","indent":0,"type":"root","version":1,"textFormat":1,"textStyle":"font-size: 14px;"}}', + theme: NoteTheme.blue, + author: '', + showAuthor: true, + width: 240, + height: 300, + _isTempNode: true, + } as NoteNodeType, + position: { + x: leftNode.position.x - 500, + y: leftNode.position.y + 100, + }, + }).newNode return [ newNode, - ...(newNoteNode ? [newNoteNode] : []), + newNoteNode, ...nodes, ] } diff --git a/web/app/components/workflow/nodes/data-source-empty/hooks.ts b/web/app/components/workflow/nodes/data-source-empty/hooks.ts index 71ad4e857d..13c4c8b56b 100644 --- a/web/app/components/workflow/nodes/data-source-empty/hooks.ts +++ b/web/app/components/workflow/nodes/data-source-empty/hooks.ts @@ -38,7 +38,10 @@ export const useReplaceDataSourceNode = (id: string) => { const newNodes = produce(nodes, (draft) => { draft[emptyNodeIndex] = newNode }) - setNodes(newNodes) + const newNodesWithoutTempNodes = produce(newNodes, (draft) => { + return draft.filter(node => !node.data._isTempNode) + }) + setNodes(newNodesWithoutTempNodes) }, []) return { diff --git a/web/app/components/workflow/note-node/index.tsx b/web/app/components/workflow/note-node/index.tsx index 8ba842ecbe..7f2cde42d6 100644 --- a/web/app/components/workflow/note-node/index.tsx +++ b/web/app/components/workflow/note-node/index.tsx @@ -77,22 +77,27 @@ const NoteNode = ({ <> - } - minWidth={240} - minHeight={88} - /> + { + !data._isTempNode && ( + } + minWidth={240} + minHeight={88} + /> + ) + }
{ - data.selected && ( + data.selected && !data._isTempNode && (
= { _waitingRun?: boolean _retryIndex?: number _dataSourceStartToAdd?: boolean - noteBySystem?: boolean + _isTempNode?: boolean isInIteration?: boolean iteration_id?: string selected?: boolean