Feat: Add return value widget to CodeForm #3221 (#7776)

### What problem does this PR solve?
Feat: Add return value widget  to CodeForm #3221

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu
2025-05-21 19:35:27 +08:00
committed by GitHub
parent 558b252c5a
commit ac2643700b
3 changed files with 135 additions and 61 deletions

View File

@ -1,6 +1,7 @@
import Editor, { loader } from '@monaco-editor/react';
import { INextOperatorForm } from '../../interface';
import { FormContainer } from '@/components/form-container';
import {
Form,
FormControl,
@ -9,11 +10,17 @@ import {
FormLabel,
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { RAGFlowSelect } from '@/components/ui/select';
import { CodeTemplateStrMap, ProgrammingLanguage } from '@/constants/agent';
import { ICodeForm } from '@/interfaces/database/flow';
import { useEffect } from 'react';
import { DynamicInputVariable } from './next-variable';
import { useTranslation } from 'react-i18next';
import {
DynamicInputVariable,
TypeOptions,
VariableTitle,
} from './next-variable';
loader.config({ paths: { vs: '/vs' } });
@ -24,6 +31,7 @@ const options = [
const CodeForm = ({ form, node }: INextOperatorForm) => {
const formData = node?.data.form as ICodeForm;
const { t } = useTranslation();
useEffect(() => {
// TODO: Direct operation zustand is more elegant
@ -35,42 +43,100 @@ const CodeForm = ({ form, node }: INextOperatorForm) => {
return (
<Form {...form}>
<DynamicInputVariable node={node}></DynamicInputVariable>
<FormField
control={form.control}
name="script"
render={({ field }) => (
<FormItem>
<FormLabel>
<form
className="p-5 space-y-5"
onSubmit={(e) => {
e.preventDefault();
}}
>
<DynamicInputVariable
node={node}
title={t('flow.input')}
></DynamicInputVariable>
<FormField
control={form.control}
name="script"
render={({ field }) => (
<FormItem>
<FormLabel className="flex items-center justify-between">
Code
<FormField
control={form.control}
name="lang"
render={({ field }) => (
<FormItem>
<FormControl>
<RAGFlowSelect {...field} options={options} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</FormLabel>
<FormControl>
<Editor
height={300}
theme="vs-dark"
language={formData.lang}
options={{
minimap: { enabled: false },
automaticLayout: true,
}}
{...field}
/>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
{formData.lang === ProgrammingLanguage.Python ? (
<DynamicInputVariable
node={node}
title={'Return Values'}
name={'return'}
></DynamicInputVariable>
) : (
<div>
<VariableTitle title={'Return Values'}></VariableTitle>
<FormContainer className="space-y-5">
<FormField
control={form.control}
name="lang"
name={'return.name'}
render={({ field }) => (
<FormItem>
<FormLabel>Name</FormLabel>
<FormControl>
<RAGFlowSelect {...field} options={options} />
<Input
{...field}
placeholder={t('common.pleaseInput')}
></Input>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</FormLabel>
<FormControl>
<Editor
height={600}
theme="vs-dark"
language={formData.lang}
options={{
minimap: { enabled: false },
automaticLayout: true,
}}
{...field}
<FormField
control={form.control}
name={`return.component_id`}
render={({ field }) => (
<FormItem className="flex-1">
<FormLabel>Type</FormLabel>
<FormControl>
<RAGFlowSelect
placeholder={t('common.pleaseSelect')}
options={TypeOptions}
{...field}
></RAGFlowSelect>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</FormControl>
<FormMessage />
</FormItem>
</FormContainer>
</div>
)}
/>
</form>
</Form>
);
};