codecombat/app/templates/account/account-settings-view.jade
phoenixeliot 8496343a02 Improve student account recovery
This adds the ability to verify email addresses of a user, so we know they have access to the email address on their account.

Until a user has verified their email address, any teacher of a class they're in can reset their password for them via the Teacher Dashboard. When a user's email address is verified, a teacher may trigger a password recovery email to be sent to the student.

Verification links are valid forever, until the user changes the email address they have on file. They are created using a timestamp, with a sha256 of timestamp+salt+userID+email. Currently the hash value is rather long, could be shorter.

Squashed commit messages:

Add server endpoints for verifying email address

Add server endpoints for verifying email address (pt 2)

Add Server+Client endpoint for sending verification email

Add client view for verification links

Add Edit Student Modal for resetting passwords

Add specs for EditStudentModal

Tweak method name in EditStudentModal

Add edit student button to TeacherClassView

Fix up frontend for teacher password resetting

Add middleware for teacher password resetting

Improve button UX in EditStudentModal

Add JoinClassModal

Add welcome emails, use broad name

Use email without domain as fallback instead of full email

Fetch user on edit student modal open

Don't allow password reset if student email is verified

Set role to student on user signup with classCode

Tweak interface for joinClassModal

Add button to request verification email for yourself

Fix verify email template ID

Move text to en.coffee

Minor tweaks

Fix code review comments

Fix some tests, disable a broken one

Fix misc tests

Fix more tests

Refactor recovery email sending to auth

Fix overbroad sass

Add options to refactored recovery email function

Rename getByCode to fetchByCode

Fix error message

Fix up error handling in users middleware

Use .get instead of .toObject

Use findById

Fix more code review comments

Disable still-broken test
2016-05-24 14:07:28 -07:00

204 lines
10 KiB
Text

if me.get('anonymous')
.alert.alert-danger(data-i18n="account_settings.not_logged_in") Log in or create an account to change your settings.
else
.row
.col-md-6
.panel.panel-default
.panel-heading
.panel-title(data-i18n="account_settings.me_tab")
.panel-body
.form
- var name = me.get('name') || '';
- var email = me.get('email');
- var admin = me.get('permissions', true).indexOf('admin') != -1;
- var godmode = me.get('permissions', true).indexOf('godmode') != -1;
.form-group
label.control-label(for="name", data-i18n="general.name") Name
input#name-input.form-control(name="name", type="text", value="#{name}")
.form-group
label.control-label(for="email")
span(data-i18n="general.email") Email
unless me.get('emailVerified')
span.spl (
span.spr(data-i18n="account.not_yet_verified")
a.resend-verification-email
span.resend-text(data-i18n="account.resend_email")
span.sent-text.hide(data-i18n="account.email_sent")
span )
input#email.form-control(name="email", type="text", value="#{email}")
if !isProduction
.form-group.checkbox
label(for="admin", data-i18n="account_settings.admin") Admin
input#admin(name="admin", type="checkbox", checked=admin)
.form-group.checkbox
label(for="godmode", data-i18n="account_settings.god_mode") God Mode
input#godmode(name="godmode", type="checkbox", checked=godmode)
if me.hasSubscription()
.form-group
label(data-i18n="account.subscription")
br
span.spr ✓
span(data-i18n="account.active")
span.spr= '.'
// TODO: show better summary states, like active, subscribed, free, and active until.
a(href="/account/subscription", data-i18n="account_settings.manage_subscription")
.panel.panel-default
.panel-heading
.panel-title(data-i18n="account_settings.picture_tab")
#profile-photo-panel-body.panel-body
img.profile-photo(src=me.getPhotoURL(230), draggable="false")
input#photoURL(type="hidden", value=me.get('photoURL')||'')
button#upload-photo-button.btn.form-control.btn-primary(data-i18n="account_settings.upload_picture")
.panel.panel-default
.panel-heading
.panel-title(data-i18n="account_settings.password_tab")
.panel-body
.form
.form-group
label.control-label(for="password", data-i18n="account_settings.new_password") New Password
input#password.form-control(name="password", type="password")
.form-group
label.control-label(for="password2", data-i18n="account_settings.new_password_verify") Verify
input#password2.form-control(name="password2", type="password")
.panel.panel-default
.panel-heading
.panel-title#delete-account-panel-title(data-i18n="account_settings.delete_account_tab")
.panel-body
.form#delete-account-form
.form-group
label.control-label(for="email1", data-i18n="account_settings.type_in_email")
input#email1.form-control(name="email", type="email")
.form-group
label.control-label(for="password1", data-i18n="account_settings.type_in_password")
input#password1.form-control(name="password", type="password")
button#delete-account-btn.btn.form-control.btn-primary(data-i18n="account_settings.delete_this_account")
.col-md-6
- var subs = view.getEmailSubsDict();
#email-panel.panel.panel-default
.panel-heading
.panel-title(data-i18n="account_settings.emails_tab")
.panel-body
.form
.form-group.checkbox
label.control-label(for="email_generalNews", data-i18n="account_settings.email_announcements") Announcements
input#email_generalNews(name="email_generalNews", type="checkbox", checked=subs.generalNews)
span.help-block(data-i18n="account_settings.email_announcements_description") Get emails on the latest news and developments at CodeCombat.
hr
h4(data-i18n="account_settings.email_notifications") Notifications
span(data-i18n="account_settings.email_notifications_summary") Controls for personalized, automatic email notifications related to your CodeCombat activity.
.form
.form-group.checkbox
label.control-label(for="email_anyNotes", data-i18n="account_settings.email_any_notes") Any Notifications
input#email_anyNotes(name="email_anyNotes", type="checkbox", checked=subs.anyNotes)
span.help-block(data-i18n="account_settings.email_any_notes_description") Disable to stop all activity notification emails.
fieldset#specific-notification-settings
.form-group.checkbox
label.control-label(for="email_recruitNotes", data-i18n="account_settings.email_recruit_notes") Job Opportunities
input#email_recruitNotes(name="email_recruitNotes", type="checkbox", checked=subs.recruitNotes)
span.help-block(data-i18n="account_settings.email_recruit_notes_description") If you play really well, we may contact you about getting you a (better) job.
hr
h4(data-i18n="account_settings.contributor_emails") Contributor Class Emails
span(data-i18n="account_settings.contribute_prefix") We\'re looking for people to join our party! Check out the
a(href="/contribute", data-i18n="account_settings.contribute_page") contribute page
span(data-i18n="account_settings.contribute_suffix") to find out more.
.form
.form-group.checkbox
label.control-label(for="email_archmageNews")
span(data-i18n="classes.archmage_title")
| Archmage
|
span(data-i18n="classes.archmage_title_description")
| (Coder)
input#email_archmageNews(name="email_archmageNews", type="checkbox", checked=subs.archmageNews)
span(data-i18n="contribute.archmage_subscribe_desc").help-block Get emails about general news and announcements about CodeCombat.
.form-group.checkbox
label.control-label(for="email_artisanNews")
span(data-i18n="classes.artisan_title")
| Artisan
|
span(data-i18n="classes.artisan_title_description")
| (Level Builder)
input#email_artisanNews(name="email_artisanNews", type="checkbox", checked=subs.artisanNews)
span(data-i18n="contribute.artisan_subscribe_desc").help-block Get emails on level editor updates and announcements.
.form-group.checkbox
label.control-label(for="email_adventurerNews")
span(data-i18n="classes.adventurer_title")
| Adventurer
|
span(data-i18n="classes.adventurer_title_description")
| (Level Playtester)
input#email_adventurerNews(name="email_adventurerNews", type="checkbox", checked=subs.adventurerNews)
span(data-i18n="contribute.adventurer_subscribe_desc").help-block Get emails when there are new levels to test.
.form-group.checkbox
label.control-label(for="email_scribeNews")
span(data-i18n="classes.scribe_title")
| Scribe
|
span(data-i18n="classes.scribe_title_description")
| (Article Editor)
input#email_scribeNews(name="email_scribeNews", type="checkbox", checked=subs.scribeNews)
span(data-i18n="contribute.scribe_subscribe_desc").help-block Get emails about article writing announcements.
.form-group.checkbox
label.control-label(for="email_diplomatNews")
span(data-i18n="classes.diplomat_title")
| Diplomat
|
span(data-i18n="classes.diplomat_title_description")
| (Translator)
input#email_diplomatNews(name="email_diplomatNews", type="checkbox", checked=subs.diplomatNews)
span(data-i18n="contribute.diplomat_subscribe_desc").help-block Get emails about i18n developments and, eventually, levels to translate.
.form-group.checkbox
label.control-label(for="email_ambassadorNews")
span(data-i18n="classes.ambassador_title")
| Ambassador
|
span(data-i18n="classes.ambassador_title_description")
| (Support)
input#email_ambassadorNews(name="email_ambassadorNews", type="checkbox", checked=subs.ambassadorNews)
span(data-i18n="contribute.ambassador_subscribe_desc").help-block Get emails on support updates and multiplayer developments.
.form-group.checkbox
label.control-label(for="email_teacherNews")
span(data-i18n="classes.teacher_title")
input#email_teacherNews(name="email_teacherNews", type="checkbox", checked=subs.teacherNews)
span(data-i18n="contribute.teacher_subscribe_desc").help-block
button#toggle-all-btn.btn.btn-primary.form-control(data-i18n="account_settings.email_toggle") Toggle All
.panel.panel-default
.panel-heading
.panel-title#reset-progress-panel-title(data-i18n="account_settings.reset_progress_tab")
.panel-body
.form#reset-progress-form
.form-group
label.control-label(for="email-reset-progress", data-i18n="account_settings.type_in_email_progress")
input#email-reset-progress.form-control(name="email", type="email")
.form-group
label.control-label(for="password-reset-progress", data-i18n="account_settings.type_in_password")
input#password-reset-progress.form-control(name="password", type="password")
button#reset-progress-btn.btn.form-control.btn-primary(data-i18n="account_settings.reset_your_progress")
.clearfix