import classNames from 'classnames'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import KeyValueListInputItem from './KeyValueListInputItem'; import styles from './KeyValueListInput.css'; class KeyValueListInput extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.state = { isFocused: false }; } // // Listeners onItemChange = (index, itemValue) => { const { name, value, onChange } = this.props; const newValue = [...value]; if (index == null) { newValue.push(itemValue); } else { newValue.splice(index, 1, itemValue); } onChange({ name, value: newValue }); }; onRemoveItem = (index) => { const { name, value, onChange } = this.props; const newValue = [...value]; newValue.splice(index, 1); onChange({ name, value: newValue }); }; onFocus = () => { this.setState({ isFocused: true }); }; onBlur = () => { this.setState({ isFocused: false }); const { name, value, onChange } = this.props; const newValue = value.reduce((acc, v) => { if (v.key || v.value) { acc.push(v); } return acc; }, []); if (newValue.length !== value.length) { onChange({ name, value: newValue }); } }; // // Render render() { const { className, value, keyPlaceholder, valuePlaceholder, hasError, hasWarning } = this.props; const { isFocused } = this.state; return ( <div className={classNames( className, isFocused && styles.isFocused, hasError && styles.hasError, hasWarning && styles.hasWarning )} > { [...value, { key: '', value: '' }].map((v, index) => { return ( <KeyValueListInputItem key={index} index={index} keyValue={v.key} value={v.value} keyPlaceholder={keyPlaceholder} valuePlaceholder={valuePlaceholder} isNew={index === value.length} onChange={this.onItemChange} onRemove={this.onRemoveItem} onFocus={this.onFocus} onBlur={this.onBlur} /> ); }) } </div> ); } } KeyValueListInput.propTypes = { className: PropTypes.string.isRequired, name: PropTypes.string.isRequired, value: PropTypes.arrayOf(PropTypes.object).isRequired, hasError: PropTypes.bool, hasWarning: PropTypes.bool, keyPlaceholder: PropTypes.string, valuePlaceholder: PropTypes.string, onChange: PropTypes.func.isRequired }; KeyValueListInput.defaultProps = { className: styles.inputContainer, value: [] }; export default KeyValueListInput;