Skip to content

Commit 74f923b

Browse files
committed
Add InPlaceEditor input
1 parent a99880b commit 74f923b

File tree

3 files changed

+434
-0
lines changed

3 files changed

+434
-0
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
import * as React from 'react';
2+
import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
3+
import { createTheme, ThemeProvider, Typography } from '@mui/material';
4+
import {
5+
ResourceContextProvider,
6+
DataProviderContext,
7+
I18nContextProvider,
8+
ShowBase,
9+
TestMemoryRouter,
10+
NotificationContextProvider,
11+
UndoableMutationsContextProvider,
12+
} from 'ra-core';
13+
import fakeRestDataProvider from 'ra-data-fakerest';
14+
import polyglotI18nProvider from 'ra-i18n-polyglot';
15+
import englishMessages from 'ra-language-english';
16+
17+
import { InPlaceEditor } from './InPlaceEditor';
18+
import { SelectInput } from '../SelectInput';
19+
import { SelectField, TextField } from '../../field';
20+
import { Notification } from '../../layout';
21+
22+
export default {
23+
title: 'ra-ui-materialui/input/InPlaceEditor',
24+
};
25+
26+
const i18nProvider = polyglotI18nProvider(() => englishMessages, 'en');
27+
28+
const Wrapper = ({ children, dataProvider }) => (
29+
<TestMemoryRouter>
30+
<QueryClientProvider client={new QueryClient()}>
31+
<DataProviderContext.Provider value={dataProvider}>
32+
<UndoableMutationsContextProvider>
33+
<I18nContextProvider value={i18nProvider}>
34+
<ThemeProvider theme={createTheme()}>
35+
<NotificationContextProvider>
36+
<ResourceContextProvider value="users">
37+
<ShowBase id={1}>{children}</ShowBase>
38+
<Notification />
39+
</ResourceContextProvider>
40+
</NotificationContextProvider>
41+
</ThemeProvider>
42+
</I18nContextProvider>
43+
</UndoableMutationsContextProvider>
44+
</DataProviderContext.Provider>
45+
</QueryClientProvider>
46+
</TestMemoryRouter>
47+
);
48+
49+
export const Basic = ({
50+
delay,
51+
updateFails,
52+
mutationMode,
53+
notifyOnSuccess,
54+
}) => {
55+
const dataProvider = fakeRestDataProvider(
56+
{
57+
users: [
58+
{ id: 1, name: 'John Doe', age: 25 },
59+
{ id: 2, name: 'Jane Doe', age: 30 },
60+
],
61+
},
62+
process.env.NODE_ENV !== 'test'
63+
);
64+
const sometimesFailsDataProvider = {
65+
...dataProvider,
66+
update: async (resource, params) => {
67+
return new Promise((resolve, reject) => {
68+
setTimeout(() => {
69+
if (updateFails) {
70+
reject(new Error('Server error'));
71+
} else {
72+
resolve(dataProvider.update(resource, params));
73+
}
74+
}, delay);
75+
}) as any;
76+
},
77+
};
78+
79+
return (
80+
<Wrapper dataProvider={sometimesFailsDataProvider}>
81+
<Typography color="secondary">Text above</Typography>
82+
<InPlaceEditor
83+
source="name"
84+
mutationMode={mutationMode}
85+
notifyOnSuccess={notifyOnSuccess}
86+
/>
87+
<Typography color="secondary">Text below</Typography>
88+
</Wrapper>
89+
);
90+
};
91+
92+
Basic.args = {
93+
delay: 500,
94+
updateFails: false,
95+
mutationMode: 'pessimistic',
96+
notifyOnSuccess: false,
97+
};
98+
Basic.argTypes = {
99+
delay: { control: { type: 'number' } },
100+
updateFails: { control: { type: 'boolean' } },
101+
mutationMode: {
102+
control: { type: 'select' },
103+
options: ['optimistic', 'pessimistic', 'undoable'],
104+
},
105+
notifyOnSuccess: { control: { type: 'boolean' } },
106+
};
107+
108+
export const SX = () => {
109+
const dataProvider = fakeRestDataProvider(
110+
{
111+
users: [{ id: 1, name: 'John Doe', age: 25 }],
112+
},
113+
process.env.NODE_ENV !== 'test'
114+
);
115+
return (
116+
<Wrapper dataProvider={dataProvider}>
117+
<InPlaceEditor
118+
source="name"
119+
sx={{
120+
fontSize: '1.5rem',
121+
fontWeight: 'bold',
122+
color: 'primary.main',
123+
marginTop: '1rem',
124+
marginLeft: '1rem',
125+
}}
126+
/>
127+
</Wrapper>
128+
);
129+
};
130+
131+
export const Children = () => {
132+
const dataProvider = fakeRestDataProvider(
133+
{
134+
users: [{ id: 1, name: 'John Doe', age: 25 }],
135+
},
136+
process.env.NODE_ENV !== 'test'
137+
);
138+
return (
139+
<Wrapper dataProvider={dataProvider}>
140+
<InPlaceEditor source="age">
141+
<TextField source="age" variant="body1" />{' '}
142+
<Typography component="span">years old</Typography>
143+
</InPlaceEditor>
144+
</Wrapper>
145+
);
146+
};
147+
148+
export const Editor = () => {
149+
const dataProvider = fakeRestDataProvider(
150+
{
151+
users: [{ id: 1, name: 'John Doe', type: 'prospect' }],
152+
},
153+
process.env.NODE_ENV !== 'test'
154+
);
155+
return (
156+
<Wrapper dataProvider={dataProvider}>
157+
<InPlaceEditor
158+
source="type"
159+
editor={
160+
<SelectInput
161+
source="type"
162+
choices={[
163+
{ id: 'prospect', name: 'Prospect' },
164+
{ id: 'customer', name: 'Customer' },
165+
]}
166+
size="small"
167+
margin="none"
168+
label={false}
169+
variant="standard"
170+
autoFocus
171+
SelectProps={{ defaultOpen: true }}
172+
helperText={false}
173+
sx={{ '& .MuiInput-root': { marginTop: 0 } }}
174+
/>
175+
}
176+
>
177+
<SelectField
178+
source="type"
179+
choices={[
180+
{ id: 'prospect', name: 'Prospect' },
181+
{ id: 'customer', name: 'Customer' },
182+
]}
183+
variant="body1"
184+
sx={{ marginTop: '1px' }}
185+
component="div"
186+
/>
187+
</InPlaceEditor>
188+
</Wrapper>
189+
);
190+
};

0 commit comments

Comments
 (0)