Skip to content

Commit 8f3096b

Browse files
committed
Add offline support to reference components
1 parent f88c509 commit 8f3096b

File tree

2 files changed

+58
-20
lines changed

2 files changed

+58
-20
lines changed

packages/ra-ui-materialui/src/field/ReferenceManyCount.tsx

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { ReactNode } from 'react';
22
import {
33
useReferenceManyFieldController,
44
useRecordContext,
@@ -37,6 +37,7 @@ export const ReferenceManyCount = <RecordType extends RaRecord = RaRecord>(
3737
filter,
3838
sort,
3939
link,
40+
offline,
4041
resource,
4142
source = 'id',
4243
timeout = 1000,
@@ -46,31 +47,44 @@ export const ReferenceManyCount = <RecordType extends RaRecord = RaRecord>(
4647
const oneSecondHasPassed = useTimeout(timeout);
4748
const createPath = useCreatePath();
4849

49-
const { isPending, error, total } =
50+
const { isPaused, isPending, error, total } =
5051
useReferenceManyFieldController<RecordType>({
5152
filter,
5253
sort,
5354
page: 1,
5455
perPage: 1,
5556
record,
5657
reference,
57-
// @ts-ignore remove when #8491 is released
5858
resource,
5959
source,
6060
target,
6161
});
6262

63-
const body = isPending ? (
64-
oneSecondHasPassed ? (
65-
<CircularProgress size={14} />
66-
) : (
67-
''
68-
)
69-
) : error ? (
70-
<ErrorIcon color="error" fontSize="small" titleAccess="error" />
71-
) : (
72-
total
73-
);
63+
let body: ReactNode = total;
64+
65+
if (isPaused && total == null) {
66+
body = offline ?? (
67+
<ErrorIcon
68+
color="error"
69+
fontSize="small"
70+
titleAccess="ra.notification.offline"
71+
/>
72+
);
73+
}
74+
75+
if (isPending && !isPaused && oneSecondHasPassed) {
76+
body = <CircularProgress size={14} />;
77+
}
78+
79+
if (error) {
80+
body = (
81+
<ErrorIcon
82+
color="error"
83+
fontSize="small"
84+
titleAccess={error.message}
85+
/>
86+
);
87+
}
7488

7589
return link && record ? (
7690
<Link
@@ -104,6 +118,7 @@ ReferenceManyCount.textAlign = 'right';
104118
export interface ReferenceManyCountProps<RecordType extends RaRecord = RaRecord>
105119
extends Omit<FieldProps<RecordType>, 'source'>,
106120
Omit<TypographyProps, 'textAlign'> {
121+
offline?: ReactNode;
107122
reference: string;
108123
source?: string;
109124
target: string;

packages/ra-ui-materialui/src/field/ReferenceOneField.tsx

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { ReactElement, ReactNode, useMemo } from 'react';
1+
import React, { ReactNode, useMemo } from 'react';
22
import { UseQueryOptions } from '@tanstack/react-query';
33
import { Typography } from '@mui/material';
44
import {
@@ -40,6 +40,7 @@ export const ReferenceOneField = <
4040
source = 'id',
4141
target,
4242
emptyText,
43+
offline: offlineProp = 'ra-references.single_offline',
4344
sort,
4445
filter,
4546
link,
@@ -83,11 +84,32 @@ export const ReferenceOneField = <
8384
emptyText
8485
) : null;
8586

86-
return !record ||
87+
const offline =
88+
typeof offlineProp === 'string' ? (
89+
<Typography component="span" variant="body2">
90+
{offlineProp && translate(offlineProp, { _: offlineProp })}
91+
</Typography>
92+
) : offlineProp ? (
93+
offlineProp
94+
) : null;
95+
96+
if (
97+
!record ||
8798
(!controllerProps.isPending &&
88-
controllerProps.referenceRecord == null) ? (
89-
empty
90-
) : (
99+
!controllerProps.isPaused &&
100+
controllerProps.referenceRecord == null)
101+
) {
102+
return empty;
103+
}
104+
105+
if (
106+
!record ||
107+
(controllerProps.isPaused && controllerProps.referenceRecord == null)
108+
) {
109+
return offline;
110+
}
111+
112+
return (
91113
<ResourceContextProvider value={reference}>
92114
<ReferenceFieldContextProvider value={context}>
93115
<RecordContextProvider value={context.referenceRecord}>
@@ -111,7 +133,8 @@ export interface ReferenceOneFieldProps<
111133
source?: string;
112134
filter?: any;
113135
link?: LinkToType<ReferenceRecordType>;
114-
emptyText?: string | ReactElement;
136+
emptyText?: ReactNode;
137+
offline?: ReactNode;
115138
queryOptions?: Omit<
116139
UseQueryOptions<{
117140
data: ReferenceRecordType[];

0 commit comments

Comments
 (0)