Skip to content

Commit 9169c90

Browse files
authored
Merge pull request #7825 from marmelab/7817-referenceInput-locale
Fix ReferenceInput generated label in FilterForm
2 parents 7296d9e + f06393a commit 9169c90

File tree

2 files changed

+88
-17
lines changed

2 files changed

+88
-17
lines changed

packages/ra-ui-materialui/src/list/filter/FilterForm.spec.tsx

+70-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import * as React from 'react';
22
import expect from 'expect';
33
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
4-
import { minLength } from 'ra-core';
4+
import {
5+
ListContext,
6+
minLength,
7+
ResourceContextProvider,
8+
testDataProvider,
9+
} from 'ra-core';
510

611
import {
712
FilterForm,
813
getFilterFormValues,
914
mergeInitialValuesWithDefaultValues,
1015
} from './FilterForm';
11-
import { TextInput } from '../../input';
16+
import { ReferenceInput, SelectInput, TextInput } from '../../input';
1217
import { AdminContext } from '../../AdminContext';
18+
import { Filter } from './Filter';
1319

1420
describe('<FilterForm />', () => {
1521
const defaultProps = {
@@ -86,6 +92,68 @@ describe('<FilterForm />', () => {
8692
};
8793
const setFilters = jest.fn();
8894

95+
render(
96+
<AdminContext>
97+
<FilterForm
98+
{...defaultProps}
99+
filters={filters}
100+
displayedFilters={displayedFilters}
101+
setFilters={setFilters}
102+
/>
103+
</AdminContext>
104+
);
105+
fireEvent.change(screen.queryByLabelText('Title') as HTMLElement, {
106+
target: { value: 'foo' },
107+
});
108+
await waitFor(() => {
109+
expect(setFilters).not.toHaveBeenCalled();
110+
});
111+
});
112+
113+
it('should provide ressource context for ReferenceInput filters', async () => {
114+
const defaultProps: any = {
115+
context: 'form',
116+
resource: 'comments',
117+
setFilters: jest.fn(),
118+
hideFilter: jest.fn(),
119+
showFilter: jest.fn(),
120+
displayedFilters: { post_id: true },
121+
};
122+
const dataProvider = testDataProvider({
123+
// @ts-ignore
124+
getList: () => Promise.resolve({ data: [], total: 0 }),
125+
});
126+
127+
render(
128+
<AdminContext dataProvider={dataProvider}>
129+
<ResourceContextProvider value="comments">
130+
<ListContext.Provider value={defaultProps}>
131+
<Filter>
132+
<ReferenceInput source="post_id" reference="posts">
133+
<SelectInput optionText="title" />
134+
</ReferenceInput>
135+
</Filter>
136+
</ListContext.Provider>
137+
</ResourceContextProvider>
138+
</AdminContext>
139+
);
140+
await waitFor(() => {
141+
expect(
142+
screen.getByText('resources.comments.fields.post_id')
143+
).not.toBeNull();
144+
});
145+
const filters = [
146+
<TextInput
147+
source="title"
148+
label="Title"
149+
validate={[minLength(5)]}
150+
/>,
151+
];
152+
const displayedFilters = {
153+
title: true,
154+
};
155+
const setFilters = jest.fn();
156+
89157
render(
90158
<AdminContext>
91159
<FilterForm

packages/ra-ui-materialui/src/list/filter/FilterForm.tsx

+18-15
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
import PropTypes from 'prop-types';
1010
import { styled } from '@mui/material/styles';
1111
import {
12+
LabelPrefixContextProvider,
1213
ListFilterContextValue,
1314
useListContext,
1415
useResourceContext,
@@ -118,21 +119,23 @@ export const FilterFormBase = (props: FilterFormBaseProps) => {
118119
);
119120

120121
return (
121-
<StyledForm
122-
className={className}
123-
{...sanitizeRestProps(rest)}
124-
onSubmit={handleSubmit}
125-
>
126-
{getShownFilters().map((filterElement: JSX.Element) => (
127-
<FilterFormInput
128-
key={filterElement.props.source}
129-
filterElement={filterElement}
130-
handleHide={handleHide}
131-
resource={resource}
132-
/>
133-
))}
134-
<div className={FilterFormClasses.clearFix} />
135-
</StyledForm>
122+
<LabelPrefixContextProvider prefix={`resources.${resource}.fields`}>
123+
<StyledForm
124+
className={className}
125+
{...sanitizeRestProps(rest)}
126+
onSubmit={handleSubmit}
127+
>
128+
{getShownFilters().map((filterElement: JSX.Element) => (
129+
<FilterFormInput
130+
key={filterElement.props.source}
131+
filterElement={filterElement}
132+
handleHide={handleHide}
133+
resource={resource}
134+
/>
135+
))}
136+
<div className={FilterFormClasses.clearFix} />
137+
</StyledForm>
138+
</LabelPrefixContextProvider>
136139
);
137140
};
138141

0 commit comments

Comments
 (0)