Commit 4157e5c0 by Renzo Lucioni

i18n logistration

parent 63ea30da
......@@ -12,6 +12,7 @@ urlpatterns = patterns(
url(r'^v1/', include(user_api_router.urls)),
url(r'^v1/account/login_session/$', user_api_views.LoginSessionView.as_view(), name="user_api_login_session"),
url(r'^v1/account/registration/$', user_api_views.RegistrationView.as_view(), name="user_api_registration"),
url(r'^v1/account/password_reset/$', user_api_views.PasswordResetView.as_view(), name="user_api_password_reset"),
url(
r'^v1/preferences/(?P<pref_key>{})/users/$'.format(UserPreference.KEY_REGEX),
user_api_views.PreferenceUsersListView.as_view()
......
......@@ -73,23 +73,39 @@ class LoginSessionView(APIView):
"""
form_desc = FormDescription("post", reverse("user_api_login_session"))
# Translators: This label appears above a field on the login form
# meant to hold the user's email address.
email_label = _(u"Email")
# Translators: This example email address is used as a placeholder in
# a field on the login form meant to hold the user's email address.
email_placeholder = _(u"username@domain.com")
# Translators: These instructions appear on the login form, immediately
# below a field meant to hold the user's email address.
email_instructions = _(
u"The email address you used to register with {platform_name}"
).format(platform_name=settings.PLATFORM_NAME)
form_desc.add_field(
"email",
field_type="email",
label=_(u"Email"),
placeholder=_(u"username@domain.com"),
instructions=_(
u"The email address you used to register with {platform}"
).format(platform=settings.PLATFORM_NAME),
label=email_label,
placeholder=email_placeholder,
instructions=email_instructions,
restrictions={
"min_length": account_api.EMAIL_MIN_LENGTH,
"max_length": account_api.EMAIL_MAX_LENGTH,
}
)
# Translators: This label appears above a field on the login form
# meant to hold the user's password.
password_label = _(u"Password")
form_desc.add_field(
"password",
label=_(u"Password"),
label=password_label,
field_type="password",
restrictions={
"min_length": account_api.PASSWORD_MIN_LENGTH,
......@@ -97,10 +113,15 @@ class LoginSessionView(APIView):
}
)
# Translators: This phrase appears next to a checkbox on the login form
# which the user can check in order to remain logged in after their
# session ends.
remember_label = _(u"Remember me")
form_desc.add_field(
"remember",
field_type="checkbox",
label=_("Remember me"),
label=remember_label,
default=False,
required=False,
)
......@@ -252,14 +273,26 @@ class RegistrationView(APIView):
return shim_student_view(create_account)(request)
def _add_email_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# meant to hold the user's email address.
email_label = _(u"Email")
# Translators: This example email address is used as a placeholder in
# a field on the registration form meant to hold the user's email address.
email_placeholder = _(u"username@domain.com")
# Translators: These instructions appear on the registration form, immediately
# below a field meant to hold the user's email address.
email_instructions = _(
u"The email address you used to register with {platform_name}"
).format(platform_name=settings.PLATFORM_NAME)
form_desc.add_field(
"email",
field_type="email",
label=_(u"Email"),
placeholder=_(u"username@domain.com"),
instructions=_(
u"The email address you want to use with {platform}"
).format(platform=settings.PLATFORM_NAME),
label=email_label,
placeholder=email_placeholder,
instructions=email_instructions,
restrictions={
"min_length": account_api.EMAIL_MIN_LENGTH,
"max_length": account_api.EMAIL_MAX_LENGTH,
......@@ -268,10 +301,18 @@ class RegistrationView(APIView):
)
def _add_name_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# meant to hold the user's full name.
name_label = _(u"Full Name")
# Translators: These instructions appear on the registration form, immediately
# below a field meant to hold the user's full name.
name_instructions = _(u"The name that will appear on your certificates")
form_desc.add_field(
"name",
label=_(u"Full Name"),
instructions=_(u"The name that will appear on your certificates"),
label=name_label,
instructions=name_instructions,
restrictions={
"max_length": profile_api.FULL_NAME_MAX_LENGTH,
},
......@@ -279,10 +320,20 @@ class RegistrationView(APIView):
)
def _add_username_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# meant to hold the user's public username.
username_label = _(u"Username")
# Translators: These instructions appear on the registration form, immediately
# below a field meant to hold the user's public username.
username_instructions = _(
u"The name that will identify you in your courses"
)
form_desc.add_field(
"username",
label=_(u"Username"),
instructions=_(u"The name that will identify you in your courses"),
label=username_label,
instructions=username_instructions,
restrictions={
"min_length": account_api.USERNAME_MIN_LENGTH,
"max_length": account_api.USERNAME_MAX_LENGTH,
......@@ -291,9 +342,14 @@ class RegistrationView(APIView):
)
def _add_password_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# meant to hold the user's password.
password_label = _(u"Password")
form_desc.add_field(
"password",
label=_(u"Password"),
label=password_label,
field_type="password",
restrictions={
"min_length": account_api.PASSWORD_MIN_LENGTH,
"max_length": account_api.PASSWORD_MAX_LENGTH,
......@@ -302,57 +358,87 @@ class RegistrationView(APIView):
)
def _add_level_of_education_field(self, form_desc, required=True):
# Translators: This label appears above a dropdown menu on the registration
# form used to select the user's highest completed level of education.
education_level_label = _(u"Highest Level of Education Completed")
form_desc.add_field(
"level_of_education",
label=_("Highest Level of Education Completed"),
label=education_level_label,
field_type="select",
options=self._options_with_default(UserProfile.LEVEL_OF_EDUCATION_CHOICES),
required=required
)
def _add_gender_field(self, form_desc, required=True):
# Translators: This label appears above a dropdown menu on the registration
# form used to select the user's gender.
gender_label = _(u"Gender")
form_desc.add_field(
"gender",
label=_("Gender"),
label=gender_label,
field_type="select",
options=self._options_with_default(UserProfile.GENDER_CHOICES),
required=required
)
def _add_year_of_birth_field(self, form_desc, required=True):
# Translators: This label appears above a dropdown menu on the registration
# form used to select the user's year of birth.
yob_label = _(u"Year of Birth")
options = [(unicode(year), unicode(year)) for year in UserProfile.VALID_YEARS]
form_desc.add_field(
"year_of_birth",
label=_("Year of Birth"),
label=yob_label,
field_type="select",
options=self._options_with_default(options),
required=required
)
def _add_mailing_address_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# meant to hold the user's mailing address.
mailing_address_label = _(u"Mailing Address")
form_desc.add_field(
"mailing_address",
label=_("Mailing Address"),
label=mailing_address_label,
field_type="textarea",
required=required
)
def _add_goals_field(self, form_desc, required=True):
# Translators: This phrase appears above a field on the registration form
# meant to hold the user's reasons for registering with edX.
goals_label = _(
u"If you'd like, tell us why you're interested in {platform_name}"
).format(platform_name=settings.PLATFORM_NAME)
form_desc.add_field(
"goals",
label=_("If you'd like, tell us why you're interested in edX."),
label=goals_label,
field_type="textarea",
required=required
)
def _add_city_field(self, form_desc, required=True):
# Translators: This label appears above a field on the registration form
# which allows the user to input the city in which they live.
city_label = _(u"City")
form_desc.add_field(
"city",
label=_("City"),
label=city_label,
required=required
)
def _add_country_field(self, form_desc, required=True):
# Translators: This label appears above a dropdown menu on the registration
# form used to select the country in which the user lives.
country_label = _(u"Country")
sorted_countries = sorted(
countries.countries, key=lambda(__, name): unicode(name)
)
......@@ -362,7 +448,7 @@ class RegistrationView(APIView):
]
form_desc.add_field(
"country",
label=_("Country"),
label=country_label,
field_type="select",
options=self._options_with_default(options),
required=required
......@@ -375,7 +461,8 @@ class RegistrationView(APIView):
# Combine terms of service and honor code checkboxes
else:
# Translators: This is a legal document users must agree to in order to register a new account.
# Translators: This is a legal document users must agree to
# in order to register a new account.
terms_text = _(u"Terms of Service and Honor Code")
terms_link = u"<a href=\"{url}\">{terms_text}</a>".format(
......@@ -383,11 +470,17 @@ class RegistrationView(APIView):
terms_text=terms_text
)
# Translators: "Terms of service" is a legal document users must agree to in order to register a new account.
label = _(u"I agree to the {terms_of_service}").format(terms_of_service=terms_link)
# Translators: "Terms of Service" is a legal document users must agree to
# in order to register a new account.
label = _(
u"I agree to the {terms_of_service}"
).format(terms_of_service=terms_link)
# Translators: "Terms of service" is a legal document users must agree to in order to register a new account.
error_msg = _(u"You must agree to the {terms_of_service}").format(terms_of_service=terms_link)
# Translators: "Terms of Service" is a legal document users must agree to
# in order to register a new account.
error_msg = _(
u"You must agree to the {terms_of_service}"
).format(terms_of_service=terms_link)
form_desc.add_field(
"honor_code",
......@@ -401,17 +494,20 @@ class RegistrationView(APIView):
)
def _add_terms_of_service_field(self, form_desc, required=True):
# Translators: This is a legal document users must agree to in order to register a new account.
# Translators: This is a legal document users must agree to
# in order to register a new account.
terms_text = _(u"Terms of Service")
terms_link = u"<a href=\"{url}\">{terms_text}</a>".format(
url=marketing_link("TOS"),
terms_text=terms_text
)
# Translators: "Terms of service" is a legal document users must agree to in order to register a new account.
# Translators: "Terms of service" is a legal document users must agree to
# in order to register a new account.
label = _(u"I agree to the {terms_of_service}").format(terms_of_service=terms_link)
# Translators: "Terms of service" is a legal document users must agree to in order to register a new account.
# Translators: "Terms of service" is a legal document users must agree to
# in order to register a new account.
error_msg = _("You must agree to the {terms_of_service}").format(terms_of_service=terms_link)
form_desc.add_field(
......@@ -478,6 +574,60 @@ class RegistrationView(APIView):
restrictions={}
)
class PasswordResetView(APIView):
"""HTTP end-point for GETting a description of the password reset form. """
# This end-point is available to anonymous users,
# so do not require authentication.
authentication_classes = []
def get(self, request):
"""Return a description of the password reset form.
This decouples clients from the API definition:
if the API decides to modify the form, clients won't need
to be updated.
See `user_api.helpers.FormDescription` for examples
of the JSON-encoded form description.
Arguments:
request (HttpRequest)
Returns:
HttpResponse
"""
form_desc = FormDescription("post", reverse("password_change_request"))
# Translators: This label appears above a field on the password reset
# form meant to hold the user's email address.
email_label = _(u"Email")
# Translators: This example email address is used as a placeholder in
# a field on the password reset form meant to hold the user's email address.
email_placeholder = _(u"username@domain.com")
# Translators: These instructions appear on the password reset form,
# immediately below a field meant to hold the user's email address.
email_instructions = _(
u"The email address you used to register with {platform_name}"
).format(platform_name=settings.PLATFORM_NAME)
form_desc.add_field(
"email",
field_type="email",
label=email_label,
placeholder=email_placeholder,
instructions=email_instructions,
restrictions={
"min_length": account_api.EMAIL_MIN_LENGTH,
"max_length": account_api.EMAIL_MAX_LENGTH,
}
)
return HttpResponse(form_desc.to_json(), content_type="application/json")
class UserViewSet(viewsets.ReadOnlyModelViewSet):
authentication_classes = (authentication.SessionAuthentication,)
......
var edx = edx || {};
(function( $, _ ) {
(function( $, _, gettext ) {
'use strict';
edx.utils = edx.utils || {};
......@@ -10,10 +10,10 @@ var edx = edx || {};
validate: {
msg: {
email: '<li>The email address you\'ve provided is invalid.</li>',
min: '<li><%= field %> must have at least <%= count %> characters.</li>',
max: '<li><%= field %> can only contain up to <%= count %> characters.</li>',
required: '<li><%= field %> is required.</li>',
email: '<li><%- gettext("The email address you\'ve provided is invalid.") %></li>',
min: '<li><%- _.sprintf(gettext("%(field)s must have at least %(count)d characters"), context) %></li>',
max: '<li><%- _.sprintf(gettext("%(field)s can only contain up to %(count)d characters"), context) %></li>',
required: '<li><%- _.sprintf(gettext("%(field)s is required"), context) %></li>',
custom: '<li><%= content %></li>'
},
......@@ -123,13 +123,17 @@ var edx = edx || {};
tpl = _fn.validate.msg[key];
obj = {
// We pass the context object to the template so that
// we can perform variable interpolation using sprintf
context: {
field: _fn.validate.str.capitalizeFirstLetter( name )
}
};
if ( key === 'min' ) {
obj.count = $el.attr('minlength');
obj.context.count = $el.attr('minlength');
} else if ( key === 'max' ) {
obj.count = $el.attr('maxlength');
obj.context.count = $el.attr('maxlength');
}
}
......@@ -150,4 +154,4 @@ var edx = edx || {};
edx.utils.validate = utils.validate;
})( jQuery, _ );
\ No newline at end of file
})( jQuery, _, gettext );
......@@ -69,6 +69,7 @@ def login_and_registration_form(request, initial_mode="login"):
'disable_courseware_js': True,
'initial_mode': initial_mode,
'third_party_auth': json.dumps(_third_party_auth_context(request)),
'platform_name': settings.PLATFORM_NAME,
}
return render_to_response('student_account/login_and_register.html', context)
......
......@@ -275,7 +275,8 @@
exports: 'js/student_account/views/LoginView',
deps: [
'js/student_account/models/LoginModel',
'js/student_account/views/FormView'
'js/student_account/views/FormView',
'underscore.string'
]
},
'js/student_account/models/PasswordResetModel': {
......@@ -297,7 +298,8 @@
exports: 'js/student_account/views/RegisterView',
deps: [
'js/student_account/models/RegisterModel',
'js/student_account/views/FormView'
'js/student_account/views/FormView',
'underscore.string'
]
},
'js/student_account/views/AccessView': {
......@@ -305,7 +307,8 @@
deps: [
'js/student_account/views/LoginView',
'js/student_account/views/PasswordResetView',
'js/student_account/views/RegisterView'
'js/student_account/views/RegisterView',
'underscore.string'
]
},
},
......
......@@ -8,6 +8,7 @@ var edx = edx || {};
return new edx.student.account.AccessView({
mode: $('#login-and-registration-container').data('initial-mode'),
thirdPartyAuth: $('#login-and-registration-container').data('third-party-auth')
thirdPartyAuth: $('#login-and-registration-container').data('third-party-auth'),
platformName: $('#login-and-registration-container').data('platform-name')
});
})(jQuery);
......@@ -12,14 +12,18 @@ var edx = edx || {};
email: ''
},
urlRoot: '/account/password',
urlRoot: '',
initialize: function( obj ) {
this.urlRoot = obj.url;
},
sync: function(method, model) {
var headers = {
'X-CSRFToken': $.cookie('csrftoken')
};
// Is just expecting email address
// Only expects an email address.
$.ajax({
url: model.urlRoot,
type: 'POST',
......
......@@ -52,7 +52,6 @@ var edx = edx || {};
window.location.href = url;
})
.fail( function( error ) {
console.log('RegisterModel.save() FAILURE!!!!!');
model.trigger('error', error);
});
}
......
......@@ -25,12 +25,19 @@ var edx = edx || {};
activeForm: '',
initialize: function( obj ) {
/* Mix non-conflicting functions from underscore.string
* (all but include, contains, and reverse) into the
* Underscore namespace
*/
_.mixin(_.str.exports())
this.tpl = $(this.tpl).html();
this.activeForm = obj.mode || 'login';
this.thirdPartyAuth = obj.thirdPartyAuth || {
currentProvider: null,
providers: []
};
this.platformName = obj.platformName;
this.render();
},
......@@ -52,11 +59,7 @@ var edx = edx || {};
},
loadForm: function( type ) {
if ( type === 'reset' ) {
this.load.reset( this );
} else {
this.getFormData( type, this.load[type], this );
}
},
load: {
......@@ -68,27 +71,21 @@ var edx = edx || {};
context.subview.login = new edx.student.account.LoginView({
fields: data.fields,
model: model,
thirdPartyAuth: context.thirdPartyAuth
thirdPartyAuth: context.thirdPartyAuth,
platformName: context.platformName
});
// Listen for 'password-help' event to toggle sub-views
context.listenTo( context.subview.login, 'password-help', context.resetPassword );
},
reset: function( context ) {
var model = new edx.student.account.PasswordResetModel(),
data = [{
label: 'Email',
instructions: 'The email address you used to register with edX',
name: 'email',
required: true,
type: 'email',
restrictions: [],
defaultValue: ''
}];
reset: function( data, context ) {
var model = new edx.student.account.PasswordResetModel({
url: data.submit_url
});
context.subview.passwordHelp = new edx.student.account.PasswordResetView({
fields: data,
fields: data.fields,
model: model
});
},
......@@ -101,7 +98,8 @@ var edx = edx || {};
context.subview.register = new edx.student.account.RegisterView({
fields: data.fields,
model: model,
thirdPartyAuth: context.thirdPartyAuth
thirdPartyAuth: context.thirdPartyAuth,
platformName: context.platformName
});
}
},
......@@ -109,7 +107,8 @@ var edx = edx || {};
getFormData: function( type, callback, context ) {
var urls = {
login: 'login_session',
register: 'registration'
register: 'registration',
reset: 'password_reset'
};
$.ajax({
......
......@@ -44,7 +44,7 @@ var edx = edx || {};
* default init steps
*/
preRender: function( data ) {
/* custom code goes here */
/* Custom code goes here */
return data;
},
......@@ -89,7 +89,7 @@ var edx = edx || {};
this.render( html.join('') );
},
/* Helper method ot toggle display
/* Helper method to toggle display
* including accessibility considerations
*/
element: {
......@@ -143,7 +143,7 @@ var edx = edx || {};
key = $el.attr('name') || false;
if ( key ) {
test = this.validate( elements[i], this.formType );
test = this.validate( elements[i] );
if ( test.isValid ) {
obj[key] = $el.attr('type') === 'checkbox' ? $el.is(':checked') : $el.val();
......@@ -204,8 +204,9 @@ var edx = edx || {};
this.element.hide( this.$errors );
}
},
validate: function( $el, form ) {
return edx.utils.validate( $el, form );
validate: function( $el ) {
return edx.utils.validate( $el );
}
});
......
......@@ -24,15 +24,21 @@ var edx = edx || {};
preRender: function( data ) {
this.providers = data.thirdPartyAuth.providers || [];
this.currentProvider = data.thirdPartyAuth.currentProvider || '';
this.platformName = data.platformName;
},
render: function( html ) {
var fields = html || '';
$(this.el).html( _.template( this.tpl, {
// We pass the context object to the template so that
// we can perform variable interpolation using sprintf
context: {
fields: fields,
currentProvider: this.currentProvider,
providers: this.providers
providers: this.providers,
platformName: this.platformName
}
}));
this.postRender();
......@@ -94,5 +100,4 @@ var edx = edx || {};
}
}
});
})(jQuery, _, gettext);
......@@ -43,24 +43,6 @@ var edx = edx || {};
this.element.hide( $el.find('#password-reset-form') );
this.element.show( $el.find('.js-reset-success') );
},
submitForm: function( event ) {
var data = this.getFormData();
event.preventDefault();
if ( !_.compact(this.errors).length ) {
this.model.set( data );
this.model.save();
this.toggleErrorMsg( false );
} else {
this.toggleErrorMsg( true );
}
},
validate: function( $el ) {
return edx.utils.validate( $el );
}
});
......
......@@ -21,15 +21,21 @@ var edx = edx || {};
preRender: function( data ) {
this.providers = data.thirdPartyAuth.providers || [];
this.currentProvider = data.thirdPartyAuth.currentProvider || '';
this.platformName = data.platformName;
},
render: function( html ) {
var fields = html || '';
$(this.el).html( _.template( this.tpl, {
// We pass the context object to the template so that
// we can perform variable interpolation using sprintf
context: {
fields: fields,
currentProvider: this.currentProvider,
providers: this.providers
providers: this.providers,
platformName: this.platformName
}
}));
this.postRender();
......
......@@ -99,6 +99,11 @@
/** The forms **/
.form-wrapper {
padding-top: 25px;
form {
@include clearfix;
clear: both;
}
}
.login-form {
......
<header class="js-login-register-header header">
<h1 class="headline">Welcome!</h1>
<p class="tagline">Log in or register to take courses from the world's best universities.</p>
<h1 class="headline"><%- gettext("Welcome!") %></h1>
<p class="tagline"><%- gettext("Log in or register to take courses from the world's best universities.") %></p>
</header>
<section class="form-type">
<h2>
<input type="radio" name="form" id="register-option" value="register" class="form-toggle" <% if ( mode === 'register' ) { %>checked<% } %> >
<label for"register-option" class="form-label">I am a new user</label>
<label for="register-option" class="form-label"><%- gettext("I am a new user") %></label>
</h2>
<div id="register-form" class="form-wrapper <% if ( mode !== 'register' ) { %>hidden" aria-hidden="true<% } %>"></div>
</section>
......@@ -14,7 +14,7 @@
<section class="form-type">
<h2>
<input type="radio" name="form" id="login-option" value="login" class="form-toggle" <% if ( mode === 'login' ) { %>checked<% } %>>
<label for="login-option" class="form-label">I am a returning user</label>
<label for="login-option" class="form-label"><%- gettext("I am a returning user") %></label>
</h2>
<div id="login-form" class="form-wrapper <% if ( mode !== 'login' ) { %>hidden" aria-hidden="true<% } %>"></div>
</section>
......
......@@ -7,7 +7,7 @@
<% } %>
<% if( form === 'login' && name === 'password' ) { %>
<a href="#" class="forgot-password field-link">Forgot password?</a>
<a href="#" class="forgot-password field-link"><%- gettext("Forgot password?") %></a>
<% } %>
<% if ( type === 'select' ) { %>
......
<form id="login" class="login-form">
<div class="status already-authenticated-msg hidden" aria-hidden="true">
<% if (currentProvider) { %>
<p class="message-copy">You've successfully logged into <%- currentProvider %>, but your <%- currentProvider %> account isn't linked with an edX account. To link your accounts, go to your edX dashboard.</p>
<% if (context.currentProvider) { %>
<p class="message-copy">
<%- _.sprintf(gettext("You've successfully logged into %(currentProvider)s, but your %(currentProvider)s account isn't linked with an %(platformName)s account. To link your accounts, go to your %(platformName)s dashboard."), context) %>
</p>
<% } %>
</div>
<div class="status submission-error hidden" aria-hidden="true">
<h4 class="message-title">We couldn't log you in.</h4>
<h4 class="message-title"><%- gettext("We couldn't log you in.") %></h4>
<ul class="message-copy"></ul>
</div>
<%= fields %>
<button class="action action-primary action-update js-login">Log in</button>
<%= context.fields %>
<button class="action action-primary action-update js-login"><%- gettext("Log in") %></button>
</form>
<% _.each( providers, function( provider) { %>
<% _.each( context.providers, function( provider ) { %>
<button type="submit"class="button button-primary button-<%- provider.name %> login-provider" data-provider-url="<%- provider.loginUrl %>">
<span class="icon <%- provider.iconClass %>"></span>Log in using <%- provider.name %>
<span class="icon <%- provider.iconClass %>"></span><%- _.sprintf(gettext("Log in using %(name)s"), provider) %>
</button>
<% }); %>
......@@ -6,16 +6,16 @@
<%block name="pagetitle">${_("Log in or Register")}</%block>
<%block name="js_extra">
<script type="text/javascript" src="${static.url('js/vendor/underscore-min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/backbone-min.js')}"></script>
<script type="text/javascript" src="${static.url('js/vendor/underscore.string.min.js')}"></script>
<%static:js group='student_account'/>
</%block>
<%block name="header_extras">
% for template_name in ["account", "access", "form_field", "login", "register", "password_reset"]:
<script type="text/template" id="${template_name}-tpl">
% for template_name in ["account", "access", "form_field", "login", "register", "password_reset"]:
<script type="text/template" id="${template_name}-tpl">
<%static:include path="student_account/${template_name}.underscore" />
</script>
</script>
% endfor
</%block>
......@@ -24,5 +24,6 @@
class="login-register"
data-initial-mode="${initial_mode}"
data-third-party-auth='${third_party_auth}'
data-platform-name='${platform_name}'
/>
</div>
<header class="header">
<h1 class="headline">Reset Password</h1>
<h1 class="headline"><%- gettext("Reset Password") %></h1>
</header>
<section class="form-type">
<div id="password-reset-form" class="form-wrapper">
<!-- <p class="action-label">Please enter your email address below and we will send you instructions for setting a new password.</p> -->
<p class="action-label">Enter the email address you used to create your account. We'll send you a link you can use to reset your password.</p>
<p class="action-label"><%- gettext("Enter the email address you used to create your account. We'll send you a link you can use to reset your password.") %></p>
<form id="password-reset-form">
<div class="status submission-error hidden" aria-hidden="true">
<h4 class="message-title">An error occurred.</h4>
<h4 class="message-title"><%- gettext("An error occurred.") %></h4>
<ul class="message-copy"></ul>
</div>
<%= fields %>
<button class="action action-primary action-update js-reset">Reset password</button>
<button class="action action-primary action-update js-reset"><%- gettext("Reset password") %></button>
</form>
</div>
<div class="js-reset-success status submission-success hidden" aria-hidden="true">
<h4 class="message-title">Password Reset Email Sent</h4>
<h4 class="message-title"><%- gettext("Password Reset Email Sent") %></h4>
<div class="message-copy">
<p>We've sent instructions for resetting your password to the email address you provided.</p>
<p>
<%- gettext("We've sent instructions for resetting your password to the email address you provided.") %>
</p>
</div>
</div>
</section>
<% if (currentProvider) { %>
<% if (context.currentProvider) { %>
<div class="status" aria-hidden="false">
<p class="message-copy">You've successfully logged into <%- currentProvider %>. We just need a little more information before you start learning with edX.</p>
<p class="message-copy">
<%- _.sprintf(gettext("You've successfully logged into %(currentProvider)s."), context) %>
<%- _.sprintf(gettext("We just need a little more information before you start learning with %(platformName)s."), context) %>
</p>
</div>
<% } else {
_.each( providers, function( provider) { %>
_.each( context.providers, function( provider) { %>
<button type="submit"class="button button-primary button-<%- provider.name %> login-provider" data-provider-url="<%- provider.registerUrl %>">
<span class="icon <%- provider.iconClass %>"></span>Register using <%- provider.name %>
<span class="icon <%- provider.iconClass %>"></span><%- _.sprintf(gettext("Register using %(name)s"), provider) %>
</button>
<% });
} %>
<form id="register" autocomplete="off">
<div class="status submission-error hidden" aria-hidden="true">
<h4 class="message-title">An error occurred in your registration.</h4>
<h4 class="message-title"><%- gettext("An error occurred in your registration.") %></h4>
<ul class="message-copy"></ul>
</div>
<!-- PASSWORD FIELD DISPLAYS IN PLAIN TEXT -->
<%= fields %>
<button class="action action-primary action-update js-register">Register</button>
<%= context.fields %>
<button class="action action-primary action-update js-register"><%- gettext("Register") %></button>
</form>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment