@@ -6,7 +6,19 @@ import { UndoOutlined, RedoOutlined } from '@ant-design/icons';
6
6
7
7
import AntForm from '../common/form-wrapper' ;
8
8
9
- const ArrayItem = ( { fields, fieldIndex, name, remove, length, minItems, removeLabel } ) => {
9
+ const ArrayItem = ( {
10
+ fields,
11
+ fieldIndex,
12
+ name,
13
+ remove,
14
+ length,
15
+ minItems,
16
+ removeLabel,
17
+ ArrayItemProps,
18
+ FieldsContainerProps,
19
+ RemoveContainerProps,
20
+ RemoveButtonProps
21
+ } ) => {
10
22
const { renderForm } = useFormApi ( ) ;
11
23
12
24
const editedFields = fields . map ( ( field , index ) => {
@@ -15,10 +27,12 @@ const ArrayItem = ({ fields, fieldIndex, name, remove, length, minItems, removeL
15
27
} ) ;
16
28
17
29
return (
18
- < Row >
19
- < Col span = { 24 } > { renderForm ( [ editedFields ] ) } </ Col >
20
- < Col span = { 24 } >
21
- < Button type = "primary" danger onClick = { ( ) => remove ( fieldIndex ) } disabled = { length <= minItems } >
30
+ < Row { ...ArrayItemProps } >
31
+ < Col span = { 24 } { ...FieldsContainerProps } >
32
+ { renderForm ( [ editedFields ] ) }
33
+ </ Col >
34
+ < Col span = { 24 } { ...RemoveContainerProps } >
35
+ < Button type = "primary" danger { ...RemoveButtonProps } onClick = { ( ) => remove ( fieldIndex ) } disabled = { length <= minItems } >
22
36
{ removeLabel }
23
37
</ Button >
24
38
</ Col >
@@ -33,7 +47,11 @@ ArrayItem.propTypes = {
33
47
remove : PropTypes . func . isRequired ,
34
48
length : PropTypes . number ,
35
49
minItems : PropTypes . number ,
36
- removeLabel : PropTypes . node . isRequired
50
+ removeLabel : PropTypes . node . isRequired ,
51
+ ArrayItemProps : PropTypes . object . isRequired ,
52
+ FieldsContainerProps : PropTypes . object . isRequired ,
53
+ RemoveContainerProps : PropTypes . object . isRequired ,
54
+ RemoveButtonProps : PropTypes . object . isRequired
37
55
} ;
38
56
39
57
const defaultButtonLabels = {
@@ -90,7 +108,23 @@ const DynamicArray = ({ ...props }) => {
90
108
validateOnMount,
91
109
isRequired,
92
110
helperText,
111
+ // customization props
93
112
FormItemProps,
113
+ ArrayItemProps,
114
+ FieldsContainerProps,
115
+ RemoveContainerProps,
116
+ RemoveButtonProps,
117
+ FieldArrayRowProps,
118
+ FieldArrayRowCol,
119
+ FieldArrayHeaderProps,
120
+ FieldArrayLabelProps,
121
+ FieldArrayButtonsProps,
122
+ UndoButtonProps,
123
+ RedoButtonProps,
124
+ AddButtonProps,
125
+ FieldArrayDescriptionProps,
126
+ NoItemsMessageProps,
127
+ ErrorMessageProps,
94
128
...rest
95
129
} = useFieldApi ( props ) ;
96
130
const [ state , dispatch ] = useReducer ( reducer , initialState ) ;
@@ -133,15 +167,27 @@ const DynamicArray = ({ ...props }) => {
133
167
} ;
134
168
135
169
return (
136
- < Row gutter = { [ 0 , 16 ] } >
137
- < Col span = { 24 } >
138
- < Row justify = "space-between" >
139
- < Col > { label && < Typography . Title level = { 4 } > { label } </ Typography . Title > } </ Col >
170
+ < Row gutter = { [ 0 , 16 ] } { ...FieldArrayRowProps } >
171
+ < Col span = { 24 } { ...FieldArrayRowCol } >
172
+ < Row justify = "space-between" { ...FieldArrayHeaderProps } >
173
+ < Col >
174
+ { label && (
175
+ < Typography . Title level = { 4 } { ...FieldArrayLabelProps } >
176
+ { label }
177
+ </ Typography . Title >
178
+ ) }
179
+ </ Col >
140
180
< Col >
141
- < Space >
142
- < Button type = "default" onClick = { undo } disabled = { state . index === 0 } icon = { < UndoOutlined /> } />
143
- < Button type = "default" onClick = { redo } disabled = { state . index === state . history . length } icon = { < RedoOutlined /> } />
144
- < Button type = "primary" onClick = { pushWrapper } disabled = { value . length >= maxItems } >
181
+ < Space { ...FieldArrayButtonsProps } >
182
+ < Button type = "default" icon = { < UndoOutlined /> } { ...UndoButtonProps } onClick = { undo } disabled = { state . index === 0 } />
183
+ < Button
184
+ type = "default"
185
+ icon = { < RedoOutlined /> }
186
+ { ...RedoButtonProps }
187
+ onClick = { redo }
188
+ disabled = { state . index === state . history . length }
189
+ />
190
+ < Button type = "primary" { ...AddButtonProps } onClick = { pushWrapper } disabled = { value . length >= maxItems } >
145
191
{ combinedButtonLabels . add }
146
192
</ Button >
147
193
</ Space >
@@ -150,13 +196,17 @@ const DynamicArray = ({ ...props }) => {
150
196
</ Col >
151
197
{ description && (
152
198
< Col span = { 24 } >
153
- < Typography . Text > { description } </ Typography . Text >
199
+ < Typography . Text { ... FieldArrayDescriptionProps } > { description } </ Typography . Text >
154
200
</ Col >
155
201
) }
156
202
< Col span = { 24 } >
157
203
< Row gutter = { [ 0 , 16 ] } >
158
204
{ value . length <= 0 ? (
159
- < Typography . Text > { noItemsMessage } </ Typography . Text >
205
+ typeof noItemsMessage === 'string' ? (
206
+ < Typography . Text { ...NoItemsMessageProps } > { noItemsMessage } </ Typography . Text >
207
+ ) : (
208
+ React . cloneElement ( noItemsMessage , NoItemsMessageProps )
209
+ )
160
210
) : (
161
211
map ( ( name , index ) => (
162
212
< Col span = { 24 } key = { name } >
@@ -168,6 +218,10 @@ const DynamicArray = ({ ...props }) => {
168
218
length = { value . length }
169
219
minItems = { minItems }
170
220
removeLabel = { combinedButtonLabels . remove }
221
+ ArrayItemProps = { ArrayItemProps }
222
+ FieldsContainerProps = { FieldsContainerProps }
223
+ RemoveContainerProps = { RemoveContainerProps }
224
+ RemoveButtonProps = { RemoveButtonProps }
171
225
/>
172
226
</ Col >
173
227
) )
@@ -176,7 +230,9 @@ const DynamicArray = ({ ...props }) => {
176
230
</ Col >
177
231
{ isError && (
178
232
< Col span = { 12 } >
179
- < Typography . Text type = "danger" > { typeof error === 'object' ? error . name : error } </ Typography . Text >
233
+ < Typography . Text type = "danger" { ...ErrorMessageProps } >
234
+ { typeof error === 'object' ? error . name : error }
235
+ </ Typography . Text >
180
236
</ Col >
181
237
) }
182
238
</ Row >
@@ -195,15 +251,46 @@ DynamicArray.propTypes = {
195
251
minItems : PropTypes . number ,
196
252
maxItems : PropTypes . number ,
197
253
noItemsMessage : PropTypes . node ,
254
+ buttonLabels : PropTypes . object ,
255
+ // customization props
198
256
FormItemProps : PropTypes . object ,
199
- buttonLabels : PropTypes . object
257
+ ArrayItemProps : PropTypes . object ,
258
+ FieldsContainerProps : PropTypes . object ,
259
+ RemoveContainerProps : PropTypes . object ,
260
+ RemoveButtonProps : PropTypes . object ,
261
+ FieldArrayRowProps : PropTypes . object ,
262
+ FieldArrayRowCol : PropTypes . object ,
263
+ FieldArrayHeaderProps : PropTypes . object ,
264
+ FieldArrayLabelProps : PropTypes . object ,
265
+ FieldArrayButtonsProps : PropTypes . object ,
266
+ UndoButtonProps : PropTypes . object ,
267
+ RedoButtonProps : PropTypes . object ,
268
+ AddButtonProps : PropTypes . object ,
269
+ FieldArrayDescriptionProps : PropTypes . object ,
270
+ NoItemsMessageProps : PropTypes . object ,
271
+ ErrorMessageProps : PropTypes . object
200
272
} ;
201
273
202
274
DynamicArray . defaultProps = {
203
275
maxItems : Infinity ,
204
276
minItems : 0 ,
205
277
noItemsMessage : 'No items added' ,
206
- FormItemProps : { }
278
+ FormItemProps : { } ,
279
+ ArrayItemProps : { } ,
280
+ FieldsContainerProps : { } ,
281
+ RemoveContainerProps : { } ,
282
+ RemoveButtonProps : { } ,
283
+ FieldArrayRowProps : { } ,
284
+ FieldArrayRowCol : { } ,
285
+ FieldArrayHeaderProps : { } ,
286
+ FieldArrayLabelProps : { } ,
287
+ FieldArrayButtonsProps : { } ,
288
+ UndoButtonProps : { } ,
289
+ RedoButtonProps : { } ,
290
+ AddButtonProps : { } ,
291
+ FieldArrayDescriptionProps : { } ,
292
+ NoItemsMessageProps : { } ,
293
+ ErrorMessageProps : { }
207
294
} ;
208
295
209
296
export default DynamicArray ;
0 commit comments