From 079778997aa824aeeb2b98bae11a1757b3b87e1d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Gr=C3=A9goire=20Aubert?= Date: Fri, 27 Apr 2018 10:51:26 +0200 Subject: [PATCH] SONAR-10325 Add "advanced" url query flag to display login/password form on SonarCloud login page --- .../sessions/components/LoginContainer.tsx | 18 +++++-- .../sessions/components/LoginSonarCloud.css | 5 +- .../sessions/components/LoginSonarCloud.tsx | 34 +++++++++--- .../__tests__/LoginSonarCloud-test.tsx | 16 ++++++ .../LoginSonarCloud-test.tsx.snap | 54 +++++++++++++++++++ 5 files changed, 114 insertions(+), 13 deletions(-) diff --git a/server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx b/server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx index 04396a37d99..2750f8f083e 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx +++ b/server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx @@ -27,17 +27,23 @@ import { getIdentityProviders } from '../../../api/users'; import { IdentityProvider } from '../../../app/types'; import { getBaseUrl } from '../../../helpers/urls'; -interface Props { - doLogin: (login: string, password: string) => Promise; +interface OwnProps { location: { hash?: string; pathName: string; query: { + advanced?: string; return_to?: string; // eslint-disable-line camelcase }; }; } +interface DispatchToProps { + doLogin: (login: string, password: string) => Promise; +} + +type Props = OwnProps & DispatchToProps; + interface State { identityProviders?: IdentityProvider[]; } @@ -84,6 +90,7 @@ class LoginContainer extends React.PureComponent { }; render() { + const { location } = this.props; const { identityProviders } = this.state; if (!identityProviders) { return null; @@ -95,6 +102,7 @@ class LoginContainer extends React.PureComponent { identityProviders={identityProviders} onSubmit={this.handleSubmit} returnTo={this.getReturnUrl()} + showForm={location.query['advanced'] !== undefined} /> ); } @@ -110,6 +118,8 @@ class LoginContainer extends React.PureComponent { } const mapStateToProps = null; -const mapDispatchToProps = { doLogin }; +const mapDispatchToProps = { doLogin: doLogin as any }; -export default connect(mapStateToProps, mapDispatchToProps)(LoginContainer as any); +export default connect<{}, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)( + LoginContainer +); diff --git a/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.css b/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.css index b618673b4db..e88cfb3e387 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.css +++ b/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.css @@ -25,6 +25,10 @@ padding: calc(2 * var(--gridSize)) 20px; } +.sonarcloud-login-page-large { + width: 300px; +} + .sonarcloud-login-title { line-height: 1.5; font-size: var(--bigFontSize); @@ -38,7 +42,6 @@ } .sonarcloud-oauth-providers.oauth-providers > ul > li > a > span { - font-weight: 600; padding-left: calc(1.5 * var(--gridSize)); } diff --git a/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.tsx b/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.tsx index 9df3ffd6a56..80843135a5d 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.tsx +++ b/server/sonar-web/src/main/js/apps/sessions/components/LoginSonarCloud.tsx @@ -18,6 +18,8 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import * as React from 'react'; +import * as classNames from 'classnames'; +import LoginForm from './LoginForm'; import OAuthProviders from './OAuthProviders'; import { IdentityProvider } from '../../../app/types'; import { getHostUrl } from '../../../helpers/urls'; @@ -26,12 +28,24 @@ import './LoginSonarCloud.css'; interface Props { identityProviders: IdentityProvider[]; + onSubmit: (login: string, password: string) => Promise; returnTo: string; + showForm?: boolean; } -export default function LoginSonarCloud({ identityProviders, returnTo }: Props) { +export default function LoginSonarCloud({ + identityProviders, + onSubmit, + returnTo, + showForm +}: Props) { + const displayForm = showForm || identityProviders.length <= 0; return ( -
+
SonarCloud logo
- + {displayForm ? ( + + ) : ( + + )}
); } diff --git a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/LoginSonarCloud-test.tsx b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/LoginSonarCloud-test.tsx index 0fa5c7ae1da..f29a3d8b963 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/LoginSonarCloud-test.tsx +++ b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/LoginSonarCloud-test.tsx @@ -34,3 +34,19 @@ it('logs in with identity provider', () => { ); expect(wrapper).toMatchSnapshot(); }); + +it('logs in with simple form', () => { + expect( + shallow( + + ) + ).toMatchSnapshot(); + expect( + shallow() + ).toMatchSnapshot(); +}); diff --git a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginSonarCloud-test.tsx.snap b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginSonarCloud-test.tsx.snap index a14d1983c52..7a2921af8dd 100644 --- a/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginSonarCloud-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/sessions/components/__tests__/__snapshots__/LoginSonarCloud-test.tsx.snap @@ -37,3 +37,57 @@ exports[`logs in with identity provider 1`] = ` />
`; + +exports[`logs in with simple form 1`] = ` +
+
+ SonarCloud logo +

+ login.login_or_signup_to_sonarcloud +

+
+ +
+`; + +exports[`logs in with simple form 2`] = ` +
+
+ SonarCloud logo +

+ login.login_or_signup_to_sonarcloud +

+
+ +
+`; -- 2.39.5