/** * * InputPassword * */ import React from 'react'; import { isEmpty, includes, mapKeys, reject, map, isObject } from 'lodash'; import { FormattedMessage } from 'react-intl'; import WithInput from 'components/WithInput'; class InputPassword extends React.Component { // eslint-disable-line react/prefer-stateless-function /* eslint-disable jsx-a11y/no-static-element-interactions */ constructor(props) { super(props); this.state = { errors: [], hasInitialValue: false, type: true, }; } componentDidMount() { if (this.props.value && !isEmpty(this.props.value)) { this.setState({ hasInitialValue: true }); } } componentWillReceiveProps(nextProps) { if (this.props.errors !== nextProps.errors) { this.setState({ errors: nextProps.errors }); } } handleBlur = ({ target }) => { // prevent error display if input is initially empty if (!isEmpty(target.value) || this.state.hasInitialValue) { // validates basic string validations // add custom logic here such as alerts... const errors = this.validate(target.value); this.setState({ errors, hasInitialValue: true }); } } // Basic string validations validate = (value) => { let errors = []; // handle i18n const requiredError = { id: 'settings-manager.request.error.validation.required' }; mapKeys(this.props.validations, (validationValue, validationKey) => { switch (validationKey) { case 'maxLength': if (value.length > validationValue) { errors.push({ id: 'settings-manager.request.error.validation.maxLength' }); } break; case 'minLength': if (value.length < validationValue) { errors.push({ id: 'settings-manager.request.error.validation.minLength' }); } break; case 'required': if (value.length === 0) { errors.push({ id: 'settings-manager.request.error.validation.required' }); } break; case 'regex': if (!new RegExp(validationValue).test(value)) { errors.push({ id: 'settings-manager.request.error.validation.regex' }); } break; default: errors = []; } }); if (includes(errors, requiredError)) { errors = reject(errors, (error) => error !== requiredError); } return errors; } showPassword = () => this.setState({ type: !this.state.type }) renderErrors = () => { // eslint-disable-line consistent-return if (!this.props.noErrorsDescription) { return ( map(this.state.errors, (error, key) => { const displayError = isObject(error) && error.id ? : error; return (
{displayError}
); }) ); } } render() { const inputValue = this.props.value || ''; // override default onBlur const handleBlur = this.props.handleBlur || this.handleBlur; // override bootStrapClass const bootStrapClass = this.props.customBootstrapClass ? this.props.customBootstrapClass : 'col-md-6'; // set error class with override possibility const bootStrapClassDanger = !this.props.deactivateErrorHighlight && !isEmpty(this.state.errors) ? 'has-danger' : ''; const placeholder = this.props.placeholder || this.props.name; const type = this.state.type ? 'password' : 'text'; const color = this.state.type ? { color: '#9EA7B8' } : { color: 'black' }; return (
{(message) => ( )} {this.props.inputDescription} {this.renderErrors()}
); } } InputPassword.propTypes = { customBootstrapClass: React.PropTypes.string.isRequired, deactivateErrorHighlight: React.PropTypes.bool.isRequired, errors: React.PropTypes.array.isRequired, handleBlur: React.PropTypes.func.isRequired, handleChange: React.PropTypes.func.isRequired.isRequired, handleFocus: React.PropTypes.func.isRequired, inputDescription: React.PropTypes.string.isRequired, name: React.PropTypes.string.isRequired.isRequired, noErrorsDescription: React.PropTypes.bool.isRequired, placeholder: React.PropTypes.string.isRequired, styles: React.PropTypes.object.isRequired, target: React.PropTypes.string.isRequired.isRequired, validations: React.PropTypes.object.isRequired.isRequired, value: React.PropTypes.string.isRequired, }; export default WithInput(InputPassword); // eslint-disable-line new-cap