|
1 | 1 | import * as React from 'react'; |
2 | | -import { FormDataConsumer, required, ResourceContextProvider } from 'ra-core'; |
| 2 | +import { |
| 3 | + FilterLiveForm, |
| 4 | + FormDataConsumer, |
| 5 | + required, |
| 6 | + ResourceContextProvider, |
| 7 | + useListContext, |
| 8 | +} from 'ra-core'; |
3 | 9 | import fakeRestDataProvider from 'ra-data-fakerest'; |
4 | 10 | import { AdminContext } from '../AdminContext'; |
5 | | -import { AutocompleteInput, ReferenceInput, TextInput } from '../input'; |
| 11 | +import { |
| 12 | + ArrayInput, |
| 13 | + AutocompleteInput, |
| 14 | + ReferenceInput, |
| 15 | + SelectInput, |
| 16 | + SimpleFormIterator, |
| 17 | + TextInput, |
| 18 | +} from '../input'; |
6 | 19 | import { SimpleForm } from './SimpleForm'; |
7 | 20 | import { Create } from '../detail'; |
| 21 | +import { Datagrid, List } from '../list'; |
| 22 | +import { TextField } from '../field'; |
8 | 23 |
|
9 | 24 | // We keep this test in ra-ui-materialui because we need heavy components to reproduce the issue https://github.com/marmelab/react-admin/issues/10415 |
10 | 25 | export default { title: 'ra-core/form/FormDataConsumer' }; |
@@ -49,6 +64,85 @@ export const Basic = () => ( |
49 | 64 | </AdminContext> |
50 | 65 | ); |
51 | 66 |
|
| 67 | +const config = { |
| 68 | + name: { |
| 69 | + operators: [ |
| 70 | + { id: 'eq', name: 'Equals' }, |
| 71 | + { id: 'ne', name: 'Not equals' }, |
| 72 | + ], |
| 73 | + }, |
| 74 | + id: { |
| 75 | + operators: [ |
| 76 | + { id: 'eq', name: 'Equals' }, |
| 77 | + { id: 'ne', name: 'Not equals' }, |
| 78 | + ], |
| 79 | + }, |
| 80 | +}; |
| 81 | + |
| 82 | +const StackedFiltersForm = () => ( |
| 83 | + <FilterLiveForm> |
| 84 | + <ArrayInput source="filters"> |
| 85 | + <SimpleFormIterator inline disableReordering disableClear> |
| 86 | + <AutocompleteInput |
| 87 | + source="source" |
| 88 | + choices={[ |
| 89 | + { id: 'name', name: 'Name' }, |
| 90 | + { id: 'id', name: 'Id' }, |
| 91 | + ]} |
| 92 | + /> |
| 93 | + <FormDataConsumer> |
| 94 | + {({ scopedFormData }) => { |
| 95 | + if (!scopedFormData) return null; |
| 96 | + const source = scopedFormData.source; |
| 97 | + const operators = config[source]?.operators ?? []; |
| 98 | + return ( |
| 99 | + <SelectInput |
| 100 | + source="operator" |
| 101 | + choices={operators} |
| 102 | + disabled={!operators.length} |
| 103 | + /> |
| 104 | + ); |
| 105 | + }} |
| 106 | + </FormDataConsumer> |
| 107 | + <FormDataConsumer> |
| 108 | + {({ scopedFormData }) => { |
| 109 | + if (!scopedFormData) return null; |
| 110 | + const source = scopedFormData.source; |
| 111 | + const operators = config[source]?.operators ?? []; |
| 112 | + return ( |
| 113 | + <TextInput |
| 114 | + helperText={false} |
| 115 | + source="value" |
| 116 | + disabled={!operators.length} |
| 117 | + /> |
| 118 | + ); |
| 119 | + }} |
| 120 | + </FormDataConsumer> |
| 121 | + </SimpleFormIterator> |
| 122 | + </ArrayInput> |
| 123 | + </FilterLiveForm> |
| 124 | +); |
| 125 | + |
| 126 | +const FiltersDebugger = () => { |
| 127 | + const { filterValues } = useListContext(); |
| 128 | + return <pre>{JSON.stringify(filterValues, null, 2)}</pre>; |
| 129 | +}; |
| 130 | + |
| 131 | +export const StackedFilters = () => ( |
| 132 | + <AdminContext dataProvider={dataProvider}> |
| 133 | + <ResourceContextProvider value="users"> |
| 134 | + <List> |
| 135 | + <StackedFiltersForm /> |
| 136 | + <FiltersDebugger /> |
| 137 | + <Datagrid> |
| 138 | + <TextField source="id" /> |
| 139 | + <TextField source="name" /> |
| 140 | + </Datagrid> |
| 141 | + </List> |
| 142 | + </ResourceContextProvider> |
| 143 | + </AdminContext> |
| 144 | +); |
| 145 | + |
52 | 146 | const dataProvider = fakeRestDataProvider({ |
53 | 147 | users: [ |
54 | 148 | { |
|
0 commit comments