UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

259 lines (225 loc) 7.31 kB
define(function (require, exports, module) {var React = require('react'); var joinClasses = require('./utils/joinClasses'); var classSet = require('./utils/classSet'); var Button = require('./Button'); var Input = React.createClass({displayName: "Input", propTypes: { type: React.PropTypes.string, label: React.PropTypes.node, help: React.PropTypes.node, addonBefore: React.PropTypes.node, addonAfter: React.PropTypes.node, buttonBefore: React.PropTypes.node, buttonAfter: React.PropTypes.node, bsStyle: function(props) { if (props.type === 'submit') { // Return early if `type=submit` as the `Button` component // it transfers these props to has its own propType checks. return; } return React.PropTypes.oneOf(['success', 'warning', 'error']).apply(null, arguments); }, hasFeedback: React.PropTypes.bool, groupClassName: React.PropTypes.string, wrapperClassName: React.PropTypes.string, labelClassName: React.PropTypes.string, disabled: React.PropTypes.bool }, getInputDOMNode: function () { return this.refs.input.getDOMNode(); }, getValue: function () { if (this.props.type === 'static') { return this.props.value; } else if (this.props.type) { if (this.props.type == "select" && this.props.multiple) { return this.getSelectedOptions(); } else { return this.getInputDOMNode().value; } } else { throw Error('Cannot use getValue without specifying input type.'); } }, getChecked: function () { return this.getInputDOMNode().checked; }, getSelectedOptions: function () { var values = []; Array.prototype.forEach.call( this.getInputDOMNode().getElementsByTagName('option'), function (option) { if (option.selected) { var value = option.getAttribute('value') || option.innerHTML; values.push(value); } } ); return values; }, isCheckboxOrRadio: function () { return this.props.type === 'radio' || this.props.type === 'checkbox'; }, isFile: function () { return this.props.type === 'file'; }, renderInput: function () { var input = null; if (!this.props.type) { return this.props.children } switch (this.props.type) { case 'select': input = ( React.createElement("select", React.__spread({}, this.props, {className: joinClasses(this.props.className, 'form-control'), ref: "input", key: "input"}), this.props.children ) ); break; case 'textarea': input = React.createElement("textarea", React.__spread({}, this.props, {className: joinClasses(this.props.className, 'form-control'), ref: "input", key: "input"})); break; case 'static': input = ( React.createElement("p", React.__spread({}, this.props, {className: joinClasses(this.props.className, 'form-control-static'), ref: "input", key: "input"}), this.props.value ) ); break; case 'submit': input = ( React.createElement(Button, React.__spread({}, this.props, {componentClass: "input", ref: "input", key: "input"})) ); break; default: var className = this.isCheckboxOrRadio() || this.isFile() ? '' : 'form-control'; input = React.createElement("input", React.__spread({}, this.props, {className: joinClasses(this.props.className, className), ref: "input", key: "input"})); } return input; }, renderInputGroup: function (children) { var addonBefore = this.props.addonBefore ? ( React.createElement("span", {className: "input-group-addon", key: "addonBefore"}, this.props.addonBefore ) ) : null; var addonAfter = this.props.addonAfter ? ( React.createElement("span", {className: "input-group-addon", key: "addonAfter"}, this.props.addonAfter ) ) : null; var buttonBefore = this.props.buttonBefore ? ( React.createElement("span", {className: "input-group-btn"}, this.props.buttonBefore ) ) : null; var buttonAfter = this.props.buttonAfter ? ( React.createElement("span", {className: "input-group-btn"}, this.props.buttonAfter ) ) : null; return addonBefore || addonAfter || buttonBefore || buttonAfter ? ( React.createElement("div", {className: "input-group", key: "input-group"}, addonBefore, buttonBefore, children, addonAfter, buttonAfter ) ) : children; }, renderIcon: function () { var classes = { 'glyphicon': true, 'form-control-feedback': true, 'glyphicon-ok': this.props.bsStyle === 'success', 'glyphicon-warning-sign': this.props.bsStyle === 'warning', 'glyphicon-remove': this.props.bsStyle === 'error' }; return this.props.hasFeedback ? ( React.createElement("span", {className: classSet(classes), key: "icon"}) ) : null; }, renderHelp: function () { return this.props.help ? ( React.createElement("span", {className: "help-block", key: "help"}, this.props.help ) ) : null; }, renderCheckboxandRadioWrapper: function (children) { var classes = { 'checkbox': this.props.type === 'checkbox', 'radio': this.props.type === 'radio' }; return ( React.createElement("div", {className: classSet(classes), key: "checkboxRadioWrapper"}, children ) ); }, renderWrapper: function (children) { return this.props.wrapperClassName ? ( React.createElement("div", {className: this.props.wrapperClassName, key: "wrapper"}, children ) ) : children; }, renderLabel: function (children) { var classes = { 'control-label': !this.isCheckboxOrRadio() }; classes[this.props.labelClassName] = this.props.labelClassName; return this.props.label ? ( React.createElement("label", {htmlFor: this.props.id, className: classSet(classes), key: "label"}, children, this.props.label ) ) : children; }, renderFormGroup: function (children) { var classes = { 'form-group': true, 'has-feedback': this.props.hasFeedback, 'has-success': this.props.bsStyle === 'success', 'has-warning': this.props.bsStyle === 'warning', 'has-error': this.props.bsStyle === 'error' }; classes[this.props.groupClassName] = this.props.groupClassName; return ( React.createElement("div", {className: classSet(classes)}, children ) ); }, render: function () { if (this.isCheckboxOrRadio()) { return this.renderFormGroup( this.renderWrapper([ this.renderCheckboxandRadioWrapper( this.renderLabel( this.renderInput() ) ), this.renderHelp() ]) ); } else { return this.renderFormGroup([ this.renderLabel(), this.renderWrapper([ this.renderInputGroup( this.renderInput() ), this.renderIcon(), this.renderHelp() ]) ]); } } }); module.exports = Input; });