import { Box, CircularProgress, Paper, Typography } from '@mui/material'; import { IChangeEvent } from '@rjsf/core'; import Form from '@rjsf/mui'; import { ObjectFieldTemplateProps, RJSFSchema, RJSFValidationError } from '@rjsf/utils'; import validator from '@rjsf/validator-ajv8'; import { AgentFrameworkConfig } from '@services/agentInstance/promptConcat/promptConcatSchema'; import React, { useCallback, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { ErrorDisplay } from './components/ErrorDisplay'; import { ArrayItemProvider } from './context/ArrayItemContext'; import { useDefaultUiSchema } from './defaultUiSchema'; import { fields } from './fields'; import { ArrayFieldItemTemplate, ArrayFieldTemplate, FieldTemplate, ObjectFieldTemplate, RootObjectFieldTemplate } from './templates'; import { widgets } from './widgets'; /** * Extended form context that provides access to root form data * for conditional field logic and cross-field validation */ export interface ExtendedFormContext { rootFormData?: Record; } /** * Configuration for conditional field display logic * Used with ConditionalField to show/hide fields based on other field values */ export interface ConditionalFieldConfig { dependsOn: string; showWhen: string | string[]; hideWhen?: boolean; } interface PromptConfigFormProps { /** JSON Schema for form validation and generation */ schema?: RJSFSchema; /** UI schema for layout customization */ uiSchema?: Record; /** Initial form data */ formData?: AgentFrameworkConfig; /** Change handler for form data */ onChange?: (formData: AgentFrameworkConfig) => void; /** Error handler for form validation errors */ onError?: (errors: RJSFValidationError[]) => void; /** Whether the form is disabled */ disabled?: boolean; /** Whether to show loading indicator */ loading?: boolean; } /** * React JSON Schema Form component for prompt configuration * Uses custom templates and widgets for better styling and user experience */ export const PromptConfigForm: React.FC = ({ schema, uiSchema: uiSchemaOverride, formData, onChange, onError, disabled = false, loading = false, }) => { const { t } = useTranslation('agent'); const [validationErrors, setValidationErrors] = useState([]); const uiSchema = useDefaultUiSchema(uiSchemaOverride, schema); const templates = useMemo(() => { const rootObjectFieldTemplate = (props: ObjectFieldTemplateProps) => { const isRootLevel = props.fieldPathId?.$id === 'root'; return isRootLevel ? : ; }; return { ArrayFieldTemplate, ArrayFieldItemTemplate, FieldTemplate, ObjectFieldTemplate: rootObjectFieldTemplate, }; }, []); const handleError = useCallback((errors: RJSFValidationError[]) => { setValidationErrors(errors); onError?.(errors); }, [onError]); const handleChange = useCallback((changeEvent: IChangeEvent) => { const formData = changeEvent.formData; if (formData) { onChange?.(formData); } }, [onChange]); const formContext = useMemo((): ExtendedFormContext => ({ rootFormData: formData, }), [formData]); if (loading) { return ( ); } if (!schema || Object.keys(schema).length === 0) { return ( {t('Prompt.SchemaNotProvided')} {t('Prompt.SchemaNotProvidedDescription')} ); } return (
); };