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();
});