import { type ArrayFieldTemplateItemType, type ArrayFieldTemplateProps, type FormContextType, type RJSFSchema, type StrictRJSFSchema, getTemplate, getUiOptions, } from "@rjsf/utils"; import { cloneElement } from "react"; /** The `ArrayFieldTemplate` component is the template used to render all items in an array. * * @param props - The `ArrayFieldTemplateItemType` props for the component */ export default function ArrayFieldTemplate< T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any, >(props: ArrayFieldTemplateProps) { const { canAdd, className, disabled, idSchema, uiSchema, items, onAddClick, readonly, registry, required, schema, title, } = props; const uiOptions = getUiOptions(uiSchema); const ArrayFieldDescriptionTemplate = getTemplate<"ArrayFieldDescriptionTemplate", T, S, F>( "ArrayFieldDescriptionTemplate", registry, uiOptions, ); const ArrayFieldItemTemplate = getTemplate<"ArrayFieldItemTemplate", T, S, F>( "ArrayFieldItemTemplate", registry, uiOptions, ); const ArrayFieldTitleTemplate = getTemplate<"ArrayFieldTitleTemplate", T, S, F>( "ArrayFieldTitleTemplate", registry, uiOptions, ); // Button templates are not overridden in the uiSchema const { ButtonTemplates: { AddButton }, } = registry.templates; return (
{items && items.length > 0 && (
{items.map( ({ key, children, ...itemProps }: ArrayFieldTemplateItemType) => { const newChildren = cloneElement(children, { ...children.props, name: undefined, title: undefined, }); return ( ); }, )}
)} {canAdd && ( )}
); }