diff options
-rw-r--r-- | src/css/forms.less | 3 | ||||
-rw-r--r-- | src/forgot-password.jade | 45 | ||||
-rw-r--r-- | src/include/layout-main.jade | 4 | ||||
-rw-r--r-- | src/js/Botleagues.coffee | 22 | ||||
-rw-r--r-- | src/js/BotleaguesCallback.coffee | 24 | ||||
-rw-r--r-- | src/js/BotleaguesFrontend.coffee | 16 | ||||
-rw-r--r-- | src/js/forms.coffee | 80 | ||||
-rw-r--r-- | src/register.jade | 33 |
8 files changed, 186 insertions, 41 deletions
diff --git a/src/css/forms.less b/src/css/forms.less index 2a714ce..41e3091 100644 --- a/src/css/forms.less +++ b/src/css/forms.less @@ -1,10 +1,9 @@ #login-block { display: none; + margin-bottom: 0.5em; #login-form { display: inline-block; - float: right; - margin-bottom: 0.5em; } } diff --git a/src/forgot-password.jade b/src/forgot-password.jade new file mode 100644 index 0000000..ef814a7 --- /dev/null +++ b/src/forgot-password.jade @@ -0,0 +1,45 @@ +//- + Web Frontend for Botleagues + Copyright (C) 2015 Camil Staps <info@camilstaps.nl> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +extends ./include/layout-main.jade + +block menu + -var selected = null + +block header + -var header_jumbotron = false + -var header_title = 'Password reset' + +block content + .row + .col-lg-6: div.well.bs-component: form#password-reset-form-1(action='#') + .form-group + label.control-label(for='password-reset-email') Email + input.form-control#password-reset-email(type='email',placeholder='Email') + .form-group: button.btn.btn-default(type='submit') Send reset token + + .col-lg-6(style='display:none;'): div.well.bs-component: form#password-reset-form-2(action='#') + .form-group + label.control-label(for='password-reset-token') Token (sent to your email address) + input.form-control#password-reset-token(type='text',placeholder='Password Reset Token') + .form-group + label.control-label(for='password-reset-password') New password + input.form-control#password-reset-password(type='password',placeholder='Choose a new password') + .form-group + label.control-label(for='password-reset-password-2') New password (confirmation) + input.form-control#password-reset-password-2(type='password',placeholder='Enter password again') + .form-group: button.btn.btn-default(type='submit') Reset password diff --git a/src/include/layout-main.jade b/src/include/layout-main.jade index 0ca3134..8a99a14 100644 --- a/src/include/layout-main.jade +++ b/src/include/layout-main.jade @@ -41,7 +41,7 @@ html(lang="en") #messages #login-block - form.form-inline#login-form(action='#',method='post') + form.form-inline.pull-right#login-form(action='#',method='post') .form-group input.form-control#login-email(type='email',placeholder='Email') | @@ -51,6 +51,8 @@ html(lang="en") .form-group button.btn.btn-default.pull-right#login-submit(role='submit') Login br(style='clear:both;') + a.pull-right(href='/forgot-password'): small Forgot password? + br(style='clear:both;') -var header_jumbotron = false block header diff --git a/src/js/Botleagues.coffee b/src/js/Botleagues.coffee index 6be7a0e..f090e4b 100644 --- a/src/js/Botleagues.coffee +++ b/src/js/Botleagues.coffee @@ -32,17 +32,31 @@ $.cookie.json = true options = method: 'GET' dataType: 'json' - complete: (data) -> - callback data.responseJSON + statusCode: + 200: (data, status, jqxhr) -> + if status == 'parsererror' + callback {} + else + callback data + 201: (jqxhr) -> + new_options = options + new_options.method = 'GET' + jQuery.ajax jqxhr.getResponseHeader('Location'), new_options + 500: (jqxhr) -> + console.log 500 + console.log jqxhr + callback jqxhr.responseJSON url = Botleagues.url + '/' + user_options.endpoint delete user_options.callback delete user_options.endpoint + new_options = options + for key, option of user_options - options[key] = option + new_options[key] = option - jQuery.ajax url, options + jQuery.ajax url, new_options return diff --git a/src/js/BotleaguesCallback.coffee b/src/js/BotleaguesCallback.coffee index f35d03b..b06f887 100644 --- a/src/js/BotleaguesCallback.coffee +++ b/src/js/BotleaguesCallback.coffee @@ -18,10 +18,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. @BotleaguesCallback = + common: (data) -> + console.log data + register: (data) -> + BotleaguesCallback.common data + $ 'form.form-register .form-group' .removeClass 'has-feedback has-success has-warning has-error' - .find '.form-control-feedback' + .find '.form-control-feedback, .feedback' .remove() if data.error? @@ -44,13 +49,28 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. .find 'label' .append( $ '<span>' - .addClass 'pull-right text-danger' + .addClass 'feedback pull-right text-danger' .text error_msg ) + else if data.user? + BotleaguesFrontend.success + message: 'Your account has been created' + prepend_to: $ 'form.form-register' + + $ 'form.form-register input' + .val '' + + else + BotleaguesFrontend.error + message: 'Unknown error' + prepend_to: $ 'form.form-register' + return login: (data) -> + BotleaguesCallback.common data + if data.user_token? BotleaguesFrontend.success message: 'Login successful! Refreshing the page...' diff --git a/src/js/BotleaguesFrontend.coffee b/src/js/BotleaguesFrontend.coffee index 471a230..a9af930 100644 --- a/src/js/BotleaguesFrontend.coffee +++ b/src/js/BotleaguesFrontend.coffee @@ -57,4 +57,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. warning: (user_options) -> user_options.type = 'warning' - BotleaguesFrontend.message user_options
\ No newline at end of file + BotleaguesFrontend.message user_options + + ensurePasswordsMatch: (objects, prepend_to) -> + password = null + ok = true + objects.each () -> + if password? + if ($ this).val() != password + BotleaguesFrontend.error + message: 'The passwords don\'t match' + prepend_to: prepend_to + ok = false + else + password = ($ this).val() + ok
\ No newline at end of file diff --git a/src/js/forms.coffee b/src/js/forms.coffee index 36b0b98..19a1540 100644 --- a/src/js/forms.coffee +++ b/src/js/forms.coffee @@ -19,19 +19,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. # Request API for registering $ 'form.form-register' .submit -> - Botleagues.request - endpoint: 'user' - method: 'POST' - data: - email: - $ this - .find 'input[name="email"]' - .val() - password: - $ this - .find 'input[name="password"]' - .val() - callback: BotleaguesCallback.register + if BotleaguesFrontend.ensurePasswordsMatch (($ this).find 'input[type="password"]'), $ this + Botleagues.request + endpoint: 'user' + method: 'POST' + data: + email: + $ this + .find 'input[name="email"]' + .val() + password: + $ this + .find 'input[name="password"]' + .val() + callback: BotleaguesCallback.register false @@ -48,4 +49,57 @@ $ '.btn-botleagues-login' $ '#login-form' .submit -> Botleagues.login ($ '#login-email').val(), ($ '#login-password').val() + false + +# Password reset form, stage 1: request token +$ '#password-reset-form-1' + .submit -> + Botleagues.request + endpoint: 'user/' + encodeURIComponent(($ '#password-reset-email').val()) + '/password_reminder' + method: 'POST' + callback: (data) -> + if data.error? + BotleaguesFrontend.error + message: data.error + prepend_to: $ '#password-reset-form-1' + else + BotleaguesFrontend.success + message: "We've sent an email with a password reset token to " + data.password_reminder.userEmail + ". It will be valid until " + (new Date(Date.parse data.password_reminder.valid_till)).toTimeString() + prepend_to: $ '#password-reset-form-1' + $ '#password-reset-form-2' + .parent().parent().fadeIn() + $ '#password-reset-form-1' + .addClass 'text-muted' + .find 'button, input' + .attr 'disabled', true + return + + false + +# Password reset form, stage 2: reset password +$ '#password-reset-form-2' + .submit -> + if BotleaguesFrontend.ensurePasswordsMatch (($ this).find 'input[type="password"]'), $ this + Botleagues.request + endpoint: 'user/' + (encodeURIComponent ($ '#password-reset-email').val()) + '/password_reminder/' + ($ '#password-reset-token').val() + method: 'DELETE' + data: + password: + $ '#password-reset-password' + .val() + callback: (data) -> + if data.error? + BotleaguesFrontend.error + message: data.error + prepend_to: $ '#password-reset-form-2' + else + BotleaguesFrontend.success + message: "Your password has been reset." + prepend_to: $ '#password-reset-form-2' + $ '#password-reset-form-2' + .addClass 'text-muted' + .find 'button, input' + .attr 'disabled', true + return + false
\ No newline at end of file diff --git a/src/register.jade b/src/register.jade index e7a06dc..20c5c4b 100644 --- a/src/register.jade +++ b/src/register.jade @@ -25,21 +25,18 @@ block header block content .row - .col-lg-6 - div.well.bs-component - h4 Register - form.form-register(action='#') - .form-group - label(for="register-email") Email - input.form-control#register-email(type='email',name='email',placeholder="Enter email") - .form-group - label(for="register-password") Password - input.form-control#register-password(type='password',name='password',placeholder="Enter password") - .form-group - label(for="register-password2") Password (confirmation) - input.form-control#register-password2(type='password',name='password',placeholder="Enter password again") - .checkbox: label - input#accepts-toc(type='checkbox',name="accepts-toc") - | I accept the terms and conditions - button.btn.btn-lg.btn-success.pull-right(type='submit') Register - br(style='clear:both;')
\ No newline at end of file + .col-lg-6: div.well.bs-component: form.form-register(action='#') + .form-group + label(for="register-email") Email + input.form-control#register-email(type='email',name='email',placeholder="Enter email") + .form-group + label(for="register-password") Password + input.form-control#register-password(type='password',name='password',placeholder="Enter password") + .form-group + label(for="register-password2") Password (confirmation) + input.form-control#register-password2(type='password',name='password',placeholder="Enter password again") + .checkbox: label + input#accepts-toc(type='checkbox',name="accepts-toc") + | I accept the terms and conditions + button.btn.btn-lg.btn-success.pull-right(type='submit') Register + br(style='clear:both;')
\ No newline at end of file |