import { IdentityProvider } from '../../../app/types';
import { getBaseUrl } from '../../../helpers/urls';
-interface Props {
- doLogin: (login: string, password: string) => Promise<void>;
+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<void>;
+}
+
+type Props = OwnProps & DispatchToProps;
+
interface State {
identityProviders?: IdentityProvider[];
}
};
render() {
+ const { location } = this.props;
const { identityProviders } = this.state;
if (!identityProviders) {
return null;
identityProviders={identityProviders}
onSubmit={this.handleSubmit}
returnTo={this.getReturnUrl()}
+ showForm={location.query['advanced'] !== undefined}
/>
);
}
}
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
+);
padding: calc(2 * var(--gridSize)) 20px;
}
+.sonarcloud-login-page-large {
+ width: 300px;
+}
+
.sonarcloud-login-title {
line-height: 1.5;
font-size: var(--bigFontSize);
}
.sonarcloud-oauth-providers.oauth-providers > ul > li > a > span {
- font-weight: 600;
padding-left: calc(1.5 * var(--gridSize));
}
* 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';
interface Props {
identityProviders: IdentityProvider[];
+ onSubmit: (login: string, password: string) => Promise<void>;
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 (
- <div className="sonarcloud-login-page boxed-group boxed-group-inner" id="login_form">
+ <div
+ className={classNames('sonarcloud-login-page boxed-group boxed-group-inner', {
+ 'sonarcloud-login-page-large': displayForm
+ })}
+ id="login_form">
<div className="text-center">
<img
alt="SonarCloud logo"
</h1>
</div>
- <OAuthProviders
- className="sonarcloud-oauth-providers"
- formatLabel={formatLabel}
- identityProviders={identityProviders}
- returnTo={returnTo}
- />
+ {displayForm ? (
+ <LoginForm onSubmit={onSubmit} returnTo={returnTo} />
+ ) : (
+ <OAuthProviders
+ className="sonarcloud-oauth-providers"
+ formatLabel={formatLabel}
+ identityProviders={identityProviders}
+ returnTo={returnTo}
+ />
+ )}
</div>
);
}
);
expect(wrapper).toMatchSnapshot();
});
+
+it('logs in with simple form', () => {
+ expect(
+ shallow(
+ <LoginSonarCloud
+ identityProviders={[identityProvider]}
+ onSubmit={jest.fn()}
+ returnTo=""
+ showForm={true}
+ />
+ )
+ ).toMatchSnapshot();
+ expect(
+ shallow(<LoginSonarCloud identityProviders={[]} onSubmit={jest.fn()} returnTo="" />)
+ ).toMatchSnapshot();
+});
/>
</div>
`;
+
+exports[`logs in with simple form 1`] = `
+<div
+ className="sonarcloud-login-page boxed-group boxed-group-inner sonarcloud-login-page-large"
+ id="login_form"
+>
+ <div
+ className="text-center"
+ >
+ <img
+ alt="SonarCloud logo"
+ height={36}
+ src="null/images/sc-icon.svg"
+ width={36}
+ />
+ <h1
+ className="sonarcloud-login-title"
+ >
+ login.login_or_signup_to_sonarcloud
+ </h1>
+ </div>
+ <LoginForm
+ onSubmit={[MockFunction]}
+ returnTo=""
+ />
+</div>
+`;
+
+exports[`logs in with simple form 2`] = `
+<div
+ className="sonarcloud-login-page boxed-group boxed-group-inner sonarcloud-login-page-large"
+ id="login_form"
+>
+ <div
+ className="text-center"
+ >
+ <img
+ alt="SonarCloud logo"
+ height={36}
+ src="null/images/sc-icon.svg"
+ width={36}
+ />
+ <h1
+ className="sonarcloud-login-title"
+ >
+ login.login_or_signup_to_sonarcloud
+ </h1>
+ </div>
+ <LoginForm
+ onSubmit={[MockFunction]}
+ returnTo=""
+ />
+</div>
+`;