Ivan - Fix lost focus issue [skip ci]

This commit is contained in:
Ivan Diaz 2016-07-23 00:45:47 -03:00
parent 63813f2425
commit 8a89efa653
3 changed files with 53 additions and 6 deletions

View File

@ -1,10 +1,13 @@
const React = require('react');
const ReactDOM = require('react-dom');
const Reflux = require('reflux');
const _ = require('lodash');
const classNames = require('classnames');
const UserActions = require('actions/user-actions');
const UserStore = require('stores/user-store');
const focus = require('lib-core/focus');
const empty = require('lib-core/empty');
const Button = require('core-components/button');
const Form = require('core-components/form');
@ -35,7 +38,7 @@ let MainHomePageLoginWidget = React.createClass({
renderLogin() {
return (
<Widget className="main-home-page--widget" title="Login">
<Widget className="main-home-page--widget" title="Login" ref="loginWidget">
<Form className="login-widget--form" ref="loginForm" onSubmit={this.handleLoginFormSubmit} errors={this.state.loginFormErrors} onValidateErrors={this.handleLoginFormErrorsValidation}>
<div className="login-widget--inputs">
<Input placeholder="email" name="email" className="login-widget--input" validation="EMAIL" required/>
@ -46,7 +49,7 @@ let MainHomePageLoginWidget = React.createClass({
<Button type="primary">LOG IN</Button>
</div>
</Form>
<Button className="login-widget--forgot-password" type="link" onClick={this.handleForgotPasswordClick}>
<Button className="login-widget--forgot-password" type="link" onClick={this.handleForgotPasswordClick} onMouseDown={empty.preventDefault}>
{'Forgot your password?'}
</Button>
</Widget>
@ -55,7 +58,7 @@ let MainHomePageLoginWidget = React.createClass({
renderPasswordRecovery() {
return (
<Widget className="main-home-page--widget main-home-page--password-widget" title="Password Recovery">
<Widget className="main-home-page--widget main-home-page--password-widget" title="Password Recovery" ref="recoverWidget">
<Form className="login-widget--form" onSubmit={this.handleForgotPasswordSubmit}>
<div className="login-widget--inputs">
<Input placeholder="email" name="email" className="login-widget--input" validation="EMAIL"/>
@ -64,7 +67,7 @@ let MainHomePageLoginWidget = React.createClass({
<Button type="primary">Recover my password</Button>
</div>
</Form>
<Button className="login-widget--forgot-password" type="link" onClick={this.handleBackToLoginClick}>
<Button className="login-widget--forgot-password" type="link" onClick={this.handleBackToLoginClick} onMouseDown={empty.preventDefault}>
{'Back to login form'}
</Button>
</Widget>
@ -88,13 +91,13 @@ let MainHomePageLoginWidget = React.createClass({
handleForgotPasswordClick() {
this.setState({
sideToShow: 'back'
});
}, this.moveFocusToCurrentSide);
},
handleBackToLoginClick() {
this.setState({
sideToShow: 'front'
});
}, this.moveFocusToCurrentSide);
},
onUserStoreChanged(event) {
@ -107,6 +110,23 @@ let MainHomePageLoginWidget = React.createClass({
this.refs.loginForm.refs.password.focus()
}.bind(this));
}
},
moveFocusToCurrentSide() {
let currentWidget;
let previousWidget;
if (this.state.sideToShow === 'front') {
currentWidget = ReactDOM.findDOMNode(this.refs.loginWidget);
previousWidget = ReactDOM.findDOMNode(this.refs.recoverWidget);
} else {
currentWidget = ReactDOM.findDOMNode(this.refs.recoverWidget);
previousWidget = ReactDOM.findDOMNode(this.refs.loginWidget);
}
if (focus.isActiveElementInsideDOMTree(previousWidget)) {
focus.focusFirstInput(currentWidget);
}
}
});

View File

@ -0,0 +1,9 @@
export default {
preventDefault(event) {
event.preventDefault();
},
stopPropagation(event) {
event.stopPropagation();
}
}

View File

@ -0,0 +1,18 @@
const _ = require('lodash');
export default {
isActiveElementInsideDOMTree(domTree = document) {
let activeElement = document.activeElement;
let elements = domTree.querySelectorAll('*');
return (_.findIndex(elements, activeElement) !== -1);
},
focusFirstInput(domTree) {
let firstFocusableElement = domTree.querySelector('input');
if (firstFocusableElement) {
firstFocusableElement.focus();
}
}
};