diff --git a/web/app/components/workflow/header/editing-title.tsx b/web/app/components/workflow/header/editing-title.tsx
index 6cff4d99a..44a85631d 100644
--- a/web/app/components/workflow/header/editing-title.tsx
+++ b/web/app/components/workflow/header/editing-title.tsx
@@ -10,6 +10,7 @@ const EditingTitle = () => {
const { formatTimeFromNow } = useWorkflow()
const draftUpdatedAt = useStore(state => state.draftUpdatedAt)
const publishedAt = useStore(state => state.publishedAt)
+ const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft)
return (
@@ -26,6 +27,14 @@ const EditingTitle = () => {
? `${t('workflow.common.published')} ${formatTimeFromNow(publishedAt)}`
: t('workflow.common.unpublished')
}
+ {
+ isSyncingWorkflowDraft && (
+ <>
+ ·
+ {t('workflow.common.syncingData')}
+ >
+ )
+ }
)
}
diff --git a/web/app/components/workflow/hooks/use-workflow-interactions.ts b/web/app/components/workflow/hooks/use-workflow-interactions.ts
index 5d5e98146..e110d7c44 100644
--- a/web/app/components/workflow/hooks/use-workflow-interactions.ts
+++ b/web/app/components/workflow/hooks/use-workflow-interactions.ts
@@ -57,11 +57,13 @@ export const useWorkflowUpdate = () => {
const {
appId,
setSyncWorkflowDraftHash,
+ setIsSyncingWorkflowDraft,
} = workflowStore.getState()
+ setIsSyncingWorkflowDraft(true)
fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => {
handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdator)
setSyncWorkflowDraftHash(response.hash)
- })
+ }).finally(() => setIsSyncingWorkflowDraft(false))
}, [handleUpdateWorkflowCanvas, workflowStore])
return {
diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx
index 882ed2f3a..e9ae8dd84 100644
--- a/web/app/components/workflow/index.tsx
+++ b/web/app/components/workflow/index.tsx
@@ -55,6 +55,7 @@ import HelpLine from './help-line'
import CandidateNode from './candidate-node'
import PanelContextmenu from './panel-contextmenu'
import NodeContextmenu from './node-contextmenu'
+import SyncingDataModal from './syncing-data-modal'
import {
useStore,
useWorkflowStore,
@@ -99,7 +100,10 @@ const Workflow: FC = memo(({
const controlMode = useStore(s => s.controlMode)
const nodeAnimation = useStore(s => s.nodeAnimation)
const showConfirm = useStore(s => s.showConfirm)
- const { setShowConfirm } = workflowStore.getState()
+ const {
+ setShowConfirm,
+ setControlPromptEditorRerenderKey,
+ } = workflowStore.getState()
const {
handleSyncWorkflowDraft,
syncWorkflowDraftWhenPageClose,
@@ -113,6 +117,7 @@ const Workflow: FC = memo(({
if (v.type === WORKFLOW_DATA_UPDATE) {
setNodes(v.payload.nodes)
setEdges(v.payload.edges)
+ setTimeout(() => setControlPromptEditorRerenderKey(Date.now()))
}
})
@@ -135,7 +140,7 @@ const Workflow: FC = memo(({
if (document.visibilityState === 'hidden')
syncWorkflowDraftWhenPageClose()
else if (document.visibilityState === 'visible')
- handleRefreshWorkflowDraft()
+ setTimeout(() => handleRefreshWorkflowDraft(), 500)
}, [syncWorkflowDraftWhenPageClose, handleRefreshWorkflowDraft])
useEffect(() => {
@@ -223,6 +228,7 @@ const Workflow: FC = memo(({
`}
ref={workflowContainerRef}
>
+
diff --git a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
index 6c354c0a2..1f14c0e85 100644
--- a/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
+++ b/web/app/components/workflow/nodes/_base/components/prompt/editor.tsx
@@ -27,6 +27,7 @@ import TooltipPlus from '@/app/components/base/tooltip-plus'
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars'
import Switch from '@/app/components/base/switch'
import { Jinja } from '@/app/components/base/icons/src/vender/workflow'
+import { useStore } from '@/app/components/workflow/store'
type Props = {
className?: string
@@ -82,6 +83,7 @@ const Editor: FC = ({
}) => {
const { t } = useTranslation()
const { eventEmitter } = useEventEmitterContextContext()
+ const controlPromptEditorRerenderKey = useStore(s => s.controlPromptEditorRerenderKey)
const isShowHistory = !isChatModel && isChatApp
@@ -173,6 +175,7 @@ const Editor: FC = ({
? (
void
+ isSyncingWorkflowDraft: boolean
+ setIsSyncingWorkflowDraft: (isSyncingWorkflowDraft: boolean) => void
+ controlPromptEditorRerenderKey: number
+ setControlPromptEditorRerenderKey: (controlPromptEditorRerenderKey: number) => void
}
export const createWorkflowStore = () => {
@@ -209,6 +213,10 @@ export const createWorkflowStore = () => {
setConnectingNodePayload: connectingNodePayload => set(() => ({ connectingNodePayload })),
enteringNodePayload: undefined,
setEnteringNodePayload: enteringNodePayload => set(() => ({ enteringNodePayload })),
+ isSyncingWorkflowDraft: false,
+ setIsSyncingWorkflowDraft: isSyncingWorkflowDraft => set(() => ({ isSyncingWorkflowDraft })),
+ controlPromptEditorRerenderKey: 0,
+ setControlPromptEditorRerenderKey: controlPromptEditorRerenderKey => set(() => ({ controlPromptEditorRerenderKey })),
}))
}
diff --git a/web/app/components/workflow/syncing-data-modal.tsx b/web/app/components/workflow/syncing-data-modal.tsx
new file mode 100644
index 000000000..fe3843d2f
--- /dev/null
+++ b/web/app/components/workflow/syncing-data-modal.tsx
@@ -0,0 +1,15 @@
+import { useStore } from './store'
+
+const SyncingDataModal = () => {
+ const isSyncingWorkflowDraft = useStore(s => s.isSyncingWorkflowDraft)
+
+ if (!isSyncingWorkflowDraft)
+ return null
+
+ return (
+
+
+ )
+}
+
+export default SyncingDataModal
diff --git a/web/i18n/en-US/workflow.ts b/web/i18n/en-US/workflow.ts
index 82e2cca04..9ac975f8a 100644
--- a/web/i18n/en-US/workflow.ts
+++ b/web/i18n/en-US/workflow.ts
@@ -67,6 +67,7 @@ const translation = {
manageInTools: 'Manage in Tools',
workflowAsToolTip: 'Tool reconfiguration is required after the workflow update.',
viewDetailInTracingPanel: 'View details',
+ syncingData: 'Syncing data, just a few seconds.',
},
errorMsg: {
fieldRequired: '{{field}} is required',
diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts
index e384f590f..83b933bc8 100644
--- a/web/i18n/zh-Hans/workflow.ts
+++ b/web/i18n/zh-Hans/workflow.ts
@@ -67,6 +67,7 @@ const translation = {
manageInTools: '访问工具页',
workflowAsToolTip: '工作流更新后需要重新配置工具参数',
viewDetailInTracingPanel: '查看详细信息',
+ syncingData: '同步数据中,只需几秒钟。',
},
errorMsg: {
fieldRequired: '{{field}} 不能为空',