From c95e051ed8d4338d49abd2847b620dd949848509 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 19 Feb 2014 16:48:21 +0530 Subject: [PATCH] fixed login and added script_lib in template for one time script loading --- frappe/templates/base.html | 23 ++- frappe/templates/includes/login.css | 43 ++++ frappe/templates/includes/login.js | 308 ++++++++++++++-------------- frappe/templates/pages/login.html | 5 +- frappe/website/context.py | 7 +- frappe/website/js/website.js | 30 ++- 6 files changed, 243 insertions(+), 173 deletions(-) create mode 100644 frappe/templates/includes/login.css diff --git a/frappe/templates/base.html b/frappe/templates/base.html index 62aa942d77..420ac53712 100644 --- a/frappe/templates/base.html +++ b/frappe/templates/base.html @@ -10,31 +10,38 @@ - {% block head -%} - {%- if meta_description is defined -%} + {%- block head -%} + {%- if meta_description is defined %} {%- endif -%} - {%- for link in web_include_js -%} + {%- for link in web_include_js %} {%- endfor -%} - {%- for link in web_include_css -%} + {%- for link in web_include_css %} {%- endfor -%} - {% block style -%} + {%- block style %} - {%- endblock %} + {%- endblock -%} - {% block script -%} + {%- block script %} {%- endblock %} - {%- endblock %} + + {%- block script_lib %} + + {%- endblock -%} + + {%- endblock -%}
diff --git a/frappe/templates/includes/login.css b/frappe/templates/includes/login.css new file mode 100644 index 0000000000..56b89e1aff --- /dev/null +++ b/frappe/templates/includes/login.css @@ -0,0 +1,43 @@ +.page-header { display: none; } +.page-sidebar { + display: none; +} +.page-content { + right: 0%; + width: 100%; +} + +.form-signin { + max-width: 330px; + padding: 15px; + margin: 0 auto; +} +.form-signin .form-signin-heading, +.form-signin .checkbox { + margin-bottom: 10px; +} +.form-signin .checkbox { + font-weight: normal; +} +.form-signin .form-control { + position: relative; + height: auto; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 10px; + font-size: 16px; +} +.form-signin .form-control:focus { + z-index: 2; +} +input#login_email, input#signup_fullname { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +input#login_password, input#signup_email { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} \ No newline at end of file diff --git a/frappe/templates/includes/login.js b/frappe/templates/includes/login.js index 90af5301a5..e14fb3b14f 100644 --- a/frappe/templates/includes/login.js +++ b/frappe/templates/includes/login.js @@ -1,182 +1,176 @@ -if(!login) { - var disable_signup = {{ disable_signup and "true" or "false" }}; - var login = {}; - - $(document).ready(function() { - window.location.hash = "#login"; - login.login(); - - $(".btn-signup").click(function() { - var args = {}; - args.cmd = "frappe.core.doctype.profile.profile.sign_up"; - args.email = ($("#signup_email").val() || "").trim(); - args.full_name = ($("#signup_fullname").val() || "").trim(); - - if(!args.email || !valid_email(args.email) || !args.full_name) { - login.set_message("Valid email and name required."); - return false; - } - login.call(args); - }); - - $(".btn-login").click(function() { - var args = {}; - args.cmd = "login"; - args.usr = ($("#login_email").val() || "").trim(); - args.pwd = $("#login_password").val(); - - if(!args.usr || !args.pwd) { - login.set_message("Both login and password required."); - return false; - } - login.call(args); - }); - - $(".btn-forgot").click(function() { - var args = {}; - args.cmd = "frappe.core.doctype.profile.profile.reset_password"; - args.user = ($("#forgot_email").val() || "").trim(); - - if(!args.user) { - login.set_message("Valid Login id required."); - return false; - } +window.disable_signup = {{ disable_signup and "true" or "false" }}; - login.call(args); - }); - $(document).trigger('login_rendered'); - - }) +window.login = {}; + +login.bind_events = function() { $(window).on("hashchange", function() { login.route(); }); - $(document).on("page_change", function() { - if(location.pathname && location.pathname.split("/")[1].split(".")[0]==="login") - login.route(); + $(".form-login").on("submit", function(event) { + event.preventDefault(); + var args = {}; + args.cmd = "login"; + args.usr = ($("#login_email").val() || "").trim(); + args.pwd = $("#login_password").val(); + if(!args.usr || !args.pwd) { + frappe.msgprint("Both login and password required."); + return false; + } + login.call(args); }); - login.route = function() { - var route = window.location.hash.slice(1); - if(!route) route = "login"; - login[route](); - } + $(".form-signup").on("submit", function() { + event.preventDefault(); + var args = {}; + args.cmd = "frappe.core.doctype.profile.profile.sign_up"; + args.email = ($("#signup_email").val() || "").trim(); + args.full_name = ($("#signup_fullname").val() || "").trim(); + if(!args.email || !valid_email(args.email) || !args.full_name) { + frappe.msgprint("Valid email and name required."); + return false; + } + login.call(args); + }); - login.login = function() { - $("form").toggle(false); - $(".form-login").toggle(true); - } + $(".form-forgot").on("submit", function() { + event.preventDefault(); + var args = {}; + args.cmd = "frappe.core.doctype.profile.profile.reset_password"; + args.user = ($("#forgot_email").val() || "").trim(); + if(!args.user) { + frappe.msgprint("Valid Login id required."); + return false; + } + login.call(args); + }); +} - login.forgot = function() { - $("form").toggle(false); - $(".form-forgot").toggle(true); - } - login.signup = function() { - $("form").toggle(false); - $(".form-signup").toggle(true); - } +login.route = function() { + var route = window.location.hash.slice(1); + if(!route) route = "login"; + login[route](); +} +login.login = function() { + $("form").toggle(false); + $(".form-login").toggle(true); +} - // Login - login.call = function(args) { - $('.btn-primary').prop("disabled", true); - - $.ajax({ - type: "POST", - url: "/", - data: args, - dataType: "json", - statusCode: login.login_handlers - }).always(function(){ - $('.btn-primary').prop("disabled", false); - }) - - } +login.forgot = function() { + $("form").toggle(false); + $(".form-forgot").toggle(true); +} +login.signup = function() { + $("form").toggle(false); + $(".form-signup").toggle(true); +} - login.login_handlers = { - 200: function(data) { - if(data.message=="Logged In") { - window.location.href = "app"; - } else if(data.message=="No App") { - if(localStorage) { - var last_visited = localStorage.getItem("last_visited") || "/index"; - localStorage.removeItem("last_visited"); - window.location.href = last_visited; - } else { - window.location.href = "/index"; - } - } else if(window.is_sign_up) { - frappe.msgprint(data.message); - } - }, - 401: function(xhr, data) { - login.set_message("Invalid Login"); - } + +// Login +login.call = function(args) { + $('.btn-primary').prop("disabled", true); + + $.ajax({ + type: "POST", + url: "/", + data: args, + dataType: "json", + statusCode: login.login_handlers + }).always(function(){ + $('.btn-primary').prop("disabled", false); + }) +} + +login.login_handlers = { + 200: function(data) { + if(data.message=="Logged In") { + window.location.href = "app"; + } else if(data.message=="No App") { + if(localStorage) { + var last_visited = localStorage.getItem("last_visited") || "/index"; + localStorage.removeItem("last_visited"); + window.location.href = last_visited; + } else { + window.location.href = "/index"; + } + } else if(window.is_sign_up) { + frappe.msgprint(data.message); + } + }, + 401: function(xhr, data) { + frappe.msgprint("Invalid Login"); } +} +frappe.ready(function() { + window.location.hash = "#login"; + login.bind_events(); + login.login(); + $(document).trigger('login_rendered'); +}); - {% if fb_app_id is defined -%} +{% if fb_app_id is defined -%} // facebook login - $(document).ready(function() { - var user_id = frappe.get_cookie("user_id"); - var sid = frappe.get_cookie("sid"); - - // logged in? - if(!sid || sid==="Guest") { - // fallback on facebook login -- no login again - $(".btn-facebook").removeAttr("disabled"); - } else { - // get private stuff (if access) - // app.setup_user({"user": user_id}); - } - - }); - $(function() { - $login = $(".btn-facebook").prop("disabled", true); - $.getScript('//connect.facebook.net/en_UK/all.js', function() { - $login.prop("disabled", false); - FB.init({ - appId: '{{ fb_app_id }}', - }); - $login.click(function() { - $login.prop("disabled", true).html("Logging In..."); - login.via_facebook(); - }); +$(function() { + $login = $(".btn-facebook").prop("disabled", true); + $.getScript('//connect.facebook.net/en_UK/all.js', function() { + $login.prop("disabled", false); + FB.init({ + appId: '{{ fb_app_id }}', + }); + $login.click(function() { + $login.prop("disabled", true).html("Logging In..."); + login.via_facebook(); }); }); +}); + +login.via_facebook = function() { + // not logged in to facebook either + FB.login(function(response) { + if (response.authResponse) { + // yes logged in via facebook + console.log('Welcome! Fetching your information.... '); + var fb_access_token = response.authResponse.accessToken; + + // get user graph + FB.api('/me', function(response) { + response.fb_access_token = fb_access_token || "[none]"; + $.ajax({ + url:"/", + type: "POST", + data: { + cmd:"frappe.core.doctype.profile.profile.facebook_login", + data: JSON.stringify(response) + }, + statusCode: login.login_handlers + }) + }); + } else { + frappe.msgprint("You have denied access to this application via Facebook. \ + Please change your privacy settings in Facebook and try again. \ + If you do not want to use Facebook login, sign-up here"); + } + },{scope:"email"}); +} - login.via_facebook = function() { - // not logged in to facebook either - FB.login(function(response) { - if (response.authResponse) { - // yes logged in via facebook - console.log('Welcome! Fetching your information.... '); - var fb_access_token = response.authResponse.accessToken; - - // get user graph - FB.api('/me', function(response) { - response.fb_access_token = fb_access_token || "[none]"; - $.ajax({ - url:"/", - type: "POST", - data: { - cmd:"frappe.core.doctype.profile.profile.facebook_login", - data: JSON.stringify(response) - }, - statusCode: login.login_handlers - }) - }); - } else { - frappe.msgprint("You have denied access to this application via Facebook. \ - Please change your privacy settings in Facebook and try again. \ - If you do not want to use Facebook login, sign-up here"); - } - },{scope:"email"}); +frappe.ready(function() { + var user_id = frappe.get_cookie("user_id"); + var sid = frappe.get_cookie("sid"); + + // logged in? + if(!sid || sid==="Guest") { + // fallback on facebook login -- no login again + $(".btn-facebook").removeAttr("disabled"); + } else { + // get private stuff (if access) + // app.setup_user({"user": user_id}); } - {%- endif %} -} +}); +{%- endif %} \ No newline at end of file diff --git a/frappe/templates/pages/login.html b/frappe/templates/pages/login.html index 3e8518ba96..4a77ac83a5 100644 --- a/frappe/templates/pages/login.html +++ b/frappe/templates/pages/login.html @@ -55,9 +55,8 @@
- {% endblock %} +{% block script_lib %}{% include "templates/includes/login.js" %}{% endblock %} + {% block sidebar %}{% endblock %} \ No newline at end of file diff --git a/frappe/website/context.py b/frappe/website/context.py index 2c856ab3fd..07ade7c960 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -33,9 +33,12 @@ def get_context(path): else: context["access"] = get_access(context.pathname) - - context.update(context.data or {}) + if not context.data: + context.data = {} + context.data["path"] = path + context.update(context.data or {}) + # TODO private pages return context diff --git a/frappe/website/js/website.js b/frappe/website/js/website.js index 632072df1b..ccae9a932b 100644 --- a/frappe/website/js/website.js +++ b/frappe/website/js/website.js @@ -263,13 +263,21 @@ $.extend(frappe, { } else { $('[data-html-block]').each(function(i, section) { var $section = $(section); - if($section.attr("data-html-block")==="script") { + var stype = $section.attr("data-html-block"); + if(stype==="script") { $section.remove(); $("") - .html(data[$section.attr("data-html-block")] || "") + .html(data[stype] || "") .appendTo("body"); + } else if(stype==="script_lib") { + // render once + if(!$("[data-block-html='script_lib'][data-path='"+data.path+"']").length) { + $("") + .html(data.script_lib) + .appendTo("body"); + } } else { - $section.html(data[$section.attr("data-html-block")] || ""); + $section.html(data[stype] || ""); } }); if(data.title) $("title").html(data.title); @@ -286,6 +294,21 @@ $.extend(frappe, { return (window.history && window.history.pushState && window.history.replaceState && // pushState isn't reliable on iOS until 5. !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/)) + }, + get_pathname: function() { + return location.pathname && location.pathname.split("/")[1].split(".")[0]; + }, + page_ready_events: {}, + ready: function(fn) { + if(!frappe.page_ready_events[frappe.get_pathname()]) { + frappe.page_ready_events[frappe.get_pathname()] = []; + } + frappe.page_ready_events[frappe.get_pathname()].push(fn); + }, + trigger_ready: function() { + $.each((frappe.page_ready_events[frappe.get_pathname()] || []), function(i, fn) { + fn(); + }) } }); @@ -445,4 +468,5 @@ $(document).on("page_change", function() { $(document).trigger("apply_permissions"); frappe.datetime.refresh_when(); + frappe.trigger_ready(); });