From e4d9d03f557e0c238d9c38507d0586b5dcf0de56 Mon Sep 17 00:00:00 2001 From: James Allen Date: Fri, 11 Jul 2014 17:08:19 +0100 Subject: [PATCH] Improve feedback on login/register forms --- .../AuthenticationController.coffee | 10 +++------- services/web/app/views/user/login.jade | 8 +++++--- services/web/app/views/user/register.jade | 15 ++++++++------- .../web/public/coffee/directives/asyncForm.coffee | 11 ++++++++--- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee b/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee index ebaaec8d7e..6de2ce7110 100644 --- a/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee +++ b/services/web/app/coffee/Features/Authentication/AuthenticationController.coffee @@ -16,9 +16,9 @@ module.exports = AuthenticationController = if !isAllowed logger.log email:email, "too many login requests" res.statusCode = 429 - return res.send + return res.send message: - text: 'This account has had too many login requests,
please wait 2 minutes before trying to log in again', + text: 'This account has had too many login requests. Please wait 2 minutes before trying to log in again', type: 'error' AuthenticationManager.authenticate email: email, password, (error, user) -> return next(error) if error? @@ -100,7 +100,7 @@ module.exports = AuthenticationController = callback() _establishUserSession: (req, user, callback = (error) ->) -> - lightUser = + lightUser = _id: user._id first_name: user.first_name last_name: user.last_name @@ -110,7 +110,3 @@ module.exports = AuthenticationController = req.session.user = lightUser req.session.justLoggedIn = true req.session.save callback - - - - diff --git a/services/web/app/views/user/login.jade b/services/web/app/views/user/login.jade index cc3d3b099b..c0b8827d89 100644 --- a/services/web/app/views/user/login.jade +++ b/services/web/app/views/user/login.jade @@ -35,7 +35,9 @@ block content | Required .actions button.btn-primary.btn( - type='submit' - ng-disabled="loginForm.$invalid" - ) Login + type='submit', + ng-disabled="loginForm.inflight" + ) + span(ng-show="!loginForm.inflight") Login + span(ng-show="loginForm.inflight") Logging in... a.pull-right(href='/user/password/reset') Forgot your password? diff --git a/services/web/app/views/user/register.jade b/services/web/app/views/user/register.jade index ed180047f3..da6f5064a7 100644 --- a/services/web/app/views/user/register.jade +++ b/services/web/app/views/user/register.jade @@ -10,7 +10,7 @@ block content div Join ShareLaTeX to view this project else if newTemplateData.templateName !== undefined h1 Please register to edit the '#{newTemplateData.templateName}' template - div Already have a ShareLaTeX account? + div Already have a ShareLaTeX account? a(href="/login") Login here .row @@ -18,12 +18,12 @@ block content .card .page-header h1 Register - form(async-form="register", name="registerForm", action="/register", novalidate, ng-cloak) + form(async-form="register", name="registerForm", action="/register", ng-cloak) input(name='_csrf', type='hidden', value=csrfToken) input(name='redir', type='hidden', value=redir) form-messages(for="registerForm") .form-group - label(for='email') Email + label(for='email') Email input.form-control( type='email', name='email', @@ -36,7 +36,7 @@ block content span.small.text-primary(ng-show="registerForm.email.$invalid && registerForm.email.$dirty") | Must be an email address .form-group - label(for='password') Password + label(for='password') Password input.form-control( type='password', name='password', @@ -49,6 +49,7 @@ block content .actions button.btn-primary.btn( type='submit' - ng-disabled="register.$invalid" - ) Register - + ng-disabled="registerForm.inflight" + ) + span(ng-show="!registerForm.inflight") Register + span(ng-show="registerForm.inflight") Registering... diff --git a/services/web/public/coffee/directives/asyncForm.coffee b/services/web/public/coffee/directives/asyncForm.coffee index 72702cf347..f38dc40e6e 100644 --- a/services/web/public/coffee/directives/asyncForm.coffee +++ b/services/web/public/coffee/directives/asyncForm.coffee @@ -7,6 +7,7 @@ define [ formName = attrs.asyncForm scope[attrs.name].response = response = {} + scope[attrs.name].inflight = false element.on "submit", (e) -> e.preventDefault() @@ -15,9 +16,12 @@ define [ for data in element.serializeArray() formData[data.name] = data.value + scope[attrs.name].inflight = true + $http .post(element.attr('action'), formData) .success (data, status, headers, config) -> + scope[attrs.name].inflight = false response.success = true response.error = false @@ -33,12 +37,13 @@ define [ ga('send', 'event', formName, 'failure', data.message) else ga('send', 'event', formName, 'success') - + .error (data, status, headers, config) -> + scope[attrs.name].inflight = false response.success = false response.error = true response.message = - text: data.message or "Something went wrong talking to the server :(. Please try again." + text: data.message?.text or "Something went wrong talking to the server :(. Please try again." type: 'error' ga('send', 'event', formName, 'failure', data.message) } @@ -60,4 +65,4 @@ define [ form: "=for" } - } \ No newline at end of file + }