-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Copy pathReferenceOneField.tsx
108 lines (100 loc) · 2.84 KB
/
ReferenceOneField.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import React, { ReactNode } from 'react';
import PropTypes from 'prop-types';
import { Typography } from '@mui/material';
import {
useReferenceOneFieldController,
useRecordContext,
ResourceContextProvider,
LinkToType,
useCreatePath,
useTranslate,
} from 'ra-core';
import { PublicFieldProps, fieldPropTypes, InjectedFieldProps } from './types';
import { ReferenceFieldView } from './ReferenceField';
/**
* Render the related record in a one-to-one relationship
*
* Expects a single field as child
*
* @example // display the bio of the current author
* <ReferenceOneField reference="bios" target="author_id">
* <TextField source="body" />
* </ReferenceOneField>
*/
export const ReferenceOneField = (props: ReferenceOneFieldProps) => {
const {
children,
reference,
source,
target,
emptyText,
link = false,
} = props;
const record = useRecordContext(props);
const createPath = useCreatePath();
const translate = useTranslate();
const {
isLoading,
isFetching,
referenceRecord,
error,
refetch,
} = useReferenceOneFieldController({
record,
reference,
source,
target,
});
const resourceLinkPath =
link === false
? false
: createPath({
resource: reference,
id: referenceRecord?.id,
type:
typeof link === 'function'
? link(record, reference)
: link,
});
return !record || (!isLoading && referenceRecord == null) ? (
emptyText ? (
<Typography component="span" variant="body2">
{emptyText && translate(emptyText, { _: emptyText })}
</Typography>
) : null
) : (
<ResourceContextProvider value={reference}>
<ReferenceFieldView
isLoading={isLoading}
isFetching={isFetching}
referenceRecord={referenceRecord}
resourceLinkPath={resourceLinkPath}
reference={reference}
refetch={refetch}
error={error}
>
{children}
</ReferenceFieldView>
</ResourceContextProvider>
);
};
export interface ReferenceOneFieldProps
extends PublicFieldProps,
InjectedFieldProps {
children?: ReactNode;
reference: string;
target: string;
link?: LinkToType;
}
ReferenceOneField.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
label: fieldPropTypes.label,
record: PropTypes.any,
reference: PropTypes.string.isRequired,
source: PropTypes.string.isRequired,
target: PropTypes.string.isRequired,
};
ReferenceOneField.defaultProps = {
source: 'id',
};