diff --git a/web/app/components/workflow/nodes/_base/components/before-run-form/index.tsx b/web/app/components/workflow/nodes/_base/components/before-run-form/index.tsx index ad8d0b9c61..2259eb4c0a 100644 --- a/web/app/components/workflow/nodes/_base/components/before-run-form/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/before-run-form/index.tsx @@ -24,7 +24,7 @@ import SpecialResultPanel from '@/app/components/workflow/run/special-result-pan const i18nPrefix = 'workflow.singleRun' -type BeforeRunFormProps = { +export type BeforeRunFormProps = { nodeName: string nodeType?: BlockEnum toolIcon?: string | Emoji @@ -139,7 +139,7 @@ const BeforeRunForm: FC = ({ onRun(submitData) }, [forms, onRun, t]) return ( -
+
diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx index fdf3f6b4b7..a92432fe78 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx @@ -6,6 +6,7 @@ import { cloneElement, memo, useCallback, + useRef, useState, } from 'react' import { @@ -49,6 +50,9 @@ import { useStore as useAppStore } from '@/app/components/app/store' import { useStore } from '@/app/components/workflow/store' import Tab, { TabType } from './tab' import LastRun from './last-run' +import useOneStepRun from '../../hooks/use-one-step-run' +import type { PanelExposedType } from '@/types/workflow' +import BeforeRunForm from '../before-run-form' type BasePanelProps = { children: ReactNode @@ -105,8 +109,30 @@ const BasePanel: FC = ({ saveStateToHistory(WorkflowHistoryEvent.NodeDescriptionChange) }, [handleNodeDataUpdateWithSyncDraft, id, saveStateToHistory]) + const isSupportSingleRun = canRunBySingle(data.type) + const { + isShowSingleRun, + showSingleRun, + hideSingleRun, + toVarInputs, + runningStatus, + handleRun, + handleStop, + runInputData, + setRunInputData, + runResult, + getInputVars, + } = useOneStepRun({ + id, + data, + defaultRunInputData: {}, + }) + const childPanelRef = useRef(null) + const [singleRunParams, setSingleRunParams] = useState(undefined) + const [tabType, setTabType] = useState(TabType.settings) const hasLastRunData = true // TODO: add disabled logic + return (
= ({ />
{ - canRunBySingle(data.type) && !nodesReadOnly && ( + isSupportSingleRun && !nodesReadOnly && ( = ({
{ - handleNodeDataUpdate({ id, data: { _isSingleRun: true } }) + if (!childPanelRef.current?.singleRunParams) { + // handleNodeDataUpdate({ id, data: { _isSingleRun: true } }) + console.error('childPanelRef is not set') + return + } + setSingleRunParams(childPanelRef.current?.singleRunParams) + showSingleRun() handleSyncWorkflowDraft(true) }} > @@ -185,7 +217,7 @@ const BasePanel: FC = ({ {tabType === TabType.settings && ( <>
- {cloneElement(children as any, { id, data })} + {cloneElement(children as any, { id, data, ref: childPanelRef })}
{ @@ -223,6 +255,21 @@ const BasePanel: FC = ({ {tabType === TabType.lastRun && ( )} + + { + isShowSingleRun && ( + xxx
} + /> + ) + }
) diff --git a/web/app/components/workflow/nodes/agent/panel.tsx b/web/app/components/workflow/nodes/agent/panel.tsx index da87312a90..d5f4a3ff02 100644 --- a/web/app/components/workflow/nodes/agent/panel.tsx +++ b/web/app/components/workflow/nodes/agent/panel.tsx @@ -1,5 +1,4 @@ -import type { FC } from 'react' -import { memo, useMemo } from 'react' +import { forwardRef, memo, useImperativeHandle, useMemo } from 'react' import type { NodePanelProps } from '../../types' import { AgentFeature, type AgentNodeType } from './types' import Field from '../_base/components/field' @@ -9,8 +8,6 @@ import { useTranslation } from 'react-i18next' import OutputVars, { VarItem } from '../_base/components/output-vars' import type { StrategyParamItem } from '@/app/components/plugins/types' import type { CredentialFormSchema } from '@/app/components/header/account-setting/model-provider-page/declarations' -import BeforeRunForm from '@/app/components/workflow/nodes/_base/components/before-run-form' -import ResultPanel from '@/app/components/workflow/run/result-panel' import formatTracing from '@/app/components/workflow/run/utils/format-log' import { useLogs } from '@/app/components/workflow/run/hooks' import type { Props as FormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form/form' @@ -18,7 +15,7 @@ import { toType } from '@/app/components/tools/utils/to-form-schema' import { useStore } from '../../store' import Split from '../_base/components/split' import MemoryConfig from '../_base/components/memory-config' - +import type { PanelExposedType } from '@/types/workflow' const i18nPrefix = 'workflow.nodes.agent' export function strategyParamToCredientialForm(param: StrategyParamItem): CredentialFormSchema { @@ -30,7 +27,7 @@ export function strategyParamToCredientialForm(param: StrategyParamItem): Creden } } -const AgentPanel: FC> = (props) => { +const AgentPanel = forwardRef>((props, ref) => { const { inputs, setInputs, @@ -41,11 +38,6 @@ const AgentPanel: FC> = (props) => { availableNodesWithParent, availableVars, readOnly, - isShowSingleRun, - hideSingleRun, - runningStatus, - handleRun, - handleStop, runResult, runInputData, setRunInputData, @@ -79,6 +71,13 @@ const AgentPanel: FC> = (props) => { const resetEditor = useStore(s => s.setControlPromptEditorRerenderKey) + useImperativeHandle(ref, () => ({ + singleRunParams: { + forms: singleRunForms, + logsParams, + }, + })) + return
> = (props) => { ))}
- { - isShowSingleRun && ( - } - /> - ) - }
-} +}) AgentPanel.displayName = 'AgentPanel' diff --git a/web/types/workflow.ts b/web/types/workflow.ts index 43af64e5ca..f275539ff0 100644 --- a/web/types/workflow.ts +++ b/web/types/workflow.ts @@ -2,6 +2,8 @@ import type { Viewport } from 'reactflow' import type { BlockEnum, ConversationVariable, Edge, EnvironmentVariable, Node } from '@/app/components/workflow/types' import type { TransferMethod } from '@/types/app' import type { ErrorHandleTypeEnum } from '@/app/components/workflow/nodes/_base/components/error-handle/types' +import type { BeforeRunFormProps } from '@/app/components/workflow/nodes/_base/components/before-run-form' +import type { SpecialResultPanelProps } from '@/app/components/workflow/run/special-result-panel' export type AgentLogItem = { node_execution_id: string, @@ -351,3 +353,7 @@ export type UpdateWorkflowParams = { title: string releaseNotes: string } + +export type PanelExposedType = { + singleRunParams: Pick & Partial +}