Repository: ignite
Updated Branches:
  refs/heads/master 8a0ed0e3b -> 41699c31c


IGNITE-8370 Web Console: Split "Sign In" page to three separate pages.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2f8df263
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2f8df263
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2f8df263

Branch: refs/heads/master
Commit: 2f8df26367bf81058aefa0bdd6c5b234d849250c
Parents: 8a0ed0e
Author: Ilya Borisov <[email protected]>
Authored: Wed Apr 25 16:13:19 2018 +0700
Committer: Alexey Kuznetsov <[email protected]>
Committed: Wed Apr 25 16:13:19 2018 +0700

----------------------------------------------------------------------
 .../testcafe/fixtures/auth/forgot-password.js   |  22 +--
 .../e2e/testcafe/fixtures/auth/logout.js        |   5 +-
 .../e2e/testcafe/fixtures/auth/signup.js        |  14 +-
 .../e2e/testcafe/page-models/PageSignIn.js      |  77 --------
 .../testcafe/page-models/pageForgotPassword.js  |  24 +++
 .../e2e/testcafe/page-models/pageSignin1.js     |  32 +++
 .../e2e/testcafe/page-models/pageSignup.js      |  48 +++++
 modules/web-console/e2e/testcafe/roles.js       |   4 +-
 modules/web-console/frontend/app/app.js         |   8 +-
 .../page-forgot-password/component.js           |  30 +++
 .../page-forgot-password/controller.js          |  57 ++++++
 .../components/page-forgot-password/index.js    |  28 +++
 .../app/components/page-forgot-password/run.js  |  48 +++++
 .../components/page-forgot-password/style.scss  |  54 +++++
 .../page-forgot-password/template.pug           |  50 +++++
 .../components/page-forgot-password/types.ts    |  24 +++
 .../app/components/page-landing/template.pug    |   4 +-
 .../app/components/page-signin/component.js     |  26 +++
 .../app/components/page-signin/controller.js    | 107 ++--------
 .../app/components/page-signin/index.js         |  38 +---
 .../frontend/app/components/page-signin/run.js  |  53 +++++
 .../app/components/page-signin/style.scss       |  49 +++--
 .../app/components/page-signin/template.pug     | 195 ++++---------------
 .../app/components/page-signin/types.ts         |  26 +++
 .../app/components/page-signup/component.js     |  28 +++
 .../app/components/page-signup/controller.js    |  60 ++++++
 .../app/components/page-signup/index.js         |  28 +++
 .../frontend/app/components/page-signup/run.js  |  35 ++++
 .../app/components/page-signup/style.scss       |  61 ++++++
 .../app/components/page-signup/template.pug     | 122 ++++++++++++
 .../app/components/page-signup/types.ts         |  36 ++++
 .../app/primitives/form-field/dropdown.pug      |   1 +
 modules/web-console/frontend/app/types/index.ts |  33 ++++
 .../frontend/public/stylesheets/style.scss      |  23 ---
 34 files changed, 1020 insertions(+), 430 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/fixtures/auth/forgot-password.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/fixtures/auth/forgot-password.js 
b/modules/web-console/e2e/testcafe/fixtures/auth/forgot-password.js
index 6b151ed..27ac2db 100644
--- a/modules/web-console/e2e/testcafe/fixtures/auth/forgot-password.js
+++ b/modules/web-console/e2e/testcafe/fixtures/auth/forgot-password.js
@@ -16,13 +16,12 @@
  */
 
 import { dropTestDB, resolveUrl, insertTestUser } from '../../envtools';
-import {PageSignIn} from '../../page-models/PageSignIn';
+import {PageSignIn} from '../../page-models/pageSignin1';
 import {errorNotification} from '../../components/notifications';
-
-const page = new PageSignIn();
+import {pageForgotPassword as page} from 
'../../page-models/pageForgotPassword';
 
 fixture('Password reset')
-    .page(resolveUrl('/signin'))
+    .page(resolveUrl('/forgot-password'))
     .before(async() => {
         await dropTestDB();
         await insertTestUser();
@@ -33,26 +32,23 @@ fixture('Password reset')
 
 test('Incorrect email', async(t) => {
     await t
-        .click(page.showForgotPasswordButton)
-        .typeText(page.forgotPassword.email.control, 'aa')
-        .expect(page.forgotPassword.email.getError('email').exists).ok('Marks 
field as invalid')
+        .typeText(page.email.control, 'aa')
+        .expect(page.email.getError('email').exists).ok('Marks field as 
invalid')
         
.expect(page.remindPasswordButton.getAttribute('disabled')).ok('Disables submit 
button');
 });
 
 test('Unknown email', async(t) => {
     await t
-        .click(page.showForgotPasswordButton)
-        .typeText(page.forgotPassword.email.control, '[email protected]', 
{replace: true})
+        .typeText(page.email.control, '[email protected]', {replace: true})
         .click(page.remindPasswordButton)
         .expect(errorNotification.withText('Account with that email address 
does not exists!').exists).ok('Shows global error notification')
-        .expect(page.forgotPassword.email.getError('server').exists).ok('Marks 
input as server-invalid');
+        .expect(page.email.getError('server').exists).ok('Marks input as 
server-invalid');
 });
 
 // TODO: IGNITE-8028 Implement this test as unit test.
 test.skip('Successful reset', async(t) => {
     await t
-        .click(page.showForgotPasswordButton)
-        .typeText(page.forgotPassword.email.control, 'a@a', {replace: true})
+        .typeText(page.email.control, 'a@a', {replace: true})
         .click(page.remindPasswordButton)
-        .expect(page.forgotPassword.email.getError('server').exists).notOk('No 
errors happen');
+        .expect(page.email.getError('server').exists).notOk('No errors 
happen');
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/fixtures/auth/logout.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/fixtures/auth/logout.js 
b/modules/web-console/e2e/testcafe/fixtures/auth/logout.js
index 196c03f..5cad60f 100644
--- a/modules/web-console/e2e/testcafe/fixtures/auth/logout.js
+++ b/modules/web-console/e2e/testcafe/fixtures/auth/logout.js
@@ -18,10 +18,9 @@
 import {dropTestDB, resolveUrl, insertTestUser} from 'envtools';
 import {createRegularUser} from '../../roles';
 import {userMenu} from '../../components/userMenu';
-import {PageSignIn} from '../../page-models/PageSignIn';
+import {pageSignin} from '../../page-models/pageSignin1';
 
 const user = createRegularUser();
-const pageSignIn = new PageSignIn();
 
 fixture('Logout')
     .before(async() => {
@@ -35,5 +34,5 @@ fixture('Logout')
 test('Successful logout', async(t) => {
     await t.useRole(user).navigateTo(resolveUrl('/settings/profile'));
     await userMenu.clickOption('Log out');
-    await t.expect(pageSignIn._selector.exists).ok('Goes to sign in page after 
logout');
+    await t.expect(pageSignin.selector.exists).ok('Goes to sign in page after 
logout');
 });

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/fixtures/auth/signup.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/fixtures/auth/signup.js 
b/modules/web-console/e2e/testcafe/fixtures/auth/signup.js
index 065bff9..f0951d9 100644
--- a/modules/web-console/e2e/testcafe/fixtures/auth/signup.js
+++ b/modules/web-console/e2e/testcafe/fixtures/auth/signup.js
@@ -16,14 +16,12 @@
  */
 
 import {dropTestDB, resolveUrl, insertTestUser} from '../../envtools';
-import {PageSignIn} from '../../page-models/PageSignIn';
+import {pageSignup as page} from '../../page-models/pageSignup';
 import {errorNotification} from '../../components/notifications';
 import {userMenu} from '../../components/userMenu';
 
-const page = new PageSignIn();
-
 fixture('Signup')
-    .page(resolveUrl('/signin'))
+    .page(resolveUrl('/signup'))
     .before(async() => {
         await dropTestDB();
         await insertTestUser();
@@ -45,9 +43,9 @@ test('Local validation', async(t) => {
         country: 'Brazil'
     });
     await t
-        .expect(page.signup.email.getError('email').exists).ok()
-        .expect(page.signup.passwordConfirm.getError('mismatch').exists).ok()
-        .expect(page.signup.firstName.getError('required').exists).ok()
+        .expect(page.email.getError('email').exists).ok()
+        .expect(page.passwordConfirm.getError('mismatch').exists).ok()
+        .expect(page.firstName.getError('required').exists).ok()
         .expect(isButtonDisabled).ok('Button disabled with invalid fields');
     await page.fillSignupForm({
         email: '[email protected]',
@@ -73,7 +71,7 @@ test('Server validation', async(t) => {
     await t
         .click(page.signupButton)
         .expect(errorNotification.withText('A user with the given username is 
already registered').exists).ok('Shows global error')
-        .expect(page.signup.email.getError('server').exists).ok('Marks email 
input as server-invalid');
+        .expect(page.email.getError('server').exists).ok('Marks email input as 
server-invalid');
 });
 test('Successful signup', async(t) => {
     await page.fillSignupForm({

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/page-models/PageSignIn.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/page-models/PageSignIn.js 
b/modules/web-console/e2e/testcafe/page-models/PageSignIn.js
deleted file mode 100644
index 1712cd69f..0000000
--- a/modules/web-console/e2e/testcafe/page-models/PageSignIn.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import {Selector, t} from 'testcafe';
-import { resolveUrl } from '../envtools';
-import {AngularJSSelector} from 'testcafe-angular-selectors';
-import {CustomFormField} from '../components/FormField';
-
-export class PageSignIn {
-    constructor() {
-        this._selector = Selector('page-sign-in');
-        this.signin = {
-            email: new CustomFormField({model: '$ctrl.data.signin.email'}),
-            password: new CustomFormField({model: 
'$ctrl.data.signin.password'})
-        };
-        this.forgotPassword = {
-            email: new CustomFormField({model: 
'$ctrl.data.remindPassword.email'})
-        };
-        this.signup = {
-            email: new CustomFormField({model: '$ctrl.data.signup.email'}),
-            password: new CustomFormField({model: 
'$ctrl.data.signup.password'}),
-            passwordConfirm: new CustomFormField({model: 'confirm'}),
-            firstName: new CustomFormField({model: 
'$ctrl.data.signup.firstName'}),
-            lastName: new CustomFormField({model: 
'$ctrl.data.signup.lastName'}),
-            company: new CustomFormField({model: '$ctrl.data.signup.company'}),
-            country: new CustomFormField({model: '$ctrl.data.signup.country'})
-        };
-        this.signinButton = Selector('#signin_submit');
-        this.signupButton = Selector('#signup_submit');
-        this.showForgotPasswordButton = Selector('#forgot_show');
-        this.remindPasswordButton = Selector('#forgot_submit');
-    }
-
-    async open() {
-        await t.navigateTo(resolveUrl('/signin'));
-    }
-
-    async login(email, password) {
-        return await t
-            .typeText(this.signin.email.control, email)
-            .typeText(this.signin.password.control, password)
-            .click(this.signinButton);
-    }
-
-    async fillSignupForm({
-        email,
-        password,
-        passwordConfirm,
-        firstName,
-        lastName,
-        company,
-        country
-    }) {
-        await t
-            .typeText(this.signup.email.control, email, {replace: true})
-            .typeText(this.signup.password.control, password, {replace: true})
-            .typeText(this.signup.passwordConfirm.control, passwordConfirm, 
{replace: true})
-            .typeText(this.signup.firstName.control, firstName, {replace: 
true})
-            .typeText(this.signup.lastName.control, lastName, {replace: true})
-            .typeText(this.signup.company.control, company, {replace: true});
-        await this.signup.country.selectOption(country);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/page-models/pageForgotPassword.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/page-models/pageForgotPassword.js 
b/modules/web-console/e2e/testcafe/page-models/pageForgotPassword.js
new file mode 100644
index 0000000..3b4160a
--- /dev/null
+++ b/modules/web-console/e2e/testcafe/page-models/pageForgotPassword.js
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Selector} from 'testcafe';
+import {CustomFormField} from '../components/FormField';
+
+export const pageForgotPassword = {
+    email: new CustomFormField({model: '$ctrl.data.email'}),
+    remindPasswordButton: Selector('button').withText('Send it to me')
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/page-models/pageSignin1.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/page-models/pageSignin1.js 
b/modules/web-console/e2e/testcafe/page-models/pageSignin1.js
new file mode 100644
index 0000000..57031b6
--- /dev/null
+++ b/modules/web-console/e2e/testcafe/page-models/pageSignin1.js
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Selector, t} from 'testcafe';
+import {CustomFormField} from '../components/FormField';
+
+export const pageSignin = {
+    email: new CustomFormField({model: '$ctrl.data.email'}),
+    password: new CustomFormField({model: '$ctrl.data.password'}),
+    signinButton: Selector('button').withText('Sign In'),
+    selector: Selector('page-signin'),
+    async login(email, password) {
+        return await t
+            .typeText(this.email.control, email)
+            .typeText(this.password.control, password)
+            .click(this.signinButton);
+    }
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/page-models/pageSignup.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/page-models/pageSignup.js 
b/modules/web-console/e2e/testcafe/page-models/pageSignup.js
new file mode 100644
index 0000000..c380abe
--- /dev/null
+++ b/modules/web-console/e2e/testcafe/page-models/pageSignup.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Selector, t} from 'testcafe';
+import {CustomFormField} from '../components/FormField';
+
+export const pageSignup = {
+    email: new CustomFormField({model: '$ctrl.data.email'}),
+    password: new CustomFormField({model: '$ctrl.data.password'}),
+    passwordConfirm: new CustomFormField({model: 'confirm'}),
+    firstName: new CustomFormField({model: '$ctrl.data.firstName'}),
+    lastName: new CustomFormField({model: '$ctrl.data.lastName'}),
+    company: new CustomFormField({model: '$ctrl.data.company'}),
+    country: new CustomFormField({model: '$ctrl.data.country'}),
+    signupButton: Selector('button').withText('Sign Up'),
+    async fillSignupForm({
+        email,
+        password,
+        passwordConfirm,
+        firstName,
+        lastName,
+        company,
+        country
+    }) {
+        await t
+            .typeText(this.email.control, email, {replace: true})
+            .typeText(this.password.control, password, {replace: true})
+            .typeText(this.passwordConfirm.control, passwordConfirm, {replace: 
true})
+            .typeText(this.firstName.control, firstName, {replace: true})
+            .typeText(this.lastName.control, lastName, {replace: true})
+            .typeText(this.company.control, company, {replace: true});
+        await this.country.selectOption(country);
+    }
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/e2e/testcafe/roles.js
----------------------------------------------------------------------
diff --git a/modules/web-console/e2e/testcafe/roles.js 
b/modules/web-console/e2e/testcafe/roles.js
index 5f584b2..5d9bfcc 100644
--- a/modules/web-console/e2e/testcafe/roles.js
+++ b/modules/web-console/e2e/testcafe/roles.js
@@ -17,7 +17,7 @@
 
 const { Role, t } = require('testcafe');
 import { resolveUrl } from './envtools';
-const { PageSignIn } = require('./page-models/PageSignIn');
+import {pageSignin as page} from './page-models/pageSignin1';
 
 export const createRegularUser = () => {
     return new Role(resolveUrl('/signin'), async() => {
@@ -25,8 +25,6 @@ export const createRegularUser = () => {
 
         // Disable "Getting started" modal.
         await t.eval(() => window.localStorage.showGettingStarted = 'false');
-
-        const page = new PageSignIn();
         await page.login('a@a', 'a');
     });
 };

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js 
b/modules/web-console/frontend/app/app.js
index 81a5bc7..350005f 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -136,7 +136,6 @@ import breadcrumbs from './components/breadcrumbs';
 import panelCollapsible from './components/panel-collapsible';
 import clusterSelector from './components/cluster-selector';
 import connectedClusters from './components/connected-clusters';
-import pageSignIn from './components/page-signin';
 import pageLanding from './components/page-landing';
 import passwordVisibility from './components/password-visibility';
 import progressLine from './components/progress-line';
@@ -144,6 +143,9 @@ import progressLine from './components/progress-line';
 import pageProfile from './components/page-profile';
 import pagePasswordChanged from './components/page-password-changed';
 import pagePasswordReset from './components/page-password-reset';
+import pageSignup from './components/page-signup';
+import pageSignin from './components/page-signin';
+import pageForgotPassword from './components/page-forgot-password';
 
 import igniteServices from './services';
 
@@ -234,10 +236,12 @@ angular.module('ignite-console', [
     igniteListOfRegisteredUsers.name,
     pageProfile.name,
     exposeInput.name,
-    pageSignIn.name,
     pageLanding.name,
     pagePasswordChanged.name,
     pagePasswordReset.name,
+    pageSignup.name,
+    pageSignin.name,
+    pageForgotPassword.name,
     uiAceJava.name,
     uiAceSpring.name,
     breadcrumbs.name,

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/component.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/component.js 
b/modules/web-console/frontend/app/components/page-forgot-password/component.js
new file mode 100644
index 0000000..8c70e73
--- /dev/null
+++ 
b/modules/web-console/frontend/app/components/page-forgot-password/component.js
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import template from './template.pug';
+import controller from './controller';
+
+import './style.scss';
+
+/** @type {ng.IComponentOptions} */
+export default {
+    controller,
+    template,
+    bindings: {
+        email: '<?'
+    }
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/controller.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/controller.js
 
b/modules/web-console/frontend/app/components/page-forgot-password/controller.js
new file mode 100644
index 0000000..92e8541
--- /dev/null
+++ 
b/modules/web-console/frontend/app/components/page-forgot-password/controller.js
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default class PageForgotPassword {
+    /** @type {string} Optional email to populate form with */
+    email;
+    /** @type {import('./types').IForgotPasswordFormController} */
+    form;
+    /** @type {import('./types').IForgotPasswordData} */
+    data = {email: null};
+    /** @type {string} */
+    serverError = null;
+
+    static $inject = ['Auth', 'IgniteMessages'];
+
+    /**
+     * @param {import('app/modules/user/Auth.service').default} Auth
+     */
+    constructor(Auth, IgniteMessages) {
+        this.Auth = Auth;
+        this.IgniteMessages = IgniteMessages;
+    }
+    /** @param {import('./types').IForgotPasswordFormController} form */
+    canSubmitForm(form) {
+        return form.$error.server ? true : !form.$invalid;
+    }
+    $postLink() {
+        this.form.email.$validators.server = () => !this.serverError;
+    }
+    /**
+     * @param {{email: ng.IChangesObject<string>}} changes
+     */
+    $onChanges(changes) {
+        if ('email' in changes) this.data.email = changes.email.currentValue;
+    }
+    remindPassword() {
+        return this.Auth.remindPassword(this.data.email).catch((res) => {
+            this.IgniteMessages.showError(null, res.data);
+            this.serverError = res.data;
+            this.form.email.$validate();
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/index.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/index.js 
b/modules/web-console/frontend/app/components/page-forgot-password/index.js
new file mode 100644
index 0000000..dec8fd9
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-forgot-password/index.js
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import angular from 'angular';
+import component from './component';
+import {registerState} from './run';
+
+export default angular
+    .module('ignite-console.page-forgot-password', [
+        'ui.router',
+        'ignite-console.user'
+    ])
+    .component('pageForgotPassword', component)
+    .run(registerState);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/run.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/run.js 
b/modules/web-console/frontend/app/components/page-forgot-password/run.js
new file mode 100644
index 0000000..c7ee6a6
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-forgot-password/run.js
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @param {import("@uirouter/angularjs").UIRouter} $uiRouter
+ */
+export function registerState($uiRouter) {
+    /** @type {import("app/types").IIgniteNg1StateDeclaration} */
+    const state = {
+        name: 'forgotPassword',
+        url: '/forgot-password',
+        component: 'pageForgotPassword',
+        unsaved: true,
+        tfMetaTags: {
+            title: 'Forgot Password'
+        },
+        resolve: [
+            {
+                token: 'email',
+                deps: ['$uiRouter'],
+                /**
+                 * @param {import('@uirouter/angularjs').UIRouter} $uiRouter
+                 */
+                resolveFn($uiRouter) {
+                    return 
$uiRouter.stateService.transition.targetState().params().email;
+                }
+            }
+        ]
+    };
+
+    $uiRouter.stateRegistry.register(state);
+}
+
+registerState.$inject = ['$uiRouter'];

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/style.scss
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/style.scss 
b/modules/web-console/frontend/app/components/page-forgot-password/style.scss
new file mode 100644
index 0000000..8122c34
--- /dev/null
+++ 
b/modules/web-console/frontend/app/components/page-forgot-password/style.scss
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+page-forgot-password {
+    display: flex;
+    flex-direction: column;
+    flex: 1 0 auto;
+
+    section {
+        margin-left: auto;
+        margin-right: auto;
+        width: 530px;
+
+        h3 {
+            font-size: 38px;
+            font-weight: 300;
+            margin: 30px 0 30px;
+        }
+
+        p {
+            margin-bottom: 20px;
+        }
+
+        .form-field {
+            margin: 10px 0;
+        }
+
+        .form-footer {
+            padding: 15px 0;
+            text-align: right;
+            border-top: 1px solid #e5e5e5;
+            display: flex;
+            align-items: center;
+
+            .btn-ignite {
+                margin-left: auto;
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/template.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/template.pug 
b/modules/web-console/frontend/app/components/page-forgot-password/template.pug
new file mode 100644
index 0000000..6a11baf
--- /dev/null
+++ 
b/modules/web-console/frontend/app/components/page-forgot-password/template.pug
@@ -0,0 +1,50 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+include /app/helpers/jade/mixins
+
+web-console-header
+    web-console-header-left
+        ignite-header-title
+
+.container.body-container
+    section
+        - const form = '$ctrl.form'
+        h3 Forgot password?
+        p That's ok! Simply enter your email below and a reset password link 
will be sent to you via email. You can then follow that link and select a new 
password.
+        form(name=form novalidate ng-submit='$ctrl.remindPassword()')
+            +form-field__email({
+                label: 'Email:',
+                model: '$ctrl.data.email',
+                name: '"email"',
+                placeholder: 'Input email',
+                required: true
+            })(
+                ng-model-options='{allowInvalid: true}'
+                autocomplete='email'
+                ignite-auto-focus
+                tabindex='0'
+            )
+                +form-field__error({error: 'server', message: 
`{{$ctrl.serverError}}`})
+            footer.form-footer
+                a(ui-sref='signin') Back to sign in
+                button.btn-ignite.btn-ignite--primary(
+                    tabindex='1'
+                    type='submit'
+                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
+                ) Send it to me
+
+web-console-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-forgot-password/types.ts
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-forgot-password/types.ts 
b/modules/web-console/frontend/app/components/page-forgot-password/types.ts
new file mode 100644
index 0000000..cbcff81
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-forgot-password/types.ts
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export interface IForgotPasswordData {
+    email: string
+}
+
+export interface IForgotPasswordFormController extends ng.IFormController {
+    email: ng.INgModelController
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-landing/template.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-landing/template.pug 
b/modules/web-console/frontend/app/components/page-landing/template.pug
index a1ce4f7..7b5b1cc 100644
--- a/modules/web-console/frontend/app/components/page-landing/template.pug
+++ b/modules/web-console/frontend/app/components/page-landing/template.pug
@@ -26,7 +26,7 @@ section.intro-container-wrapper
             h1  Web Console
             h2 An Interactive Configuration Wizard and Management Tool for 
Apache™ Ignite®
             p It provides an interactive configuration wizard which helps you 
create and download configuration files and code snippets for your Apache 
Ignite projects. Additionally, the tool allows you to automatically load SQL 
metadata from any RDBMS, run SQL queries on your in-memory cache as well as 
view execution plans, in-memory schema, and streaming charts.
-            a#signup_show.btn.btn-lg.btn-primary.btn-custom(ui-sref='signin') 
Try Now
+            a#signup_show.btn.btn-lg.btn-primary.btn-custom(ui-sref='signup') 
Sign Up
         .col-lg-6.col-md-6.col-sm-6.col-xs-12
             ui-carousel(slides='$ctrl.images' autoplay='true' 
slides-to-show='1' arrows='false')
                 carousel-item
@@ -61,6 +61,6 @@ section.features-container-wrapper
                     h3 Manage The Web Console users
                     p With The Web Console you can have accounts with 
different roles.
         .align-center.text-center
-            a.btn.btn-lg.btn-primary.btn-custom(ui-sref='signin') Get Started
+            a.btn.btn-lg.btn-primary.btn-custom(ui-sref='signup') Get Started
 
 web-console-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/component.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signin/component.js 
b/modules/web-console/frontend/app/components/page-signin/component.js
new file mode 100644
index 0000000..968ff39
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signin/component.js
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import template from './template.pug';
+import controller from './controller';
+import './style.scss';
+
+/** @type {ng.IComponentOptions} */
+export default {
+    controller,
+    template
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/controller.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signin/controller.js 
b/modules/web-console/frontend/app/components/page-signin/controller.js
index fb57620..b13cf4b 100644
--- a/modules/web-console/frontend/app/components/page-signin/controller.js
+++ b/modules/web-console/frontend/app/components/page-signin/controller.js
@@ -15,107 +15,42 @@
  * limitations under the License.
  */
 
-// eslint-disable-next-line
-import {default as AuthService} from 'app/modules/user/Auth.service';
-
 export default class {
-    /** @type {ng.IFormController} */
-    form_signup;
-    /** @type {ng.IFormController} */
-    form_signin;
-    /** @type {ng.IFormController} */
-    form_forgot;
+    /** @type {import('./types').ISiginData} */
+    data = {
+        email: null,
+        password: null
+    };
+    /** @type {import('./types').ISigninFormController} */
+    form;
+    /** @type {string} */
+    serverError = null;
 
-    static $inject = ['IgniteFocus', 'IgniteCountries', 'Auth', 
'IgniteMessages'];
+    static $inject = ['Auth', 'IgniteMessages'];
 
     /**
-     * @param {AuthService} Auth
+     * @param {import('app/modules/user/Auth.service').default} Auth
      */
-    constructor(Focus, Countries, Auth, IgniteMessages) {
+    constructor(Auth, IgniteMessages) {
         this.Auth = Auth;
         this.IgniteMessages = IgniteMessages;
-        this.countries = Countries.getAll();
-
-        Focus.move('user_email');
-    }
-    $onInit() {
-        const data = this.data = {
-            signup: {
-                email: null,
-                password: null,
-                firstName: null,
-                lastName: null,
-                company: null,
-                country: null
-            },
-            signin: {
-                /** @type {string} */
-                email: null,
-                /** @type {string} */
-                password: null
-            },
-            remindPassword: {
-                /** 
-                 * Explicitly mirrors signin email so user won't have to type 
it twice
-                 * @type {string}
-                 */
-                get email() {
-                    return data.signin.email;
-                },
-                set email(value) {
-                    data.signin.email = value;
-                }
-            }
-        };
-        /** @type {('signin'|'remindPassword')} */
-        this.activeForm = 'signin';
-        /** @type {{signup: string, signin: string, remindPassword: string}} */
-        this.serverErrors = {
-            signup: null,
-            signin: null,
-            remindPassword: null
-        };
-    }
-    get isSigninOpened() {
-        return this.activeForm === 'signin';
     }
-    get isRemindPasswordOpened() {
-        return this.activeForm === 'remindPassword';
-    }
-    /** Toggles between signin and remind password forms */
-    toggleActiveForm() {
-        this.activeForm = this.activeForm === 'signin' ? 'remindPassword' : 
'signin';
-    }
-    /** @param {ng.IFormController} form */
+
+    /** @param {import('./types').ISigninFormController} form */
     canSubmitForm(form) {
         return form.$error.server ? true : !form.$invalid;
     }
+
     $postLink() {
-        this.form_signup.signupEmail.$validators.server = () => 
!this.serverErrors.signup;
-        this.form_signin.signinEmail.$validators.server = () => 
!this.serverErrors.signin;
-        this.form_signin.signinPassword.$validators.server = () => 
!this.serverErrors.signin;
-        this.form_forgot.forgotEmail.$validators.server = () => 
!this.serverErrors.remindPassword;
-    }
-    signup() {
-        return this.Auth.signnup(this.data.signup).catch((res) => {
-            this.IgniteMessages.showError(null, res.data);
-            this.serverErrors.signup = res.data;
-            this.form_signup.signupEmail.$validate();
-        });
+        this.form.password.$validators.server = () => !this.serverError;
     }
+
     signin() {
-        return this.Auth.signin(this.data.signin.email, 
this.data.signin.password).catch((res) => {
-            this.IgniteMessages.showError(null, res.data);
-            this.serverErrors.signin = res.data;
-            this.form_signin.signinEmail.$validate();
-            this.form_signin.signinPassword.$validate();
-        });
-    }
-    remindPassword() {
-        return 
this.Auth.remindPassword(this.data.remindPassword.email).catch((res) => {
+        return this.Auth.signin(this.data.email, 
this.data.password).catch((res) => {
             this.IgniteMessages.showError(null, res.data);
-            this.serverErrors.remindPassword = res.data;
-            this.form_forgot.forgotEmail.$validate();
+            this.serverError = res.data;
+            this.form.email.$validate();
+            this.form.password.$validate();
         });
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signin/index.js 
b/modules/web-console/frontend/app/components/page-signin/index.js
index 6be374f..ee027a6 100644
--- a/modules/web-console/frontend/app/components/page-signin/index.js
+++ b/modules/web-console/frontend/app/components/page-signin/index.js
@@ -16,41 +16,13 @@
  */
 
 import angular from 'angular';
-
-import template from './template.pug';
-import controller from './controller';
-import './style.scss';
+import component from './component';
+import {registerState} from './run';
 
 export default angular
-    .module('ignite-console.sign-in', [
+    .module('ignite-console.page-signin', [
         'ui.router',
         'ignite-console.user'
     ])
-    .component('pageSignIn', {
-        controller,
-        template
-    })
-    .config(['$stateProvider', function($stateProvider) {
-        // set up the states
-        $stateProvider
-        .state('signin', {
-            url: '/signin',
-            template: '<page-sign-in></page-sign-in>',
-            redirectTo: (trans) => {
-                return trans.injector().get('User').read()
-                    .then(() => {
-                        try {
-                            const {name, params} = 
JSON.parse(localStorage.getItem('lastStateChangeSuccess'));
-
-                            const restored = 
trans.router.stateService.target(name, params);
-
-                            return restored.valid() ? restored : 
'default-state';
-                        } catch (ignored) {
-                            return 'default-state';
-                        }
-                    })
-                    .catch(() => true);
-            },
-            unsaved: true
-        });
-    }]);
+    .component('pageSignin', component)
+    .run(registerState);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/run.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signin/run.js 
b/modules/web-console/frontend/app/components/page-signin/run.js
new file mode 100644
index 0000000..7ac3bf8
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signin/run.js
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @param {import("@uirouter/angularjs").UIRouter} $uiRouter
+ */
+export function registerState($uiRouter) {
+    /** @type {import("app/types").IIgniteNg1StateDeclaration} */
+    const state = {
+        url: '/signin',
+        name: 'signin',
+        component: 'pageSignin',
+        unsaved: true,
+        redirectTo: (trans) => {
+            const skipStates = new Set(['signup', 'forgotPassword', 
'landing']);
+            if (skipStates.has(trans.from().name)) return;
+            return trans.injector().get('User').read()
+                .then(() => {
+                    try {
+                        const {name, params} = 
JSON.parse(localStorage.getItem('lastStateChangeSuccess'));
+
+                        const restored = 
trans.router.stateService.target(name, params);
+
+                        return restored.valid() ? restored : 'default-state';
+                    } catch (ignored) {
+                        return 'default-state';
+                    }
+                })
+                .catch(() => true);
+        },
+        tfMetaTags: {
+            title: 'Sign In'
+        }
+    };
+
+    $uiRouter.stateRegistry.register(state);
+}
+
+registerState.$inject = ['$uiRouter'];

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signin/style.scss 
b/modules/web-console/frontend/app/components/page-signin/style.scss
index 8ea143a..c4dee98 100644
--- a/modules/web-console/frontend/app/components/page-signin/style.scss
+++ b/modules/web-console/frontend/app/components/page-signin/style.scss
@@ -15,34 +15,41 @@
  * limitations under the License.
  */
 
-page-sign-in {
+page-signin {
     display: flex;
     flex-direction: column;
     flex: 1 0 auto;
 
-    font-family: Roboto;
-
-    h3 {
-        font-size: 38px;
-        font-weight: 300;
-        margin: 30px 0 60px;
-    }
-
     section {
-        flex-grow: 1;
-        padding: 25px 0 60px;
+        margin-left: auto;
+        margin-right: auto;
+        width: 530px;
 
-        background-color: #ffffff;
-        color: #444444;
-    }
+        h3 {
+            font-size: 38px;
+            font-weight: 300;
+            margin: 30px 0 30px;
+        }
+
+        .form-field {
+            margin: 10px 0;
+        }
 
-    .ps-grid {
-        display: grid;
-        grid-gap: 10px;
-        grid-template-columns: 1fr 1fr;
+        .form-footer {
+            padding: 15px 0;
+            text-align: right;
+            border-top: 1px solid #e5e5e5;
+            display: flex;
+            align-items: center;
 
-        .ps-grid-full-width {
-            grid-column: 1 / 3;
+            .btn-ignite {
+                margin-left: auto;
+            }
         }
     }
-}
\ No newline at end of file
+
+    .page-signin__no-account-message {
+        text-align: center;
+        margin: 20px 0;
+    } 
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/template.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signin/template.pug 
b/modules/web-console/frontend/app/components/page-signin/template.pug
index 58d8571..fd5e95f 100644
--- a/modules/web-console/frontend/app/components/page-signin/template.pug
+++ b/modules/web-console/frontend/app/components/page-signin/template.pug
@@ -20,164 +20,41 @@ web-console-header
     web-console-header-left
         ignite-header-title
 
-section
-    .container
-        .row
-            .col-lg-6.col-md-6.col-sm-6.col-xs-12
-                .row
-                    .col-xs-12.col-md-11
-                        -var form = '$ctrl.form_signup'
-                        h3 Don't Have An Account?
-                        form.ps-grid(name=form novalidate)
-                            .ps-grid-full-width
-                                +form-field__email({
-                                    label: 'Email:',
-                                    model: '$ctrl.data.signup.email',
-                                    name: '"signupEmail"',
-                                    placeholder: 'Input email',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='passwordInput'
-                                    ng-model-options='{allowInvalid: true}'
-                                )
-                                    +form-field__error({error: 'server', 
message: `{{$ctrl.serverErrors.signup}}`})
-                            div
-                                +form-field__password({
-                                    label: 'Password:',
-                                    model: '$ctrl.data.signup.password',
-                                    name: '"password"',
-                                    placeholder: 'Input password',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='confirmInput'
-                                )
-                            div
-                                +form-field__password({
-                                    label: 'Confirm:',
-                                    model: 'confirm',
-                                    name: '"confirm"',
-                                    placeholder: 'Confirm password',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='firstNameInput'
-                                    ignite-match='$ctrl.data.signup.password'
-                                )
-                            div
-                                +form-field__text({
-                                    label: 'First name:',
-                                    model: '$ctrl.data.signup.firstName',
-                                    name: '"firstName"',
-                                    placeholder: 'Input first name',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='lastNameInput'
-                                )
-                            div
-                                +form-field__text({
-                                    label: 'Last name:',
-                                    model: '$ctrl.data.signup.lastName',
-                                    name: '"lastName"',
-                                    placeholder: 'Input last name',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='companyInput'
-                                )
-                            .ps-grid-full-width
-                                +form-field__dropdown({
-                                    label: 'Country:',
-                                    model: '$ctrl.data.signup.country',
-                                    name: '"country"',
-                                    required: true,
-                                    placeholder: 'Choose your country',
-                                    options: '$ctrl.countries'
-                                })(
-                                    ignite-on-enter-focus-move='signup_submit'
-                                )
-                            .ps-grid-full-width
-                                +form-field__text({
-                                    label: 'Company:',
-                                    model: '$ctrl.data.signup.company',
-                                    name: '"company"',
-                                    placeholder: 'Input company name',
-                                    required: true
-                                })(
-                                    ignite-on-enter-focus-move='countryInput'
-                                )
-                            .login-footer.ps-grid-full-width
-                                
button#signup_submit.btn-ignite.btn-ignite--primary(
-                                    ng-click='$ctrl.signup()'
-                                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
-                                ) Sign Up
-
-            .col-lg-6.col-md-6.col-sm-6.col-xs-12
-                .row
-                    .col-xs-12.col-md-11
-                        -var form = '$ctrl.form_signin'
-                        form.row(ng-show='$ctrl.isSigninOpened' name=form 
novalidate)
-                            .settings-row
-                                h3 Sign In
-                            .settings-row
-                                +form-field__email({
-                                    label: 'Email:',
-                                    model: '$ctrl.data.signin.email',
-                                    name: '"signinEmail"',
-                                    placeholder: 'Input email',
-                                    required: true
-                                })(
-                                    ignite-auto-focus
-                                    
ignite-on-enter-focus-move='singinPasswordInput'
-                                    ng-model-options='{allowInvalid: true}'
-                                )
-                                    +form-field__error({error: 'server', 
message: `{{$ctrl.serverErrors.signin}}`})
-                            .settings-row
-                                +form-field__password({
-                                    label: 'Password:',
-                                    model: '$ctrl.data.signin.password',
-                                    name: '"signinPassword"',
-                                    placeholder: 'Input password',
-                                    required: true
-                                })(
-                                    
ignite-on-enter='$ctrl.signin($ctrl.data.signin.email, 
$ctrl.data.signin.password)'
-                                    ng-model-options='{allowInvalid: true}'
-                                )
-                                    +form-field__error({error: 'server', 
message: `{{$ctrl.serverErrors.signin}}`})
-                            .login-footer
-                                a.labelField#forgot_show(
-                                    ng-click='$ctrl.toggleActiveForm()'
-                                    ignite-on-click-focus='forgot_email'
-                                ) Forgot password?
-                                
button#signin_submit.btn-ignite.btn-ignite--primary(
-                                    ng-click='$ctrl.signin()'
-                                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
-                                ) Sign In
-
-                        - var form = '$ctrl.form_forgot'
-                        form.row(ng-show='$ctrl.isRemindPasswordOpened' 
name=form novalidate)
-                            .settings-row
-                                h3 Forgot password?
-                            .settings-row
-                                p.col-xs-12.col-md-11 That's ok! Simply enter 
your email below and a reset password link will be sent to you via email. You 
can then follow that link and select a new password.
-                            .settings-row
-                                +form-field__email({
-                                    label: 'Email:',
-                                    model: '$ctrl.data.remindPassword.email',
-                                    name: '"forgotEmail"',
-                                    placeholder: 'Input email',
-                                    required: true
-                                })(
-                                    ignite-auto-focus
-                                    ng-model-options='{allowInvalid: true}'
-                                    ignite-on-enter='$ctrl.remindPassword()'
-                                )
-                                    +form-field__error({error: 'server', 
message: `{{$ctrl.serverErrors.remindPassword}}`})
-                            .login-footer
-                                a.labelField#forgot_signin(
-                                    ng-click='$ctrl.toggleActiveForm()'
-                                    ignite-on-click-focus='signin_email'
-                                ) Sign In
-                                
button#forgot_submit.btn-ignite.btn-ignite--primary(
-                                    ng-click='$ctrl.remindPassword()'
-                                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
-                                ) Send it to me
+.container.body-container
+    section
+        -var form = '$ctrl.form'
+        h3 Sign In
+        form(name=form novalidate ng-submit='$ctrl.signin()')
+            +form-field__email({
+                label: 'Email:',
+                model: '$ctrl.data.email',
+                name: '"email"',
+                placeholder: 'Input email',
+                required: true
+            })(
+                ng-model-options='{allowInvalid: true}'
+                autocomplete='email'
+                ignite-auto-focus
+            )
+                +form-field__error({error: 'server', message: 
`{{$ctrl.serverErrors.}`})
+            +form-field__password({
+                label: 'Password:',
+                model: '$ctrl.data.password',
+                name: '"password"',
+                placeholder: 'Input password',
+                required: true
+            })(
+                ng-model-options='{allowInvalid: true}'
+                autocomplete='current-password'
+            )
+                +form-field__error({error: 'server', message: 
`{{$ctrl.serverErrors}}`})
+            footer.form-footer
+                a(ui-sref='forgotPassword({email: $ctrl.data.email})') Forgot 
password?
+                button.btn-ignite.btn-ignite--primary(
+                    type='submit'
+                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
+                ) Sign In
+        footer.page-signin__no-account-message
+            | Don't have an account? #[a(ui-sref='signup') Get started]
 
 web-console-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signin/types.ts
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signin/types.ts 
b/modules/web-console/frontend/app/components/page-signin/types.ts
new file mode 100644
index 0000000..96cca75
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signin/types.ts
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export interface ISiginData {
+    email: string,
+    password: string
+}
+
+export interface ISigninFormController extends ng.IFormController {
+    email: ng.INgModelController,
+    password: ng.INgModelController
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/component.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signup/component.js 
b/modules/web-console/frontend/app/components/page-signup/component.js
new file mode 100644
index 0000000..789a681
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/component.js
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import angular from 'angular';
+
+import template from './template.pug';
+import controller from './controller';
+import './style.scss';
+
+/** @type {ng.IComponentOptions} */
+export default {
+    controller,
+    template
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/controller.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signup/controller.js 
b/modules/web-console/frontend/app/components/page-signup/controller.js
new file mode 100644
index 0000000..ffc534a
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/controller.js
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default class PageSignup {
+    /** @type {import('./types').ISignupFormController} */
+    form;
+    /** @type {import('./types').ISignupData} */
+    data = {
+        email: null,
+        password: null,
+        firstName: null,
+        lastName: null,
+        company: null,
+        country: null
+    };
+    /** @type {string} */
+    serverError = null;
+
+    static $inject = ['IgniteCountries', 'Auth', 'IgniteMessages'];
+
+    /**
+     * @param {import('app/modules/user/Auth.service').default} Auth
+     */
+    constructor(Countries, Auth, IgniteMessages) {
+        this.Auth = Auth;
+        this.IgniteMessages = IgniteMessages;
+        this.countries = Countries.getAll();
+    }
+
+    /** @param {import('./types').ISignupFormController} form */
+    canSubmitForm(form) {
+        return form.$error.server ? true : !form.$invalid;
+    }
+
+    $postLink() {
+        this.form.email.$validators.server = () => !this.serverError;
+    }
+
+    signup() {
+        return this.Auth.signnup(this.data).catch((res) => {
+            this.IgniteMessages.showError(null, res.data);
+            this.serverError = res.data;
+            this.form.email.$validate();
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signup/index.js 
b/modules/web-console/frontend/app/components/page-signup/index.js
new file mode 100644
index 0000000..4efadb5
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/index.js
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import angular from 'angular';
+import component from './component';
+import {registerState} from './run';
+
+export default angular
+    .module('ignite-console.page-signup', [
+        'ui.router',
+        'ignite-console.user'
+    ])
+    .component('pageSignup', component)
+    .run(registerState);

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/run.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signup/run.js 
b/modules/web-console/frontend/app/components/page-signup/run.js
new file mode 100644
index 0000000..1d04fa2
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/run.js
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @param {import("@uirouter/angularjs").UIRouter} $uiRouter
+ */
+export function registerState($uiRouter) {
+    /** @type {import("app/types").IIgniteNg1StateDeclaration} */
+    const state = {
+        name: 'signup',
+        url: '/signup',
+        component: 'pageSignup',
+        unsaved: true,
+        tfMetaTags: {
+            title: 'Sign Up'
+        }
+    };
+    $uiRouter.stateRegistry.register(state);
+}
+
+registerState.$inject = ['$uiRouter'];

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signup/style.scss 
b/modules/web-console/frontend/app/components/page-signup/style.scss
new file mode 100644
index 0000000..54ae14e
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/style.scss
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+page-signup {
+    display: flex;
+    flex-direction: column;
+    flex: 1 0 auto;
+
+    section {
+        h3 {
+            font-size: 38px;
+            font-weight: 300;
+            margin: 30px 0 30px;
+        }
+
+        margin-left: auto;
+        margin-right: auto;
+        width: 530px;
+
+        form footer {
+            padding: 15px 0;
+            text-align: right;
+            border-top: 1px solid #e5e5e5;
+            display: flex;
+            align-items: center;
+
+            .btn-ignite {
+                margin-left: auto;
+            }
+        }
+
+        form {
+            display: grid;
+            grid-gap: 10px;
+            grid-template-columns: 1fr 1fr;
+
+            .full-width {
+                grid-column: 1 / 3;
+            }
+        }
+    }
+
+    .page-signup__has-account-message {
+        text-align: center;
+        margin: 20px 0;
+    } 
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/template.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/components/page-signup/template.pug 
b/modules/web-console/frontend/app/components/page-signup/template.pug
new file mode 100644
index 0000000..8cc7b14
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/template.pug
@@ -0,0 +1,122 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+include /app/helpers/jade/mixins
+
+web-console-header
+    web-console-header-left
+        ignite-header-title
+
+.container.body-container
+    section
+        -var form = '$ctrl.form'
+        h3 Don't Have An Account?
+        form(name=form novalidate ng-submit='$ctrl.signup()')
+            .full-width
+                +form-field__email({
+                    label: 'Email:',
+                    model: '$ctrl.data.email',
+                    name: '"email"',
+                    placeholder: 'Input email',
+                    required: true
+                })(
+                    ng-model-options='{allowInvalid: true}'
+                    autocomplete='email'
+                    ignite-auto-focus
+                )
+                    +form-field__error({error: 'server', message: 
`{{$ctrl.serverError}}`})
+            div
+                +form-field__password({
+                    label: 'Password:',
+                    model: '$ctrl.data.password',
+                    name: '"password"',
+                    placeholder: 'Input password',
+                    required: true
+                })(
+                    autocomplete='new-password'
+                )
+            div
+                +form-field__password({
+                    label: 'Confirm:',
+                    model: 'confirm',
+                    name: '"confirm"',
+                    placeholder: 'Confirm password',
+                    required: true
+                })(
+                    ignite-match='$ctrl.data.password'
+                    autocomplete='off'
+                )
+            div
+                +form-field__text({
+                    label: 'First name:',
+                    model: '$ctrl.data.firstName',
+                    name: '"firstName"',
+                    placeholder: 'Input first name',
+                    required: true
+                })(
+                    autocomplete='given-name'
+                )
+            div
+                +form-field__text({
+                    label: 'Last name:',
+                    model: '$ctrl.data.lastName',
+                    name: '"lastName"',
+                    placeholder: 'Input last name',
+                    required: true
+                })(
+                    autocomplete='family-name'
+                )
+            div
+                +form-field__phone({
+                    label: 'Phone:',
+                    model: '$ctrl.data.phone',
+                    name: '"phone"',
+                    placeholder: 'Input phone (ex.: +15417543010)',
+                    optional: true
+                })(
+                    autocomplete='tel'
+                )
+            div
+                +form-field__dropdown({
+                    label: 'Country:',
+                    model: '$ctrl.data.country',
+                    name: '"country"',
+                    required: true,
+                    placeholder: 'Choose your country',
+                    options: '$ctrl.countries'
+                })(
+                    autocomplete='country'
+                )
+            .full-width
+                +form-field__text({
+                    label: 'Company:',
+                    model: '$ctrl.data.company',
+                    name: '"company"',
+                    placeholder: 'Input company name',
+                    required: true
+                })(
+                    ignite-on-enter-focus-move='countryInput'
+                    autocomplete='organization'
+                )
+            footer.full-width.form-footer
+                button.btn-ignite.btn-ignite--primary(
+                    type='submit'
+                    ng-disabled=`!$ctrl.canSubmitForm(${form})`
+                ) Sign Up
+        footer.page-signup__has-account-message
+            | Already have an account? #[a(ui-sref='signin') Sign in here]
+
+web-console-footer

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/components/page-signup/types.ts
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-signup/types.ts 
b/modules/web-console/frontend/app/components/page-signup/types.ts
new file mode 100644
index 0000000..49e8d5d
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-signup/types.ts
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export interface ISignupData {
+    email: string,
+    password: string,
+    firstName: string,
+    lastName: string,
+    phone?: string,
+    company: string,
+    country: string
+}
+
+export interface ISignupFormController extends ng.IFormController {
+    email: ng.INgModelController,
+    password: ng.INgModelController,
+    firstName: ng.INgModelController,
+    lastName: ng.INgModelController,
+    phone: ng.INgModelController,
+    company: ng.INgModelController,
+    country: ng.INgModelController
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/primitives/form-field/dropdown.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/primitives/form-field/dropdown.pug 
b/modules/web-console/frontend/app/primitives/form-field/dropdown.pug
index cb05829..c41825c 100644
--- a/modules/web-console/frontend/app/primitives/form-field/dropdown.pug
+++ b/modules/web-console/frontend/app/primitives/form-field/dropdown.pug
@@ -17,6 +17,7 @@
 mixin form-field__dropdown({ label, model, name, disabled, required, multiple, 
placeholder, placeholderEmpty, options, tip })
     mixin __form-field__input()
         button.select-toggle(
+            type='button'
             id=`{{ ${name} }}Input`
             name=`{{ ${name} }}`
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/app/types/index.ts
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/types/index.ts 
b/modules/web-console/frontend/app/types/index.ts
new file mode 100644
index 0000000..333c00b
--- /dev/null
+++ b/modules/web-console/frontend/app/types/index.ts
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {Ng1StateDeclaration} from '@uirouter/angularjs';
+
+interface ITfMetatagsConfig {
+    title: string
+}
+
+export interface IIgniteNg1StateDeclaration extends Ng1StateDeclaration {
+    /**
+     * Whether to store state as last visited in local storage or not.
+     * true - will be saved
+     * false (default) - won't be saved
+     * @type {boolean}
+     */
+    unsaved?: boolean,
+    tfMetaTags: ITfMetatagsConfig
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/2f8df263/modules/web-console/frontend/public/stylesheets/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/public/stylesheets/style.scss 
b/modules/web-console/frontend/public/stylesheets/style.scss
index 0c978e9..a9702e3 100644
--- a/modules/web-console/frontend/public/stylesheets/style.scss
+++ b/modules/web-console/frontend/public/stylesheets/style.scss
@@ -241,29 +241,6 @@ h1, h2, h3, h4, h5, h6 {
     font-size: 2em;
 }
 
-.login-footer {
-    padding: 15px 0;
-    text-align: right;
-    border-top: 1px solid #e5e5e5;
-
-    label {
-        float: left;
-        margin: 0;
-    }
-
-    .btn:last-child {
-        margin-right: 0;
-    }
-
-    .checkbox {
-        margin: 0;
-    }
-
-    .btn {
-        margin-right: 0;
-    }
-}
-
 body {
     overflow-x: hidden;
     display: flex;

Reply via email to