Skip to content

Commit 7959357

Browse files
authored
Merge pull request #9275 from marmelab/fix-reference-array-field-not-support-query-options-next
Add queryOptions support for ReferenceArrayField
2 parents 41476f9 + bda5a40 commit 7959357

File tree

3 files changed

+56
-7
lines changed

3 files changed

+56
-7
lines changed

packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import { RaRecord, SortPayload } from '../../types';
44
import { useGetManyAggregate } from '../../dataProvider';
55
import { ListControllerResult, useList } from '../list';
66
import { useNotify } from '../../notification';
7+
import { UseQueryOptions } from 'react-query';
78

89
export interface UseReferenceArrayFieldControllerParams<
9-
RecordType extends RaRecord = RaRecord
10+
RecordType extends RaRecord = RaRecord,
11+
ReferenceRecordType extends RaRecord = RaRecord
1012
> {
1113
filter?: any;
1214
page?: number;
@@ -16,6 +18,7 @@ export interface UseReferenceArrayFieldControllerParams<
1618
resource: string;
1719
sort?: SortPayload;
1820
source: string;
21+
queryOptions?: UseQueryOptions<ReferenceRecordType[], Error>;
1922
}
2023

2124
const emptyArray = [];
@@ -49,7 +52,10 @@ export const useReferenceArrayFieldController = <
4952
RecordType extends RaRecord = RaRecord,
5053
ReferenceRecordType extends RaRecord = RaRecord
5154
>(
52-
props: UseReferenceArrayFieldControllerParams<RecordType>
55+
props: UseReferenceArrayFieldControllerParams<
56+
RecordType,
57+
ReferenceRecordType
58+
>
5359
): ListControllerResult => {
5460
const {
5561
filter = defaultFilter,
@@ -59,9 +65,11 @@ export const useReferenceArrayFieldController = <
5965
reference,
6066
sort = defaultSort,
6167
source,
68+
queryOptions = {},
6269
} = props;
6370
const notify = useNotify();
6471
const value = get(record, source);
72+
const { meta, ...otherQueryOptions } = queryOptions;
6573

6674
const ids = useMemo(() => {
6775
if (Array.isArray(value)) return value;
@@ -73,7 +81,7 @@ export const useReferenceArrayFieldController = <
7381
ReferenceRecordType
7482
>(
7583
reference,
76-
{ ids },
84+
{ ids, meta },
7785
{
7886
onError: error =>
7987
notify(
@@ -92,6 +100,7 @@ export const useReferenceArrayFieldController = <
92100
},
93101
}
94102
),
103+
...otherQueryOptions,
95104
}
96105
);
97106

packages/ra-ui-materialui/src/field/ReferenceArrayField.stories.tsx

+35-1
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ const fakeData = {
2020

2121
export default { title: 'ra-ui-materialui/fields/ReferenceArrayField' };
2222

23+
const dataProvider = fakeRestProvider(fakeData, false);
24+
2325
export const DifferentIdTypes = () => {
2426
return (
25-
<AdminContext dataProvider={fakeRestProvider(fakeData, false)}>
27+
<AdminContext dataProvider={dataProvider}>
2628
<CardContent>
2729
<Show resource="bands" id={1} sx={{ width: 600 }}>
2830
<TextField source="name" fullWidth />
@@ -41,3 +43,35 @@ export const DifferentIdTypes = () => {
4143
</AdminContext>
4244
);
4345
};
46+
47+
const dataProviderWithLog = {
48+
...dataProvider,
49+
getMany: (resource, params) => {
50+
console.log('getMany', resource, params);
51+
return dataProvider.getMany(resource, params);
52+
},
53+
} as any;
54+
55+
export const WithMeta = () => {
56+
return (
57+
<AdminContext dataProvider={dataProviderWithLog}>
58+
<CardContent>
59+
<Show resource="bands" id={1} sx={{ width: 600 }}>
60+
<TextField source="name" />
61+
<ReferenceArrayField
62+
source="members"
63+
reference="artists"
64+
queryOptions={{
65+
meta: { foo: 'bar' },
66+
}}
67+
>
68+
<Datagrid bulkActionButtons={false}>
69+
<TextField source="id" />
70+
<TextField source="name" />
71+
</Datagrid>
72+
</ReferenceArrayField>
73+
</Show>
74+
</CardContent>
75+
</AdminContext>
76+
);
77+
};

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { fieldPropTypes, FieldProps } from './types';
2020
import { LinearProgress } from '../layout';
2121
import { SingleFieldList } from '../list/SingleFieldList';
2222
import { ChipField } from './ChipField';
23+
import { UseQueryOptions } from 'react-query';
2324

2425
/**
2526
* A container component that fetches records from another resource specified
@@ -81,7 +82,7 @@ export const ReferenceArrayField = <
8182
RecordType extends RaRecord = RaRecord,
8283
ReferenceRecordType extends RaRecord = RaRecord
8384
>(
84-
props: ReferenceArrayFieldProps<RecordType>
85+
props: ReferenceArrayFieldProps<RecordType, ReferenceRecordType>
8586
) => {
8687
const {
8788
filter,
@@ -91,6 +92,7 @@ export const ReferenceArrayField = <
9192
resource,
9293
sort,
9394
source,
95+
queryOptions,
9496
} = props;
9597
const record = useRecordContext(props);
9698
const controllerProps = useReferenceArrayFieldController<
@@ -105,6 +107,7 @@ export const ReferenceArrayField = <
105107
resource,
106108
sort,
107109
source,
110+
queryOptions,
108111
});
109112
return (
110113
<ResourceContextProvider value={reference}>
@@ -126,10 +129,12 @@ ReferenceArrayField.propTypes = {
126129
sortBy: PropTypes.string,
127130
sortByOrder: fieldPropTypes.sortByOrder,
128131
source: PropTypes.string.isRequired,
132+
queryOptions: PropTypes.any,
129133
};
130134

131135
export interface ReferenceArrayFieldProps<
132-
RecordType extends RaRecord = RaRecord
136+
RecordType extends RaRecord = RaRecord,
137+
ReferenceRecordType extends RaRecord = RaRecord
133138
> extends FieldProps<RecordType> {
134139
children?: ReactNode;
135140
filter?: FilterPayload;
@@ -139,11 +144,12 @@ export interface ReferenceArrayFieldProps<
139144
reference: string;
140145
sort?: SortPayload;
141146
sx?: SxProps;
147+
queryOptions?: UseQueryOptions<ReferenceRecordType[], Error>;
142148
}
143149

144150
export interface ReferenceArrayFieldViewProps
145151
extends Omit<ReferenceArrayFieldProps, 'resource' | 'page' | 'perPage'>,
146-
ListControllerProps {}
152+
Omit<ListControllerProps, 'queryOptions'> {}
147153

148154
export const ReferenceArrayFieldView: FC<ReferenceArrayFieldViewProps> = props => {
149155
const { children, pagination, reference, className, sx } = props;

0 commit comments

Comments
 (0)