Login window.frappe = {}; frappe.ready_events = []; frappe.ready = function(fn) { frappe.ready_events.push(fn); } window.dev_server = 0; window.socketio_port = 9000; window.show_language_picker = false;


frappe.ready(function() { $("#footer-subscribe-button").click(function() { if($("#footer-subscribe-email").val() && validate_email($("#footer-subscribe-email").val())) { $("#footer-subscribe-email").attr('disabled', true); $("#footer-subscribe-button").html("Sending...") .attr("disabled", true); erpnext.subscribe_to_newsletter({ email: $("#footer-subscribe-email").val(), callback: function(r) { if(!r.exc) { $("#footer-subscribe-button").html(__("Added")) .attr("disabled", true); } else { $("#footer-subscribe-button").html(__("Error: Not a valid id?")) .addClass("btn-danger").attr("disabled", false); $("#footer-subscribe-email").val("").attr('disabled', false); } } }); } else frappe.msgprint(frappe._("Please enter valid email address")) }); }); frappe.boot = {'sysdefaults': {'float_precision': 3, 'date_format': 'dd-mm-yyyy', 'time_format': 'HH:mm:ss'}, 'time_zone': {'system': 'Asia/Dubai', 'user': 'Asia/Kolkata'}} // for backward compatibility of some libs frappe.sys_defaults = frappe.boot.sysdefaults; // login.js // don't remove this line (used in test) window.disable_signup = true; window.login = {}; window.verify = {}; login.bind_events = function () { $(window).on("hashchange", function () { login.route(); }); $(".form-login").on("submit", function (event) { event.preventDefault(); var args = {}; args.cmd = "login"; args.usr = frappe.utils.xss_sanitise(($("#login_email").val() || "").trim()); args.pwd = $("#login_password").val(); args.device = "desktop"; if (!args.usr || !args.pwd) { frappe.msgprint("Both login and password required"); return false; } login.call(args); return false; }); $(".form-signup").on("submit", function (event) { event.preventDefault(); var args = {}; args.cmd = "frappe.core.doctype.user.user.sign_up"; args.email = ($("#signup_email").val() || "").trim(); args.redirect_to = frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to")); args.full_name = frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim()); if (!args.email || !validate_email(args.email) || !args.full_name) { login.set_status("Valid email and name required", 'red'); return false; } login.call(args); return false; }); $(".form-forgot").on("submit", function (event) { event.preventDefault(); var args = {}; args.cmd = "frappe.core.doctype.user.user.reset_password"; args.user = ($("#forgot_email").val() || "").trim(); if (!args.user) { login.set_status("Valid Login id required.", 'red'); return false; } login.call(args); return false; }); $(".form-login-with-email-link").on("submit", function (event) { event.preventDefault(); var args = {}; args.cmd = "frappe.www.login.send_login_link"; args.email = ($("#login_with_email_link_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_with_email_link_email").val(""); }).catch(() => { login.set_status("Send login link", 'blue'); }); return false; }); $(".toggle-password").click(function () { var input = $($(this).attr("toggle")); if (input.attr("type") == "password") { input.attr("type", "text"); $(this).text("Hide") } else { input.attr("type", "password"); $(this).text("Show") } }); } login.route = function () { var route = window.location.hash.slice(1); if (!route) route = "login"; route = route.replaceAll("-", "_"); login[route](); } login.reset_sections = function (hide) { if (hide || hide === undefined) { $("section.for-login").toggle(false); $("section.for-email-login").toggle(false); $("section.for-forgot").toggle(false); $("section.for-login-with-email-link").toggle(false); $("section.for-signup").toggle(false); } $('section:not(.signup-disabled) .indicator').each(function () { $(this).removeClass().addClass('indicator').addClass('blue') .text($(this).attr('data-text')); }); } login.login = function () { login.reset_sections(); $(".for-login").toggle(true); } login.email = function () { login.reset_sections(); $(".for-email-login").toggle(true); $("#login_email").focus(); } login.steptwo = function () { login.reset_sections(); $(".for-login").toggle(true); $("#login_email").focus(); } login.forgot = function () { login.reset_sections(); if ($("#login_email").val()) { $("#forgot_email").val($("#login_email").val()); } $(".for-forgot").toggle(true); $("#forgot_email").focus(); } login.login_with_email_link = function () { login.reset_sections(); if ($("#login_email").val()) { $("#login_with_email_link_email").val($("#login_email").val()); } $(".for-login-with-email-link").toggle(true); $("#login_with_email_link_email").focus(); } login.signup = function () { login.reset_sections(); $(".for-signup").toggle(true); $("#signup_fullname").focus(); } // Login login.call = function (args, callback) { login.set_status("Verifying...", 'blue'); return frappe.call({ type: "POST", args: args, callback: callback, freeze: true, statusCode: login.login_handlers }); } login.set_status = function (message, color) { $('section:visible .btn-primary').text(message) if (color == "red") { $('section:visible .page-card-body').addClass("invalid"); } } login.set_invalid = function (message) { $(".login-content.page-card").addClass('invalid-login'); setTimeout(() => { $(".login-content.page-card").removeClass('invalid-login'); }, 500) login.set_status(message, 'red'); $("#login_password").focus(); } login.login_handlers = (function () { var get_error_handler = function (default_message) { return function (xhr, data) { if (xhr.responseJSON) { data = xhr.responseJSON; } var message = default_message; if (data._server_messages) { message = ($.map(JSON.parse(data._server_messages || '[]'), function (v) { // temp fix for messages sent as dict try { return JSON.parse(v).message; } catch (e) { return v; } }) || []).join('<br>') || default_message; } if (message === default_message) { login.set_invalid(message); } else { login.reset_sections(false); } }; } var login_handlers = { 200: function (data) { if (data.message == 'Logged In') { login.set_status("Success", 'green'); document.body.innerHTML = `<div class="centered splash"> <img src="/assets/erpnext/images/erpnext-logo.svg" style="max-width: 100px; max-height: 100px;"> </div>`; window.location.href = frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to")) || data.home_page; } else if (data.message == 'Password Reset') { window.location.href = frappe.utils.sanitise_redirect(data.redirect_to); } else if (data.message == "No App") { login.set_status("Success", 'green'); if (localStorage) { var last_visited = localStorage.getItem("last_visited") || frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to")); localStorage.removeItem("last_visited"); } if (data.redirect_to) { window.location.href = frappe.utils.sanitise_redirect(data.redirect_to); } if (last_visited && last_visited != "/login") { window.location.href = last_visited; } else { window.location.href = data.home_page; } } else if (window.location.hash === '#forgot') { if (data.message === 'not found') { login.set_status("Not a valid user", 'red'); } else if (data.message == 'not allowed') { login.set_status("Not Allowed", 'red'); } else if (data.message == 'disabled') { login.set_status("Not Allowed: Disabled User", 'red'); } else { login.set_status("Instructions Emailed", 'green'); } } else if (window.location.hash === '#signup') { if (cint(data.message[0]) == 0) { login.set_status(data.message[1], 'red'); } else { login.set_status("Success", 'green'); frappe.msgprint(data.message[1]) } //login.set_status(__(data.message), 'green'); } //OTP verification if (data.verification && data.message != 'Logged In') { login.set_status("Success", 'green'); document.cookie = "tmp_id=" + data.tmp_id; if (data.verification.method == 'OTP App') { continue_otp_app(data.verification.setup, data.verification.qrcode); } else if (data.verification.method == 'SMS') { continue_sms(data.verification.setup, data.verification.prompt); } else if (data.verification.method == 'Email') { continue_email(data.verification.setup, data.verification.prompt); } } }, 401: get_error_handler("Invalid Login. Try again."), 417: get_error_handler("Oops! Something went wrong."), 404: get_error_handler("User does not exist."), 500: get_error_handler("Something went wrong.") }; return login_handlers; })(); frappe.ready(function () { login.bind_events(); if (!window.location.hash) { window.location.hash = "#login"; } else { $(window).trigger("hashchange"); } $(".form-signup, .form-forgot, .form-login-with-email-link").removeClass("hide"); $(document).trigger('login_rendered'); }); var verify_token = function (event) { $(".form-verify").on("submit", function (eventx) { eventx.preventDefault(); var args = {}; args.cmd = "login"; args.otp = $("#login_token").val(); args.tmp_id = frappe.get_cookie('tmp_id'); if (!args.otp) { frappe.msgprint("Login token required"); return false; } login.call(args); return false; }); } var request_otp = function (r) { $('.login-content').empty(); $('.login-content:visible').append( `<div id="twofactor_div"> <form class="form-verify"> <div class="page-card-head"> <span class="indicator blue" data-text="Verification">Verification</span> </div> <div id="otp_div"></div> <input type="text" id="login_token" autocomplete="off" class="form-control" placeholder="Verification Code" required=""> <button class="btn btn-sm btn-primary btn-block mt-3" id="verify_token">Verify</button> </form> </div>` ); // add event handler for submit button verify_token(); $("#login_token").get(0)?.focus(); } var continue_otp_app = function (setup, qrcode) { request_otp(); var qrcode_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>'); if (setup) { direction = $('<div>').attr('id', 'qr_info').text("Enter Code displayed in OTP App."); qrcode_div.append(direction); $('#otp_div').prepend(qrcode_div); } else { direction = $('<div>').attr('id', 'qr_info').text("OTP setup using OTP App was not completed. Please contact Administrator."); qrcode_div.append(direction); $('#otp_div').prepend(qrcode_div); } } var continue_sms = function (setup, prompt) { request_otp(); var sms_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>'); if (setup) { sms_div.append(prompt) $('#otp_div').prepend(sms_div); } else { direction = $('<div>').attr('id', 'qr_info').html(prompt || "SMS was not sent. Please contact Administrator."); sms_div.append(direction); $('#otp_div').prepend(sms_div) } } var continue_email = function (setup, prompt) { request_otp(); var email_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>'); if (setup) { email_div.append(prompt) $('#otp_div').prepend(email_div); } else { var direction = $('<div>').attr('id', 'qr_info').html(prompt || "Verification code email not sent. Please contact Administrator."); email_div.append(direction); $('#otp_div').prepend(email_div); } } frappe.csrf_token = "None";
x server