diff options
-rw-r--r-- | src/Header.jsx | 6 | ||||
-rw-r--r-- | src/Panel.jsx | 5 | ||||
-rw-r--r-- | src/Select.jsx | 8 | ||||
-rw-r--r-- | src/TimePicker.jsx | 12 | ||||
-rw-r--r-- | tests/TimePicker.spec.jsx | 36 |
5 files changed, 62 insertions, 5 deletions
diff --git a/src/Header.jsx b/src/Header.jsx index 91e8549..f6dd241 100644 --- a/src/Header.jsx +++ b/src/Header.jsx | |||
@@ -22,6 +22,7 @@ class Header extends Component { | |||
22 | allowEmpty: PropTypes.bool, | 22 | allowEmpty: PropTypes.bool, |
23 | defaultOpenValue: PropTypes.object, | 23 | defaultOpenValue: PropTypes.object, |
24 | currentSelectPanel: PropTypes.string, | 24 | currentSelectPanel: PropTypes.string, |
25 | onKeyDown: PropTypes.func, | ||
25 | }; | 26 | }; |
26 | 27 | ||
27 | constructor(props) { | 28 | constructor(props) { |
@@ -122,9 +123,12 @@ class Header extends Component { | |||
122 | } | 123 | } |
123 | 124 | ||
124 | onKeyDown = (e) => { | 125 | onKeyDown = (e) => { |
126 | const { onEsc, onKeyDown } = this.props; | ||
125 | if (e.keyCode === 27) { | 127 | if (e.keyCode === 27) { |
126 | this.props.onEsc(); | 128 | onEsc(); |
127 | } | 129 | } |
130 | |||
131 | onKeyDown(e); | ||
128 | } | 132 | } |
129 | 133 | ||
130 | onClear = () => { | 134 | onClear = () => { |
diff --git a/src/Panel.jsx b/src/Panel.jsx index 468eb37..4e09b57 100644 --- a/src/Panel.jsx +++ b/src/Panel.jsx | |||
@@ -43,6 +43,7 @@ class Panel extends Component { | |||
43 | minuteStep: PropTypes.number, | 43 | minuteStep: PropTypes.number, |
44 | secondStep: PropTypes.number, | 44 | secondStep: PropTypes.number, |
45 | addon: PropTypes.func, | 45 | addon: PropTypes.func, |
46 | onKeyDown: PropTypes.func, | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | static defaultProps = { | 49 | static defaultProps = { |
@@ -55,6 +56,7 @@ class Panel extends Component { | |||
55 | defaultOpenValue: moment(), | 56 | defaultOpenValue: moment(), |
56 | use12Hours: false, | 57 | use12Hours: false, |
57 | addon: noop, | 58 | addon: noop, |
59 | onKeyDown: noop, | ||
58 | }; | 60 | }; |
59 | 61 | ||
60 | constructor(props) { | 62 | constructor(props) { |
@@ -92,7 +94,7 @@ class Panel extends Component { | |||
92 | const { | 94 | const { |
93 | prefixCls, className, placeholder, disabledHours, disabledMinutes, | 95 | prefixCls, className, placeholder, disabledHours, disabledMinutes, |
94 | disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond, | 96 | disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond, |
95 | format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, | 97 | format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, onKeyDown, |
96 | hourStep, minuteStep, secondStep, | 98 | hourStep, minuteStep, secondStep, |
97 | } = this.props; | 99 | } = this.props; |
98 | const { | 100 | const { |
@@ -132,6 +134,7 @@ class Panel extends Component { | |||
132 | onChange={this.onChange} | 134 | onChange={this.onChange} |
133 | onClear={onClear} | 135 | onClear={onClear} |
134 | allowEmpty={allowEmpty} | 136 | allowEmpty={allowEmpty} |
137 | onKeyDown={onKeyDown} | ||
135 | /> | 138 | /> |
136 | <Combobox | 139 | <Combobox |
137 | prefixCls={prefixCls} | 140 | prefixCls={prefixCls} |
diff --git a/src/Select.jsx b/src/Select.jsx index 49fed5b..a51ffd2 100644 --- a/src/Select.jsx +++ b/src/Select.jsx | |||
@@ -79,7 +79,7 @@ class Select extends Component { | |||
79 | scrollToSelected(duration) { | 79 | scrollToSelected(duration) { |
80 | // move to selected item | 80 | // move to selected item |
81 | const select = ReactDom.findDOMNode(this); | 81 | const select = ReactDom.findDOMNode(this); |
82 | const list = ReactDom.findDOMNode(this.refs.list); | 82 | const list = ReactDom.findDOMNode(this.list); |
83 | if (!list) { | 83 | if (!list) { |
84 | return; | 84 | return; |
85 | } | 85 | } |
@@ -101,6 +101,10 @@ class Select extends Component { | |||
101 | this.setState({ active: false }); | 101 | this.setState({ active: false }); |
102 | } | 102 | } |
103 | 103 | ||
104 | saveList = (node) => { | ||
105 | this.list = node; | ||
106 | } | ||
107 | |||
104 | render() { | 108 | render() { |
105 | if (this.props.options.length === 0) { | 109 | if (this.props.options.length === 0) { |
106 | return null; | 110 | return null; |
@@ -118,7 +122,7 @@ class Select extends Component { | |||
118 | onMouseEnter={this.handleMouseEnter} | 122 | onMouseEnter={this.handleMouseEnter} |
119 | onMouseLeave={this.handleMouseLeave} | 123 | onMouseLeave={this.handleMouseLeave} |
120 | > | 124 | > |
121 | <ul ref="list">{this.getOptions()}</ul> | 125 | <ul ref={this.saveList}>{this.getOptions()}</ul> |
122 | </div> | 126 | </div> |
123 | ); | 127 | ); |
124 | } | 128 | } |
diff --git a/src/TimePicker.jsx b/src/TimePicker.jsx index 85dc3e2..5f2239a 100644 --- a/src/TimePicker.jsx +++ b/src/TimePicker.jsx | |||
@@ -42,6 +42,8 @@ export default class Picker extends Component { | |||
42 | onChange: PropTypes.func, | 42 | onChange: PropTypes.func, |
43 | onOpen: PropTypes.func, | 43 | onOpen: PropTypes.func, |
44 | onClose: PropTypes.func, | 44 | onClose: PropTypes.func, |
45 | onFocus: PropTypes.func, | ||
46 | onBlur: PropTypes.func, | ||
45 | addon: PropTypes.func, | 47 | addon: PropTypes.func, |
46 | name: PropTypes.string, | 48 | name: PropTypes.string, |
47 | autoComplete: PropTypes.string, | 49 | autoComplete: PropTypes.string, |
@@ -49,6 +51,7 @@ export default class Picker extends Component { | |||
49 | hourStep: PropTypes.number, | 51 | hourStep: PropTypes.number, |
50 | minuteStep: PropTypes.number, | 52 | minuteStep: PropTypes.number, |
51 | secondStep: PropTypes.number, | 53 | secondStep: PropTypes.number, |
54 | onKeyDown: PropTypes.func, | ||
52 | }; | 55 | }; |
53 | 56 | ||
54 | static defaultProps = { | 57 | static defaultProps = { |
@@ -72,8 +75,11 @@ export default class Picker extends Component { | |||
72 | onChange: noop, | 75 | onChange: noop, |
73 | onOpen: noop, | 76 | onOpen: noop, |
74 | onClose: noop, | 77 | onClose: noop, |
78 | onFocus: noop, | ||
79 | onBlur: noop, | ||
75 | addon: noop, | 80 | addon: noop, |
76 | use12Hours: false, | 81 | use12Hours: false, |
82 | onKeyDown: noop, | ||
77 | }; | 83 | }; |
78 | 84 | ||
79 | constructor(props) { | 85 | constructor(props) { |
@@ -160,7 +166,7 @@ export default class Picker extends Component { | |||
160 | prefixCls, placeholder, disabledHours, | 166 | prefixCls, placeholder, disabledHours, |
161 | disabledMinutes, disabledSeconds, hideDisabledOptions, | 167 | disabledMinutes, disabledSeconds, hideDisabledOptions, |
162 | allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText, | 168 | allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText, |
163 | addon, use12Hours, hourStep, minuteStep, secondStep, | 169 | addon, use12Hours, onKeyDown, hourStep, minuteStep, secondStep, |
164 | } = this.props; | 170 | } = this.props; |
165 | return ( | 171 | return ( |
166 | <Panel | 172 | <Panel |
@@ -187,6 +193,7 @@ export default class Picker extends Component { | |||
187 | minuteStep={minuteStep} | 193 | minuteStep={minuteStep} |
188 | secondStep={secondStep} | 194 | secondStep={secondStep} |
189 | addon={addon} | 195 | addon={addon} |
196 | onKeyDown={onKeyDown} | ||
190 | /> | 197 | /> |
191 | ); | 198 | ); |
192 | } | 199 | } |
@@ -237,6 +244,7 @@ export default class Picker extends Component { | |||
237 | const { | 244 | const { |
238 | prefixCls, placeholder, placement, align, | 245 | prefixCls, placeholder, placement, align, |
239 | disabled, transitionName, style, className, getPopupContainer, name, autoComplete, | 246 | disabled, transitionName, style, className, getPopupContainer, name, autoComplete, |
247 | onFocus, onBlur, | ||
240 | } = this.props; | 248 | } = this.props; |
241 | const { open, value } = this.state; | 249 | const { open, value } = this.state; |
242 | const popupClassName = this.getPopupClassName(); | 250 | const popupClassName = this.getPopupClassName(); |
@@ -266,6 +274,8 @@ export default class Picker extends Component { | |||
266 | onKeyDown={this.onKeyDown} | 274 | onKeyDown={this.onKeyDown} |
267 | disabled={disabled} value={value && value.format(this.getFormat()) || ''} | 275 | disabled={disabled} value={value && value.format(this.getFormat()) || ''} |
268 | autoComplete={autoComplete} | 276 | autoComplete={autoComplete} |
277 | onFocus={onFocus} | ||
278 | onBlur={onBlur} | ||
269 | /> | 279 | /> |
270 | <span className={`${prefixCls}-icon`}/> | 280 | <span className={`${prefixCls}-icon`}/> |
271 | </span> | 281 | </span> |
diff --git a/tests/TimePicker.spec.jsx b/tests/TimePicker.spec.jsx index 0dd6c10..d698e48 100644 --- a/tests/TimePicker.spec.jsx +++ b/tests/TimePicker.spec.jsx | |||
@@ -208,4 +208,40 @@ describe('TimePicker', () => { | |||
208 | }); | 208 | }); |
209 | }); | 209 | }); |
210 | }); | 210 | }); |
211 | |||
212 | describe('other operations', () => { | ||
213 | it('focus/blur correctly', (done) => { | ||
214 | let focus = false; | ||
215 | let blur = false; | ||
216 | |||
217 | const picker = renderPicker({ | ||
218 | onFocus: () => { | ||
219 | focus = true; | ||
220 | }, | ||
221 | onBlur: () => { | ||
222 | blur = true; | ||
223 | }, | ||
224 | }); | ||
225 | expect(picker.state.open).not.to.be.ok(); | ||
226 | const input = TestUtils.scryRenderedDOMComponentsWithClass(picker, | ||
227 | 'rc-time-picker-input')[0]; | ||
228 | |||
229 | async.series([(next) => { | ||
230 | Simulate.focus(input); | ||
231 | setTimeout(next, 100); | ||
232 | }, (next) => { | ||
233 | expect(picker.state.open).to.be(false); | ||
234 | |||
235 | Simulate.blur(input); | ||
236 | setTimeout(next, 100); | ||
237 | }, (next) => { | ||
238 | expect(focus).to.be(true); | ||
239 | expect(blur).to.be(true); | ||
240 | |||
241 | next(); | ||
242 | }], () => { | ||
243 | done(); | ||
244 | }); | ||
245 | }); | ||
246 | }); | ||
211 | }); | 247 | }); |