aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2015-05-25 15:00:47 +0200
committerCamil Staps2015-05-25 15:00:47 +0200
commitcba2e9564ab63d22eb362bcc7c095d5148512d1a (patch)
tree398c4ae4b12c9b9b0d084a3202386b519cb03309
parentLicense in all files (diff)
Resetting password
-rw-r--r--src/css/forms.less3
-rw-r--r--src/forgot-password.jade45
-rw-r--r--src/include/layout-main.jade4
-rw-r--r--src/js/Botleagues.coffee22
-rw-r--r--src/js/BotleaguesCallback.coffee24
-rw-r--r--src/js/BotleaguesFrontend.coffee16
-rw-r--r--src/js/forms.coffee80
-rw-r--r--src/register.jade33
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')
| &nbsp;
@@ -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