From 8d49edac6af9dd08f1bb7b1727aee36af413a4a2 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Tue, 28 Mar 2017 18:59:33 -0300 Subject: [#932] Moves form componentes to separate directories with @deniscostadsc --- .../admin_recovery_code_form.js | 54 +++++++++++++ .../admin_recovery_code_form.scss | 22 ++++++ .../admin_recovery_code_form.spec.js | 38 +++++++++ .../forms/admin_recovery_code_form.js | 54 ------------- .../forms/admin_recovery_code_form.spec.js | 38 --------- web-ui/src/account_recovery/forms/forms.scss | 92 ---------------------- .../account_recovery/forms/new_password_form.js | 55 ------------- .../forms/new_password_form.spec.js | 45 ----------- .../forms/user_recovery_code_form.js | 59 -------------- .../forms/user_recovery_code_form.spec.js | 52 ------------ .../new_password_form/new_password_form.js | 57 ++++++++++++++ .../new_password_form/new_password_form.scss | 22 ++++++ .../new_password_form/new_password_form.spec.js | 45 +++++++++++ web-ui/src/account_recovery/page.js | 6 +- web-ui/src/account_recovery/page.scss | 40 ++++++++++ web-ui/src/account_recovery/page.spec.js | 21 ++--- .../user_recovery_code_form.js | 59 ++++++++++++++ .../user_recovery_code_form.scss | 39 +++++++++ .../user_recovery_code_form.spec.js | 52 ++++++++++++ 19 files changed, 442 insertions(+), 408 deletions(-) create mode 100644 web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.js create mode 100644 web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.scss create mode 100644 web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.spec.js delete mode 100644 web-ui/src/account_recovery/forms/admin_recovery_code_form.js delete mode 100644 web-ui/src/account_recovery/forms/admin_recovery_code_form.spec.js delete mode 100644 web-ui/src/account_recovery/forms/forms.scss delete mode 100644 web-ui/src/account_recovery/forms/new_password_form.js delete mode 100644 web-ui/src/account_recovery/forms/new_password_form.spec.js delete mode 100644 web-ui/src/account_recovery/forms/user_recovery_code_form.js delete mode 100644 web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js create mode 100644 web-ui/src/account_recovery/new_password_form/new_password_form.js create mode 100644 web-ui/src/account_recovery/new_password_form/new_password_form.scss create mode 100644 web-ui/src/account_recovery/new_password_form/new_password_form.spec.js create mode 100644 web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js create mode 100644 web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.scss create mode 100644 web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js diff --git a/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.js b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.js new file mode 100644 index 00000000..7a82a5d7 --- /dev/null +++ b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import InputField from 'src/common/input_field/input_field'; +import SubmitButton from 'src/common/submit_button/submit_button'; + +import './admin_recovery_code_form.scss'; + +export const AdminRecoveryCodeForm = ({ t, next }) => ( +
+ {t('account-recovery.admin-form.image-description')} +

{t('account-recovery.admin-form.title')}

+ +
    +
  • {t('account-recovery.admin-form.tip1')}
  • +
  • {t('account-recovery.admin-form.tip2')}
  • +
  • {t('account-recovery.admin-form.tip3')}
  • +
+ + + +); + +AdminRecoveryCodeForm.propTypes = { + t: React.PropTypes.func.isRequired, + next: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(AdminRecoveryCodeForm); diff --git a/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.scss b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.scss new file mode 100644 index 00000000..6dcbcc67 --- /dev/null +++ b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.scss @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +.admin-code-image { + margin: 1em 0; + align-self: center; + height: 2.7em; +} diff --git a/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.spec.js b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.spec.js new file mode 100644 index 00000000..85b75652 --- /dev/null +++ b/web-ui/src/account_recovery/admin_recovery_code_form/admin_recovery_code_form.spec.js @@ -0,0 +1,38 @@ +import { shallow } from 'enzyme'; +import expect from 'expect'; +import React from 'react'; +import { AdminRecoveryCodeForm } from './admin_recovery_code_form'; + +describe('AdminRecoveryCodeForm', () => { + let adminRecoveryCodeForm; + let mockNext; + + beforeEach(() => { + const mockTranslations = key => key; + mockNext = expect.createSpy(); + adminRecoveryCodeForm = shallow( + + ); + }); + + it('renders title for admin recovery code', () => { + expect(adminRecoveryCodeForm.find('h1').text()).toEqual('account-recovery.admin-form.title'); + }); + + it('renders tips for retrieving recovery code', () => { + expect(adminRecoveryCodeForm.find('li').length).toEqual(3); + }); + + it('renders input field for admin code', () => { + expect(adminRecoveryCodeForm.find('InputField').props().name).toEqual('admin-code'); + }); + + it('renders button for next step', () => { + expect(adminRecoveryCodeForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.admin-form.button'); + }); + + it('submits form to next step', () => { + adminRecoveryCodeForm.find('form').simulate('submit'); + expect(mockNext).toHaveBeenCalled(); + }); +}); diff --git a/web-ui/src/account_recovery/forms/admin_recovery_code_form.js b/web-ui/src/account_recovery/forms/admin_recovery_code_form.js deleted file mode 100644 index 3d97b191..00000000 --- a/web-ui/src/account_recovery/forms/admin_recovery_code_form.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2017 ThoughtWorks, Inc. - * - * Pixelated is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pixelated is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pixelated. If not, see . - */ - -import React from 'react'; -import { translate } from 'react-i18next'; - -import InputField from 'src/common/input_field/input_field'; -import SubmitButton from 'src/common/submit_button/submit_button'; - -import './forms.scss'; - -export const AdminRecoveryCodeForm = ({ t, next }) => ( -
- {t('account-recovery.admin-form.image-description')} -

{t('account-recovery.admin-form.title')}

- -
    -
  • {t('account-recovery.admin-form.tip1')}
  • -
  • {t('account-recovery.admin-form.tip2')}
  • -
  • {t('account-recovery.admin-form.tip3')}
  • -
- - - -); - -AdminRecoveryCodeForm.propTypes = { - t: React.PropTypes.func.isRequired, - next: React.PropTypes.func.isRequired -}; - -export default translate('', { wait: true })(AdminRecoveryCodeForm); diff --git a/web-ui/src/account_recovery/forms/admin_recovery_code_form.spec.js b/web-ui/src/account_recovery/forms/admin_recovery_code_form.spec.js deleted file mode 100644 index 0e922212..00000000 --- a/web-ui/src/account_recovery/forms/admin_recovery_code_form.spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import { shallow } from 'enzyme'; -import expect from 'expect'; -import React from 'react'; -import { AdminRecoveryCodeForm } from 'src/account_recovery/forms/admin_recovery_code_form'; - -describe('AdminRecoveryCodeForm', () => { - let adminRecoveryCodeForm; - let mockNext; - - beforeEach(() => { - const mockTranslations = key => key; - mockNext = expect.createSpy(); - adminRecoveryCodeForm = shallow( - - ); - }); - - it('renders title for admin recovery code', () => { - expect(adminRecoveryCodeForm.find('h1').text()).toEqual('account-recovery.admin-form.title'); - }); - - it('renders tips for retrieving recovery code', () => { - expect(adminRecoveryCodeForm.find('li').length).toEqual(3); - }); - - it('renders input field for admin code', () => { - expect(adminRecoveryCodeForm.find('InputField').props().name).toEqual('admin-code'); - }); - - it('renders button for next step', () => { - expect(adminRecoveryCodeForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.admin-form.button'); - }); - - it('submits form to next step', () => { - adminRecoveryCodeForm.find('form').simulate('submit'); - expect(mockNext).toHaveBeenCalled(); - }); -}); diff --git a/web-ui/src/account_recovery/forms/forms.scss b/web-ui/src/account_recovery/forms/forms.scss deleted file mode 100644 index 09d8f2ce..00000000 --- a/web-ui/src/account_recovery/forms/forms.scss +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2017 ThoughtWorks, Inc. - * - * Pixelated is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pixelated is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pixelated. If not, see . - */ - -.account-recovery-form { - display: flex; - flex-direction: column; - - img { - margin: 1em 0; - align-self: center; - } - - .user-code-form-content { - display: flex; - flex-direction: column; - align-items: center; - } - - .account-recovery-progress { - width: 100%; - } - - .admin-code-image { - height: 2.7em; - } - - .user-code-image { - height: 4em; - } - - .input-field-group { - margin-top: 0; - } -} - -.new-password { - .input-field-group:first-of-type { - margin-bottom: 0; - } -} - -@media only screen and (min-width : 500px) { - .account-recovery-form { - align-items: center; - - .account-recovery-progress, h1 { - width: 80%; - } - - .user-code-form-content { - flex-direction: row; - width: 80%; - - img { - margin: 1.6em; - } - } - } -} - -@media only screen and (min-width : 960px) { - .account-recovery-form { - .account-recovery-progress { - width: 80%; - margin-top: 0; - } - - h1 { - max-width: 80%; - width: auto; - } - - .input-field-group, .submit-button { - width: 60%; - align-self: center; - } - } -} diff --git a/web-ui/src/account_recovery/forms/new_password_form.js b/web-ui/src/account_recovery/forms/new_password_form.js deleted file mode 100644 index 114366b3..00000000 --- a/web-ui/src/account_recovery/forms/new_password_form.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2017 ThoughtWorks, Inc. - * - * Pixelated is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pixelated is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pixelated. If not, see . - */ - -import React from 'react'; -import { translate } from 'react-i18next'; - -import InputField from 'src/common/input_field/input_field'; -import SubmitButton from 'src/common/submit_button/submit_button'; -import BackLink from 'src/common/back_link/back_link'; - -export const NewPasswordForm = ({ t, previous }) => ( -
- {t('account-recovery.new-password.image-description')} -

{t('account-recovery.new-password-form.title')}

- - - - - -); - -NewPasswordForm.propTypes = { - t: React.PropTypes.func.isRequired, - previous: React.PropTypes.func.isRequired -}; - -export default translate('', { wait: true })(NewPasswordForm); diff --git a/web-ui/src/account_recovery/forms/new_password_form.spec.js b/web-ui/src/account_recovery/forms/new_password_form.spec.js deleted file mode 100644 index 5ac96b40..00000000 --- a/web-ui/src/account_recovery/forms/new_password_form.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import { shallow } from 'enzyme'; -import expect from 'expect'; -import React from 'react'; -import { NewPasswordForm } from 'src/account_recovery/forms/new_password_form'; - -describe('NewPasswordForm', () => { - let newPasswordForm; - let mockPrevious; - - beforeEach(() => { - const mockTranslations = key => key; - mockPrevious = expect.createSpy(); - newPasswordForm = shallow( - - ); - }); - - it('renders title for new password form', () => { - expect(newPasswordForm.find('h1').text()).toEqual('account-recovery.new-password-form.title'); - }); - - it('renders input for new password', () => { - expect(newPasswordForm.find('InputField').at(0).props().type).toEqual('password'); - expect(newPasswordForm.find('InputField').at(0).props().label).toEqual('account-recovery.new-password-form.input-label1'); - }); - - it('renders input to confirm new password', () => { - expect(newPasswordForm.find('InputField').at(1).props().type).toEqual('password'); - expect(newPasswordForm.find('InputField').at(1).props().label).toEqual('account-recovery.new-password-form.input-label2'); - }); - - it('renders submit button', () => { - expect(newPasswordForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.new-password-form.button'); - }); - - it('returns to previous step on link click', () => { - newPasswordForm.find('BackLink').simulate('click'); - expect(mockPrevious).toHaveBeenCalled(); - }); - - it('returns to previous step on key down', () => { - newPasswordForm.find('BackLink').simulate('keyDown'); - expect(mockPrevious).toHaveBeenCalled(); - }); -}); diff --git a/web-ui/src/account_recovery/forms/user_recovery_code_form.js b/web-ui/src/account_recovery/forms/user_recovery_code_form.js deleted file mode 100644 index 30525cdf..00000000 --- a/web-ui/src/account_recovery/forms/user_recovery_code_form.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2017 ThoughtWorks, Inc. - * - * Pixelated is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Pixelated is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Pixelated. If not, see . - */ - -import React from 'react'; -import { translate } from 'react-i18next'; - -import InputField from 'src/common/input_field/input_field'; -import SubmitButton from 'src/common/submit_button/submit_button'; -import BackLink from 'src/common/back_link/back_link'; - -import './forms.scss'; - -export const UserRecoveryCodeForm = ({ t, previous, next }) => ( -
- {t('account-recovery.user-form.image-description')} -

{t('account-recovery.user-form.title')}

-
- -

{t('account-recovery.user-form.description')}

-
- - - - -); - -UserRecoveryCodeForm.propTypes = { - t: React.PropTypes.func.isRequired, - previous: React.PropTypes.func.isRequired, - next: React.PropTypes.func.isRequired -}; - -export default translate('', { wait: true })(UserRecoveryCodeForm); diff --git a/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js b/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js deleted file mode 100644 index 1aebb814..00000000 --- a/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -import { shallow } from 'enzyme'; -import expect from 'expect'; -import React from 'react'; -import { UserRecoveryCodeForm } from 'src/account_recovery/forms/user_recovery_code_form'; - -describe('UserRecoveryCodeForm', () => { - let userRecoveryCodeForm; - let mockNext; - let mockPrevious; - - beforeEach(() => { - const mockTranslations = key => key; - mockNext = expect.createSpy(); - mockPrevious = expect.createSpy(); - userRecoveryCodeForm = shallow( - - ); - }); - - it('renders title for user recovery code', () => { - expect(userRecoveryCodeForm.find('h1').text()).toEqual('account-recovery.user-form.title'); - }); - - it('renders description', () => { - expect(userRecoveryCodeForm.find('p').text()).toEqual('account-recovery.user-form.description'); - }); - - it('renders input for user code', () => { - expect(userRecoveryCodeForm.find('InputField').props().label).toEqual('account-recovery.user-form.input-label'); - }); - - it('renders submit button', () => { - expect(userRecoveryCodeForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.user-form.button'); - }); - - it('submits form to next step', () => { - userRecoveryCodeForm.find('form').simulate('submit'); - expect(mockNext).toHaveBeenCalled(); - }); - - it('returns to previous step on link click', () => { - userRecoveryCodeForm.find('BackLink').simulate('click'); - expect(mockPrevious).toHaveBeenCalled(); - }); - - it('returns to previous step on key down', () => { - userRecoveryCodeForm.find('BackLink').simulate('keyDown'); - expect(mockPrevious).toHaveBeenCalled(); - }); -}); diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.js b/web-ui/src/account_recovery/new_password_form/new_password_form.js new file mode 100644 index 00000000..8fbfb99d --- /dev/null +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import InputField from 'src/common/input_field/input_field'; +import SubmitButton from 'src/common/submit_button/submit_button'; +import BackLink from 'src/common/back_link/back_link'; + +import './new_password_form.scss'; + +export const NewPasswordForm = ({ t, previous }) => ( +
+ {t('account-recovery.new-password.image-description')} +

{t('account-recovery.new-password-form.title')}

+ + + + + +); + +NewPasswordForm.propTypes = { + t: React.PropTypes.func.isRequired, + previous: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(NewPasswordForm); diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.scss b/web-ui/src/account_recovery/new_password_form/new_password_form.scss new file mode 100644 index 00000000..77623262 --- /dev/null +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.scss @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +.new-password { + .input-field-group:first-of-type { + margin-bottom: 0; + } +} diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js b/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js new file mode 100644 index 00000000..2d326aea --- /dev/null +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js @@ -0,0 +1,45 @@ +import { shallow } from 'enzyme'; +import expect from 'expect'; +import React from 'react'; +import { NewPasswordForm } from './new_password_form'; + +describe('NewPasswordForm', () => { + let newPasswordForm; + let mockPrevious; + + beforeEach(() => { + const mockTranslations = key => key; + mockPrevious = expect.createSpy(); + newPasswordForm = shallow( + + ); + }); + + it('renders title for new password form', () => { + expect(newPasswordForm.find('h1').text()).toEqual('account-recovery.new-password-form.title'); + }); + + it('renders input for new password', () => { + expect(newPasswordForm.find('InputField').at(0).props().type).toEqual('password'); + expect(newPasswordForm.find('InputField').at(0).props().label).toEqual('account-recovery.new-password-form.input-label1'); + }); + + it('renders input to confirm new password', () => { + expect(newPasswordForm.find('InputField').at(1).props().type).toEqual('password'); + expect(newPasswordForm.find('InputField').at(1).props().label).toEqual('account-recovery.new-password-form.input-label2'); + }); + + it('renders submit button', () => { + expect(newPasswordForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.new-password-form.button'); + }); + + it('returns to previous step on link click', () => { + newPasswordForm.find('BackLink').simulate('click'); + expect(mockPrevious).toHaveBeenCalled(); + }); + + it('returns to previous step on key down', () => { + newPasswordForm.find('BackLink').simulate('keyDown'); + expect(mockPrevious).toHaveBeenCalled(); + }); +}); diff --git a/web-ui/src/account_recovery/page.js b/web-ui/src/account_recovery/page.js index 3043a38b..579f17cc 100644 --- a/web-ui/src/account_recovery/page.js +++ b/web-ui/src/account_recovery/page.js @@ -19,9 +19,9 @@ import React from 'react'; import { translate } from 'react-i18next'; import DocumentTitle from 'react-document-title'; import Header from 'src/common/header/header'; -import AdminRecoveryCodeForm from 'src/account_recovery/forms/admin_recovery_code_form'; -import UserRecoveryCodeForm from 'src/account_recovery/forms/user_recovery_code_form'; -import NewPasswordForm from 'src/account_recovery/forms/new_password_form'; +import AdminRecoveryCodeForm from 'src/account_recovery/admin_recovery_code_form/admin_recovery_code_form'; +import UserRecoveryCodeForm from 'src/account_recovery/user_recovery_code_form/user_recovery_code_form'; +import NewPasswordForm from 'src/account_recovery/new_password_form/new_password_form'; import Footer from 'src/common/footer/footer'; import 'font-awesome/scss/font-awesome.scss'; diff --git a/web-ui/src/account_recovery/page.scss b/web-ui/src/account_recovery/page.scss index 20604b70..c6a25e53 100644 --- a/web-ui/src/account_recovery/page.scss +++ b/web-ui/src/account_recovery/page.scss @@ -66,10 +66,33 @@ p { margin-bottom: 0.5em; } +.account-recovery-form { + display: flex; + flex-direction: column; + + .account-recovery-progress { + margin: 1em 0; + align-self: center; + width: 100%; + } + + .input-field-group { + margin-top: 0; + } +} + @media only screen and (min-width : 500px) { body { font-size: 1.3em; } + + .account-recovery-form { + align-items: center; + + .account-recovery-progress, h1 { + width: 80%; + } + } } @media only screen and (min-width : 960px) { @@ -78,4 +101,21 @@ p { max-width: 700px; padding: 3em; } + + .account-recovery-progress { + width: 80%; + margin-top: 0; + } + + .account-recovery-form { + h1 { + max-width: 80%; + width: auto; + } + + .input-field-group, .submit-button { + width: 60%; + align-self: center; + } + } } diff --git a/web-ui/src/account_recovery/page.spec.js b/web-ui/src/account_recovery/page.spec.js index 32e1477c..fd4e7db6 100644 --- a/web-ui/src/account_recovery/page.spec.js +++ b/web-ui/src/account_recovery/page.spec.js @@ -4,11 +4,12 @@ import React from 'react'; import { Page } from 'src/account_recovery/page'; import Header from 'src/common/header/header'; -import AdminRecoveryCodeForm from 'src/account_recovery/forms/admin_recovery_code_form'; -import UserRecoveryCodeForm from 'src/account_recovery/forms/user_recovery_code_form'; -import NewPasswordForm from 'src/account_recovery/forms/new_password_form'; import Footer from 'src/common/footer/footer'; +import AdminRecoveryCodeFormWrapper from './admin_recovery_code_form/admin_recovery_code_form'; +import UserRecoveryCodeFormWrapper from './user_recovery_code_form/user_recovery_code_form'; +import NewPasswordFormWrapper from './new_password_form/new_password_form'; + describe('Account Recovery Page', () => { let page; @@ -37,29 +38,29 @@ describe('Account Recovery Page', () => { }); it('renders admin recovery code form as default form', () => { - expect(page.find(AdminRecoveryCodeForm).length).toEqual(1); - expect(page.find(UserRecoveryCodeForm).length).toEqual(0); - expect(page.find(NewPasswordForm).length).toEqual(0); + expect(page.find(AdminRecoveryCodeFormWrapper).length).toEqual(1); + expect(page.find(UserRecoveryCodeFormWrapper).length).toEqual(0); + expect(page.find(NewPasswordFormWrapper).length).toEqual(0); }); it('renders user recovery code form when admin code submitted', () => { pageInstance.nextStep({ preventDefault: () => {} }); - expect(page.find(UserRecoveryCodeForm).length).toEqual(1); + expect(page.find(UserRecoveryCodeFormWrapper).length).toEqual(1); }); it('returns to admin code form on user code form back link', () => { pageInstance.nextStep({ preventDefault: () => {} }); pageInstance.previousStep(); - expect(page.find(AdminRecoveryCodeForm).length).toEqual(1); + expect(page.find(AdminRecoveryCodeFormWrapper).length).toEqual(1); }); it('renders new password form when user code submitted', () => { pageInstance.nextStep({ preventDefault: () => {} }); pageInstance.nextStep({ preventDefault: () => {} }); - expect(page.find(NewPasswordForm).length).toEqual(1); + expect(page.find(NewPasswordFormWrapper).length).toEqual(1); }); it('returns to user code form on new password form back link', () => { @@ -67,7 +68,7 @@ describe('Account Recovery Page', () => { pageInstance.nextStep({ preventDefault: () => {} }); pageInstance.previousStep(); - expect(page.find(UserRecoveryCodeForm).length).toEqual(1); + expect(page.find(UserRecoveryCodeFormWrapper).length).toEqual(1); }); }); }); diff --git a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js new file mode 100644 index 00000000..cfdcdc26 --- /dev/null +++ b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import InputField from 'src/common/input_field/input_field'; +import SubmitButton from 'src/common/submit_button/submit_button'; +import BackLink from 'src/common/back_link/back_link'; + +import './user_recovery_code_form.scss'; + +export const UserRecoveryCodeForm = ({ t, previous, next }) => ( +
+ {t('account-recovery.user-form.image-description')} +

{t('account-recovery.user-form.title')}

+
+ +

{t('account-recovery.user-form.description')}

+
+ + + + +); + +UserRecoveryCodeForm.propTypes = { + t: React.PropTypes.func.isRequired, + previous: React.PropTypes.func.isRequired, + next: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(UserRecoveryCodeForm); diff --git a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.scss b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.scss new file mode 100644 index 00000000..55f5621b --- /dev/null +++ b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.scss @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see . + */ + +.user-code-form-content { + display: flex; + flex-direction: column; + align-items: center; +} + +.user-code-image { + margin: 1em 0; + align-self: center; + height: 4em; +} + +@media only screen and (min-width : 500px) { + .user-code-form-content { + flex-direction: row; + width: 80%; + } + + .user-code-image { + margin-right: 1.6em; + } +} diff --git a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js new file mode 100644 index 00000000..cb6998c8 --- /dev/null +++ b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js @@ -0,0 +1,52 @@ +import { shallow } from 'enzyme'; +import expect from 'expect'; +import React from 'react'; +import { UserRecoveryCodeForm } from './user_recovery_code_form'; + +describe('UserRecoveryCodeForm', () => { + let userRecoveryCodeForm; + let mockNext; + let mockPrevious; + + beforeEach(() => { + const mockTranslations = key => key; + mockNext = expect.createSpy(); + mockPrevious = expect.createSpy(); + userRecoveryCodeForm = shallow( + + ); + }); + + it('renders title for user recovery code', () => { + expect(userRecoveryCodeForm.find('h1').text()).toEqual('account-recovery.user-form.title'); + }); + + it('renders description', () => { + expect(userRecoveryCodeForm.find('p').text()).toEqual('account-recovery.user-form.description'); + }); + + it('renders input for user code', () => { + expect(userRecoveryCodeForm.find('InputField').props().label).toEqual('account-recovery.user-form.input-label'); + }); + + it('renders submit button', () => { + expect(userRecoveryCodeForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.user-form.button'); + }); + + it('submits form to next step', () => { + userRecoveryCodeForm.find('form').simulate('submit'); + expect(mockNext).toHaveBeenCalled(); + }); + + it('returns to previous step on link click', () => { + userRecoveryCodeForm.find('BackLink').simulate('click'); + expect(mockPrevious).toHaveBeenCalled(); + }); + + it('returns to previous step on key down', () => { + userRecoveryCodeForm.find('BackLink').simulate('keyDown'); + expect(mockPrevious).toHaveBeenCalled(); + }); +}); -- cgit v1.2.3 From 648aeebe1be3d29a6fdf3199a8d86d92de676b5a Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 29 Mar 2017 10:49:34 -0300 Subject: [#932] Hides logout button on account recovery flow --- web-ui/src/account_recovery/page.spec.js | 4 ++-- web-ui/src/backup_account/page.js | 2 +- web-ui/src/backup_account/page.spec.js | 5 +++++ web-ui/src/common/header/header.js | 12 ++++++++++-- web-ui/src/common/header/header.spec.js | 13 +++++++++---- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/web-ui/src/account_recovery/page.spec.js b/web-ui/src/account_recovery/page.spec.js index fd4e7db6..68debba0 100644 --- a/web-ui/src/account_recovery/page.spec.js +++ b/web-ui/src/account_recovery/page.spec.js @@ -22,8 +22,8 @@ describe('Account Recovery Page', () => { expect(page.props().title).toEqual('account-recovery.page-title'); }); - it('renders header', () => { - expect(page.find(Header).length).toEqual(1); + it('renders header without logout button', () => { + expect(page.find(Header).props().renderLogout).toEqual(false); }); it('renders footer', () => { diff --git a/web-ui/src/backup_account/page.js b/web-ui/src/backup_account/page.js index be3bae36..e7663205 100644 --- a/web-ui/src/backup_account/page.js +++ b/web-ui/src/backup_account/page.js @@ -56,7 +56,7 @@ export class Page extends React.Component { return (
-
+
{this.mainContent()}
diff --git a/web-ui/src/backup_account/page.spec.js b/web-ui/src/backup_account/page.spec.js index 2933a64e..8c014ee4 100644 --- a/web-ui/src/backup_account/page.spec.js +++ b/web-ui/src/backup_account/page.spec.js @@ -5,6 +5,7 @@ import { Page } from 'src/backup_account/page'; import BackupEmail from 'src/backup_account/backup_email/backup_email'; import Confirmation from 'src/backup_account/confirmation/confirmation'; import SnackbarNotification from 'src/common/snackbar_notification/snackbar_notification'; +import Header from 'src/common/header/header'; describe('BackupAccount', () => { let page; @@ -18,6 +19,10 @@ describe('BackupAccount', () => { expect(page.props().title).toEqual('backup-account.page-title'); }); + it('renders header with logout button', () => { + expect(page.find(Header).props().renderLogout).toEqual(true); + }); + describe('save backup email', () => { let pageInstance; diff --git a/web-ui/src/common/header/header.js b/web-ui/src/common/header/header.js index 715d54c6..3ad924c0 100644 --- a/web-ui/src/common/header/header.js +++ b/web-ui/src/common/header/header.js @@ -19,7 +19,7 @@ import React from 'react'; import Logout from 'src/common/logout/logout'; import './header.scss'; -export const Header = () => ( +export const Header = ({ renderLogout }) => (
); +Header.propTypes = { + renderLogout: React.PropTypes.bool +}; + +Header.defaultProps = { + renderLogout: false +}; + export default Header; diff --git a/web-ui/src/common/header/header.spec.js b/web-ui/src/common/header/header.spec.js index 81a952c7..0c11713b 100644 --- a/web-ui/src/common/header/header.spec.js +++ b/web-ui/src/common/header/header.spec.js @@ -11,11 +11,16 @@ describe('Header', () => { header = shallow(
); }); - it('renders the header containing the logout button', () => { - expect(header.find('header').find(Logout)).toExist(); - }); - it('renders the header pixelated logo', () => { expect(header.find('header').find('img').props().alt).toEqual('Pixelated'); }); + + it('renders the header containing the logout button when renderLogout is true', () => { + header = shallow(
); + expect(header.find('header').find(Logout).length).toEqual(1); + }); + + it('hides logout button when renderLogout is false', () => { + expect(header.find('header').find(Logout).length).toEqual(0); + }); }); -- cgit v1.2.3 From c5c858f92b30862d0b8977b7559e437cdd073d7f Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 29 Mar 2017 14:37:41 -0300 Subject: [#932] Makes account recovery resource public --- service/pixelated/resources/account_recovery_resource.py | 5 +++-- service/pixelated/resources/login_resource.py | 3 +++ service/pixelated/resources/root_resource.py | 2 +- service/test/unit/resources/test_login_resource.py | 10 ++++++++++ web-ui/config/public-assets-webpack.js | 1 + web-ui/src/account_recovery/account_recovery.html | 2 +- web-ui/webpack.config.js | 4 ++-- web-ui/webpack.production.config.js | 4 ++-- 8 files changed, 23 insertions(+), 8 deletions(-) diff --git a/service/pixelated/resources/account_recovery_resource.py b/service/pixelated/resources/account_recovery_resource.py index ccfdc580..8cb10fc8 100644 --- a/service/pixelated/resources/account_recovery_resource.py +++ b/service/pixelated/resources/account_recovery_resource.py @@ -18,19 +18,20 @@ import os from pixelated.resources import BaseResource from twisted.python.filepath import FilePath -from pixelated.resources import get_protected_static_folder +from pixelated.resources import get_public_static_folder from twisted.web.http import OK from twisted.web.template import Element, XMLFile, renderElement class AccountRecoveryPage(Element): - loader = XMLFile(FilePath(os.path.join(get_protected_static_folder(), 'account_recovery.html'))) + loader = XMLFile(FilePath(os.path.join(get_public_static_folder(), 'account_recovery.html'))) def __init__(self): super(AccountRecoveryPage, self).__init__() class AccountRecoveryResource(BaseResource): + BASE_URL = 'account-recovery' isLeaf = True def __init__(self, services_factory): diff --git a/service/pixelated/resources/login_resource.py b/service/pixelated/resources/login_resource.py index 3e1200d7..45942ea6 100644 --- a/service/pixelated/resources/login_resource.py +++ b/service/pixelated/resources/login_resource.py @@ -20,6 +20,7 @@ from xml.sax import SAXParseException from pixelated.authentication import Authenticator from pixelated.config.leap import BootstrapUserServices from pixelated.resources import BaseResource, UnAuthorizedResource, IPixelatedSession +from pixelated.resources.account_recovery_resource import AccountRecoveryResource from pixelated.resources import get_public_static_folder, respond_json from twisted.cred.error import UnauthorizedLogin from twisted.internet import defer @@ -101,6 +102,8 @@ class LoginResource(BaseResource): return self if path == 'status': return LoginStatusResource(self._services_factory) + if path == AccountRecoveryResource.BASE_URL: + return AccountRecoveryResource(self._services_factory) if not self.is_logged_in(request): return UnAuthorizedResource() return NoResource() diff --git a/service/pixelated/resources/root_resource.py b/service/pixelated/resources/root_resource.py index 02f2fb62..d860c422 100644 --- a/service/pixelated/resources/root_resource.py +++ b/service/pixelated/resources/root_resource.py @@ -92,7 +92,7 @@ class RootResource(BaseResource): def initialize(self, provider=None, disclaimer_banner=None, authenticator=None): self._child_resources.add('assets', File(self._protected_static_folder)) - self._child_resources.add('account-recovery', AccountRecoveryResource(self._services_factory)) + self._child_resources.add(AccountRecoveryResource.BASE_URL, AccountRecoveryResource(self._services_factory)) self._child_resources.add('backup-account', BackupAccountResource(self._services_factory, authenticator)) self._child_resources.add('sandbox', SandboxResource(self._protected_static_folder)) self._child_resources.add('keys', KeysResource(self._services_factory)) diff --git a/service/test/unit/resources/test_login_resource.py b/service/test/unit/resources/test_login_resource.py index 9f940bc6..eaaba1d4 100644 --- a/service/test/unit/resources/test_login_resource.py +++ b/service/test/unit/resources/test_login_resource.py @@ -67,6 +67,16 @@ class TestLoginResource(unittest.TestCase): d.addCallback(assert_unauthorized_resources) return d + def test_account_recovery_resource_does_not_require_login(self): + request = DummyRequest(['account-recovery']) + d = self.web.get(request) + + def assert_successful(_): + self.assertEqual(200, request.responseCode) + + d.addCallback(assert_successful) + return d + @patch('pixelated.resources.session.PixelatedSession.is_logged_in') def test_there_are_no_grand_children_resources_when_logged_in(self, mock_is_logged_in): request = DummyRequest(['/login/grand_children']) diff --git a/web-ui/config/public-assets-webpack.js b/web-ui/config/public-assets-webpack.js index 28dff566..13364e2c 100644 --- a/web-ui/config/public-assets-webpack.js +++ b/web-ui/config/public-assets-webpack.js @@ -3,6 +3,7 @@ var CopyWebpackPlugin = require('copy-webpack-plugin'); module.exports = new CopyWebpackPlugin([ { context: 'src/login/', from: '*.html' }, { context: 'src/login/', from: '*.css' }, + { context: 'src/account_recovery/', from: 'account_recovery.html' }, { context: 'src/interstitial/', from: '*' }, { context: 'app/', from: 'fonts/*' }, { context: 'app/', from: 'locales/**/*' }, diff --git a/web-ui/src/account_recovery/account_recovery.html b/web-ui/src/account_recovery/account_recovery.html index f4601239..35054455 100644 --- a/web-ui/src/account_recovery/account_recovery.html +++ b/web-ui/src/account_recovery/account_recovery.html @@ -9,6 +9,6 @@
- + diff --git a/web-ui/webpack.config.js b/web-ui/webpack.config.js index 0470b508..e82cf88b 100644 --- a/web-ui/webpack.config.js +++ b/web-ui/webpack.config.js @@ -21,11 +21,12 @@ var commonConfiguration = { var publicAssets = Object.assign({}, commonConfiguration, { entry: { 'login': './src/login/login.js', + 'account_recovery': './src/account_recovery/account_recovery.js' }, output: { path: path.join(__dirname, 'dist/public'), filename: '[name].js', - publicPath: '/assets/' + publicPath: '/public/' }, plugins: [ publicAssetsWebpack, @@ -39,7 +40,6 @@ var publicAssets = Object.assign({}, commonConfiguration, { var protectedAssets = Object.assign({}, commonConfiguration, { entry: { 'app': './app/js/index.js', - 'account_recovery': './src/account_recovery/account_recovery.js', 'backup_account': './src/backup_account/backup_account.js', 'sandbox': './app/js/sandbox.js' }, diff --git a/web-ui/webpack.production.config.js b/web-ui/webpack.production.config.js index 23be0565..c731526a 100644 --- a/web-ui/webpack.production.config.js +++ b/web-ui/webpack.production.config.js @@ -31,11 +31,12 @@ var commonPlugins = [ var publicAssets = Object.assign({}, commonConfiguration, { entry: { 'login': './src/login/login.js', + 'account_recovery': './src/account_recovery/account_recovery.js' }, output: { path: path.join(__dirname, 'dist/public'), filename: '[name].js', - publicPath: '/assets/' + publicPath: '/public/' }, plugins: commonPlugins.concat([ publicAssetsWebpack ]) }); @@ -43,7 +44,6 @@ var publicAssets = Object.assign({}, commonConfiguration, { var protectedAssets = Object.assign({}, commonConfiguration, { entry: { 'app': './app/js/index.js', - 'account_recovery': './src/account_recovery/account_recovery.js', 'backup_account': './src/backup_account/backup_account.js', 'sandbox': './app/js/sandbox.js' }, -- cgit v1.2.3 From 26cb72e514a51d571e13dfd74e99f6b2499efe22 Mon Sep 17 00:00:00 2001 From: Anike Arni Date: Wed, 29 Mar 2017 17:09:54 -0300 Subject: [#932] Fixes image description --- web-ui/src/account_recovery/new_password_form/new_password_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.js b/web-ui/src/account_recovery/new_password_form/new_password_form.js index 8fbfb99d..3c32df07 100644 --- a/web-ui/src/account_recovery/new_password_form/new_password_form.js +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.js @@ -29,7 +29,7 @@ export const NewPasswordForm = ({ t, previous }) => ( {t('account-recovery.new-password.image-description')}

{t('account-recovery.new-password-form.title')}

Date: Wed, 29 Mar 2017 17:10:19 -0300 Subject: [#932] Makes back link a button --- .../new_password_form/new_password_form.js | 6 +--- .../new_password_form/new_password_form.spec.js | 5 --- .../user_recovery_code_form.js | 6 +--- .../user_recovery_code_form.spec.js | 5 --- .../backup_account/confirmation/confirmation.js | 11 +++---- .../confirmation/confirmation.spec.js | 4 +-- web-ui/src/common/back_link/back_link.js | 15 ++++++--- web-ui/src/common/back_link/back_link.scss | 4 +++ web-ui/src/common/back_link/back_link.spec.js | 37 +++++++++++++++++----- 9 files changed, 53 insertions(+), 40 deletions(-) diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.js b/web-ui/src/account_recovery/new_password_form/new_password_form.js index 3c32df07..94e08997 100644 --- a/web-ui/src/account_recovery/new_password_form/new_password_form.js +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.js @@ -41,11 +41,7 @@ export const NewPasswordForm = ({ t, previous }) => ( label={t('account-recovery.new-password-form.input-label2')} /> - + ); diff --git a/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js b/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js index 2d326aea..ace238be 100644 --- a/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js +++ b/web-ui/src/account_recovery/new_password_form/new_password_form.spec.js @@ -37,9 +37,4 @@ describe('NewPasswordForm', () => { newPasswordForm.find('BackLink').simulate('click'); expect(mockPrevious).toHaveBeenCalled(); }); - - it('returns to previous step on key down', () => { - newPasswordForm.find('BackLink').simulate('keyDown'); - expect(mockPrevious).toHaveBeenCalled(); - }); }); diff --git a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js index cfdcdc26..0df40a6e 100644 --- a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js +++ b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.js @@ -42,11 +42,7 @@ export const UserRecoveryCodeForm = ({ t, previous, next }) => (
- + ); diff --git a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js index cb6998c8..6ecb22e4 100644 --- a/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js +++ b/web-ui/src/account_recovery/user_recovery_code_form/user_recovery_code_form.spec.js @@ -44,9 +44,4 @@ describe('UserRecoveryCodeForm', () => { userRecoveryCodeForm.find('BackLink').simulate('click'); expect(mockPrevious).toHaveBeenCalled(); }); - - it('returns to previous step on key down', () => { - userRecoveryCodeForm.find('BackLink').simulate('keyDown'); - expect(mockPrevious).toHaveBeenCalled(); - }); }); diff --git a/web-ui/src/backup_account/confirmation/confirmation.js b/web-ui/src/backup_account/confirmation/confirmation.js index 41637dab..49b0d19c 100644 --- a/web-ui/src/backup_account/confirmation/confirmation.js +++ b/web-ui/src/backup_account/confirmation/confirmation.js @@ -18,6 +18,7 @@ import React from 'react'; import { translate } from 'react-i18next'; import SubmitButton from 'src/common/submit_button/submit_button'; +import BackLink from 'src/common/back_link/back_link'; import './confirmation.scss'; @@ -29,12 +30,10 @@ export const Confirmation = ({ t }) => (
-