@@ -9,7 +9,7 @@ import './field-array.scss';
9
9
10
10
import prepareProps from '../common/prepare-props' ;
11
11
12
- const ArrayItem = ( { remove, fields, name, removeText, buttonDisabled } ) => {
12
+ const ArrayItem = ( { remove, fields, name, removeText, buttonDisabled, RemoveButtonProps , ArrayItemProps } ) => {
13
13
const formOptions = useFormApi ( ) ;
14
14
15
15
const editedFields = fields . map ( ( field ) => ( {
@@ -18,7 +18,7 @@ const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled }) => {
18
18
} ) ) ;
19
19
20
20
return (
21
- < div >
21
+ < div { ... ArrayItemProps } >
22
22
{ formOptions . renderForm ( editedFields , formOptions ) }
23
23
< Button
24
24
disabled = { buttonDisabled }
@@ -27,6 +27,7 @@ const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled }) => {
27
27
kind = "danger"
28
28
onClick = { remove }
29
29
className = { 'ddorg__carbon-field-array-remove' }
30
+ { ...RemoveButtonProps }
30
31
>
31
32
{ removeText }
32
33
</ Button >
@@ -39,33 +40,56 @@ ArrayItem.propTypes = {
39
40
fields : PropTypes . array ,
40
41
name : PropTypes . string ,
41
42
removeText : PropTypes . node ,
42
- buttonDisabled : PropTypes . bool
43
+ buttonDisabled : PropTypes . bool ,
44
+ RemoveButtonProps : PropTypes . object ,
45
+ ArrayItemProps : PropTypes . object
46
+ } ;
47
+
48
+ ArrayItem . defaultProps = {
49
+ RemoveButtonProps : { } ,
50
+ ArrayItemProps : { }
43
51
} ;
44
52
45
53
const FieldArray = ( props ) => {
46
- const { itemDefault, maxItems, minItems, fields, input, arrayValidator, labelText, buttonLabels, noItemsMessage, meta } = useFieldApi (
47
- prepareProps ( props )
48
- ) ;
54
+ const {
55
+ AddContainerProps,
56
+ AddButtonProps,
57
+ FormGroupProps,
58
+ WrapperProps,
59
+ ArrayItemProps,
60
+ RemoveButtonProps,
61
+ defaultItem,
62
+ maxItems,
63
+ minItems,
64
+ fields,
65
+ input,
66
+ arrayValidator,
67
+ labelText,
68
+ buttonLabels,
69
+ noItemsMessage,
70
+ meta
71
+ } = useFieldApi ( prepareProps ( props ) ) ;
49
72
50
73
const buttonLabelsFinal = {
51
74
add : 'Add' ,
52
75
remove : 'Remove' ,
53
76
...buttonLabels
54
77
} ;
55
78
56
- const invalid = meta . touched && meta . error && ! Array . isArray ( meta . error ) ;
79
+ const invalid = meta . touched && ! Array . isArray ( meta . error ) && meta . error ;
57
80
58
81
return (
59
82
< FormGroup
60
- legendText = { labelText }
83
+ legendText = { labelText || '' }
61
84
invalid = { Boolean ( invalid ) }
62
85
message = { Boolean ( invalid ) }
63
86
messageText = { invalid || '' }
64
87
className = { 'ddorg__carbon-field-array-form-group' }
88
+ { ...FormGroupProps }
65
89
>
66
90
< FieldArrayFF name = { input . name } validate = { arrayValidator } >
67
91
{ ( fieldArrayProps ) => (
68
- < div >
92
+ < div { ... WrapperProps } >
69
93
{ fieldArrayProps . fields . length === 0 && noItemsMessage }
70
94
{ fieldArrayProps . fields . map ( ( name , index ) => (
71
95
< ArrayItem
@@ -75,15 +99,18 @@ const FieldArray = (props) => {
75
99
name = { name }
76
100
fields = { fields }
77
101
buttonDisabled = { minItems >= fieldArrayProps . fields . length }
102
+ ArrayItemProps = { ArrayItemProps }
103
+ RemoveButtonProps = { RemoveButtonProps }
78
104
/>
79
105
) ) }
80
- < div className = { 'ddorg__carbon-field-array-add-container' } >
106
+ < div className = { 'ddorg__carbon-field-array-add-container' } { ... AddContainerProps } >
81
107
< Button
82
108
disabled = { fieldArrayProps . fields . length >= maxItems }
83
109
renderIcon = { AddAlt32 }
84
110
id = { `add-${ input . name } ` }
85
- onClick = { ( ) => fieldArrayProps . fields . push ( itemDefault ) }
111
+ onClick = { ( ) => fieldArrayProps . fields . push ( defaultItem ) }
86
112
className = { 'ddorg__carbon-field-array-add' }
113
+ { ...AddButtonProps }
87
114
>
88
115
{ buttonLabelsFinal . add }
89
116
</ Button >
@@ -98,13 +125,31 @@ const FieldArray = (props) => {
98
125
FieldArray . propTypes = {
99
126
noItemsMessage : PropTypes . node ,
100
127
maxItems : PropTypes . number ,
101
- minItems : PropTypes . number
128
+ minItems : PropTypes . number ,
129
+ buttonLabels : PropTypes . shape ( {
130
+ add : PropTypes . node ,
131
+ remove : PropTypes . node
132
+ } ) ,
133
+ AddContainerProps : PropTypes . object ,
134
+ AddButtonProps : PropTypes . object ,
135
+ FormGroupProps : PropTypes . object ,
136
+ WrapperProps : PropTypes . object ,
137
+ ArrayItemProps : PropTypes . object ,
138
+ RemoveButtonProps : PropTypes . object ,
139
+ defaultItem : PropTypes . any ,
140
+ fields : PropTypes . array
102
141
} ;
103
142
104
143
FieldArray . defaultProps = {
105
144
noItemsMessage : 'No items' ,
106
145
maxItems : Infinity ,
107
- minItems : 0
146
+ minItems : 0 ,
147
+ AddContainerProps : { } ,
148
+ AddButtonProps : { } ,
149
+ FormGroupProps : { } ,
150
+ WrapperProps : { } ,
151
+ ArrayItemProps : { } ,
152
+ RemoveButtonProps : { }
108
153
} ;
109
154
110
155
export default FieldArray ;
0 commit comments