Allow capslock warning and Forgot password button to live togheter

stable
Xavier Julián 2015-10-19 11:51:54 +02:00 committed by David Barragán Merino
parent 2ee79aa983
commit b30f6cab3e
12 changed files with 244 additions and 102 deletions

View File

@ -300,32 +300,22 @@ Capslock = ($translate) ->
$(this).remove() $(this).remove()
showIcon = () -> showIcon = (e) ->
return if open return if open
element = e.currentTarget
top = $el.position().top $(element).parent().append(warningIcon)
left = $el.position().left + $el.outerWidth(true) $('.icon-capslock').fadeIn()
warningIcon.css({
display: 'none',
position: 'absolute',
top: top,
left: left - 25
lineHeight: $el.outerHeight() + 'px',
marginLeft: 0
})
warningIcon
.insertAfter($el)
.fadeIn()
open = true open = true
$el.on 'keyup.capslock', (e) -> $el.on 'blur', (e) ->
if $el.val() == $el.val().toLowerCase()
hideIcon() hideIcon()
$el.on 'keyup.capslock, focus', (e) ->
if $el.val() == $el.val().toLowerCase()
hideIcon(e)
else else
showIcon() showIcon(e)
$scope.$on "$destroy", -> $scope.$on "$destroy", ->
$el.off('.capslock') $el.off('.capslock')

View File

@ -6,8 +6,17 @@ div.change-email-form(tg-change-email)
form form
fieldset fieldset
input(type="hidden", name="email_token", ng-model="data.email_token", data-required="true", input(
placeholder="{{'CHANGE_EMAIL_FORM.PLACEHOLDER_INPUT_TOKEN' | translate}}") type="hidden"
name="email_token"
ng-model="data.email_token"
data-required="true"
placeholder="{{'CHANGE_EMAIL_FORM.PLACEHOLDER_INPUT_TOKEN' | translate}}"
)
a.button-change-email.button-gray(href="", title="{{'CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL' | translate}}", translate="CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL") a.button-change-email.button-gray(
href=""
title="{{'CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL' | translate}}"
translate="CHANGE_EMAIL_FORM.ACTION_CHANGE_EMAIL"
)
button(type="submit", class="hidden") button(type="submit", class="hidden")

View File

@ -6,10 +6,29 @@ div.change-password-form-container(tg-change-password-from-recovery)
form form
fieldset fieldset
input(type="password", tg-capslock, name="password", id="password", ng-model="data.password", input(
data-required="true", placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_NEW_PASSWORD' | translate}}") type="password"
name="password"
id="password"
tg-capslock
ng-model="data.password"
data-required="true"
placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_NEW_PASSWORD' | translate}}"
)
fieldset fieldset
input(type="password", tg-capslock, name="password2", id="password2", ng-model="data.password2", input(
data-required="true", data-equalto="#password", placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_RE_TYPE_NEW_PASSWORD' | translate}}") type="password"
name="password2"
id="password2"
tg-capslock
ng-model="data.password2"
data-required="true"
data-equalto="#password"
placeholder="{{'CHANGE_PASSWORD_RECOVERY_FORM.PLACEHOLDER_RE_TYPE_NEW_PASSWORD' | translate}}"
)
fieldset fieldset
button.button-change-password.button-gray.submit-button(type="submit", title="{{'CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD' | translate}}", translate="CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD") button.button-change-password.button-gray.submit-button(
type="submit"
title="{{'CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD' | translate}}"
translate="CHANGE_PASSWORD_RECOVERY_FORM.ACTION_RESET_PASSWORD"
)

View File

@ -6,9 +6,18 @@ div.forgot-form-container(tg-forgot-password)
form(ng-submit="ctrl.submit()") form(ng-submit="ctrl.submit()")
fieldset fieldset
input(type="text", tg-capslock, name="username", ng-model="data.username", data-required="true", input(
placeholder="{{'FORGOT_PASSWORD_FORM.PLACEHOLDER_FIELD' | translate}}") type="text"
name="username"
ng-model="data.username"
data-required="true"
placeholder="{{'FORGOT_PASSWORD_FORM.PLACEHOLDER_FIELD' | translate}}"
)
fieldset fieldset
button.button-gray.submit-button.button-forgot(type="submit", title="{{'FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD' | translate}}", translate="FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD") button.button-gray.submit-button.button-forgot(
type="submit"
title="{{'FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD' | translate}}"
translate="FORGOT_PASSWORD_FORM.ACTION_RESET_PASSWORD"
)
a(href="", tg-nav="login", translate="FORGOT_PASSWORD_FORM.LINK_CANCEL") a(href="", tg-nav="login", translate="FORGOT_PASSWORD_FORM.LINK_CANCEL")

View File

@ -2,19 +2,36 @@ form.login-form
p.form-header(translate="LOGIN_COMMON.HEADER") p.form-header(translate="LOGIN_COMMON.HEADER")
fieldset fieldset
input(type="text", tg-capslock, name="username", ng-model="dataLogin.username", data-required="true", input(
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}") type="text"
name="username"
ng-model="dataLogin.username"
data-required="true"
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}"
)
fieldset.login-password fieldset.login-password
input(type="password", tg-capslock, name="password", ng-model="dataLogin.password", data-required="true", input(
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}") type="password"
a.forgot-pass(href="", tg-nav="forgot-password", tg-capslock, name="password"
title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}", tg-capslock
translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD") ng-model="dataLogin.password"
data-required="true"
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}"
)
// This should be hidden when focus on pass
a.forgot-pass(
href=""
tg-nav="forgot-password"
title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}"
translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD"
)
fieldset fieldset
a.button-login.button-blackish.submit-button(type="submit", a.button-login.button-blackish.submit-button(
title="{{'LOGIN_COMMON.ACTION_ENTER' | translate}}", type="submit"
translate="LOGIN_COMMON.ACTION_ENTER") title="{{'LOGIN_COMMON.ACTION_ENTER' | translate}}"
translate="LOGIN_COMMON.ACTION_ENTER"
)
fieldset(ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}", ng-include="plugin.template") fieldset(ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}", ng-include="plugin.template")

View File

@ -1,18 +1,40 @@
div.login-form-container(tg-login) div.login-form-container(tg-login)
form.login-form form.login-form
fieldset fieldset
input(type="text", tg-capslock, name="username", data-required="true", input(
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}") type="text"
name="username"
data-required="true"
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_NAME' | translate}}"
)
fieldset.login-password fieldset.login-password
input(type="password", tg-capslock, name="password", data-required="true", input(
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}") type="password"
name="password"
tg-capslock
data-required="true"
placeholder="{{'LOGIN_COMMON.PLACEHOLDER_AUTH_PASSWORD' | translate}}"
)
// This should be hidden when focus on pass // This should be hidden when focus on pass
a.forgot-pass(href="", tg-nav="forgot-password", title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}", translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD") a.forgot-pass(
href=""
tg-nav="forgot-password"
title="{{'LOGIN_COMMON.TITLE_LINK_FORGOT_PASSWORD' | translate}}"
translate="LOGIN_COMMON.LINK_FORGOT_PASSWORD"
)
fieldset fieldset
button.button-green.submit-button(type="submit", title="{{'LOGIN_COMMON.ACTION_SIGN_IN' | translate}}", translate="LOGIN_COMMON.ACTION_SIGN_IN") button.button-green.submit-button(
type="submit"
title="{{'LOGIN_COMMON.ACTION_SIGN_IN' | translate}}"
translate="LOGIN_COMMON.ACTION_SIGN_IN"
)
fieldset(ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}", ng-include="plugin.template") fieldset(
ng-repeat="plugin in contribPlugins|filter:{type: 'auth'}"
ng-include="plugin.template"
)
tg-public-register-message tg-public-register-message

View File

@ -50,12 +50,10 @@ div.register-form-container(tg-register)
translate="REGISTER_FORM.ACTION_SIGN_UP" translate="REGISTER_FORM.ACTION_SIGN_UP"
) )
fieldset(tg-github-login-button)
//- Only displays terms notice when terms plugin is loaded. //- Only displays terms notice when terms plugin is loaded.
tg-terms-of-service-and-privacy-policy-notice tg-terms-of-service-and-privacy-policy-notice
a.register-text-top(i a.register-text-top(
href="" href=""
title="{{'REGISTER_FORM.TITLE_LINK_LOGIN' | translate}}" title="{{'REGISTER_FORM.TITLE_LINK_LOGIN' | translate}}"
tg-nav="login" tg-nav="login"

View File

@ -1,7 +1,10 @@
doctype html doctype html
div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController as ctrl", div.wrapper(
ng-init="section='user-settings'") tg-user-change-password
ng-controller="UserChangePasswordController as ctrl"
ng-init="section='user-settings'"
)
tg-project-menu tg-project-menu
sidebar.menu-secondary.sidebar.settings-nav(tg-user-settings-navigation="change-password") sidebar.menu-secondary.sidebar.settings-nav(tg-user-settings-navigation="change-password")
@ -15,12 +18,40 @@ div.wrapper(tg-user-change-password, ng-controller="UserChangePasswordController
form form
fieldset fieldset
label(for="current-password", translate="CHANGE_PASSWORD.FIELD_CURRENT_PASSWORD") label(for="current-password", translate="CHANGE_PASSWORD.FIELD_CURRENT_PASSWORD")
input(type="password", placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_CURRENT_PASSWORD' | translate}}", id="current-password", ng-model="currentPassword", tg-capslock) input(
type="password"
name="password"
id="current-password"
tg-capslock
ng-model="currentPassword"
placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_CURRENT_PASSWORD' | translate}}"
)
fieldset fieldset
label(for="new-password", translate="CHANGE_PASSWORD.FIELD_NEW_PASSWORD") label(for="new-password", translate="CHANGE_PASSWORD.FIELD_NEW_PASSWORD")
input(type="password", placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_NEW_PASSWORD' | translate}}", id="new-password", ng-model="newPassword1", tg-capslock) input(
type="password"
name="new-password"
id="new-password"
tg-capslock
ng-model="newPassword1"
placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_NEW_PASSWORD' | translate}}"
)
fieldset fieldset
label(for="retype-password", translate="CHANGE_PASSWORD.FIELD_RETYPE_PASSWORD") label(for="retype-password", translate="CHANGE_PASSWORD.FIELD_RETYPE_PASSWORD")
input(type="password", placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_RETYPE_PASSWORD' | translate}}", id="retype-password", ng-model="newPassword2", tg-capslock) input(
type="password"
name="retype-password"
id="retype-password"
tg-capslock
ng-model="newPassword2"
placeholder="{{'CHANGE_PASSWORD.PLACEHOLDER_RETYPE_PASSWORD' | translate}}"
)
fieldset fieldset
button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", translate="COMMON.SAVE") button.button-green.submit-button(
type="submit"
title="{{'COMMON.SAVE' | translate}}"
translate="COMMON.SAVE"
)

View File

@ -18,62 +18,107 @@ div.wrapper(tg-user-profile, ng-controller="UserSettingsController as ctrl",
.image-container .image-container
img.avatar(ng-src="{{user.big_photo}}" alt="avatar") img.avatar(ng-src="{{user.big_photo}}" alt="avatar")
.overlay.hidden .overlay.hidden
img.loading-spinner(src="/svg/spinner-circle.svg", img.loading-spinner(
alt="{{'COMMON.LOADING' | translate}}") src="/svg/spinner-circle.svg",
input(type="file", id="avatar-field", class="hidden", alt="{{'COMMON.LOADING' | translate}}"
tg-avatar-model="avatarAttachment") )
input.hidden(
type="file"
id="avatar-field"
tg-avatar-model="avatarAttachment"
)
p(translate="USER_PROFILE.IMAGE_HELP") p(translate="USER_PROFILE.IMAGE_HELP")
span.size-info.hidden(tg-bo-html="maxFileSizeMsg") span.size-info.hidden(tg-bo-html="maxFileSizeMsg")
a.button-green.change.js-change-avatar(translate="USER_PROFILE.ACTION_CHANGE_IMAGE",
title="{{'USER_PROFILE.CHANGE_PHOTO' | translate}} {{maxFileSizeMsg}}") a.button-green.change.js-change-avatar(
translate="USER_PROFILE.ACTION_CHANGE_IMAGE",
title="{{'USER_PROFILE.CHANGE_PHOTO' | translate}} {{maxFileSizeMsg}}"
)
a.use-gravatar(translate="USER_PROFILE.ACTION_USE_GRAVATAR") a.use-gravatar(translate="USER_PROFILE.ACTION_USE_GRAVATAR")
div.data div.data
fieldset fieldset
label(for="username", translate="USER_PROFILE.FIELD.USERNAME") label(for="username", translate="USER_PROFILE.FIELD.USERNAME")
input(type="text", name="username", id="username", tg-capslock, input(
type="text"
name="username"
id="username"
ng-model="user.username"
data-required="true"
data-maxlength="255"
data-regexp="^[\\w.-]+$"
placeholder="{{'USER_PROFILE.FIELD.USERNAME' | translate}}", placeholder="{{'USER_PROFILE.FIELD.USERNAME' | translate}}",
ng-model="user.username", data-required="true", data-maxlength="255", )
data-regexp="^[\\w.-]+$")
fieldset fieldset
label(for="email", translate="USER_PROFILE.FIELD.EMAIL") label(for="email", translate="USER_PROFILE.FIELD.EMAIL")
input(type="text", name="email", id="email", tg-capslock, input(
placeholder="{{'USER_PROFILE.FIELD.EMAIL' | translate}}", type="text"
ng-model="user.email", data-type="email", data-required="true", name="email"
data-maxlength="255") id="email"
ng-model="user.email"
data-type="email"
data-required="true"
data-maxlength="255"
placeholder="{{'USER_PROFILE.FIELD.EMAIL' | translate}}"
)
fieldset fieldset
label(for="full-name", translate="USER_PROFILE.FIELD.FULL_NAME") label(for="full-name", translate="USER_PROFILE.FIELD.FULL_NAME")
input(type="text", name="full_name", id="full-name", input(
type="text"
name="full_name"
id="full-name"
ng-model="user.full_name"
data-required="true"
data-maxlength="256"
placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_FULL_NAME' | translate}}", placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_FULL_NAME' | translate}}",
ng-model="user.full_name", data-required="true", )
data-maxlength="256")
fieldset fieldset
label(for="lang", translate="USER_PROFILE.FIELD.LANGUAGE") label(for="lang", translate="USER_PROFILE.FIELD.LANGUAGE")
select(name="lang", id="lang", ng-model="lang", select(
ng-options="locale.code as locale.name for locale in locales") name="lang"
id="lang"
ng-model="lang"
ng-options="locale.code as locale.name for locale in locales"
)
option(value="", translate="USER_PROFILE.FIELD.LANGUAGE_DEFAULT") option(value="", translate="USER_PROFILE.FIELD.LANGUAGE_DEFAULT")
fieldset fieldset
label(for="theme", translate="USER_PROFILE.FIELD.THEME") label(for="theme", translate="USER_PROFILE.FIELD.THEME")
select(name="theme", id="theme", ng-model="theme", select(
ng-options="availableTheme for availableTheme in availableThemes") name="theme"
id="theme"
ng-model="theme"
ng-options="availableTheme for availableTheme in availableThemes"
)
option(value="", translate="USER_PROFILE.FIELD.THEME_DEFAULT") option(value="", translate="USER_PROFILE.FIELD.THEME_DEFAULT")
fieldset fieldset
label(for="bio", translate="USER_PROFILE.FIELD.BIO") label(for="bio", translate="USER_PROFILE.FIELD.BIO")
textarea(
textarea(name="bio", id="bio", ng-model="user.bio", name="bio"
ng-attr-placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_BIO' | translate}}", id="bio"
ng-maxlength="210", maxlength="210") ng-model="user.bio"
ng-attr-placeholder="{{'USER_PROFILE.FIELD.PLACEHOLDER_BIO' | translate}}"
ng-maxlength="210"
maxlength="210"
)
fieldset.submit fieldset.submit
button.button-green.submit-button(type="submit", title="{{'COMMON.SAVE' | translate}}", button.button-green.submit-button(
translate="COMMON.SAVE") type="submit"
a.delete-account(href="", title="{{'USER_PROFILE.ACTION_DELETE_ACCOUNT' | translate}}", title="{{'COMMON.SAVE' | translate}}",
ng-click="ctrl.openDeleteLightbox()", translate="COMMON.SAVE"
translate="USER_PROFILE.ACTION_DELETE_ACCOUNT") )
a.delete-account(
href=""
title="{{'USER_PROFILE.ACTION_DELETE_ACCOUNT' | translate}}"
ng-click="ctrl.openDeleteLightbox()"
translate="USER_PROFILE.ACTION_DELETE_ACCOUNT"
)
div.lightbox.lightbox-delete-account(tg-lb-delete-user) div.lightbox.lightbox-delete-account(tg-lb-delete-user)

View File

@ -4,11 +4,7 @@ fieldset {
padding: 0; padding: 0;
position: relative; position: relative;
width: 100%; width: 100%;
.icon-capslock {
cursor: pointer;
} }
}
input[type="text"], input[type="text"],
input[type="number"], input[type="number"],
input[type="password"], input[type="password"],
@ -25,16 +21,20 @@ textarea {
transition: border .3s linear; transition: border .3s linear;
} }
} }
textarea { textarea {
min-height: 10rem; min-height: 10rem;
resize: vertical; resize: vertical;
} }
.checksley-error-list { .checksley-error-list {
margin-bottom: 0; margin-bottom: 0;
li { li {
padding: .2rem; padding: .2rem;
} }
} }
.icon-capslock {
bottom: .6rem;
color: $gray;
display: none;
position: absolute;
right: 1rem;
}

View File

@ -2,19 +2,21 @@
.login-password { .login-password {
position: relative; position: relative;
} }
input:focus { input {
&:focus {
+.forgot-pass { +.forgot-pass {
opacity: 0; opacity: 0;
transition: opacity .5s linear; transition: opacity .3s linear;
}
} }
} }
.forgot-pass { .forgot-pass {
@extend %small; @extend %small;
color: $gray-light; color: $gray;
opacity: 1; opacity: 1;
position: absolute; position: absolute;
right: 1rem; right: 1rem;
top: .5rem; top: .6rem;
transition: all .3s linear; transition: all .3s linear;
&:hover { &:hover {
color: $grayer; color: $grayer;