bloom-inputs
Version:
accessible inputs used in bloom packages
154 lines (136 loc) • 3.41 kB
JSX
import React from 'react'
import PropTypes from 'prop-types'
import ErrorTip from '../error-tip'
import { requiredPropsLogger } from '../../util/required-props-logger'
/* just the basic input[type='date'] -- no customized dropdown styles or anything */
class DateInput extends React.Component {
state = {
focused: false
}
onFocusIn = e => {
if (e) {
e.preventDefault()
}
this.setState({
focused: true
})
if (this.props.onFocus) {
this.props.onFocus(this.props.formId, this.props.name)
}
}
onFocusOut = e => {
if (e) {
e.preventDefault()
}
this.setState({
focused: false
})
if (this.props.onBlur) {
this.props.onBlur(e)
}
}
componentDidMount() {
const requiredProps = ['label', 'name']
const recommendedProps = ['onChange']
requiredPropsLogger(this.props, requiredProps, recommendedProps, true)
}
render() {
const {
className,
containerClass,
error,
formData,
name,
label,
labelClass,
onChange,
onKeyDown,
placeholder,
showLabel,
suppressErrors,
validateAs,
value,
...props
} = this.props
const labelTextClasses = `Input-label-text ${labelClass ? labelClass : ''}${
showLabel ? '' : ' u-sr-only'
}`
let attr = { ...props }
if (props.required) {
attr['aria-required'] = true
attr.required = true
}
let err = error
if (
Object.keys(this.props).indexOf('value') === -1 &&
formData &&
Object.keys(formData).indexOf(name) > -1
) {
attr.value = formData[name].value
err = formData[name].error
} else {
attr.value = value
}
if (!onChange) {
attr.readOnly = true
}
return (
<label
className={`Input-label ${containerClass || ''}`}
htmlFor={name}
onBlur={this.onFocusOut}
id={`${name}-label`}
onFocus={this.onFocusIn}
>
<span className={labelTextClasses}>
{label}
{attr.required && (
<span>
{'\u00A0'}*<span className='u-sr-only'> required field</span>
</span>
)}
</span>
<input
className={`Input Input--text ${className ? className : ''} ${
error ? 'Input--invalid' : ''
}`}
data-validate={validateAs}
id={name}
name={name}
onChange={onChange}
onKeyDown={onKeyDown}
placeholder={placeholder}
type='date'
{...attr}
/>
{err && !this.state.focused && !suppressErrors ? (
<ErrorTip contents={err} />
) : (
''
)}
</label>
)
}
}
DateInput.propTypes = {
className: PropTypes.string,
error: PropTypes.string,
formData: PropTypes.object,
label: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired,
labelClass: PropTypes.string,
name: PropTypes.string.isRequired,
placeholder: PropTypes.string,
onBlur: PropTypes.func,
onFocus: PropTypes.func,
onChange: PropTypes.func,
onKeyDown: PropTypes.func,
required: PropTypes.bool,
showLabel: PropTypes.bool,
suppressErrors: PropTypes.bool,
validateAs: PropTypes.string,
value: PropTypes.string.isRequired
}
DateInput.defaultProps = {
value: ''
}
export default DateInput