fix: renamed login without password to passwordless login
made text translatable in email template
This commit is contained in:
parent
68baa81f3f
commit
83bf33c1fc
6 changed files with 42 additions and 36 deletions
|
|
@ -39,7 +39,7 @@
|
|||
"allow_login_using_mobile_number",
|
||||
"allow_login_using_user_name",
|
||||
"disable_user_pass_login",
|
||||
"login_without_password",
|
||||
"passwordless_login",
|
||||
"allow_error_traceback",
|
||||
"strip_exif_metadata_from_uploaded_images",
|
||||
"allow_older_web_view_links",
|
||||
|
|
@ -509,15 +509,15 @@
|
|||
{
|
||||
"default": "0",
|
||||
"description": "User will be able to login using the link sent on the email",
|
||||
"fieldname": "login_without_password",
|
||||
"fieldname": "passwordless_login",
|
||||
"fieldtype": "Check",
|
||||
"label": "Login Without Password"
|
||||
"label": "Passwordless Login"
|
||||
}
|
||||
],
|
||||
"icon": "fa fa-cog",
|
||||
"issingle": 1,
|
||||
"links": [],
|
||||
"modified": "2022-12-20 11:20:40.735668",
|
||||
"modified": "2022-12-20 15:39:31.751704",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Core",
|
||||
"name": "System Settings",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ body {
|
|||
}
|
||||
|
||||
.for-forgot,
|
||||
.for-login-without-password,
|
||||
.for-passwordless-login,
|
||||
.for-signup,
|
||||
.for-email-login {
|
||||
display: none;
|
||||
|
|
@ -15,7 +15,7 @@ body {
|
|||
|
||||
.for-login,
|
||||
.for-forgot,
|
||||
.for-login-without-password,
|
||||
.for-passwordless-login,
|
||||
.for-signup,
|
||||
.for-email-login {
|
||||
padding: max(10vh, 60px) 0;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
{% macro table(content, td_align, tb_color, tb_width) %}
|
||||
<table cellpadding="0" cellspacing="0" width="{{ tb_width or '100%' }}" bgcolor="{{ tb_color or '' }}">
|
||||
<table cellpadding="0" cellspacing="0" width="100%">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="{{ td_align or 'center' }}">
|
||||
<td align="center">
|
||||
{{ content }}
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -15,14 +15,18 @@
|
|||
<tbody>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<div class="email-header-title">Click on the below button to login to {{ app_name }}</div>
|
||||
<div>The link will expire in {{ minutes }} minutes</div>
|
||||
<div class="email-header-title">
|
||||
{{ _('Click on the button to log in to {0}').format(app_name) }}
|
||||
</div>
|
||||
<div>{{ _('The link will expire in {0} minutes').format(minutes) }}</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<div class="btn btn-primary" style="margin-top: 30px;">
|
||||
<a href="{{ link or '#'}}" style="color: #fff; text-decoration: none;">LOG IN TO {{ app_name.upper() }}</a>
|
||||
<a href="{{ link or '#'}}" style="color: #fff; text-decoration: none;">
|
||||
{{ _('LOG IN TO {0}').format(app_name.upper()) }}
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -32,7 +36,7 @@
|
|||
|
||||
{% macro footer() %}
|
||||
<div class="email-footer">
|
||||
<div>Thanks!</div>
|
||||
<div>{{ _('Thanks!') }}</div>
|
||||
<div style="font-size: 17px;"><strong>{{ app_name }}</strong></div>
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
|
@ -55,18 +55,18 @@ login.bind_events = function () {
|
|||
return false;
|
||||
});
|
||||
|
||||
$(".form-login-without-password").on("submit", function (event) {
|
||||
$(".form-passwordless-login").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
var args = {};
|
||||
args.cmd = "frappe.www.login.send_login_link";
|
||||
args.email = ($("#login_without_password_email").val() || "").trim();
|
||||
args.email = ($("#passwordless_login_email").val() || "").trim();
|
||||
if (!args.email) {
|
||||
login.set_status('{{ _("Valid Login id required.") }}', 'red');
|
||||
return false;
|
||||
}
|
||||
login.call(args).then(() => {
|
||||
login.set_status('{{ _("Login link sent to your email.") }}', 'blue');
|
||||
$("#login_without_password_email").val("");
|
||||
$("#passwordless_login_email").val("");
|
||||
}).catch(() => {
|
||||
login.set_status('{{ _("Send login link") }}', 'blue');
|
||||
});
|
||||
|
|
@ -113,7 +113,7 @@ login.reset_sections = function (hide) {
|
|||
$("section.for-login").toggle(false);
|
||||
$("section.for-email-login").toggle(false);
|
||||
$("section.for-forgot").toggle(false);
|
||||
$("section.for-login-without-password").toggle(false);
|
||||
$("section.for-passwordless-login").toggle(false);
|
||||
$("section.for-signup").toggle(false);
|
||||
}
|
||||
$('section:not(.signup-disabled) .indicator').each(function () {
|
||||
|
|
@ -148,13 +148,13 @@ login.forgot = function () {
|
|||
$("#forgot_email").focus();
|
||||
}
|
||||
|
||||
login.loginWithoutPassword = function () {
|
||||
login.passwordlessLogin = function () {
|
||||
login.reset_sections();
|
||||
if ($("#login_email").val()) {
|
||||
$("#login_without_password_email").val($("#login_email").val());
|
||||
$("#passwordless_login_email").val($("#login_email").val());
|
||||
}
|
||||
$(".for-login-without-password").toggle(true);
|
||||
$("#login_without_password_email").focus();
|
||||
$(".for-passwordless-login").toggle(true);
|
||||
$("#passwordless_login_email").focus();
|
||||
}
|
||||
|
||||
login.signup = function () {
|
||||
|
|
@ -302,7 +302,7 @@ frappe.ready(function () {
|
|||
$(window).trigger("hashchange");
|
||||
}
|
||||
|
||||
$(".form-signup, .form-forgot, .form-login-without-password").removeClass("hide");
|
||||
$(".form-signup, .form-forgot, .form-passwordless-login").removeClass("hide");
|
||||
$(document).trigger('login_rendered');
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@
|
|||
<div class="login-content page-card">
|
||||
{{ logo_section() }}
|
||||
<form class="form-signin form-login" role="form">
|
||||
{%- if social_login or login_without_password -%}
|
||||
{%- if social_login or passwordless_login -%}
|
||||
<div class="page-card-body">
|
||||
<form class="form-signin form-login" role="form">
|
||||
{{ email_login_body() }}
|
||||
|
|
@ -101,12 +101,12 @@
|
|||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="login-without-password">
|
||||
{% if login_without_password %}
|
||||
<div class="passwordless_login">
|
||||
{% if passwordless_login %}
|
||||
<div class="login-button-wrapper">
|
||||
<a href="#loginWithoutPassword"
|
||||
class="btn btn-block btn-default btn-sm btn-login-option btn-login-without-password">
|
||||
{{ _("Login without password") }}</a>
|
||||
<a href="#passwordlessLogin"
|
||||
class="btn btn-block btn-default btn-sm btn-login-option btn-passwordless_login">
|
||||
{{ _("Passwordless Login") }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
|
@ -191,15 +191,15 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section class='for-login-without-password'>
|
||||
<section class='for-passwordless-login'>
|
||||
<div class="login-content page-card">
|
||||
<form class="form-signin form-login-without-password hide" role="form">
|
||||
<form class="form-signin form-passwordless-login hide" role="form">
|
||||
<div class="page-card-head">
|
||||
<h4>{{ _('Login Without Password') }}</h4>
|
||||
<h4>{{ _('Passwordless Login') }}</h4>
|
||||
</div>
|
||||
<div class="page-card-body">
|
||||
<div class="email-field">
|
||||
<input type="email" id="login_without_password_email" class="form-control"
|
||||
<input type="email" id="passwordless_login_email" class="form-control"
|
||||
placeholder="{{ _('Email Address') }}" required autofocus autocomplete="username">
|
||||
<svg class="field-icon email-icon" width="20" height="20" viewBox="0 0 20 20" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
|
|
@ -213,7 +213,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="page-card-actions">
|
||||
<button class="btn btn-sm btn-primary btn-block btn-login-without-password"
|
||||
<button class="btn btn-sm btn-primary btn-block btn-passwordless-login"
|
||||
type="submit">{{ _("Send login link") }}</button>
|
||||
<p class="text-center sign-up-message">
|
||||
<a href="#login">{{ _("Back to Login") }}</a>
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ def get_context(context):
|
|||
|
||||
context["login_label"] = f" {_('or')} ".join(login_label)
|
||||
|
||||
context["login_without_password"] = frappe.get_system_settings("login_without_password")
|
||||
context["passwordless_login"] = frappe.get_system_settings("passwordless_login")
|
||||
|
||||
return context
|
||||
|
||||
|
|
@ -148,9 +148,11 @@ def login_via_token(login_token):
|
|||
|
||||
|
||||
@frappe.whitelist(allow_guest=True)
|
||||
def send_login_link(email: str, subject: str | None =None):
|
||||
def send_login_link(email: str, subject: str | None = None):
|
||||
if not frappe.db.exists("User", email):
|
||||
frappe.throw("No registered account with this email address")
|
||||
frappe.throw(
|
||||
_("User with email address {0} does not exist").format(email), frappe.DoesNotExistError
|
||||
)
|
||||
|
||||
key = frappe.generate_hash("Login Link", 20)
|
||||
minutes = 10
|
||||
|
|
@ -167,7 +169,7 @@ def send_login_link(email: str, subject: str | None =None):
|
|||
frappe.sendmail(
|
||||
subject=subject,
|
||||
recipients=email,
|
||||
template="login_without_password",
|
||||
template="passwordless_login",
|
||||
args={"link": link, "minutes": minutes, "app_name": app_name},
|
||||
)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue