]> git.immae.eu Git - github/fretlink/time-picker.git/commitdiff
Merge branch 'master' into picker-step
author偏右 <afc163@gmail.com>
Sun, 22 Oct 2017 08:25:33 +0000 (16:25 +0800)
committerGitHub <noreply@github.com>
Sun, 22 Oct 2017 08:25:33 +0000 (16:25 +0800)
src/Header.jsx
src/Panel.jsx
src/Select.jsx
src/TimePicker.jsx
tests/TimePicker.spec.jsx

index 91e8549e14664555290a905a8b0102cddd27f808..f6dd24157ae34e04fb43d66ff8e34475d4ae48c0 100644 (file)
@@ -22,6 +22,7 @@ class Header extends Component {
     allowEmpty: PropTypes.bool,
     defaultOpenValue: PropTypes.object,
     currentSelectPanel: PropTypes.string,
+    onKeyDown: PropTypes.func,
   };
 
   constructor(props) {
@@ -122,9 +123,12 @@ class Header extends Component {
   }
 
   onKeyDown = (e) => {
+    const { onEsc, onKeyDown } = this.props;
     if (e.keyCode === 27) {
-      this.props.onEsc();
+      onEsc();
     }
+
+    onKeyDown(e);
   }
 
   onClear = () => {
index 468eb37a15082f29c39178970360a4823b3467b2..4e09b57431cd96d712cbdfd00b6a86556eb30e7e 100644 (file)
@@ -43,6 +43,7 @@ class Panel extends Component {
     minuteStep: PropTypes.number,
     secondStep: PropTypes.number,
     addon: PropTypes.func,
+    onKeyDown: PropTypes.func,
   };
 
   static defaultProps = {
@@ -55,6 +56,7 @@ class Panel extends Component {
     defaultOpenValue: moment(),
     use12Hours: false,
     addon: noop,
+    onKeyDown: noop,
   };
 
   constructor(props) {
@@ -92,7 +94,7 @@ class Panel extends Component {
     const {
       prefixCls, className, placeholder, disabledHours, disabledMinutes,
       disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond,
-      format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear,
+      format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, onKeyDown,
       hourStep, minuteStep, secondStep,
     } = this.props;
     const {
@@ -132,6 +134,7 @@ class Panel extends Component {
           onChange={this.onChange}
           onClear={onClear}
           allowEmpty={allowEmpty}
+          onKeyDown={onKeyDown}
         />
         <Combobox
           prefixCls={prefixCls}
index 49fed5b83c6911767c60d2156d7dd552ffedc5d3..a51ffd2c2c4a5816c4b81f036e7dc1e7599bfa40 100644 (file)
@@ -79,7 +79,7 @@ class Select extends Component {
   scrollToSelected(duration) {
     // move to selected item
     const select = ReactDom.findDOMNode(this);
-    const list = ReactDom.findDOMNode(this.refs.list);
+    const list = ReactDom.findDOMNode(this.list);
     if (!list) {
       return;
     }
@@ -101,6 +101,10 @@ class Select extends Component {
     this.setState({ active: false });
   }
 
+  saveList = (node) => {
+    this.list = node;
+  }
+
   render() {
     if (this.props.options.length === 0) {
       return null;
@@ -118,7 +122,7 @@ class Select extends Component {
         onMouseEnter={this.handleMouseEnter}
         onMouseLeave={this.handleMouseLeave}
       >
-        <ul ref="list">{this.getOptions()}</ul>
+        <ul ref={this.saveList}>{this.getOptions()}</ul>
       </div>
     );
   }
index 85dc3e2a9caf40643f639b0ba80c8cacc9d55fac..5f2239abc48088b93f66caca90e5aa74dc3f9183 100644 (file)
@@ -42,6 +42,8 @@ export default class Picker extends Component {
     onChange: PropTypes.func,
     onOpen: PropTypes.func,
     onClose: PropTypes.func,
+    onFocus: PropTypes.func,
+    onBlur: PropTypes.func,
     addon: PropTypes.func,
     name: PropTypes.string,
     autoComplete: PropTypes.string,
@@ -49,6 +51,7 @@ export default class Picker extends Component {
     hourStep: PropTypes.number,
     minuteStep: PropTypes.number,
     secondStep: PropTypes.number,
+    onKeyDown: PropTypes.func,
   };
 
   static defaultProps = {
@@ -72,8 +75,11 @@ export default class Picker extends Component {
     onChange: noop,
     onOpen: noop,
     onClose: noop,
+    onFocus: noop,
+    onBlur: noop,
     addon: noop,
     use12Hours: false,
+    onKeyDown: noop,
   };
 
   constructor(props) {
@@ -160,7 +166,7 @@ export default class Picker extends Component {
       prefixCls, placeholder, disabledHours,
       disabledMinutes, disabledSeconds, hideDisabledOptions,
       allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText,
-      addon, use12Hours, hourStep, minuteStep, secondStep,
+      addon, use12Hours, onKeyDown, hourStep, minuteStep, secondStep,
     } = this.props;
     return (
       <Panel
@@ -187,6 +193,7 @@ export default class Picker extends Component {
         minuteStep={minuteStep}
         secondStep={secondStep}
         addon={addon}
+        onKeyDown={onKeyDown}
       />
     );
   }
@@ -237,6 +244,7 @@ export default class Picker extends Component {
     const {
       prefixCls, placeholder, placement, align,
       disabled, transitionName, style, className, getPopupContainer, name, autoComplete,
+      onFocus, onBlur,
     } = this.props;
     const { open, value } = this.state;
     const popupClassName = this.getPopupClassName();
@@ -266,6 +274,8 @@ export default class Picker extends Component {
             onKeyDown={this.onKeyDown}
             disabled={disabled} value={value && value.format(this.getFormat()) || ''}
             autoComplete={autoComplete}
+            onFocus={onFocus}
+            onBlur={onBlur}
           />
           <span className={`${prefixCls}-icon`}/>
         </span>
index 0dd6c101ccaf9643c01c24f4b53e2bcd1905fe8c..d698e48ab17b610eeb3fe12491cc9df8ff977526 100644 (file)
@@ -208,4 +208,40 @@ describe('TimePicker', () => {
       });
     });
   });
+
+  describe('other operations', () => {
+    it('focus/blur correctly', (done) => {
+      let focus = false;
+      let blur = false;
+
+      const picker = renderPicker({
+        onFocus: () => {
+          focus = true;
+        },
+        onBlur: () => {
+          blur = true;
+        },
+      });
+      expect(picker.state.open).not.to.be.ok();
+      const input = TestUtils.scryRenderedDOMComponentsWithClass(picker,
+        'rc-time-picker-input')[0];
+
+      async.series([(next) => {
+        Simulate.focus(input);
+        setTimeout(next, 100);
+      }, (next) => {
+        expect(picker.state.open).to.be(false);
+
+        Simulate.blur(input);
+        setTimeout(next, 100);
+      }, (next) => {
+        expect(focus).to.be(true);
+        expect(blur).to.be(true);
+
+        next();
+      }], () => {
+        done();
+      });
+    });
+  });
 });