From 28bc87c5e24ca0660fa5344c32a871e96862db0a Mon Sep 17 00:00:00 2001 From: chanx <1243304602@qq.com> Date: Tue, 9 Dec 2025 14:52:58 +0800 Subject: [PATCH] Feature: Memory interface integration testing (#11833) ### What problem does this PR solve? Feature: Memory interface integration testing ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/components/confirm-delete-dialog.tsx | 29 +- web/src/components/dynamic-form.tsx | 534 +++++++++--------- web/src/components/ragflow-form.tsx | 7 +- web/src/layouts/next-header.tsx | 1 + web/src/locales/en.ts | 31 +- .../configuration/common-item.tsx | 13 + .../dataset-setting/configuration/naive.tsx | 3 +- .../dataset/dataset-setting/form-schema.ts | 1 + .../pages/dataset/dataset-setting/index.tsx | 1 + .../dataset-setting/permission-form-field.tsx | 24 +- web/src/pages/memories/add-or-edit-modal.tsx | 39 +- web/src/pages/memories/constants/index.tsx | 22 +- web/src/pages/memories/hooks.ts | 20 +- web/src/pages/memories/index.tsx | 8 +- web/src/pages/memories/interface.ts | 20 +- web/src/pages/memories/memory-card.tsx | 2 +- web/src/pages/memories/memory-dropdown.tsx | 22 +- web/src/pages/memory/constant.tsx | 2 + .../pages/memory/hooks/use-memory-messages.ts | 59 -- .../pages/memory/hooks/use-memory-setting.ts | 26 +- web/src/pages/memory/memory-message/hook.ts | 128 +++++ web/src/pages/memory/memory-message/index.tsx | 2 +- .../pages/memory/memory-message/interface.ts | 5 + .../memory/memory-message/message-table.tsx | 167 +++++- .../memory-setting/advanced-settings-form.tsx | 159 ++++++ .../memory/memory-setting/basic-form.tsx | 53 ++ web/src/pages/memory/memory-setting/hook.ts | 42 ++ web/src/pages/memory/memory-setting/index.tsx | 113 +++- .../memory-setting/memory-model-form.tsx | 74 +++ web/src/pages/memory/sidebar/index.tsx | 21 +- web/src/services/memory-service.ts | 29 +- web/src/utils/api.ts | 12 +- 32 files changed, 1168 insertions(+), 501 deletions(-) delete mode 100644 web/src/pages/memory/hooks/use-memory-messages.ts create mode 100644 web/src/pages/memory/memory-message/hook.ts create mode 100644 web/src/pages/memory/memory-setting/advanced-settings-form.tsx create mode 100644 web/src/pages/memory/memory-setting/basic-form.tsx create mode 100644 web/src/pages/memory/memory-setting/hook.ts create mode 100644 web/src/pages/memory/memory-setting/memory-model-form.tsx diff --git a/web/src/components/confirm-delete-dialog.tsx b/web/src/components/confirm-delete-dialog.tsx index cc85e8153..22ac73fcb 100644 --- a/web/src/components/confirm-delete-dialog.tsx +++ b/web/src/components/confirm-delete-dialog.tsx @@ -45,7 +45,7 @@ export function ConfirmDeleteDialog({ const { t } = useTranslation(); if (hidden) { - return children; + return children || <>; } return ( @@ -54,7 +54,7 @@ export function ConfirmDeleteDialog({ open={open} defaultOpen={defaultOpen} > - {children} + {children && {children}} { e.stopPropagation(); @@ -109,23 +109,28 @@ export function ConfirmDeleteDialog({ export const ConfirmDeleteDialogNode = ({ avatar, name, + warnText, children, }: { avatar?: { avatar?: string; name?: string; isPerson?: boolean }; name?: string; + warnText?: string; children?: React.ReactNode; }) => { return ( -
- {avatar && ( - - )} - {name &&
{name}
} +
+
+ {avatar && ( + + )} + {name &&
{name}
} +
+ {warnText &&
{warnText}
} {children}
); diff --git a/web/src/components/dynamic-form.tsx b/web/src/components/dynamic-form.tsx index 2fdc55af0..2926f32b6 100644 --- a/web/src/components/dynamic-form.tsx +++ b/web/src/components/dynamic-form.tsx @@ -110,7 +110,7 @@ export interface DynamicFormRef { } // Generate Zod validation schema based on field configurations -const generateSchema = (fields: FormFieldConfig[]): ZodSchema => { +export const generateSchema = (fields: FormFieldConfig[]): ZodSchema => { const schema: Record = {}; const nestedSchemas: Record> = {}; @@ -311,6 +311,271 @@ const generateDefaultValues = ( return defaultValues as DefaultValues; }; +// Render form fields +export const RenderField = ({ + field, + labelClassName, +}: { + field: FormFieldConfig; + labelClassName?: string; +}) => { + const form = useFormContext(); + if (field.render) { + if (field.type === FormFieldType.Custom && field.hideLabel) { + return
{field.render({})}
; + } + return ( + + {(fieldProps) => { + const finalFieldProps = field.onChange + ? { + ...fieldProps, + onChange: (e: any) => { + fieldProps.onChange(e); + field.onChange?.(e.target?.value ?? e); + }, + } + : fieldProps; + return field.render?.(finalFieldProps); + }} + + ); + } + switch (field.type) { + case FormFieldType.Textarea: + return ( + + {(fieldProps) => { + const finalFieldProps = field.onChange + ? { + ...fieldProps, + onChange: (e: any) => { + fieldProps.onChange(e); + field.onChange?.(e.target.value); + }, + } + : fieldProps; + return ( +