diff options
author | Anike Arni <anikarni@gmail.com> | 2017-02-23 11:21:39 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-23 11:21:39 -0300 |
commit | b06face47a2e19cc1afcda3f0e298d19f7dcb6bb (patch) | |
tree | 1e28b3200f329f4ddbe85c399e26b05d192ea354 /web-ui/src | |
parent | 92c6a9dbc39318df48b4b3d5fae1a3888f201343 (diff) | |
parent | 55cae8e71afec52e31401c512b8bebbb1e5ca88d (diff) |
Merge pull request #987 from pixelated/login-errors
Adds welcome and error messages to login
Diffstat (limited to 'web-ui/src')
-rw-r--r-- | web-ui/src/interstitial/interstitial.js | 4 | ||||
-rw-r--r-- | web-ui/src/login/about/pixelated-welcome.scss | 49 | ||||
-rw-r--r-- | web-ui/src/login/about/pixelated_welcome.js | 36 | ||||
-rw-r--r-- | web-ui/src/login/app.js | 26 | ||||
-rw-r--r-- | web-ui/src/login/app.scss | 51 | ||||
-rw-r--r-- | web-ui/src/login/error/auth-error.scss | 29 | ||||
-rw-r--r-- | web-ui/src/login/error/auth_error.js | 31 | ||||
-rw-r--r-- | web-ui/src/login/error/generic-error.scss | 59 | ||||
-rw-r--r-- | web-ui/src/login/error/generic_error.js | 37 | ||||
-rw-r--r-- | web-ui/src/login/login.css | 17 | ||||
-rw-r--r-- | web-ui/src/login/login.js | 2 | ||||
-rw-r--r-- | web-ui/src/util.js | 7 |
12 files changed, 324 insertions, 24 deletions
diff --git a/web-ui/src/interstitial/interstitial.js b/web-ui/src/interstitial/interstitial.js index 78a17190..c9a29c21 100644 --- a/web-ui/src/interstitial/interstitial.js +++ b/web-ui/src/interstitial/interstitial.js @@ -44,8 +44,10 @@ $(function () { method: 'GET', url: '/status' }).success(function (data) { - if (data.status === 'completed' || data.status === 'error') { + if (data.status === 'completed') { window.location="/"; + } else if (data.status === 'error') { + window.location="/login?error"; } }); }, 2000); diff --git a/web-ui/src/login/about/pixelated-welcome.scss b/web-ui/src/login/about/pixelated-welcome.scss new file mode 100644 index 00000000..17d05f13 --- /dev/null +++ b/web-ui/src/login/about/pixelated-welcome.scss @@ -0,0 +1,49 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +@import "~scss/base/colors"; + +.pixelated-welcome { + display: none; +} + +@media only screen and (min-width : 960px) { + .pixelated-welcome { + font-size: 0.9em; + color: $medium_grey; + display: flex; + font-weight: 300; + flex-direction: column; + align-self: flex-end; + order: 2; + width: 34%; + margin-right: 8%; + margin-top: -20.5em; + + h3 { + font-weight: normal; + font-size: 1.2em; + margin-top: 0; + } + } + + .welcome-logo { + order: 1; + width: 90%; + height: 15em; + } +} diff --git a/web-ui/src/login/about/pixelated_welcome.js b/web-ui/src/login/about/pixelated_welcome.js new file mode 100644 index 00000000..82a7d7d0 --- /dev/null +++ b/web-ui/src/login/about/pixelated_welcome.js @@ -0,0 +1,36 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import './pixelated-welcome.scss'; + +export const PixelatedWelcome = ({ t }) => ( + <div className='pixelated-welcome'> + <img className='welcome-logo' src='/public/images/welcome.svg' alt={t('login.welcome-image-alt')} /> + <div> + <h3>{t('login.welcome-message')}</h3> + </div> + </div> +); + +PixelatedWelcome.propTypes = { + t: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(PixelatedWelcome); diff --git a/web-ui/src/login/app.js b/web-ui/src/login/app.js index 07099c60..3259f7b5 100644 --- a/web-ui/src/login/app.js +++ b/web-ui/src/login/app.js @@ -19,19 +19,32 @@ 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 AuthError from 'src/login/error/auth_error'; +import GenericError from 'src/login/error/generic_error'; +import PixelatedWelcome from 'src/login/about/pixelated_welcome'; import './app.scss'; const errorMessage = (t, authError) => { - if (authError) return <p className='error'>{t('error.auth')}</p>; + if (authError) return <AuthError />; return <div />; }; -export const App = ({ t, authError }) => ( +const rightPanel = (t, error) => { + if (error) return <GenericError />; + return <PixelatedWelcome />; +}; + +export const App = ({ t, authError, error }) => ( <div className='login'> - <img className='logo' src='/public/images/logo-orange.svg' alt='Pixelated logo' /> - {errorMessage(t, authError)} - <form className='standard' id='login_form' action='/login' method='post'> + <img + className={error ? 'logo small-logo' : 'logo'} + src='/public/images/logo-orange.svg' + alt='Pixelated logo' + /> + {rightPanel(t, error)} + <form className='standard' id='login_form' action='/login' method='post' noValidate > + {errorMessage(t, authError)} <InputField name='username' label={t('login.email')} /> <InputField type='password' name='password' label={t('login.password')} /> <SubmitButton buttonText={t('login.submit')} /> @@ -41,7 +54,8 @@ export const App = ({ t, authError }) => ( App.propTypes = { t: React.PropTypes.func.isRequired, - authError: React.PropTypes.bool + authError: React.PropTypes.bool, + error: React.PropTypes.bool }; export default translate('', { wait: true })(App); diff --git a/web-ui/src/login/app.scss b/web-ui/src/login/app.scss index f6e6bc11..32e3b979 100644 --- a/web-ui/src/login/app.scss +++ b/web-ui/src/login/app.scss @@ -17,11 +17,6 @@ @import "~scss/base/colors"; -.error { - color: $error; - margin: 10px 0 0 0; -} - .login { display: block; width: 90%; @@ -37,11 +32,14 @@ } #login_form { - padding: 20px 0; width: 70%; + display: flex; + align-items: center; + flex-direction: column; .input-field-group { width: 100%; + margin: 0 0 1.5em 0; } .submit-button { @@ -51,10 +49,16 @@ .logo { width: 70%; + margin-bottom: 2em; +} + +.small-logo { + width: 50%; + margin-bottom: 1em; } @media only screen and (min-width : 500px) { - #login_form .input-field-group { + #login_form { margin-top: 1em; } @@ -64,7 +68,38 @@ } @media only screen and (min-width : 960px) { + .content { + font-size: 0.9em; + } + .login { - width: 40%; + display: flex; + align-items: flex-start; + width: 70%; + max-width: 700px; + padding: 2.5em 0; + height: 22em; + + &:after { + content: ''; + height: 22em; + position: absolute; + margin-top: inherit; + top: 2.5em; + left: 50%; + border: 1px solid $lighter_gray; + transform: scaleX(0.5); + } + } + + .logo { + height: 6em; + margin-bottom: 1em; + margin-top: 1.5em; + } + + .logo, #login_form { + width: 34%; + margin-left: 8%; } } diff --git a/web-ui/src/login/error/auth-error.scss b/web-ui/src/login/error/auth-error.scss new file mode 100644 index 00000000..f6256be4 --- /dev/null +++ b/web-ui/src/login/error/auth-error.scss @@ -0,0 +1,29 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +@import "~scss/base/colors"; + +.auth-error { + color: $error; + margin: -1em 0 1em 0; +} + +@media only screen and (min-width : 960px) { + .auth-error { + margin: -2em 0 1em 0; + } +} diff --git a/web-ui/src/login/error/auth_error.js b/web-ui/src/login/error/auth_error.js new file mode 100644 index 00000000..ceeaf42b --- /dev/null +++ b/web-ui/src/login/error/auth_error.js @@ -0,0 +1,31 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import './auth-error.scss'; + +export const AuthError = ({ t }) => ( + <p className='auth-error'>{t('error.auth')}</p> +); + +AuthError.propTypes = { + t: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(AuthError); diff --git a/web-ui/src/login/error/generic-error.scss b/web-ui/src/login/error/generic-error.scss new file mode 100644 index 00000000..5a077f32 --- /dev/null +++ b/web-ui/src/login/error/generic-error.scss @@ -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 <http://www.gnu.org/licenses/>. + */ + +@import "~scss/base/colors"; + +.generic-error { + font-size: 0.9em; + color: $medium_grey; + display: flex; + padding: 0 1.5em; + font-weight: 300; + + h2 { + font-weight: normal; + font-size: 1.4em; + } +} + +.dead-mail { + width: 20%; + margin-right: 1.5em; + margin-top: 1.7em; + align-self: flex-start; +} + +@media only screen and (min-width : 960px) { + .generic-error { + flex-direction: column; + align-self: flex-end; + order: 2; + width: 34%; + margin-right: 8%; + margin-top: -19.5em; + padding: 0; + + h2 { + margin: 0; + } + } + + .dead-mail { + order: 1; + width: 30%; + } +} diff --git a/web-ui/src/login/error/generic_error.js b/web-ui/src/login/error/generic_error.js new file mode 100644 index 00000000..023e1bcf --- /dev/null +++ b/web-ui/src/login/error/generic_error.js @@ -0,0 +1,37 @@ +/* + * 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 <http://www.gnu.org/licenses/>. + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import './generic-error.scss'; + +export const GenericError = ({ t }) => ( + <div className='generic-error'> + <img className='dead-mail' src='/public/images/dead-mail.svg' alt='' /> + <div> + <h2>{t('error.login.title')}</h2> + <p>{t('error.login.message')}</p> + </div> + </div> +); + +GenericError.propTypes = { + t: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(GenericError); diff --git a/web-ui/src/login/login.css b/web-ui/src/login/login.css index d1206a39..5116875e 100644 --- a/web-ui/src/login/login.css +++ b/web-ui/src/login/login.css @@ -46,17 +46,24 @@ body { } @media only screen and (min-width : 500px) { - body { - font-size: 1.2em; - } - .disclaimer { width: 60%; } } @media only screen and (min-width : 960px) { + body { + font-size: 1.2em; + } + .disclaimer { - width: 40%; + width: 70%; + max-width: 700px; + padding: 0; + font-size: 1em; + } + + .disclaimer-content { + font-size: 0.7em; } } diff --git a/web-ui/src/login/login.js b/web-ui/src/login/login.js index 74e5a14e..b1d895ae 100644 --- a/web-ui/src/login/login.js +++ b/web-ui/src/login/login.js @@ -28,7 +28,7 @@ if (process.env.NODE_ENV === 'development') a11y(React); render( <I18nextProvider i18n={i18n}> - <AppWrapper authError={hasQueryParameter('auth-error')} /> + <AppWrapper authError={hasQueryParameter('auth-error')} error={hasQueryParameter('error')} /> </I18nextProvider>, document.getElementById('root') ); diff --git a/web-ui/src/util.js b/web-ui/src/util.js index 1b244458..effb3d9c 100644 --- a/web-ui/src/util.js +++ b/web-ui/src/util.js @@ -1,6 +1,7 @@ -export const hasQueryParameter = param => ( - decodeURIComponent(window.location.search.substring(1)).includes(param) -); +export const hasQueryParameter = (param) => { + const decodedUri = decodeURIComponent(window.location.search.substring(1)); + return !(decodedUri.split('&').indexOf(param) < 0); +}; export default { hasQueryParameter |