|
|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
'use client'
|
|
|
|
|
import type { FC } from 'react'
|
|
|
|
|
import React from 'react'
|
|
|
|
|
import React, { useMemo } from 'react'
|
|
|
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
|
import {
|
|
|
|
|
RiCloseLine,
|
|
|
|
|
@ -21,6 +21,7 @@ import type { BlockEnum } from '@/app/components/workflow/types'
|
|
|
|
|
import type { Emoji } from '@/app/components/tools/types'
|
|
|
|
|
import type { SpecialResultPanelProps } from '@/app/components/workflow/run/special-result-panel'
|
|
|
|
|
import SpecialResultPanel from '@/app/components/workflow/run/special-result-panel'
|
|
|
|
|
import { useWorkflowStore } from '@/app/components/workflow/store'
|
|
|
|
|
|
|
|
|
|
const i18nPrefix = 'workflow.singleRun'
|
|
|
|
|
|
|
|
|
|
@ -72,6 +73,61 @@ const BeforeRunForm: FC<BeforeRunFormProps> = ({
|
|
|
|
|
...restResultPanelParams
|
|
|
|
|
}) => {
|
|
|
|
|
const { t } = useTranslation()
|
|
|
|
|
console.log(forms)
|
|
|
|
|
|
|
|
|
|
const workflowStore = useWorkflowStore()
|
|
|
|
|
const {
|
|
|
|
|
getInspectVar,
|
|
|
|
|
} = workflowStore.getState()
|
|
|
|
|
|
|
|
|
|
const existVarValuesInForms = useMemo(() => {
|
|
|
|
|
const valuesArr = forms.map((form) => {
|
|
|
|
|
const values: Record<string, any> = {}
|
|
|
|
|
form.inputs.forEach(({ variable }) => {
|
|
|
|
|
// #nodeId.path1?.path2?...# => [nodeId, path1]
|
|
|
|
|
// TODO: conversation vars and envs
|
|
|
|
|
const selector = variable.slice(1, -1).split('.')
|
|
|
|
|
const [nodeId, varName] = selector.slice(0, 2)
|
|
|
|
|
const inspectVarValue = getInspectVar(nodeId, varName)
|
|
|
|
|
if (inspectVarValue !== undefined) {
|
|
|
|
|
const subPathArr = selector.slice(2)
|
|
|
|
|
if (subPathArr.length > 0) {
|
|
|
|
|
let current = inspectVarValue.value
|
|
|
|
|
let invalid = false
|
|
|
|
|
subPathArr.forEach((subPath) => {
|
|
|
|
|
if (invalid)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if (current && typeof current === 'object' && subPath in current) {
|
|
|
|
|
current = current[subPath]
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
invalid = true
|
|
|
|
|
})
|
|
|
|
|
values[variable] = current
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
values[variable] = inspectVarValue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
return values
|
|
|
|
|
})
|
|
|
|
|
return valuesArr
|
|
|
|
|
}, [forms, getInspectVar])
|
|
|
|
|
|
|
|
|
|
const filteredExistVarForms = useMemo(() => {
|
|
|
|
|
const res = forms.map((form, i) => {
|
|
|
|
|
const existVarValuesInForm = existVarValuesInForms[i]
|
|
|
|
|
const newForm = { ...form }
|
|
|
|
|
const inputs = form.inputs.filter((input) => {
|
|
|
|
|
return !(input.variable in existVarValuesInForm)
|
|
|
|
|
})
|
|
|
|
|
newForm.inputs = inputs
|
|
|
|
|
return newForm
|
|
|
|
|
}).filter(form => form.inputs.length > 0)
|
|
|
|
|
return res
|
|
|
|
|
}, [forms, existVarValuesInForms])
|
|
|
|
|
|
|
|
|
|
const isFinished = runningStatus === NodeRunningStatus.Succeeded || runningStatus === NodeRunningStatus.Failed || runningStatus === NodeRunningStatus.Exception
|
|
|
|
|
const isRunning = runningStatus === NodeRunningStatus.Running
|
|
|
|
|
@ -89,10 +145,12 @@ const BeforeRunForm: FC<BeforeRunFormProps> = ({
|
|
|
|
|
})()
|
|
|
|
|
const handleRun = () => {
|
|
|
|
|
let errMsg = ''
|
|
|
|
|
forms.forEach((form) => {
|
|
|
|
|
forms.forEach((form, i) => {
|
|
|
|
|
const existVarValuesInForm = existVarValuesInForms[i]
|
|
|
|
|
|
|
|
|
|
form.inputs.forEach((input) => {
|
|
|
|
|
const value = form.values[input.variable] as any
|
|
|
|
|
if (!errMsg && input.required && (value === '' || value === undefined || value === null || (input.type === InputVarType.files && value.length === 0)))
|
|
|
|
|
if (!errMsg && input.required && !(input.variable in existVarValuesInForm) && (value === '' || value === undefined || value === null || (input.type === InputVarType.files && value.length === 0)))
|
|
|
|
|
errMsg = t('workflow.errorMsg.fieldRequired', { field: typeof input.label === 'object' ? input.label.variable : input.label })
|
|
|
|
|
|
|
|
|
|
if (!errMsg && (input.type === InputVarType.singleFile || input.type === InputVarType.multiFiles) && value) {
|
|
|
|
|
@ -117,8 +175,15 @@ const BeforeRunForm: FC<BeforeRunFormProps> = ({
|
|
|
|
|
|
|
|
|
|
const submitData: Record<string, any> = {}
|
|
|
|
|
let parseErrorJsonField = ''
|
|
|
|
|
forms.forEach((form) => {
|
|
|
|
|
forms.forEach((form, i) => {
|
|
|
|
|
const existVarValuesInForm = existVarValuesInForms[i]
|
|
|
|
|
|
|
|
|
|
form.inputs.forEach((input) => {
|
|
|
|
|
if (input.variable in existVarValuesInForm) {
|
|
|
|
|
// TODO: if is the big value, should fetch value from server
|
|
|
|
|
submitData[input.variable] = existVarValuesInForm[input.variable]
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
const value = formatValue(form.values[input.variable], input.type)
|
|
|
|
|
submitData[input.variable] = value
|
|
|
|
|
@ -162,7 +227,7 @@ const BeforeRunForm: FC<BeforeRunFormProps> = ({
|
|
|
|
|
!showSpecialResultPanel && (
|
|
|
|
|
<div className='h-0 grow overflow-y-auto pb-4'>
|
|
|
|
|
<div className='mt-3 space-y-4 px-4'>
|
|
|
|
|
{forms.map((form, index) => (
|
|
|
|
|
{filteredExistVarForms.map((form, index) => (
|
|
|
|
|
<div key={index}>
|
|
|
|
|
<Form
|
|
|
|
|
key={index}
|
|
|
|
|
|