@@ -35,7 +35,7 @@ FormConditionWrapper.propTypes = {
3535} ;
3636
3737const SingleField = ( { component, condition, hideField, ...rest } ) => {
38- const { componentMapper } = useContext ( RendererContext ) ;
38+ const { actionMapper , componentMapper } = useContext ( RendererContext ) ;
3939
4040 let componentProps = {
4141 component,
@@ -47,15 +47,52 @@ const SingleField = ({ component, condition, hideField, ...rest }) => {
4747 if ( typeof componentBinding === 'object' && Object . prototype . hasOwnProperty . call ( componentBinding , 'component' ) ) {
4848 const { component, ...mapperProps } = componentBinding ;
4949 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+ } ;
5165 } else {
5266 Component = componentBinding ;
5367 }
5468
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+
5592 return (
5693 < FormConditionWrapper condition = { condition } >
5794 < FormFieldHideWrapper hideField = { hideField } >
58- < Component { ...componentProps } />
95+ < Component { ...componentProps } { ... overrideProps } { ... ( mergedResolveProps && { resolveProps : mergedResolveProps } ) } />
5996 </ FormFieldHideWrapper >
6097 </ FormConditionWrapper >
6198 ) ;
@@ -67,7 +104,11 @@ SingleField.propTypes = {
67104 hideField : PropTypes . bool ,
68105 dataType : PropTypes . string ,
69106 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
71112} ;
72113
73114const renderForm = ( fields ) => fields . map ( ( field ) => ( Array . isArray ( field ) ? renderForm ( field ) : < SingleField key = { field . name } { ...field } /> ) ) ;
0 commit comments