UNPKG

@ysmood/material-ui

Version:

Material Design UI components built with React

144 lines (123 loc) 4.01 kB
var React = require('react'); var Classable = require('./mixins/classable'); var ClassNames = require('classnames'); var Input = React.createClass({ propTypes: { multiline: React.PropTypes.bool, inlinePlaceholder: React.PropTypes.bool, rows: React.PropTypes.number, inputStyle: React.PropTypes.string, error: React.PropTypes.string, description: React.PropTypes.string, placeholder: React.PropTypes.string, type: React.PropTypes.string, onChange: React.PropTypes.func }, mixins: [Classable], getInitialState: function() { return { value: this.props.defaultValue, rows: this.props.rows }; }, getDefaultProps: function() { return { multiline: false, type: "text" }; }, componentDidMount: function() { if (process.env.NODE_ENV !== 'production') { console.warn('Input has been deprecated. Please use TextField instead. See http://material-ui.com/#/components/text-fields'); } }, render: function() { var classes = this.getClasses('mui-input', { 'mui-floating': this.props.inputStyle === 'floating', 'mui-text': this.props.type === 'text', 'mui-error': this.props.error || false, 'mui-disabled': !!this.props.disabled, }); var placeholder = this.props.inlinePlaceholder ? this.props.placeholder : ""; var inputIsNotEmpty = !!this.state.value; var inputClassName = ClassNames({ 'mui-is-not-empty': inputIsNotEmpty }); var textareaClassName = ClassNames({ 'mui-input-textarea': true, 'mui-is-not-empty': inputIsNotEmpty }); var inputElement = this.props.multiline ? this.props.valueLink ? <textarea {...this.props} ref="input" className={textareaClassName} placeholder={placeholder} rows={this.state.rows} /> : <textarea {...this.props} ref="input" value={this.state.value} className={textareaClassName} placeholder={placeholder} rows={this.state.rows} onChange={this._onTextAreaChange} /> : this.props.valueLink ? <input {...this.props} ref="input" className={inputClassName} placeholder={placeholder} /> : <input {...this.props} ref="input" className={inputClassName} value={this.state.value} placeholder={placeholder} onChange={this._onInputChange} />; var placeholderSpan = this.props.inlinePlaceholder ? null : <span className="mui-input-placeholder" onClick={this._onPlaceholderClick}> {this.props.placeholder} </span>; return ( <div ref={this.props.ref} className={classes}> {inputElement} {placeholderSpan} <span className="mui-input-highlight"></span> <span className="mui-input-bar"></span> <span className="mui-input-description">{this.props.description}</span> <span className="mui-input-error">{this.props.error}</span> </div> ); }, getValue: function() { return this.state.value; }, setValue: function(txt) { this.setState({value: txt}); }, clearValue: function() { this.setValue(''); }, blur: function() { if(this.isMounted()) React.findDOMNode(this.refs.input).blur(); }, focus: function() { if (this.isMounted()) React.findDOMNode(this.refs.input).focus(); }, _onInputChange: function(e) { var value = e.target.value; this.setState({value: value}); if (this.props.onChange) this.props.onChange(e, value); }, _onPlaceholderClick: function() { this.focus(); }, _onTextAreaChange: function(e) { this._onInputChange(e); this._onLineBreak(e); }, _onLineBreak: function(e) { var value = e.target.value; var lines = value.split('\n').length; if (lines > this.state.rows) { if (this.state.rows !== 20) { this.setState({ rows: ((this.state.rows) + 1)}); } } } }); module.exports = Input;