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}