import { FormContextType, ObjectFieldTemplatePropertyType, ObjectFieldTemplateProps, RJSFSchema, StrictRJSFSchema, canExpand, descriptionId, getTemplate, getUiOptions, titleId, buttonId, } from '@rjsf/utils'; /** The `ObjectFieldTemplate` is the template to use to render all the inner properties of an object along with the * title and description if available. If the object is expandable, then an `AddButton` is also rendered after all * the properties. * * @param props - The `ObjectFieldTemplateProps` for this component */ export default function ObjectFieldTemplate< T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any, >(props: ObjectFieldTemplateProps) { const { className, description, disabled, formData, fieldPathId, onAddProperty, optionalDataControl, properties, readonly, registry, required, schema, title, uiSchema, } = props; const options = getUiOptions(uiSchema); const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>('TitleFieldTemplate', registry, options); const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>( 'DescriptionFieldTemplate', registry, options, ); // For "pure union" schemas (oneOf/anyOf without properties), skip rendering the empty fieldset wrapper. // The AnyOfField/OneOfField will handle rendering the union selector and selected variant's content directly. const isPureUnionSchema = (schema.oneOf || schema.anyOf) && !schema.properties && properties.length === 0; if (isPureUnionSchema) { return null; } const showOptionalDataControlInTitle = !readonly && !disabled; // Button templates are not overridden in the uiSchema const { ButtonTemplates: { AddButton }, } = registry.templates; return (
{title && ( )} {description && ( )} {!showOptionalDataControlInTitle ? optionalDataControl : undefined} {properties.map((prop: ObjectFieldTemplatePropertyType) => prop.content)} {canExpand(schema, uiSchema, formData) && ( )}
); }