react-jam-ui
Version:
React JAM UI components
200 lines (173 loc) • 6.09 kB
JavaScript
import React from 'react'
import classNames from 'classnames'
import createTextMaskInputElement from '../../utils/mask/createTextMaskInputElement'
import masks from '../../utils/masks'
import validations from '../../utils/validations'
import './styles.styl'
export default class Input extends React.Component {
constructor(props) {
super(props);
this.state = {
valid: props.valid,
dirty: (props.value || props.defaultValue),
validation: props.validation && props.validation.name ? {
...validations[props.validation.name],
...props.validation
} : props.validation || null,
mask: props.mask && props.mask.name ? {
...masks[props.mask.name],
...props.mask
} : props.mask || null,
}
}
componentDidUpdate() {
if (this.props.mask) this.initTextMask()
}
componentDidMount() {
if (this.props.mask) this.initTextMask()
if(
(this.props.value || this.props.defaultValue) &&
( this.props.validation || this.props.required )
) {
this.validateInput(this.inputDom);
}
}
initTextMask() {
const mask = this.state.mask ? this.state.mask : null;
if (mask) {
this.textMaskInputElement = createTextMaskInputElement({
inputElement: this.inputDom,
mask: mask.pattern,
...mask
})
this.textMaskInputElement.update(this.props.value)
}
}
onFocusCapture = e => {
this.setState({
focus: true,
dirty: true
})
if (this.props.onFocus) this.props.onFocus(e)
}
onBlurCapture = e => {
this.setState({
focus: false
})
if ( this.props.validation || this.props.required ) this.validateInput(this.inputDom)
if ( this.props.onBlur ) this.props.onBlur(e)
}
onInputCapture = e => {
const value = e.target.value;
this.setState({
dirty: true
})
if ( this.props.mask ) this.textMaskInputElement.update(value)
if ( this.props.validation || this.props.required ) this.validateInput(this.inputDom)
if ( this.props.bindTo ) this.props.bindTo()
if ( this.props.onInput ) this.props.onInput(e)
}
validateInput(input) {
let valid = false;
const pattern = this.state.validation ? this.state.validation.regexp : null
if (pattern) {
valid = pattern.test(input.value);
} else
if (this.props.required && input.value) {
valid = true;
}
this.setState({
valid
})
input.valid = valid;
return valid
}
render() {
const {
size,
className,
variant,
inputRef,
validation,
icon,
bindTo,
mask,
onInput,
onBlur,
onFocus,
valid,
...rest
} = this.props;
const _valid = valid !== false && valid !== true ? this.state.valid : valid;
const classes = classNames(
'input-container',
size,
className,
{
'input-default': !variant,
[`input-${variant}`]: variant,
'disabled': rest.disabled,
'value': this.props.value,
'focus': this.state.focus,
'error': _valid == false && this.state.dirty,
'valid': _valid == true && this.state.dirty,
'input-container_icon': icon
}
);
const classesInput = classNames(
'input',
size
);
return (
<div className={ classes } >
{
icon
? icon
: null
}
<input
className={ classesInput }
type={ this.props.type || 'text' }
ref={ el => {
this.inputDom = el;
if (inputRef) inputRef(el)
}}
onFocus={ this.onFocusCapture}
onInput={ this.onInputCapture }
onBlur={ this.onBlurCapture }
{ ... rest }
/>
{
_valid &&
this.state.dirty &&
this.state.validation &&
this.state.validation.valid &&
<div className='input-msg'>{this.state.validation.valid}</div>
}
{
!_valid &&
this.state.dirty &&
this.state.validation &&
this.state.validation.error &&
<div className='input-msg'>{this.state.validation.error}</div>
}
</div>
)
}
}
/*<Input size='sm' placeholder='a' value={this.state.a.b.d} onChange={this.handleInputChange} name='d' bindTo={ twoWayBinding.bind(this, 'a.b.d') } inputRef={ (el) => { this['a.b.d'] = el } }
validation={{
name: 'phone',
regexp: /^(8|\+7)( |-)?(\d){3}( |-)?\d{3}( |-)?\d{2}( |-)?\d{2}$/,
error: 'Неверный телефон, укажите в формате +7 999 999 99 99'
}}
mask={{
name: 'phone',
value: ['(', /[1-9]/, /\d/, /\d/, ')', ' ', /\d/, /\d/, /\d/, '-', /\d/, /\d/, /\d/, /\d/]
}}
/>*/
/*<div class="form-control__wrap form-control_icon">
<i class="icon fa fa-user"></i>
<input type="text" ng-model="user.email" placeholder="{{ 'TXT.ENTER_EMAIL' | translate }}" name="email" class="form-control" ng-change="checkEmail()" />
<i class="form-control__bar"></i>
</div>*/