@@ -35,7 +35,7 @@ FormConditionWrapper.propTypes = {
35
35
} ;
36
36
37
37
const SingleField = ( { component, condition, hideField, ...rest } ) => {
38
- const { componentMapper } = useContext ( RendererContext ) ;
38
+ const { actionMapper , componentMapper } = useContext ( RendererContext ) ;
39
39
40
40
let componentProps = {
41
41
component,
@@ -47,15 +47,52 @@ const SingleField = ({ component, condition, hideField, ...rest }) => {
47
47
if ( typeof componentBinding === 'object' && Object . prototype . hasOwnProperty . call ( componentBinding , 'component' ) ) {
48
48
const { component, ...mapperProps } = componentBinding ;
49
49
Component = component ;
50
- componentProps = { ...mapperProps , ...componentProps } ;
50
+ componentProps = {
51
+ ...mapperProps ,
52
+ ...componentProps ,
53
+ // merge mapper and field actions
54
+ ...( mapperProps . actions && rest . actions ? { actions : { ...mapperProps . actions , ...rest . actions } } : { } ) ,
55
+ // merge mapper and field resolveProps
56
+ ...( mapperProps . resolveProps && rest . resolveProps
57
+ ? {
58
+ resolveProps : ( ...args ) => ( {
59
+ ...mapperProps . resolveProps ( ...args ) ,
60
+ ...rest . resolveProps ( ...args )
61
+ } )
62
+ }
63
+ : { } )
64
+ } ;
51
65
} else {
52
66
Component = componentBinding ;
53
67
}
54
68
69
+ /**
70
+ * Map actions to props
71
+ */
72
+ let overrideProps = { } ;
73
+ let mergedResolveProps ; // new object has to be created because of references
74
+ if ( componentProps . actions ) {
75
+ Object . keys ( componentProps . actions ) . forEach ( ( prop ) => {
76
+ const [ action , ...args ] = componentProps . actions [ prop ] ;
77
+ overrideProps [ prop ] = actionMapper [ action ] ( ...args ) ;
78
+ } ) ;
79
+
80
+ // Merge componentProps resolve props and actions resolve props
81
+ if ( componentProps . resolveProps && overrideProps . resolveProps ) {
82
+ mergedResolveProps = ( ...args ) => ( {
83
+ ...componentProps . resolveProps ( ...args ) ,
84
+ ...overrideProps . resolveProps ( ...args )
85
+ } ) ;
86
+ }
87
+
88
+ // do not pass actions object to components
89
+ delete componentProps . actions ;
90
+ }
91
+
55
92
return (
56
93
< FormConditionWrapper condition = { condition } >
57
94
< FormFieldHideWrapper hideField = { hideField } >
58
- < Component { ...componentProps } />
95
+ < Component { ...componentProps } { ... overrideProps } { ... ( mergedResolveProps && { resolveProps : mergedResolveProps } ) } />
59
96
</ FormFieldHideWrapper >
60
97
</ FormConditionWrapper >
61
98
) ;
@@ -67,7 +104,11 @@ SingleField.propTypes = {
67
104
hideField : PropTypes . bool ,
68
105
dataType : PropTypes . string ,
69
106
validate : PropTypes . arrayOf ( PropTypes . oneOfType ( [ PropTypes . func , PropTypes . object ] ) ) ,
70
- initialValue : PropTypes . any
107
+ initialValue : PropTypes . any ,
108
+ actions : PropTypes . shape ( {
109
+ [ PropTypes . string ] : PropTypes . func
110
+ } ) ,
111
+ resolveProps : PropTypes . func
71
112
} ;
72
113
73
114
const renderForm = ( fields ) => fields . map ( ( field ) => ( Array . isArray ( field ) ? renderForm ( field ) : < SingleField key = { field . name } { ...field } /> ) ) ;
0 commit comments