diff --git a/services/web/app/coffee/Features/User/UserController.coffee b/services/web/app/coffee/Features/User/UserController.coffee index c820c85fb5..89e6f77a4b 100644 --- a/services/web/app/coffee/Features/User/UserController.coffee +++ b/services/web/app/coffee/Features/User/UserController.coffee @@ -37,6 +37,10 @@ module.exports = user.first_name = req.body.first_name.trim() if req.body.last_name? user.last_name = req.body.last_name.trim() + if req.body.role? + user.role = req.body.role.trim() + if req.body.institution? + user.institution = req.body.institution.trim() if req.body.mode? user.ace.mode = req.body.mode if req.body.theme? diff --git a/services/web/app/coffee/Features/User/UserInfoController.coffee b/services/web/app/coffee/Features/User/UserInfoController.coffee index d3107b4c92..65cbd34bad 100644 --- a/services/web/app/coffee/Features/User/UserInfoController.coffee +++ b/services/web/app/coffee/Features/User/UserInfoController.coffee @@ -28,21 +28,6 @@ module.exports = UserController = UserController.sendFormattedPersonalInfo(user, res, next) req.session.destroy() - updatePersonalInfo: (req, res, next = (error)->) -> - {first_name, last_name, role, institution} = req.body - user_id = req.session.user._id - logger.log data:req.body, user_id:user_id, "getting update for user personal info" - update = - first_name:sanitize.escape(first_name) - last_name:sanitize.escape(last_name) - role:sanitize.escape(role) - institution:sanitize.escape(institution) - UserUpdater.updatePersonalInfo user_id, update, (err)-> - if err? - res.send 500 - else - res.send 204 - sendFormattedPersonalInfo: (user, res, next = (error) ->) -> UserController._formatPersonalInfo user, (error, info) -> return next(error) if error? diff --git a/services/web/app/coffee/Features/User/UserUpdater.coffee b/services/web/app/coffee/Features/User/UserUpdater.coffee index 9d7241e01a..86ea60240d 100644 --- a/services/web/app/coffee/Features/User/UserUpdater.coffee +++ b/services/web/app/coffee/Features/User/UserUpdater.coffee @@ -28,14 +28,3 @@ module.exports = UserUpdater = return callback(err) callback() - - updatePersonalInfo: (user_id, info, callback)-> - self = @ - update = - $set: - "first_name": info.first_name || "" - "last_name": info.last_name || "" - "role": info.role || "" - "institution": info.institution || "" - self.updateUser user_id.toString(), update, (err)-> - callback(err) \ No newline at end of file diff --git a/services/web/app/coffee/router.coffee b/services/web/app/coffee/router.coffee index a6d248224c..253aa393f3 100644 --- a/services/web/app/coffee/router.coffee +++ b/services/web/app/coffee/router.coffee @@ -91,7 +91,6 @@ module.exports = class Router app.get '/user/auth_token', AuthenticationController.requireLogin(), AuthenticationController.getAuthToken app.get '/user/personal_info', AuthenticationController.requireLogin(allow_auth_token: true), UserInfoController.getLoggedInUsersPersonalInfo - app.post '/user/personal_info', AuthenticationController.requireLogin(), UserInfoController.updatePersonalInfo app.get '/user/:user_id/personal_info', httpAuth, UserInfoController.getPersonalInfo app.get '/project', AuthenticationController.requireLogin(), ProjectController.projectListPage diff --git a/services/web/app/views/project/list.jade b/services/web/app/views/project/list.jade index 63d7a2440c..2a9646b3cc 100644 --- a/services/web/app/views/project/list.jade +++ b/services/web/app/views/project/list.jade @@ -101,7 +101,7 @@ block content | complete .progress - .bar.bar-success(ng-style="{'width' : (percentComplete+'%')}") + .progress-bar.progress-bar-info(ng-style="{'width' : (percentComplete+'%')}") button#completeUserProfileInformation.btn.btn-primary( ng-hide="formVisable", diff --git a/services/web/app/views/user/login.jade b/services/web/app/views/user/login.jade index 078d51164f..2336f38f5f 100644 --- a/services/web/app/views/user/login.jade +++ b/services/web/app/views/user/login.jade @@ -11,7 +11,7 @@ block content form(async-form="login", name="loginForm", action='/login', ng-cloak) input(name='_csrf', type='hidden', value=csrfToken) input(name='redir', type='hidden', value=redir) - form-messages + form-messages(for="loginForm") .form-group input.form-control( type='email', diff --git a/services/web/app/views/user/passwordReset.jade b/services/web/app/views/user/passwordReset.jade index 8ae564b389..88e9131d52 100644 --- a/services/web/app/views/user/passwordReset.jade +++ b/services/web/app/views/user/passwordReset.jade @@ -16,8 +16,8 @@ block content ng-cloak ) input(type="hidden", name="_csrf", value=csrfToken) - form-messages - .alert.alert-success(ng-show="success") + form-messages(for="passwordResetForm") + .alert.alert-success(ng-show="passwordResetForm.response.success") | You have been sent an email to complete your password reset. .form-group label(for='email') Please enter your email address diff --git a/services/web/app/views/user/register.jade b/services/web/app/views/user/register.jade index e7140252e0..878deb5a39 100644 --- a/services/web/app/views/user/register.jade +++ b/services/web/app/views/user/register.jade @@ -21,16 +21,16 @@ block content form(async-form="register", name="registerForm", action="/register", novalidate, ng-cloak) input(name='_csrf', type='hidden', value=csrfToken) input(name='redir', type='hidden', value=redir) - form-messages + form-messages(for="registerForm") .form-group label(for='email') Email input.form-control( type='email', name='email', - value='#{new_email}', placeholder="email@example.com" required, - ng-model="email" + ng-model="email", + ng-init="email = #{JSON.stringify(new_email)}" ) span.small.text-primary(ng-show="registerForm.email.$invalid && registerForm.email.$dirty") | Must be an email address diff --git a/services/web/app/views/user/setPassword.jade b/services/web/app/views/user/setPassword.jade index 7b99fa990e..1aa2c2a76b 100644 --- a/services/web/app/views/user/setPassword.jade +++ b/services/web/app/views/user/setPassword.jade @@ -15,8 +15,8 @@ block content ng-cloak ) input(type="hidden", name="_csrf", value=csrfToken) - form-messages - .alert.alert-success(ng-show="success") + form-messages(for="passwordResetForm") + .alert.alert-success(ng-show="passwordResetForm.response.success") | Your password has been reset. a(href='/login') Login here diff --git a/services/web/app/views/user/settings.jade b/services/web/app/views/user/settings.jade index 0fbdd3a9fa..ddb4a4cc7a 100644 --- a/services/web/app/views/user/settings.jade +++ b/services/web/app/views/user/settings.jade @@ -5,43 +5,93 @@ block content .container .row .col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2 - .card + .card.account-settings .page-header h1 Account Settings - .messageArea + form-messages(ng-cloak, for="settingsForm") + .alert.alert-success(ng-show="settingsForm.response.success") + | Thanks, your settings have been updated. + form-messages(ng-cloak, for="changePasswordForm") .container-fluid - .row + .row(ng-cloak) .col-md-5 h3 Update Account Info - form#userSettings + form(async-form="settings", name="settingsForm", action="/user/settings", novalidate) input(type="hidden", name="_csrf", value=csrfToken) .form-group label(for='email') Email - input#emailAddress.form-control(type='email', name='email', value=user.email) + input.form-control( + type='email', + name='email', + placeholder="email@example.com" + required, + ng-model="email", + ng-init="email = #{JSON.stringify(user.email)}" + ) + span.small.text-primary(ng-show="settingsForm.email.$invalid && settingsForm.email.$dirty") + | Must be an email address .form-group label(for='firstName').control-label First Name - input#firstName.form-control(type='text', name='first_name', value=user.first_name) + input.form-control( + type='text', + name='first_name', + value=user.first_name + ) .form-group label(for='lastName').control-label Last Name - input#lastName.form-control(type='text', name='last_name', value=user.last_name) + input.form-control( + type='text', + name='last_name', + value=user.last_name + ) .actions - button.btn.btn-primary(type='submit') Update + button.btn.btn-primary( + type='submit', + ng-disabled="settingsForm.$invalid" + ) Update .col-md-5.col-md-offset-1 h3 Change Password - form#changePasswordForm(method="post", action="/user/password/update") + form(async-form="changepassword", name="changePasswordForm", action="/user/password/update", novalidate) input(type="hidden", name="_csrf", value=csrfToken) .form-group label(for='currentPassword') Current Password - input#currentPassword.form-control(type='password', name='currentPassword', placeholder='*********') + input.form-control( + type='password', + name='currentPassword', + placeholder='*********', + ng-model="currentPassword", + required + ) + span.small.text-primary(ng-show="changePasswordForm.currentPassword.$invalid && changePasswordForm.currentPassword.$dirty") + | Required .form-group label(for='newPassword1') New Password - input#newPassword1.form-control(type='password', name='newPassword1', placeholder='************') + input.form-control( + type='password', + name='newPassword1', + placeholder='*********', + ng-model="newPassword1", + required + ) + span.small.text-primary(ng-show="changePasswordForm.newPassword1.$invalid && changePasswordForm.newPassword1.$dirty") + | Required .form-group label(for='newPassword2') Confirm New Password - input#newPassword2.form-control(type='password', name='newPassword2', placeholder='************') + input.form-control( + type='password', + name='newPassword2', + placeholder='*********', + ng-model="newPassword2", + equals="{{newPassword1}}" + ) + span.small.text-primary(ng-show="changePasswordForm.newPassword2.$invalid && changePasswordForm.newPassword2.$dirty") + | Doesn't match .actions - button.btn.btn-primary(type='submit') Change + button.btn.btn-primary( + type='submit', + ng-disabled="changePasswordForm.$invalid" + ) Change hr.soften diff --git a/services/web/public/coffee/app/directives/asyncForm.coffee b/services/web/public/coffee/app/directives/asyncForm.coffee index 4a168525f7..72702cf347 100644 --- a/services/web/public/coffee/app/directives/asyncForm.coffee +++ b/services/web/public/coffee/app/directives/asyncForm.coffee @@ -6,6 +6,8 @@ define [ link: (scope, element, attrs) -> formName = attrs.asyncForm + scope[attrs.name].response = response = {} + element.on "submit", (e) -> e.preventDefault() @@ -16,29 +18,29 @@ define [ $http .post(element.attr('action'), formData) .success (data, status, headers, config) -> - scope.success = true - scope.error = false + response.success = true + response.error = false if data.redir? ga('send', 'event', formName, 'success') window.location = data.redir else if data.message? - scope.message = data.message + response.message = data.message if data.message.type == "error" - scope.success = false - scope.error = true + response.success = false + response.error = true ga('send', 'event', formName, 'failure', data.message) else ga('send', 'event', formName, 'success') .error (data, status, headers, config) -> - scope.success = false - scope.error = true - ga('send', 'event', formName, 'failure', data.message) - scope.message = + response.success = false + response.error = true + response.message = text: data.message or "Something went wrong talking to the server :(. Please try again." type: 'error' + ga('send', 'event', formName, 'failure', data.message) } App.directive "formMessages", () -> @@ -46,12 +48,16 @@ define [ restrict: "E" template: """