@@ -2,7 +2,14 @@ import React from 'react';
2
2
import PropTypes from 'prop-types' ;
3
3
import { useFieldApi , useFormApi , FieldArray as FieldArrayFF } from '@data-driven-forms/react-form-renderer' ;
4
4
5
- const ArrayItem = ( { remove, fields, name } ) => {
5
+ import { Button , FormGroup } from 'carbon-components-react' ;
6
+ import { AddAlt32 , Subtract32 } from '@carbon/icons-react' ;
7
+
8
+ import './field-array.scss' ;
9
+
10
+ import prepareProps from '../common/prepare-props' ;
11
+
12
+ const ArrayItem = ( { remove, fields, name, removeText, buttonDisabled } ) => {
6
13
const formOptions = useFormApi ( ) ;
7
14
8
15
const editedFields = fields . map ( ( field ) => ( {
@@ -13,32 +20,91 @@ const ArrayItem = ({ remove, fields, name }) => {
13
20
return (
14
21
< div >
15
22
{ formOptions . renderForm ( editedFields , formOptions ) }
16
- < button onClick = { remove } > Remove</ button >
23
+ < Button
24
+ disabled = { buttonDisabled }
25
+ renderIcon = { Subtract32 }
26
+ id = { `remove-${ name } ` }
27
+ kind = "danger"
28
+ onClick = { remove }
29
+ className = { 'ddorg__carbon-field-array-remove' }
30
+ >
31
+ { removeText }
32
+ </ Button >
17
33
</ div >
18
34
) ;
19
35
} ;
20
36
21
37
ArrayItem . propTypes = {
22
38
remove : PropTypes . func ,
23
39
fields : PropTypes . array ,
24
- name : PropTypes . string
40
+ name : PropTypes . string ,
41
+ removeText : PropTypes . node ,
42
+ buttonDisabled : PropTypes . bool
25
43
} ;
26
44
27
45
const FieldArray = ( props ) => {
28
- const { itemDefault, fields, input, arrayValidator } = useFieldApi ( props ) ;
46
+ const { itemDefault, maxItems, minItems, fields, input, arrayValidator, labelText, buttonLabels, noItemsMessage, meta } = useFieldApi (
47
+ prepareProps ( props )
48
+ ) ;
49
+
50
+ const buttonLabelsFinal = {
51
+ add : 'Add' ,
52
+ remove : 'Remove' ,
53
+ ...buttonLabels
54
+ } ;
55
+
56
+ const invalid = meta . touched && meta . error && ! Array . isArray ( meta . error ) ;
29
57
30
58
return (
31
- < FieldArrayFF name = { input . name } validate = { arrayValidator } >
32
- { ( fieldArrayProps ) => (
33
- < div >
34
- { fieldArrayProps . fields . map ( ( name , index ) => (
35
- < ArrayItem key = { index } remove = { ( ) => fieldArrayProps . fields . remove ( index ) } name = { name } fields = { fields } />
36
- ) ) }
37
- < button onClick = { ( ) => fieldArrayProps . fields . push ( itemDefault ) } > Add</ button >
38
- </ div >
39
- ) }
40
- </ FieldArrayFF >
59
+ < FormGroup
60
+ legendText = { labelText }
61
+ invalid = { Boolean ( invalid ) }
62
+ message = { Boolean ( invalid ) }
63
+ messageText = { invalid || '' }
64
+ className = { 'ddorg__carbon-field-array-form-group' }
65
+ >
66
+ < FieldArrayFF name = { input . name } validate = { arrayValidator } >
67
+ { ( fieldArrayProps ) => (
68
+ < div >
69
+ { fieldArrayProps . fields . length === 0 && noItemsMessage }
70
+ { fieldArrayProps . fields . map ( ( name , index ) => (
71
+ < ArrayItem
72
+ removeText = { buttonLabelsFinal . remove }
73
+ key = { index }
74
+ remove = { ( ) => fieldArrayProps . fields . remove ( index ) }
75
+ name = { name }
76
+ fields = { fields }
77
+ buttonDisabled = { minItems >= fieldArrayProps . fields . length }
78
+ />
79
+ ) ) }
80
+ < div className = { 'ddorg__carbon-field-array-add-container' } >
81
+ < Button
82
+ disabled = { fieldArrayProps . fields . length >= maxItems }
83
+ renderIcon = { AddAlt32 }
84
+ id = { `add-${ input . name } ` }
85
+ onClick = { ( ) => fieldArrayProps . fields . push ( itemDefault ) }
86
+ className = { 'ddorg__carbon-field-array-add' }
87
+ >
88
+ { buttonLabelsFinal . add }
89
+ </ Button >
90
+ </ div >
91
+ </ div >
92
+ ) }
93
+ </ FieldArrayFF >
94
+ </ FormGroup >
41
95
) ;
42
96
} ;
43
97
98
+ FieldArray . propTypes = {
99
+ noItemsMessage : PropTypes . node ,
100
+ maxItems : PropTypes . number ,
101
+ minItems : PropTypes . number
102
+ } ;
103
+
104
+ FieldArray . defaultProps = {
105
+ noItemsMessage : 'No items' ,
106
+ maxItems : Infinity ,
107
+ minItems : 0
108
+ } ;
109
+
44
110
export default FieldArray ;
0 commit comments