From d31de6513a7c892a9d8d959519adfb598dd791d0 Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 10 May 2023 16:49:05 +0200 Subject: [PATCH 1/2] Fix ReferenceField link function is called with referencing record --- .../src/field/ReferenceField.spec.tsx | 41 ++++++++++++++++ .../src/field/ReferenceField.tsx | 48 +++++++++---------- 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx b/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx index 8d6157771d6..9521011d0d4 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceField.spec.tsx @@ -572,6 +572,47 @@ describe('', () => { expect(screen.queryAllByRole('link')).toHaveLength(0); }); + it('should call the link function with the referenced record', async () => { + const dataProvider = testDataProvider({ + getMany: jest.fn().mockResolvedValue({ + data: [{ id: 123, title: 'foo' }], + }), + }); + const link = jest.fn().mockReturnValue('/posts/123'); + + render( + + + + + + + + + + ); + await waitFor(() => + expect(dataProvider.getMany).toHaveBeenCalledTimes(1) + ); + expect(screen.queryByRole('link')?.getAttribute('href')).toBe( + '#/posts/123' + ); + + expect(link).toHaveBeenCalledWith({ id: 123, title: 'foo' }, 'posts'); + }); + it('should accept multiple children', async () => { render(); expect(screen.findByText('9780393966473')).not.toBeNull(); diff --git a/packages/ra-ui-materialui/src/field/ReferenceField.tsx b/packages/ra-ui-materialui/src/field/ReferenceField.tsx index 2ea9283cab4..4b19e8a50e5 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceField.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceField.tsx @@ -120,24 +120,7 @@ export interface ReferenceFieldProps */ export const NonEmptyReferenceField: FC< Omit & { id: Identifier } -> = ({ children, id, record, reference, link, ...props }) => { - const createPath = useCreatePath(); - const resourceDefinition = useResourceDefinition({ resource: reference }); - - const resourceLinkPath = - link === false || - (link === 'edit' && !resourceDefinition.hasEdit) || - (link === 'show' && !resourceDefinition.hasShow) - ? false - : createPath({ - resource: reference, - id, - type: - typeof link === 'function' - ? link(record, reference) - : link, - }); - +> = ({ children, id, record, reference, ...props }) => { return ( {children} @@ -167,11 +149,13 @@ export const ReferenceFieldView: FC = props => { isLoading, reference, referenceRecord, - resourceLinkPath, + link, sx, } = props; const getRecordRepresentation = useGetRecordRepresentation(reference); const translate = useTranslate(); + const createPath = useCreatePath(); + const resourceDefinition = useResourceDefinition({ resource: reference }); if (error) { return ( @@ -194,6 +178,20 @@ export const ReferenceFieldView: FC = props => { ) : null; } + const resourceLinkPath = + link === false || + (link === 'edit' && !resourceDefinition.hasEdit) || + (link === 'show' && !resourceDefinition.hasShow) + ? false + : createPath({ + resource: reference, + id: referenceRecord.id, + type: + typeof link === 'function' + ? link(referenceRecord, reference) + : link, + }); + let child = children || ( {getRecordRepresentation(referenceRecord)} @@ -227,10 +225,12 @@ ReferenceFieldView.propTypes = { reference: PropTypes.string, referenceRecord: PropTypes.any, resource: PropTypes.string, - resourceLinkPath: PropTypes.oneOfType([ + // @ts-ignore + link: PropTypes.oneOfType([ PropTypes.string, - PropTypes.oneOf([false]), - ]) as React.Validator, + PropTypes.bool, + PropTypes.func, + ]), source: PropTypes.string, translateChoice: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]), }; @@ -242,7 +242,7 @@ export interface ReferenceFieldViewProps reference: string; resource?: string; translateChoice?: Function | boolean; - resourceLinkPath?: string | false; + link?: LinkToType; children?: ReactNode; sx?: SxProps; } From 8733b282bf7c484d11e314a9b5c812d78e0ffe4e Mon Sep 17 00:00:00 2001 From: Gildas Garcia <1122076+djhi@users.noreply.github.com> Date: Wed, 10 May 2023 17:12:21 +0200 Subject: [PATCH 2/2] Fix ReferenceOneField --- packages/ra-ui-materialui/src/field/ReferenceOneField.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ra-ui-materialui/src/field/ReferenceOneField.tsx b/packages/ra-ui-materialui/src/field/ReferenceOneField.tsx index c173e31d8d0..2e06aa6073a 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceOneField.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceOneField.tsx @@ -84,7 +84,7 @@ export const ReferenceOneField = ( isLoading={isLoading} isFetching={isFetching} referenceRecord={referenceRecord} - resourceLinkPath={resourceLinkPath} + link={resourceLinkPath} reference={reference} refetch={refetch} error={error}