|
1 | 1 | import React from 'react'; |
2 | | -import classNames from 'classnames'; |
3 | | -import Button from './Button'; |
4 | | -import FormGroup from './FormGroup'; |
| 2 | +import InputBase from './InputBase'; |
| 3 | +import ButtonInput from './ButtonInput'; |
| 4 | +import deprecationWarning from './utils/deprecationWarning'; |
5 | 5 |
|
6 | | -class Input extends React.Component { |
7 | | - getInputDOMNode() { |
8 | | - return React.findDOMNode(this.refs.input); |
9 | | - } |
10 | | - |
11 | | - getValue() { |
12 | | - if (this.props.type === 'static') { |
13 | | - return this.props.value; |
14 | | - } else if (this.props.type) { |
15 | | - if (this.props.type === 'select' && this.props.multiple) { |
16 | | - return this.getSelectedOptions(); |
17 | | - } else { |
18 | | - return this.getInputDOMNode().value; |
19 | | - } |
20 | | - } else { |
21 | | - throw 'Cannot use getValue without specifying input type.'; |
22 | | - } |
23 | | - } |
24 | | - |
25 | | - getChecked() { |
26 | | - return this.getInputDOMNode().checked; |
27 | | - } |
28 | | - |
29 | | - getSelectedOptions() { |
30 | | - let values = []; |
31 | | - |
32 | | - Array.prototype.forEach.call( |
33 | | - this.getInputDOMNode().getElementsByTagName('option'), |
34 | | - (option) => { |
35 | | - if (option.selected) { |
36 | | - let value = option.getAttribute('value') || option.innerHtml; |
37 | | - values.push(value); |
38 | | - } |
39 | | - }); |
40 | | - |
41 | | - return values; |
42 | | - } |
43 | | - |
44 | | - isCheckboxOrRadio() { |
45 | | - return this.props.type === 'checkbox' || this.props.type === 'radio'; |
46 | | - } |
47 | | - |
48 | | - isFile() { |
49 | | - return this.props.type === 'file'; |
50 | | - } |
51 | | - |
52 | | - renderInputGroup(children) { |
53 | | - let addonBefore = this.props.addonBefore ? ( |
54 | | - <span className="input-group-addon" key="addonBefore"> |
55 | | - {this.props.addonBefore} |
56 | | - </span> |
57 | | - ) : null; |
58 | | - |
59 | | - let addonAfter = this.props.addonAfter ? ( |
60 | | - <span className="input-group-addon" key="addonAfter"> |
61 | | - {this.props.addonAfter} |
62 | | - </span> |
63 | | - ) : null; |
64 | | - |
65 | | - let buttonBefore = this.props.buttonBefore ? ( |
66 | | - <span className="input-group-btn"> |
67 | | - {this.props.buttonBefore} |
68 | | - </span> |
69 | | - ) : null; |
70 | | - |
71 | | - let buttonAfter = this.props.buttonAfter ? ( |
72 | | - <span className="input-group-btn"> |
73 | | - {this.props.buttonAfter} |
74 | | - </span> |
75 | | - ) : null; |
76 | | - |
77 | | - let inputGroupClassName; |
78 | | - switch (this.props.bsSize) { |
79 | | - case 'small': inputGroupClassName = 'input-group-sm'; break; |
80 | | - case 'large': inputGroupClassName = 'input-group-lg'; break; |
81 | | - } |
82 | | - |
83 | | - return addonBefore || addonAfter || buttonBefore || buttonAfter ? ( |
84 | | - <div className={classNames(inputGroupClassName, 'input-group')} key="input-group"> |
85 | | - {addonBefore} |
86 | | - {buttonBefore} |
87 | | - {children} |
88 | | - {addonAfter} |
89 | | - {buttonAfter} |
90 | | - </div> |
91 | | - ) : children; |
92 | | - } |
93 | | - |
94 | | - renderIcon() { |
95 | | - let classes = { |
96 | | - 'glyphicon': true, |
97 | | - 'form-control-feedback': true, |
98 | | - 'glyphicon-ok': this.props.bsStyle === 'success', |
99 | | - 'glyphicon-warning-sign': this.props.bsStyle === 'warning', |
100 | | - 'glyphicon-remove': this.props.bsStyle === 'error' |
101 | | - }; |
102 | | - |
103 | | - return this.props.hasFeedback ? ( |
104 | | - <span className={classNames(classes)} key="icon" /> |
105 | | - ) : null; |
106 | | - } |
| 6 | +const buttonTypes = ['button', 'reset', 'submit']; |
107 | 7 |
|
108 | | - renderHelp() { |
109 | | - return this.props.help ? ( |
110 | | - <span className="help-block" key="help"> |
111 | | - {this.props.help} |
112 | | - </span> |
113 | | - ) : null; |
114 | | - } |
115 | | - |
116 | | - renderCheckboxAndRadioWrapper(children) { |
117 | | - let classes = { |
118 | | - 'checkbox': this.props.type === 'checkbox', |
119 | | - 'radio': this.props.type === 'radio' |
120 | | - }; |
121 | | - |
122 | | - return ( |
123 | | - <div className={classNames(classes)} key="checkboxRadioWrapper"> |
124 | | - {children} |
125 | | - </div> |
126 | | - ); |
127 | | - } |
128 | | - |
129 | | - renderWrapper(children) { |
130 | | - return this.props.wrapperClassName ? ( |
131 | | - <div className={this.props.wrapperClassName} key="wrapper"> |
132 | | - {children} |
133 | | - </div> |
134 | | - ) : children; |
135 | | - } |
136 | | - |
137 | | - renderLabel(children) { |
138 | | - let classes = { |
139 | | - 'control-label': !this.isCheckboxOrRadio() |
140 | | - }; |
141 | | - classes[this.props.labelClassName] = this.props.labelClassName; |
142 | | - |
143 | | - return this.props.label ? ( |
144 | | - <label htmlFor={this.props.id} className={classNames(classes)} key="label"> |
145 | | - {children} |
146 | | - {this.props.label} |
147 | | - </label> |
148 | | - ) : children; |
149 | | - } |
150 | | - |
151 | | - renderInput() { |
152 | | - if (!this.props.type) { |
153 | | - return this.props.children; |
154 | | - } |
155 | | - |
156 | | - switch (this.props.type) { |
157 | | - case 'select': |
158 | | - return ( |
159 | | - <select {...this.props} className={classNames(this.props.className, 'form-control')} ref="input" key="input"> |
160 | | - {this.props.children} |
161 | | - </select> |
162 | | - ); |
163 | | - case 'textarea': |
164 | | - return <textarea {...this.props} className={classNames(this.props.className, 'form-control')} ref="input" key="input" />; |
165 | | - case 'static': |
166 | | - return ( |
167 | | - <p {...this.props} className={classNames(this.props.className, 'form-control-static')} ref="input" key="input"> |
168 | | - {this.props.value} |
169 | | - </p> |
170 | | - ); |
171 | | - case 'submit': |
172 | | - return <Button {...this.props} componentClass="input" ref="input" key="input" />; |
173 | | - } |
174 | | - |
175 | | - let className = this.isCheckboxOrRadio() || this.isFile() ? '' : 'form-control'; |
176 | | - return <input {...this.props} className={classNames(this.props.className, className)} ref="input" key="input" />; |
177 | | - } |
178 | | - |
179 | | - renderFormGroup(children) { |
180 | | - if (this.props.type === 'submit') { |
181 | | - let {bsStyle, ...other} = this.props; /* eslint no-unused-vars: 0 object-shorthand: 0 */ |
182 | | - return <FormGroup {...other}>{children}</FormGroup>; |
| 8 | +class Input extends InputBase { |
| 9 | + render() { |
| 10 | + if (buttonTypes.indexOf(this.props.type) > -1) { |
| 11 | + deprecationWarning(`Input type=${this.props.type}`, 'ButtonInput'); |
| 12 | + return <ButtonInput {...this.props} />; |
183 | 13 | } |
184 | 14 |
|
185 | | - return <FormGroup {...this.props}>{children}</FormGroup>; |
186 | | - } |
187 | | - |
188 | | - renderChildren() { |
189 | | - return !this.isCheckboxOrRadio() ? [ |
190 | | - this.renderLabel(), |
191 | | - this.renderWrapper([ |
192 | | - this.renderInputGroup( |
193 | | - this.renderInput() |
194 | | - ), |
195 | | - this.renderIcon(), |
196 | | - this.renderHelp() |
197 | | - ]) |
198 | | - ] : this.renderWrapper([ |
199 | | - this.renderCheckboxAndRadioWrapper( |
200 | | - this.renderLabel( |
201 | | - this.renderInput() |
202 | | - ) |
203 | | - ), |
204 | | - this.renderHelp() |
205 | | - ]); |
206 | | - } |
207 | | - |
208 | | - render() { |
209 | | - let children = this.renderChildren(); |
210 | | - return this.renderFormGroup(children); |
| 15 | + return super.render(); |
211 | 16 | } |
212 | 17 | } |
213 | 18 |
|
214 | | -Input.propTypes = { |
215 | | - type: React.PropTypes.string, |
216 | | - label: React.PropTypes.node, |
217 | | - help: React.PropTypes.node, |
218 | | - addonBefore: React.PropTypes.node, |
219 | | - addonAfter: React.PropTypes.node, |
220 | | - buttonBefore: React.PropTypes.node, |
221 | | - buttonAfter: React.PropTypes.node, |
222 | | - bsSize: React.PropTypes.oneOf(['small', 'medium', 'large']), |
223 | | - bsStyle(props) { |
224 | | - if (props.type === 'submit') { |
225 | | - return null; |
226 | | - } |
227 | | - return React.PropTypes.oneOf(['success', 'warning', 'error']).apply(null, arguments); |
228 | | - }, |
229 | | - hasFeedback: React.PropTypes.bool, |
230 | | - id: React.PropTypes.string, |
231 | | - groupClassName: React.PropTypes.string, |
232 | | - wrapperClassName: React.PropTypes.string, |
233 | | - labelClassName: React.PropTypes.string, |
234 | | - multiple: React.PropTypes.bool, |
235 | | - disabled: React.PropTypes.bool, |
236 | | - value: React.PropTypes.any |
237 | | -}; |
238 | | - |
239 | 19 | export default Input; |
0 commit comments