Skip to content

Commit dfab9cf

Browse files
committed
fix(carbon): add customization and tests for field array
1 parent 2c35dd0 commit dfab9cf

File tree

2 files changed

+461
-13
lines changed

2 files changed

+461
-13
lines changed

packages/carbon-component-mapper/src/files/field-array.js

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import './field-array.scss';
99

1010
import prepareProps from '../common/prepare-props';
1111

12-
const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled }) => {
12+
const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled, RemoveButtonProps, ArrayItemProps }) => {
1313
const formOptions = useFormApi();
1414

1515
const editedFields = fields.map((field) => ({
@@ -18,7 +18,7 @@ const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled }) => {
1818
}));
1919

2020
return (
21-
<div>
21+
<div {...ArrayItemProps}>
2222
{formOptions.renderForm(editedFields, formOptions)}
2323
<Button
2424
disabled={buttonDisabled}
@@ -27,6 +27,7 @@ const ArrayItem = ({ remove, fields, name, removeText, buttonDisabled }) => {
2727
kind="danger"
2828
onClick={remove}
2929
className={'ddorg__carbon-field-array-remove'}
30+
{...RemoveButtonProps}
3031
>
3132
{removeText}
3233
</Button>
@@ -39,33 +40,56 @@ ArrayItem.propTypes = {
3940
fields: PropTypes.array,
4041
name: PropTypes.string,
4142
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: {}
4351
};
4452

4553
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));
4972

5073
const buttonLabelsFinal = {
5174
add: 'Add',
5275
remove: 'Remove',
5376
...buttonLabels
5477
};
5578

56-
const invalid = meta.touched && meta.error && !Array.isArray(meta.error);
79+
const invalid = meta.touched && !Array.isArray(meta.error) && meta.error;
5780

5881
return (
5982
<FormGroup
60-
legendText={labelText}
83+
legendText={labelText || ''}
6184
invalid={Boolean(invalid)}
6285
message={Boolean(invalid)}
6386
messageText={invalid || ''}
6487
className={'ddorg__carbon-field-array-form-group'}
88+
{...FormGroupProps}
6589
>
6690
<FieldArrayFF name={input.name} validate={arrayValidator}>
6791
{(fieldArrayProps) => (
68-
<div>
92+
<div {...WrapperProps}>
6993
{fieldArrayProps.fields.length === 0 && noItemsMessage}
7094
{fieldArrayProps.fields.map((name, index) => (
7195
<ArrayItem
@@ -75,15 +99,18 @@ const FieldArray = (props) => {
7599
name={name}
76100
fields={fields}
77101
buttonDisabled={minItems >= fieldArrayProps.fields.length}
102+
ArrayItemProps={ArrayItemProps}
103+
RemoveButtonProps={RemoveButtonProps}
78104
/>
79105
))}
80-
<div className={'ddorg__carbon-field-array-add-container'}>
106+
<div className={'ddorg__carbon-field-array-add-container'} {...AddContainerProps}>
81107
<Button
82108
disabled={fieldArrayProps.fields.length >= maxItems}
83109
renderIcon={AddAlt32}
84110
id={`add-${input.name}`}
85-
onClick={() => fieldArrayProps.fields.push(itemDefault)}
111+
onClick={() => fieldArrayProps.fields.push(defaultItem)}
86112
className={'ddorg__carbon-field-array-add'}
113+
{...AddButtonProps}
87114
>
88115
{buttonLabelsFinal.add}
89116
</Button>
@@ -98,13 +125,31 @@ const FieldArray = (props) => {
98125
FieldArray.propTypes = {
99126
noItemsMessage: PropTypes.node,
100127
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
102141
};
103142

104143
FieldArray.defaultProps = {
105144
noItemsMessage: 'No items',
106145
maxItems: Infinity,
107-
minItems: 0
146+
minItems: 0,
147+
AddContainerProps: {},
148+
AddButtonProps: {},
149+
FormGroupProps: {},
150+
WrapperProps: {},
151+
ArrayItemProps: {},
152+
RemoveButtonProps: {}
108153
};
109154

110155
export default FieldArray;

0 commit comments

Comments
 (0)