Skip to content

Commit 69c9e86

Browse files
authored
Merge pull request #874 from rvsia/formTemplateCustomization
feat(formTemplate): allow to pass props to each component
2 parents 0ec796c + 042793e commit 69c9e86

File tree

19 files changed

+130
-96
lines changed

19 files changed

+130
-96
lines changed

packages/ant-component-mapper/src/files/form-template.d.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { FormTemplateRenderProps, AnyObject } from "@data-driven-forms/react-form-renderer";
1+
import FormTemplateCommonProps from "@data-driven-forms/common/src/form-template";
22

3-
export interface FormTemplateProps extends FormTemplateRenderProps {
4-
formWrapperProps?: AnyObject;
3+
export interface FormTemplateProps extends FormTemplateCommonProps {
54
layout?: string;
65
}
76

packages/ant-component-mapper/src/files/form-template.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ Form.defaultProps = {
2222
layout: 'vertical'
2323
};
2424

25-
const Description = ({ children }) => (
26-
<Typography>
25+
const Description = ({ children, ...props }) => (
26+
<Typography {...props}>
2727
<Paragraph>{children}</Paragraph>
2828
</Typography>
2929
);
@@ -32,8 +32,8 @@ Description.propTypes = {
3232
children: childrenPropTypes
3333
};
3434

35-
const TitleComponent = ({ children }) => (
36-
<Typography>
35+
const TitleComponent = ({ children, ...props }) => (
36+
<Typography {...props}>
3737
<Title level={3}>{children}</Title>
3838
</Typography>
3939
);
@@ -42,7 +42,11 @@ TitleComponent.propTypes = {
4242
children: childrenPropTypes
4343
};
4444

45-
const ButtonGroup = ({ children }) => <div style={{ display: 'flex', justifyContent: 'flex-end' }}>{children}</div>;
45+
const ButtonGroup = ({ children, ...props }) => (
46+
<div style={{ display: 'flex', justifyContent: 'flex-end' }} {...props}>
47+
{children}
48+
</div>
49+
);
4650

4751
ButtonGroup.propTypes = {
4852
children: childrenPropTypes

packages/blueprint-component-mapper/src/files/form-template.d.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1+
import FormTemplateCommonProps from "@data-driven-forms/common/src/form-template";
12
import { ReactNode } from "react";
23

3-
export interface FormTemplateProps {
4+
export interface FormTemplateProps extends FormTemplateCommonProps {
45
requiredLabelInfo?: ReactNode;
5-
formWrapperProps?: React.HTMLProps<HTMLFormElement>;
6-
showFormControls?: boolean;
7-
disableSubmit: string[];
86
}
97

108
declare const FormTemplate: React.ComponentType<FormTemplateProps>;
Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
export interface FormTemplateProps {
2-
showFormControls?: boolean;
3-
disableSubmit: string[];
4-
}
1+
import FormTemplateCommonProps from "@data-driven-forms/common/src/form-template";
52

6-
declare const FormTemplate: React.ComponentType<FormTemplateProps>;
3+
declare const FormTemplate: React.ComponentType<FormTemplateCommonProps>;
74

85
export default FormTemplate;

packages/carbon-component-mapper/src/files/form-template.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ ButtonGroup.propTypes = {
3030
className: PropTypes.string
3131
};
3232

33-
export const Title = ({ children }) => <h3>{children}</h3>;
33+
export const Title = ({ children, ...props }) => <h3 {...props}>{children}</h3>;
3434

3535
Title.propTypes = {
3636
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
3737
};
3838

39-
export const Description = ({ children }) => <div>{children}</div>;
39+
export const Description = ({ children, ...props }) => <div {...props}>{children}</div>;
4040

4141
Description.propTypes = {
4242
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { AnyObject, FormTemplateRenderProps } from "@data-driven-forms/react-form-renderer";
2+
import { ElementType } from "react";
3+
4+
export interface FormTemplateCommonProps extends FormTemplateRenderProps {
5+
FormWrapper?: ElementType;
6+
Title?: ElementType;
7+
Description?: ElementType;
8+
Button?: ElementType;
9+
ButtonGroup?: ElementType;
10+
formWrapperProps?: AnyObject;
11+
showFormControls?: boolean;
12+
disableSubmit?: string[];
13+
Header?: ElementType;
14+
headerProps?: AnyObject;
15+
titleProps?: AnyObject;
16+
descriptionProps?: AnyObject;
17+
buttonGroupProps?: AnyObject;
18+
buttonsProps?: AnyObject
19+
}
20+
21+
export default FormTemplateCommonProps;

packages/common/src/form-template.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,16 @@ export const FormControls = ({
3434
FormButtons,
3535
Button,
3636
ButtonGroup,
37-
formSpyProps
37+
formSpyProps,
38+
buttonsProps,
39+
buttonGroupProps
3840
}) => {
3941
if (FormButtons) {
4042
return <FormButtons />;
4143
}
4244

4345
const { submitting, pristine, validating } = formSpyProps;
46+
const { submit, reset, cancel } = buttonsProps;
4447

4548
const buttons = {
4649
submit: (
@@ -51,14 +54,17 @@ export const FormControls = ({
5154
buttonType="submit"
5255
disabled={submitting || validating || disableSubmit}
5356
label={submitLabel}
57+
{...submit}
5458
/>
5559
),
56-
reset: canReset ? <Button key="form-reset" type="button" buttonType="reset" disabled={pristine} onClick={onReset} label={resetLabel} /> : null,
57-
cancel: onCancel ? <Button key="form-cancel" type="button" buttonType="cancel" onClick={onCancel} label={cancelLabel} /> : null
60+
reset: canReset ? (
61+
<Button key="form-reset" type="button" buttonType="reset" disabled={pristine} onClick={onReset} label={resetLabel} {...reset} />
62+
) : null,
63+
cancel: onCancel ? <Button key="form-cancel" type="button" buttonType="cancel" onClick={onCancel} label={cancelLabel} {...cancel} /> : null
5864
};
5965

6066
return (
61-
<ButtonGroup {...(buttonClassName && { className: buttonClassName })}>
67+
<ButtonGroup {...buttonGroupProps} {...(buttonClassName && { className: buttonClassName })}>
6268
{completeButtons(buttonOrder).map((button) => buttons[button])}
6369
</ButtonGroup>
6470
);
@@ -85,7 +91,9 @@ FormControls.propTypes = {
8591
reset: PropTypes.func
8692
}),
8793
values: PropTypes.object
88-
})
94+
}),
95+
buttonGroupProps: PropTypes.object,
96+
buttonsProps: PropTypes.object
8997
};
9098

9199
FormControls.defaultProps = {
@@ -94,7 +102,8 @@ FormControls.defaultProps = {
94102
resetLabel: 'Reset',
95103
canReset: false,
96104
canSubmit: false,
97-
buttonOrder: ['submit', 'reset', 'cancel']
105+
buttonOrder: ['submit', 'reset', 'cancel'],
106+
buttonsProps: {}
98107
};
99108

100109
const FormTemplate = ({
@@ -107,6 +116,11 @@ const FormTemplate = ({
107116
showFormControls,
108117
disableSubmit,
109118
Header,
119+
headerProps,
120+
titleProps,
121+
descriptionProps,
122+
buttonGroupProps,
123+
buttonsProps,
110124
...rest
111125
}) => {
112126
const {
@@ -118,9 +132,9 @@ const FormTemplate = ({
118132
return (
119133
<FormWrapper onSubmit={handleSubmit} {...formWrapperProps}>
120134
{(title || label || description) && (
121-
<Header>
122-
{(title || label) && <Title>{title || label}</Title>}
123-
{description && <Description>{description}</Description>}
135+
<Header {...headerProps}>
136+
{(title || label) && <Title {...titleProps}>{title || label}</Title>}
137+
{description && <Description {...descriptionProps}>{description}</Description>}
124138
</Header>
125139
)}
126140
{formFields}
@@ -130,6 +144,8 @@ const FormTemplate = ({
130144
<FormControls
131145
Button={Button}
132146
FormSpy={FormSpy}
147+
buttonGroupProps={buttonGroupProps}
148+
buttonsProps={buttonsProps}
133149
ButtonGroup={ButtonGroup}
134150
onReset={onReset}
135151
onCancel={onCancel}
@@ -153,7 +169,12 @@ FormTemplate.propTypes = {
153169
formWrapperProps: PropTypes.object,
154170
showFormControls: PropTypes.bool,
155171
disableSubmit: PropTypes.arrayOf(PropTypes.string),
156-
Header: PropTypes.oneOfType([PropTypes.node, PropTypes.func, PropTypes.element, PropTypes.oneOf([React.Fragment])])
172+
Header: PropTypes.oneOfType([PropTypes.node, PropTypes.func, PropTypes.element, PropTypes.oneOf([React.Fragment])]),
173+
headerProps: PropTypes.object,
174+
titleProps: PropTypes.object,
175+
descriptionProps: PropTypes.object,
176+
buttonGroupProps: PropTypes.object,
177+
buttonsProps: PropTypes.object
157178
};
158179

159180
FormTemplate.defaultProps = {
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
1-
import { FormTemplateRenderProps } from "@data-driven-forms/react-form-renderer";
1+
import FormTemplateCommonProps from "@data-driven-forms/common/src/form-template";
22

3-
export interface FormTemplateProps extends FormTemplateRenderProps {
4-
FormWrapper?: React.ComponentType;
5-
Button?: React.ComponentType;
6-
ButtonGroup?: React.ComponentType;
7-
Title?: React.ComponentType;
8-
Description?: React.ComponentType;
9-
FormWrapperProps?: React.HTMLAttributes<HTMLFormElement>;
10-
}
11-
12-
declare const FormTemplate: React.ComponentType<FormTemplateProps>;
3+
declare const FormTemplate: React.ComponentType<FormTemplateCommonProps>;
134

145
export default FormTemplate;

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

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,55 +15,62 @@ const useStyles = makeStyles(() => ({
1515
}
1616
}));
1717

18-
const Form = ({ children, ...props }) => (
19-
<Grid item xs={12}>
18+
const Form = ({ children, GridContainerProps, GridProps, ...props }) => (
19+
<Grid item xs={12} {...GridProps}>
2020
<form noValidate {...props}>
21-
<Grid container item spacing={2} xs={12}>
21+
<Grid container item spacing={2} xs={12} {...GridContainerProps}>
2222
{children}
2323
</Grid>
2424
</form>
2525
</Grid>
2626
);
2727

2828
Form.propTypes = {
29-
children: PropTypes.node
29+
children: PropTypes.node,
30+
GridProps: PropTypes.object,
31+
GridContainerProps: PropTypes.object
3032
};
3133

32-
const Description = ({ children }) => (
33-
<Grid item xs={12}>
34-
<Typography variant="body1" gutterBottom>
34+
const Description = ({ children, GridProps, ...props }) => (
35+
<Grid item xs={12} {...GridProps}>
36+
<Typography variant="body1" gutterBottom {...props}>
3537
{children}
3638
</Typography>
3739
</Grid>
3840
);
3941

4042
Description.propTypes = {
41-
children: PropTypes.node
43+
children: PropTypes.node,
44+
GridProps: PropTypes.object
4245
};
4346

44-
const Title = ({ children }) => (
45-
<Grid item xs={12}>
46-
<Typography variant="h3" gutterBottom>
47+
const Title = ({ children, GridProps, ...props }) => (
48+
<Grid item xs={12} {...GridProps}>
49+
<Typography variant="h3" gutterBottom {...props}>
4750
{children}
4851
</Typography>
4952
</Grid>
5053
);
5154

5255
Title.propTypes = {
53-
children: PropTypes.node
56+
children: PropTypes.node,
57+
GridProps: PropTypes.object
5458
};
5559

56-
const ButtonGroup = ({ children }) => {
60+
const ButtonGroup = ({ children, GridProps, ...props }) => {
5761
const classes = useStyles();
5862
return (
59-
<Grid item xs={12}>
60-
<div className={classes.buttonGroup}>{children}</div>
63+
<Grid item xs={12} {...GridProps}>
64+
<div className={classes.buttonGroup} {...props}>
65+
{children}
66+
</div>
6167
</Grid>
6268
);
6369
};
6470

6571
ButtonGroup.propTypes = {
66-
children: PropTypes.node
72+
children: PropTypes.node,
73+
GridProps: PropTypes.object
6774
};
6875

6976
const Button = ({ label, variant, children, buttonType, ...props }) => (

packages/pf3-component-mapper/src/files/form-template.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ ButtonGroup.defaultProps = {
4242
className: ''
4343
};
4444

45-
export const Title = ({ children }) => <h1>{children}</h1>;
45+
export const Title = ({ children, ...props }) => <h1 {...props}>{children}</h1>;
4646

4747
Title.propTypes = {
4848
children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired
4949
};
5050

51-
export const Description = ({ children }) => <p>{children}</p>;
51+
export const Description = ({ children, ...props }) => <p {...props}>{children}</p>;
5252

5353
Description.propTypes = {
5454
children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]).isRequired

0 commit comments

Comments
 (0)