]> git.immae.eu Git - github/fretlink/time-picker.git/commitdiff
Merge branch 'master' into focus-on-open
author偏右 <afc163@gmail.com>
Sun, 22 Oct 2017 08:24:17 +0000 (16:24 +0800)
committerGitHub <noreply@github.com>
Sun, 22 Oct 2017 08:24:17 +0000 (16:24 +0800)
README.md
examples/open.js
src/Header.jsx
src/Panel.jsx
src/TimePicker.jsx
tests/Header.spec.jsx

index a2758b9faec55ea530b2692da26b0a9ae0e38201..0698d7d407dc50b4620d5604a73e446d4fba2c52 100644 (file)
--- a/README.md
+++ b/README.md
@@ -77,6 +77,7 @@ API
 | name                    | String                            | - | sets the name of the generated input |
 | onOpen                  | Function({ open })                |   | when TimePicker panel is opened      |
 | onClose                 | Function({ open })                |   | when TimePicker panel is opened      |
+| focusOnOpen             | Boolean                           | false | automatically focus the input when the picker opens |
 
 ## Test Case
 
index 8e4f5de7865410da4496fa707832abb4a9c28e6a..12d8a8d27580fe1e9a70e13109f696ce7cb15f00 100644 (file)
@@ -22,7 +22,12 @@ class App extends React.Component {
     return (
       <div>
         <button onClick={this.toggleOpen}>Toggle open</button>
-        <TimePicker open={this.state.open} onOpen={this.setOpen} onClose={this.setOpen} />
+        <TimePicker
+          open={this.state.open}
+          onOpen={this.setOpen}
+          onClose={this.setOpen}
+          focusOnOpen
+        />
       </div>
     );
   }
index f6dd24157ae34e04fb43d66ff8e34475d4ae48c0..1520d25e3008b371efc66bebfe620d2cf5df4034 100644 (file)
@@ -22,6 +22,7 @@ class Header extends Component {
     allowEmpty: PropTypes.bool,
     defaultOpenValue: PropTypes.object,
     currentSelectPanel: PropTypes.string,
+    focusOnOpen: PropTypes.bool,
     onKeyDown: PropTypes.func,
   };
 
@@ -34,6 +35,17 @@ class Header extends Component {
     };
   }
 
+  componentDidMount() {
+    if (this.props.focusOnOpen) {
+      // Wait one frame for the panel to be positioned before focusing
+      const requestAnimationFrame = (window.requestAnimationFrame || window.setTimeout);
+      requestAnimationFrame(() => {
+        this.refs.input.focus();
+        this.refs.input.select();
+      });
+    }
+  }
+
   componentWillReceiveProps(nextProps) {
     const { value, format } = nextProps;
     this.setState({
index 8a6c872e7e73784aeeace67fe3d4bca09384b57b..957c021853900ba8f416ae682d721fdef74b2e1f 100644 (file)
@@ -40,6 +40,7 @@ class Panel extends Component {
     onClear: PropTypes.func,
     use12Hours: PropTypes.bool,
     addon: PropTypes.func,
+    focusOnOpen: PropTypes.bool,
     onKeyDown: PropTypes.func,
   };
 
@@ -91,7 +92,7 @@ class Panel extends Component {
     const {
       prefixCls, className, placeholder, disabledHours, disabledMinutes,
       disabledSeconds, hideDisabledOptions, allowEmpty, showHour, showMinute, showSecond,
-      format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, onKeyDown,
+      format, defaultOpenValue, clearText, onEsc, addon, use12Hours, onClear, focusOnOpen, onKeyDown,
     } = this.props;
     const {
       value, currentSelectPanel,
@@ -124,6 +125,7 @@ class Panel extends Component {
           onChange={this.onChange}
           onClear={onClear}
           allowEmpty={allowEmpty}
+          focusOnOpen={focusOnOpen}
           onKeyDown={onKeyDown}
         />
         <Combobox
index 271515da4af3973ac5ed0486c3bbc1f1e8948a6d..70327d723981bf92212702153d58bd26d60d090e 100644 (file)
@@ -48,6 +48,7 @@ export default class Picker extends Component {
     name: PropTypes.string,
     autoComplete: PropTypes.string,
     use12Hours: PropTypes.bool,
+    focusOnOpen: PropTypes.bool,
     onKeyDown: PropTypes.func,
   };
 
@@ -76,6 +77,7 @@ export default class Picker extends Component {
     onBlur: noop,
     addon: noop,
     use12Hours: false,
+    focusOnOpen: false,
     onKeyDown: noop,
   };
 
@@ -163,7 +165,7 @@ export default class Picker extends Component {
       prefixCls, placeholder, disabledHours,
       disabledMinutes, disabledSeconds, hideDisabledOptions,
       allowEmpty, showHour, showMinute, showSecond, defaultOpenValue, clearText,
-      addon, use12Hours, onKeyDown,
+      addon, use12Hours, focusOnOpen, onKeyDown,
     } = this.props;
     return (
       <Panel
@@ -187,6 +189,7 @@ export default class Picker extends Component {
         hideDisabledOptions={hideDisabledOptions}
         use12Hours={use12Hours}
         addon={addon}
+        focusOnOpen={focusOnOpen}
         onKeyDown={onKeyDown}
       />
     );
index 5ab0ba004e3a4d68516fe9d913c0bb7bc9de4b4f..4b27abb85fe0fa55ccb924547f7e0091b37341a3 100644 (file)
@@ -368,5 +368,33 @@ describe('Header', () => {
         done();
       });
     });
+
+    it('focus on open', (done) => {
+      const picker = renderPicker({
+        focusOnOpen: true,
+      });
+      expect(picker.state.open).not.to.be.ok();
+      const input = TestUtils.scryRenderedDOMComponentsWithClass(picker,
+        'rc-time-picker-input')[0];
+      let header;
+      async.series([(next) => {
+        expect(picker.state.open).to.be(false);
+
+        Simulate.click(input);
+        setTimeout(next, 100);
+      }, (next) => {
+        // this touches the focusOnOpen code, but we cannot verify the input is in focus
+        expect(picker.state.open).to.be(true);
+        header = TestUtils.scryRenderedDOMComponentsWithClass(picker.panelInstance,
+          'rc-time-picker-panel-input')[0];
+        expect(header).to.be.ok();
+        expect((header).value).to.be('01:02:03');
+        expect((input).value).to.be('01:02:03');
+
+        next();
+      }], () => {
+        done();
+      });
+    });
   });
 });