diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx index 64da1a4c4a2..8ebeff9af4c 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.spec.tsx @@ -7,7 +7,7 @@ import { waitFor, } from '@testing-library/react'; import expect from 'expect'; -import { testDataProvider } from 'ra-core'; +import { FormDataConsumer, testDataProvider } from 'ra-core'; import { AdminContext } from '../../AdminContext'; import { SimpleForm } from '../../form'; @@ -704,4 +704,42 @@ describe('', () => { screen.queryAllByText('Custom Remove Button').length ).toBeGreaterThan(0); }); + + it('should not add an empty property when using FormDataConsumer as child', async () => { + const save = jest.fn(); + render( + + + + + + + {({ scopedFormData, getSource }) => + scopedFormData && scopedFormData.name ? ( + string)('role')} + /> + ) : null + } + + + + + + ); + + const addItemElement = screen + .getByText('ra.action.add') + .closest('button') as HTMLButtonElement; + + fireEvent.click(addItemElement); + fireEvent.click(screen.getByText('ra.action.save')); + await waitFor(() => { + expect(save).toHaveBeenCalledWith({ + emails: [{ email: '' }], + }); + }); + }); }); diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx index f0872cb6558..4a778973952 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx @@ -13,7 +13,7 @@ import { styled } from '@mui/material'; import clsx from 'clsx'; import get from 'lodash/get'; import PropTypes from 'prop-types'; -import { RaRecord, useRecordContext } from 'ra-core'; +import { FormDataConsumer, RaRecord, useRecordContext } from 'ra-core'; import { UseFieldArrayReturn } from 'react-hook-form'; import { useArrayInput } from './useArrayInput'; @@ -61,7 +61,10 @@ export const SimpleFormIterator = (props: SimpleFormIteratorProps) => { if (item == null) { defaultValue = {} as Record; Children.forEach(children, input => { - if (React.isValidElement(input)) { + if ( + React.isValidElement(input) && + input.type !== FormDataConsumer + ) { defaultValue[input.props.source] = input.props.defaultValue ?? ''; }