Feat: Synchronize variable data to the outputs field
This commit is contained in:
parent
f33a0bd735
commit
6548b16b6c
5 changed files with 90 additions and 26 deletions
|
|
@ -4,45 +4,24 @@ import { FormLayout } from '@/constants/form';
|
||||||
import { zodResolver } from '@hookform/resolvers/zod';
|
import { zodResolver } from '@hookform/resolvers/zod';
|
||||||
import { memo } from 'react';
|
import { memo } from 'react';
|
||||||
import { useForm } from 'react-hook-form';
|
import { useForm } from 'react-hook-form';
|
||||||
import { z } from 'zod';
|
|
||||||
import { initialLoopValues } from '../../constant';
|
import { initialLoopValues } from '../../constant';
|
||||||
import { useFormValues } from '../../hooks/use-form-values';
|
|
||||||
import { useWatchFormChange } from '../../hooks/use-watch-form-change';
|
|
||||||
import { INextOperatorForm } from '../../interface';
|
import { INextOperatorForm } from '../../interface';
|
||||||
import { FormWrapper } from '../components/form-wrapper';
|
import { FormWrapper } from '../components/form-wrapper';
|
||||||
import { DynamicVariables } from './dynamic-variables';
|
import { DynamicVariables } from './dynamic-variables';
|
||||||
import { LoopTerminationCondition } from './loop-termination-condition';
|
import { LoopTerminationCondition } from './loop-termination-condition';
|
||||||
|
import { FormSchema, LoopFormSchemaType } from './schema';
|
||||||
const FormSchema = z.object({
|
import { useFormValues } from './use-values';
|
||||||
loop_variables: z.array(
|
import { useWatchFormChange } from './use-watch-form-change';
|
||||||
z.object({
|
|
||||||
variable: z.string().optional(),
|
|
||||||
type: z.string().optional(),
|
|
||||||
value: z.string().or(z.number()).or(z.boolean()).optional(),
|
|
||||||
input_mode: z.string(),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
logical_operator: z.string(),
|
|
||||||
loop_termination_condition: z.array(
|
|
||||||
z.object({
|
|
||||||
variable: z.string().optional(),
|
|
||||||
operator: z.string().optional(),
|
|
||||||
value: z.string().or(z.number()).or(z.boolean()).optional(),
|
|
||||||
input_mode: z.string().optional(),
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
maximum_loop_count: z.number(),
|
|
||||||
});
|
|
||||||
|
|
||||||
function LoopForm({ node }: INextOperatorForm) {
|
function LoopForm({ node }: INextOperatorForm) {
|
||||||
const defaultValues = useFormValues(initialLoopValues, node);
|
const defaultValues = useFormValues(initialLoopValues, node);
|
||||||
|
|
||||||
const form = useForm({
|
const form = useForm<LoopFormSchemaType>({
|
||||||
defaultValues: defaultValues,
|
defaultValues: defaultValues,
|
||||||
resolver: zodResolver(FormSchema),
|
resolver: zodResolver(FormSchema),
|
||||||
});
|
});
|
||||||
|
|
||||||
useWatchFormChange(node?.id, form, true);
|
useWatchFormChange(node?.id, form);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form {...form}>
|
<Form {...form}>
|
||||||
|
|
|
||||||
24
web/src/pages/agent/form/loop-form/schema.ts
Normal file
24
web/src/pages/agent/form/loop-form/schema.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
export const FormSchema = z.object({
|
||||||
|
loop_variables: z.array(
|
||||||
|
z.object({
|
||||||
|
variable: z.string().optional(),
|
||||||
|
type: z.string().optional(),
|
||||||
|
value: z.string().or(z.number()).or(z.boolean()).optional(),
|
||||||
|
input_mode: z.string(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
logical_operator: z.string(),
|
||||||
|
loop_termination_condition: z.array(
|
||||||
|
z.object({
|
||||||
|
variable: z.string().optional(),
|
||||||
|
operator: z.string().optional(),
|
||||||
|
value: z.string().or(z.number()).or(z.boolean()).optional(),
|
||||||
|
input_mode: z.string().optional(),
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
maximum_loop_count: z.number(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type LoopFormSchemaType = z.infer<typeof FormSchema>;
|
||||||
20
web/src/pages/agent/form/loop-form/use-values.ts
Normal file
20
web/src/pages/agent/form/loop-form/use-values.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
import { RAGFlowNodeType } from '@/interfaces/database/flow';
|
||||||
|
import { isEmpty, omit } from 'lodash';
|
||||||
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
|
export function useFormValues(
|
||||||
|
defaultValues: Record<string, any>,
|
||||||
|
node?: RAGFlowNodeType,
|
||||||
|
) {
|
||||||
|
const values = useMemo(() => {
|
||||||
|
const formData = node?.data?.form;
|
||||||
|
|
||||||
|
if (isEmpty(formData)) {
|
||||||
|
return omit(defaultValues, 'outputs');
|
||||||
|
}
|
||||||
|
|
||||||
|
return omit(formData, 'outputs');
|
||||||
|
}, [defaultValues, node?.data?.form]);
|
||||||
|
|
||||||
|
return values;
|
||||||
|
}
|
||||||
33
web/src/pages/agent/form/loop-form/use-watch-form-change.ts
Normal file
33
web/src/pages/agent/form/loop-form/use-watch-form-change.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
import { UseFormReturn, useWatch } from 'react-hook-form';
|
||||||
|
import { IOutputs } from '../../interface';
|
||||||
|
import useGraphStore from '../../store';
|
||||||
|
import { LoopFormSchemaType } from './schema';
|
||||||
|
|
||||||
|
export function useWatchFormChange(
|
||||||
|
id?: string,
|
||||||
|
form?: UseFormReturn<LoopFormSchemaType>,
|
||||||
|
) {
|
||||||
|
let values = useWatch({ control: form?.control });
|
||||||
|
const { replaceNodeForm } = useGraphStore((state) => state);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (id) {
|
||||||
|
let nextValues = {
|
||||||
|
...values,
|
||||||
|
outputs: values.loop_variables?.reduce((pre, cur) => {
|
||||||
|
const variable = cur.variable;
|
||||||
|
if (variable) {
|
||||||
|
pre[variable] = {
|
||||||
|
type: 'string',
|
||||||
|
value: '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return pre;
|
||||||
|
}, {} as IOutputs),
|
||||||
|
};
|
||||||
|
|
||||||
|
replaceNodeForm(id, nextValues);
|
||||||
|
}
|
||||||
|
}, [form?.formState.isDirty, id, replaceNodeForm, values]);
|
||||||
|
}
|
||||||
|
|
@ -41,3 +41,11 @@ export type IInputs = {
|
||||||
prologue: string;
|
prologue: string;
|
||||||
mode: string;
|
mode: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type IOutputs = Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
type?: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue