Skip to content

Commit c4e4dd5

Browse files
authored
Merge pull request #438 from rvsia/muiFieldArray
fix(mui): add default field array
2 parents 0757ac4 + b5989f9 commit c4e4dd5

File tree

13 files changed

+1136
-66
lines changed

13 files changed

+1136
-66
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
const arraySchemaDDF = {
2+
title: 'FieldArray',
3+
fields: [
4+
{
5+
component: 'field-array',
6+
name: 'nicePeople',
7+
fieldKey: 'field_array',
8+
label: 'Nice people',
9+
description: 'This allow you to add nice people to the list dynamically',
10+
defaultItem: { name: 'enter a name', lastName: 'enter a last name' },
11+
fields: [
12+
{
13+
component: 'text-field',
14+
name: 'name',
15+
label: 'Name',
16+
placeholder: 'Borek',
17+
isRequired: true,
18+
validate: [
19+
{
20+
type: 'required'
21+
}
22+
]
23+
},
24+
{
25+
component: 'text-field',
26+
name: 'lastName',
27+
label: 'Last Name',
28+
placeholder: 'Stavitel'
29+
}
30+
]
31+
},
32+
{
33+
component: 'field-array',
34+
name: 'minItems',
35+
label: 'A list with a minimal number of items',
36+
validate: [{ type: 'min-items', threshold: 3 }],
37+
fields: [
38+
{
39+
component: 'text-field',
40+
label: 'Item'
41+
}
42+
]
43+
},
44+
{
45+
component: 'field-array',
46+
name: 'number',
47+
defaultItem: 5,
48+
label: 'Default value with initialValues set',
49+
fields: [
50+
{
51+
component: 'text-field',
52+
label: 'Item',
53+
type: 'number'
54+
}
55+
]
56+
},
57+
{
58+
component: 'field-array',
59+
name: 'minMax',
60+
minItems: 4,
61+
maxItems: 6,
62+
label: 'Min 4 item, max 6 items without validators',
63+
fields: [
64+
{
65+
component: 'text-field',
66+
isRequired: true,
67+
validate: [
68+
{
69+
type: 'required'
70+
}
71+
]
72+
}
73+
]
74+
}
75+
]
76+
};
77+
78+
export default arraySchemaDDF;
Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,58 @@
1-
/* eslint-disable */
2-
import React from "react";
3-
import ReactDOM from "react-dom";
1+
import React, { useState } from 'react';
2+
import ReactDOM from 'react-dom';
43
import FormRenderer, { componentTypes } from '@data-driven-forms/react-form-renderer';
54

65
import Grid from '@material-ui/core/Grid';
7-
import { componentMapper, FormTemplate } from '../src'
6+
import { componentMapper, FormTemplate } from '../src';
87
import { createMuiTheme } from '@material-ui/core/styles';
98
import { ThemeProvider } from '@material-ui/styles';
109
import Typography from '@material-ui/core/Typography';
1110
import demoSchema from '@data-driven-forms/common/src/demoschema';
11+
import fieldArraySchema from './demo-schemas/field-array-schema';
12+
13+
import Button from '@material-ui/core/Button';
1214

1315
const theme = createMuiTheme({
14-
typography: {
15-
useNextVariants: true,
16-
},
17-
});
16+
typography: {
17+
useNextVariants: true
18+
}
19+
});
1820

1921
const compositeMapper = {
20-
...componentMapper,
21-
[componentTypes.SWITCH]: {
22-
component: componentMapper[componentTypes.SWITCH],
23-
FormControlLabelProps: {
24-
labelPlacement: 'end'
25-
}
22+
...componentMapper,
23+
[componentTypes.SWITCH]: {
24+
component: componentMapper[componentTypes.SWITCH],
25+
FormControlLabelProps: {
26+
labelPlacement: 'end'
2627
}
27-
}
28-
28+
}
29+
};
2930

30-
const schema = {
31-
fields: [{
32-
component: 'switch',
33-
name: 'foo',
34-
label: 'Foo'
35-
}, {
36-
component: 'text-field',
37-
name: 'bar',
38-
label: 'bar',
39-
condition: {
40-
when: 'foo',
41-
is: true
42-
}
43-
}]
44-
}
31+
const App = () => {
32+
const [schema, setSchema] = useState(fieldArraySchema);
4533

46-
const App = () => (
47-
<ThemeProvider theme={ theme }>
48-
<Grid
49-
container
50-
spacing={4}
51-
justify="center"
52-
alignItems="center"
53-
>
54-
<Grid item xs={12}>
55-
<Typography variant="h3" >Material UI component mapper</Typography>
56-
</Grid>
57-
<Grid item xs={12}>
58-
<FormRenderer
59-
onSubmit={console.log}
60-
componentMapper={compositeMapper}
61-
FormTemplate={props => <FormTemplate {...props} />}
62-
schema={schema}
63-
onCancel={() => console.log('canceling')}
64-
/>
65-
</Grid>
34+
return (
35+
<ThemeProvider theme={theme}>
36+
<Grid container spacing={4} justify="center" alignItems="center">
37+
<Grid item xs={12}>
38+
<Typography variant="h3">Material UI component mapper</Typography>
39+
</Grid>
40+
<Grid item xs={12}>
41+
<Button onClick={() => setSchema(demoSchema)}>Demo schema</Button>
42+
<Button onClick={() => setSchema(fieldArraySchema)}>Field array</Button>
43+
</Grid>
44+
<Grid item xs={12}>
45+
<FormRenderer
46+
onSubmit={console.log}
47+
componentMapper={compositeMapper}
48+
FormTemplate={(props) => <FormTemplate {...props} />}
49+
schema={schema}
50+
onCancel={() => console.log('canceling')}
51+
/>
6652
</Grid>
53+
</Grid>
6754
</ThemeProvider>
68-
)
55+
);
56+
};
6957

7058
ReactDOM.render(<App />, document.getElementById('root'));

packages/mui-component-mapper/src/files/component-mapper.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import PlainText from './plain-text';
1111
import Select from './select';
1212
import Radio from './radio';
1313
import Wizard from './wizard';
14+
import FieldArray from './field-array';
1415

1516
export const components = {
1617
TextField,
@@ -38,7 +39,8 @@ const componentMapper = {
3839
[componentTypes.TIME_PICKER]: TimePicker,
3940
[componentTypes.SWITCH]: Switch,
4041
[componentTypes.PLAIN_TEXT]: PlainText,
41-
[componentTypes.WIZARD]: Wizard
42+
[componentTypes.WIZARD]: Wizard,
43+
[componentTypes.FIELD_ARRAY]: FieldArray
4244
};
4345

4446
export default componentMapper;

0 commit comments

Comments
 (0)