Skip to content

Commit 18e8882

Browse files
committed
Add a basic story for SimpleFormIteratorBase
1 parent 69bbd27 commit 18e8882

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import * as React from 'react';
2+
import fakeRestDataProvider from 'ra-data-fakerest';
3+
import { useWrappedSource } from '../../core/useWrappedSource';
4+
import { useFieldValue } from '../../util/useFieldValue';
5+
import { TestMemoryRouter } from '../../routing/TestMemoryRouter';
6+
import { Admin, DataTable, SimpleForm, TextInput } from '../../test-ui';
7+
import { Resource } from '../../core/Resource';
8+
import { ListBase } from '../list/ListBase';
9+
import { EditBase } from '../edit/EditBase';
10+
import { ArrayInputBase } from './ArrayInputBase';
11+
import { useArrayInput } from './useArrayInput';
12+
import { SimpleFormIteratorItemBase } from './SimpleFormIteratorItemBase';
13+
import { useSimpleFormIteratorItem } from './useSimpleFormIteratorItem';
14+
import { useSimpleFormIterator } from './useSimpleFormIterator';
15+
import {
16+
SimpleFormIteratorBase,
17+
SimpleFormIteratorBaseProps,
18+
} from './SimpleFormIteratorBase';
19+
import { useGetArrayInputNewItemDefaults } from './useGetArrayInputNewItemDefaults';
20+
import { useEvent } from '../../util';
21+
22+
export default { title: 'ra-core/controller/input/SimpleFormIteratorBase' };
23+
24+
const SimpleFormIterator = ({
25+
children,
26+
...props
27+
}: SimpleFormIteratorBaseProps) => {
28+
const { fields } = useArrayInput(props);
29+
// Get the parent source by passing an empty string as source
30+
const source = useWrappedSource('');
31+
const records = useFieldValue({ source });
32+
const getArrayInputNewItemDefaults =
33+
useGetArrayInputNewItemDefaults(fields);
34+
35+
const getItemDefaults = useEvent((item: any = undefined) => {
36+
if (item != null) return item;
37+
return getArrayInputNewItemDefaults(children);
38+
});
39+
return (
40+
<SimpleFormIteratorBase getItemDefaults={getItemDefaults} {...props}>
41+
<ul>
42+
{fields.map((member, index) => (
43+
<SimpleFormIteratorItemBase
44+
key={member.id}
45+
index={index}
46+
record={records[index]}
47+
>
48+
<li>
49+
{children}
50+
<RemoveItemButton />
51+
</li>
52+
</SimpleFormIteratorItemBase>
53+
))}
54+
</ul>
55+
<AddItemButton />
56+
</SimpleFormIteratorBase>
57+
);
58+
};
59+
60+
const RemoveItemButton = () => {
61+
const { remove } = useSimpleFormIteratorItem();
62+
return (
63+
<button type="button" onClick={() => remove()}>
64+
Remove
65+
</button>
66+
);
67+
};
68+
69+
const AddItemButton = () => {
70+
const { add } = useSimpleFormIterator();
71+
return (
72+
<button type="button" onClick={() => add()}>
73+
Add
74+
</button>
75+
);
76+
};
77+
78+
export const Basic = () => (
79+
<TestMemoryRouter initialEntries={['/posts/1']}>
80+
<Admin
81+
dataProvider={fakeRestDataProvider({
82+
posts: [
83+
{
84+
id: 1,
85+
title: 'Post 1',
86+
tags: [
87+
{ name: 'Tag 1', color: 'red' },
88+
{ name: 'Tag 2', color: 'blue' },
89+
],
90+
},
91+
{ id: 2, title: 'Post 2' },
92+
],
93+
})}
94+
>
95+
<Resource
96+
name="posts"
97+
list={
98+
<ListBase>
99+
<DataTable>
100+
<DataTable.Col source="title" />
101+
<DataTable.Col
102+
label="Tags"
103+
render={record =>
104+
record.tags
105+
? record.tags
106+
.map((tag: any) => tag.name)
107+
.join(', ')
108+
: ''
109+
}
110+
/>
111+
</DataTable>
112+
</ListBase>
113+
}
114+
edit={
115+
<EditBase>
116+
<SimpleForm>
117+
<TextInput source="title" />
118+
<div>
119+
<div>Tags:</div>
120+
<ArrayInputBase source="tags">
121+
<SimpleFormIterator>
122+
<TextInput source="name" />
123+
<TextInput source="color" />
124+
</SimpleFormIterator>
125+
</ArrayInputBase>
126+
</div>
127+
</SimpleForm>
128+
</EditBase>
129+
}
130+
/>
131+
</Admin>
132+
</TestMemoryRouter>
133+
);

0 commit comments

Comments
 (0)