PLT-2809 Followups to login page redesign (#2901)
* Rearranged controls on the login page * Prevented login when username or password hasn't been entered * Updated login page error messages * Enabled sign in with username by default
Этот коммит содержится в:
коммит произвёл
Christopher Speller
родитель
d75cb02948
Коммит
faf807d872
@@ -78,7 +78,7 @@
|
|||||||
"EmailSettings": {
|
"EmailSettings": {
|
||||||
"EnableSignUpWithEmail": true,
|
"EnableSignUpWithEmail": true,
|
||||||
"EnableSignInWithEmail": true,
|
"EnableSignInWithEmail": true,
|
||||||
"EnableSignInWithUsername": false,
|
"EnableSignInWithUsername": true,
|
||||||
"SendEmailNotifications": false,
|
"SendEmailNotifications": false,
|
||||||
"RequireEmailVerification": false,
|
"RequireEmailVerification": false,
|
||||||
"FeedbackName": "",
|
"FeedbackName": "",
|
||||||
|
|||||||
@@ -50,58 +50,25 @@ export default class Login extends React.Component {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
const loginId = this.state.loginId.trim();
|
const loginId = this.state.loginId.trim();
|
||||||
if (!loginId) {
|
|
||||||
const ldapEnabled = global.window.mm_config.EnableLdap === 'true';
|
|
||||||
const usernameSigninEnabled = global.window.mm_config.EnableSignInWithUsername === 'true';
|
|
||||||
const emailSigninEnabled = global.window.mm_config.EnableSignInWithEmail === 'true';
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
serverError: (
|
|
||||||
<FormattedMessage
|
|
||||||
id='login.loginIdRequired'
|
|
||||||
defaultMessage='A {type} is required'
|
|
||||||
values={{
|
|
||||||
type: this.createLoginPlaceholder(emailSigninEnabled, usernameSigninEnabled, ldapEnabled)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const password = this.state.password.trim();
|
const password = this.state.password.trim();
|
||||||
if (!password) {
|
|
||||||
this.setState({
|
|
||||||
serverError: (
|
|
||||||
<FormattedMessage
|
|
||||||
id='login.passwordRequired'
|
|
||||||
defaultMessage='A password is required'
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
if (global.window.mm_config.EnableMultifactorAuthentication === 'true') {
|
||||||
}
|
Client.checkMfa(
|
||||||
|
loginId,
|
||||||
if (global.window.mm_config.EnableMultifactorAuthentication !== 'true') {
|
(data) => {
|
||||||
this.submit(loginId, password, '');
|
if (data.mfa_required === 'true') {
|
||||||
return;
|
this.setState({showMfa: true});
|
||||||
}
|
} else {
|
||||||
|
this.submit(loginId, password, '');
|
||||||
Client.checkMfa(
|
}
|
||||||
loginId,
|
},
|
||||||
(data) => {
|
(err) => {
|
||||||
if (data.mfa_required === 'true') {
|
this.setState({serverError: err.message});
|
||||||
this.setState({showMfa: true});
|
|
||||||
} else {
|
|
||||||
this.submit(loginId, password, '');
|
|
||||||
}
|
}
|
||||||
},
|
);
|
||||||
(err) => {
|
} else {
|
||||||
this.setState({serverError: err.message});
|
this.submit(loginId, password, '');
|
||||||
}
|
}
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
submit(loginId, password, token) {
|
submit(loginId, password, token) {
|
||||||
@@ -125,7 +92,16 @@ export default class Login extends React.Component {
|
|||||||
serverError: (
|
serverError: (
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='login.userNotFound'
|
id='login.userNotFound'
|
||||||
defaultMessage="We couldn't find an existing account matching your login credentials."
|
defaultMessage="We couldn't find an account matching your login credentials."
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
});
|
||||||
|
} else if (err.id === 'api.user.check_user_password.invalid.app_error' || err.id === 'ent.ldap.do_login.invalid_password.app_error') {
|
||||||
|
this.setState({
|
||||||
|
serverError: (
|
||||||
|
<FormattedMessage
|
||||||
|
id='login.invalidPassword'
|
||||||
|
defaultMessage='Your password is incorrect.'
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
@@ -251,58 +227,25 @@ export default class Login extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const loginControls = [];
|
||||||
|
|
||||||
const ldapEnabled = global.window.mm_config.EnableLdap === 'true';
|
const ldapEnabled = global.window.mm_config.EnableLdap === 'true';
|
||||||
const gitlabSigninEnabled = global.window.mm_config.EnableSignUpWithGitLab === 'true';
|
const gitlabSigninEnabled = global.window.mm_config.EnableSignUpWithGitLab === 'true';
|
||||||
const googleSigninEnabled = global.window.mm_config.EnableSignUpWithGoogle === 'true';
|
const googleSigninEnabled = global.window.mm_config.EnableSignUpWithGoogle === 'true';
|
||||||
const usernameSigninEnabled = global.window.mm_config.EnableSignInWithUsername === 'true';
|
const usernameSigninEnabled = global.window.mm_config.EnableSignInWithUsername === 'true';
|
||||||
const emailSigninEnabled = global.window.mm_config.EnableSignInWithEmail === 'true';
|
const emailSigninEnabled = global.window.mm_config.EnableSignInWithEmail === 'true';
|
||||||
|
|
||||||
const oauthLogins = [];
|
|
||||||
if (gitlabSigninEnabled) {
|
|
||||||
oauthLogins.push(
|
|
||||||
<a
|
|
||||||
className='btn btn-custom-login gitlab'
|
|
||||||
key='gitlab'
|
|
||||||
href={Client.getOAuthRoute() + '/gitlab/login'}
|
|
||||||
>
|
|
||||||
<span className='icon'/>
|
|
||||||
<span>
|
|
||||||
<FormattedMessage
|
|
||||||
id='login.gitlab'
|
|
||||||
defaultMessage='with GitLab'
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (googleSigninEnabled) {
|
|
||||||
oauthLogins.push(
|
|
||||||
<Link
|
|
||||||
className='btn btn-custom-login google'
|
|
||||||
key='google'
|
|
||||||
to={Client.getOAuthRoute() + '/google/login'}
|
|
||||||
>
|
|
||||||
<span className='icon'/>
|
|
||||||
<span>
|
|
||||||
<FormattedMessage
|
|
||||||
id='login.google'
|
|
||||||
defaultMessage='with Google Apps'
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</Link>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let login = null;
|
|
||||||
if (emailSigninEnabled || usernameSigninEnabled || ldapEnabled) {
|
if (emailSigninEnabled || usernameSigninEnabled || ldapEnabled) {
|
||||||
let errorClass = '';
|
let errorClass = '';
|
||||||
if (this.state.serverError) {
|
if (this.state.serverError) {
|
||||||
errorClass = ' has-error';
|
errorClass = ' has-error';
|
||||||
}
|
}
|
||||||
|
|
||||||
login = (
|
loginControls.push(
|
||||||
<form onSubmit={this.preSubmit}>
|
<form
|
||||||
|
key='loginBoxes'
|
||||||
|
onSubmit={this.preSubmit}
|
||||||
|
>
|
||||||
<div className='signup__email-container'>
|
<div className='signup__email-container'>
|
||||||
<FormError error={this.state.serverError}/>
|
<FormError error={this.state.serverError}/>
|
||||||
<div className={'form-group' + errorClass}>
|
<div className={'form-group' + errorClass}>
|
||||||
@@ -330,6 +273,7 @@ export default class Login extends React.Component {
|
|||||||
<button
|
<button
|
||||||
type='submit'
|
type='submit'
|
||||||
className='btn btn-primary'
|
className='btn btn-primary'
|
||||||
|
disabled={!this.state.loginId || !this.state.password}
|
||||||
>
|
>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='login.signIn'
|
id='login.signIn'
|
||||||
@@ -342,10 +286,9 @@ export default class Login extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
var userSignUp;
|
|
||||||
if (global.window.mm_config.EnableOpenServer === 'true') {
|
if (global.window.mm_config.EnableOpenServer === 'true') {
|
||||||
userSignUp = (
|
loginControls.push(
|
||||||
<div>
|
<div key='signup'>
|
||||||
<span>
|
<span>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='login.noAccount'
|
id='login.noAccount'
|
||||||
@@ -365,10 +308,12 @@ export default class Login extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let forgotPassword;
|
|
||||||
if (usernameSigninEnabled || emailSigninEnabled) {
|
if (usernameSigninEnabled || emailSigninEnabled) {
|
||||||
forgotPassword = (
|
loginControls.push(
|
||||||
<div className='form-group'>
|
<div
|
||||||
|
key='forgotPassword'
|
||||||
|
className='form-group'
|
||||||
|
>
|
||||||
<Link to={'/reset_password'}>
|
<Link to={'/reset_password'}>
|
||||||
<FormattedMessage
|
<FormattedMessage
|
||||||
id='login.forgot'
|
id='login.forgot'
|
||||||
@@ -379,13 +324,69 @@ export default class Login extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((emailSigninEnabled || usernameSigninEnabled || ldapEnabled) && (gitlabSigninEnabled || googleSigninEnabled)) {
|
||||||
|
loginControls.push(
|
||||||
|
<div
|
||||||
|
key='divider'
|
||||||
|
className='or__container'
|
||||||
|
>
|
||||||
|
<FormattedMessage
|
||||||
|
id='login.or'
|
||||||
|
defaultMessage='or'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
loginControls.push(
|
||||||
|
<h5 key='oauthHeader'>
|
||||||
|
<FormattedMessage
|
||||||
|
id='login.signInWith'
|
||||||
|
defaultMessage='Sign in with:'
|
||||||
|
/>
|
||||||
|
</h5>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gitlabSigninEnabled) {
|
||||||
|
loginControls.push(
|
||||||
|
<a
|
||||||
|
className='btn btn-custom-login gitlab'
|
||||||
|
key='gitlab'
|
||||||
|
href={Client.getOAuthRoute() + '/gitlab/login'}
|
||||||
|
>
|
||||||
|
<span className='icon'/>
|
||||||
|
<span>
|
||||||
|
<FormattedMessage
|
||||||
|
id='login.gitlab'
|
||||||
|
defaultMessage='GitLab'
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (googleSigninEnabled) {
|
||||||
|
loginControls.push(
|
||||||
|
<Link
|
||||||
|
className='btn btn-custom-login google'
|
||||||
|
key='google'
|
||||||
|
to={Client.getOAuthRoute() + '/google/login'}
|
||||||
|
>
|
||||||
|
<span className='icon'/>
|
||||||
|
<span>
|
||||||
|
<FormattedMessage
|
||||||
|
id='login.google'
|
||||||
|
defaultMessage='Google Apps'
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{extraBox}
|
{extraBox}
|
||||||
{oauthLogins}
|
{loginControls}
|
||||||
{login}
|
|
||||||
{userSignUp}
|
|
||||||
{forgotPassword}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -965,20 +965,19 @@
|
|||||||
"login.email": "Email",
|
"login.email": "Email",
|
||||||
"login.find": "Find your other teams",
|
"login.find": "Find your other teams",
|
||||||
"login.forgot": "I forgot my password",
|
"login.forgot": "I forgot my password",
|
||||||
"login.gitlab": "with GitLab",
|
"login.invalidPassword": "Your password is incorrect.",
|
||||||
"login.google": "with Google Apps",
|
"login.gitlab": "GitLab",
|
||||||
|
"login.google": "Google Apps",
|
||||||
"login.ldapUsername": "LDAP Username",
|
"login.ldapUsername": "LDAP Username",
|
||||||
"login.loginIdRequired": "A {type} is required",
|
|
||||||
"login.noAccount": "Don't have an account? ",
|
"login.noAccount": "Don't have an account? ",
|
||||||
"login.on": "on {siteName}",
|
"login.on": "on {siteName}",
|
||||||
"login.or": "or",
|
"login.or": "or",
|
||||||
"login.password": "Password",
|
"login.password": "Password",
|
||||||
"login.passwordChanged": " Password updated successfully",
|
"login.passwordChanged": " Password updated successfully",
|
||||||
"login.passwordRequired": "A password is required",
|
|
||||||
"login.session_expired": " Your session has expired. Please login again.",
|
"login.session_expired": " Your session has expired. Please login again.",
|
||||||
"login.signIn": "Sign in",
|
"login.signIn": "Sign in",
|
||||||
"login.signTo": "Sign in to:",
|
"login.signInWith": "Sign in with:",
|
||||||
"login.userNotFound": "We couldn't find an existing account matching your login credentials.",
|
"login.userNotFound": "We couldn't find an account matching your login credentials.",
|
||||||
"login.username": "Username",
|
"login.username": "Username",
|
||||||
"login.verified": " Email Verified",
|
"login.verified": " Email Verified",
|
||||||
"login_mfa.enterToken": "To complete the sign in process, please enter a token from your smartphone's authenticator",
|
"login_mfa.enterToken": "To complete the sign in process, please enter a token from your smartphone's authenticator",
|
||||||
|
|||||||
@@ -965,8 +965,8 @@
|
|||||||
"login.email": "Correo electrónico",
|
"login.email": "Correo electrónico",
|
||||||
"login.find": "Encuentra tus otros equipos",
|
"login.find": "Encuentra tus otros equipos",
|
||||||
"login.forgot": "Olvide mi contraseña",
|
"login.forgot": "Olvide mi contraseña",
|
||||||
"login.gitlab": "con GitLab",
|
"login.gitlab": "GitLab",
|
||||||
"login.google": "con Google Apps",
|
"login.google": "Google Apps",
|
||||||
"login.ldapUsername": "Usuario LDAP",
|
"login.ldapUsername": "Usuario LDAP",
|
||||||
"login.loginIdRequired": "Se requiere un {type}",
|
"login.loginIdRequired": "Se requiere un {type}",
|
||||||
"login.noAccount": "¿No tienes una cuenta? ",
|
"login.noAccount": "¿No tienes una cuenta? ",
|
||||||
@@ -974,10 +974,8 @@
|
|||||||
"login.or": "o",
|
"login.or": "o",
|
||||||
"login.password": "Contraseña",
|
"login.password": "Contraseña",
|
||||||
"login.passwordChanged": " La contraseña ha sido actualizada",
|
"login.passwordChanged": " La contraseña ha sido actualizada",
|
||||||
"login.passwordRequired": "La contraseña es obligatoria",
|
|
||||||
"login.session_expired": " Tu sesión ha expirado. Por favor inicia sesión nuevamente.",
|
"login.session_expired": " Tu sesión ha expirado. Por favor inicia sesión nuevamente.",
|
||||||
"login.signIn": "Entrar",
|
"login.signIn": "Entrar",
|
||||||
"login.signTo": "Ingresar a:",
|
|
||||||
"login.userNotFound": "No pudimos encontrar una cuenta que coincida con tus credenciales.",
|
"login.userNotFound": "No pudimos encontrar una cuenta que coincida con tus credenciales.",
|
||||||
"login.username": "Nombre de usuario",
|
"login.username": "Nombre de usuario",
|
||||||
"login.verified": " Correo electrónico Verificado",
|
"login.verified": " Correo electrónico Verificado",
|
||||||
|
|||||||
@@ -821,17 +821,15 @@
|
|||||||
"login.email": "Adresse électronique",
|
"login.email": "Adresse électronique",
|
||||||
"login.find": "Trouver vos autres équipes",
|
"login.find": "Trouver vos autres équipes",
|
||||||
"login.forgot": "Mot de passe perdu",
|
"login.forgot": "Mot de passe perdu",
|
||||||
"login.gitlab": "avec GitLab",
|
"login.gitlab": "GitLab",
|
||||||
"login.google": "avec Google Apps",
|
"login.google": "Google Apps",
|
||||||
"login.ldapUsername": "Utilisateur LDAP",
|
"login.ldapUsername": "Utilisateur LDAP",
|
||||||
"login.noAccount": "Pas de compte utilisateur ?",
|
"login.noAccount": "Pas de compte utilisateur ?",
|
||||||
"login.on": "sur {siteName}",
|
"login.on": "sur {siteName}",
|
||||||
"login.or": "ou",
|
"login.or": "ou",
|
||||||
"login.password": "Mot de passe",
|
"login.password": "Mot de passe",
|
||||||
"login.passwordRequired": "Le mot de passe est obligatoire",
|
|
||||||
"login.session_expired": "Votre session a expiré. Merci de vous reconnecter.",
|
"login.session_expired": "Votre session a expiré. Merci de vous reconnecter.",
|
||||||
"login.signIn": "Connexion",
|
"login.signIn": "Connexion",
|
||||||
"login.signTo": "Se connecter à :",
|
|
||||||
"login.username": "Nom d'utilisateur",
|
"login.username": "Nom d'utilisateur",
|
||||||
"login.verified": "Adresse électronique vérifiée",
|
"login.verified": "Adresse électronique vérifiée",
|
||||||
"member_item.makeAdmin": "Passer Administrateur",
|
"member_item.makeAdmin": "Passer Administrateur",
|
||||||
|
|||||||
@@ -915,17 +915,15 @@
|
|||||||
"login.email": "電子メールアドレス",
|
"login.email": "電子メールアドレス",
|
||||||
"login.find": "参加している他のチームを探す",
|
"login.find": "参加している他のチームを探す",
|
||||||
"login.forgot": "パスワードを忘れました",
|
"login.forgot": "パスワードを忘れました",
|
||||||
"login.gitlab": "GitLabでログインする",
|
"login.gitlab": "GitLab",
|
||||||
"login.google": "Google Appsでログインする",
|
"login.google": "Google Apps",
|
||||||
"login.ldapUsername": "LDAPユーザー名",
|
"login.ldapUsername": "LDAPユーザー名",
|
||||||
"login.noAccount": "アカウントを持っていますか? ",
|
"login.noAccount": "アカウントを持っていますか? ",
|
||||||
"login.on": "{siteName}にて",
|
"login.on": "{siteName}にて",
|
||||||
"login.or": "または",
|
"login.or": "または",
|
||||||
"login.password": "パスワード",
|
"login.password": "パスワード",
|
||||||
"login.passwordRequired": "パスワードは必須です",
|
|
||||||
"login.session_expired": " あなたのセッションは有効期限が切れました。再度ログインしてください。",
|
"login.session_expired": " あなたのセッションは有効期限が切れました。再度ログインしてください。",
|
||||||
"login.signIn": "利用登録",
|
"login.signIn": "利用登録",
|
||||||
"login.signTo": "利用登録先: ",
|
|
||||||
"login.username": "LDAPユーザー名",
|
"login.username": "LDAPユーザー名",
|
||||||
"login.verified": " 電子メールアドレスが確認されました",
|
"login.verified": " 電子メールアドレスが確認されました",
|
||||||
"login_mfa.enterToken": "利用登録を完了するには、スマートフォンのauthenticatorからのトークンを入力してください。",
|
"login_mfa.enterToken": "利用登録を完了するには、スマートフォンのauthenticatorからのトークンを入力してください。",
|
||||||
|
|||||||
@@ -953,8 +953,8 @@
|
|||||||
"login.email": "E-mail",
|
"login.email": "E-mail",
|
||||||
"login.find": "Encontre suas outras equipes",
|
"login.find": "Encontre suas outras equipes",
|
||||||
"login.forgot": "Eu esqueci a minha senha",
|
"login.forgot": "Eu esqueci a minha senha",
|
||||||
"login.gitlab": "com GitLab",
|
"login.gitlab": "GitLab",
|
||||||
"login.google": "com Google Apps",
|
"login.google": "Google Apps",
|
||||||
"login.ldapUsername": "Usuário LDAP",
|
"login.ldapUsername": "Usuário LDAP",
|
||||||
"login.loginIdRequired": "Um {type} é necessário",
|
"login.loginIdRequired": "Um {type} é necessário",
|
||||||
"login.noAccount": "Não tem uma conta? ",
|
"login.noAccount": "Não tem uma conta? ",
|
||||||
@@ -962,10 +962,8 @@
|
|||||||
"login.or": "ou",
|
"login.or": "ou",
|
||||||
"login.password": "Senha",
|
"login.password": "Senha",
|
||||||
"login.passwordChanged": " Senha atualizada com sucesso",
|
"login.passwordChanged": " Senha atualizada com sucesso",
|
||||||
"login.passwordRequired": "É necessário uma senha",
|
|
||||||
"login.session_expired": " Sua sessão expirou. Por favor faça login novamente.",
|
"login.session_expired": " Sua sessão expirou. Por favor faça login novamente.",
|
||||||
"login.signIn": "Login",
|
"login.signIn": "Login",
|
||||||
"login.signTo": "Login em:",
|
|
||||||
"login.userNotFound": "Não foi possível encontrar uma conta existente que corresponda com as suas credenciais.",
|
"login.userNotFound": "Não foi possível encontrar uma conta existente que corresponda com as suas credenciais.",
|
||||||
"login.username": "Usuário",
|
"login.username": "Usuário",
|
||||||
"login.verified": " Email Verificado",
|
"login.verified": " Email Verificado",
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user