From 173a0fd4b7d632268eec0f6284f5472ec97b6371 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 14 Dec 2012 16:39:27 +0530 Subject: [PATCH 1/3] refactored web / all-app now linked in app. no wnframework in website --- public/build.json | 5 +- public/js/startup.js | 17 ---- public/js/website_utils.js | 45 +++++++++++ stock/doctype/featured_item/featured_item.py | 22 ++++++ website/__init__.py | 16 +++- website/templates/css/login.css | 1 + website/templates/html/page.html | 22 +----- website/templates/html/product_group.html | 1 + website/templates/js/login.js | 82 +++++++++++--------- website/templates/pages/login.html | 10 +-- website/utils.py | 4 + 11 files changed, 139 insertions(+), 86 deletions(-) create mode 100644 public/js/website_utils.js create mode 100644 stock/doctype/featured_item/featured_item.py create mode 100644 website/templates/html/product_group.html diff --git a/public/build.json b/public/build.json index 95fb8f0b55..375150a6db 100644 --- a/public/build.json +++ b/public/build.json @@ -7,10 +7,11 @@ "app/public/js/startup.css" ], "public/js/all-web.js": [ - "app/public/js/startup.js", - "app/public/js/conf.js" + "app/public/js/website_utils.js" ], "public/js/all-app.js": [ + "app/public/js/startup.js", + "app/public/js/conf.js", "app/public/js/modules.js", "app/public/js/toolbar.js", "app/public/js/feature_setup.js", diff --git a/public/js/startup.js b/public/js/startup.js index c90aedd0d3..69151bef29 100644 --- a/public/js/startup.js +++ b/public/js/startup.js @@ -135,23 +135,6 @@ erpnext.startup.set_periodic_updates = function() { wn.updates.id = setInterval(erpnext.update_messages, 60000); } -// subject, sender, description -erpnext.send_message = function(opts) { - if(opts.btn) { - $(opts.btn).start_working(); - } - wn.call({ - method: 'website.send_message', - args: opts, - callback: function(r) { - if(opts.btn) { - $(opts.btn).done_working(); - } - if(opts.callback)opts.callback(r) - } - }); -} - erpnext.hide_naming_series = function() { if(cur_frm.fields_dict.naming_series) { hide_field('naming_series'); diff --git a/public/js/website_utils.js b/public/js/website_utils.js new file mode 100644 index 0000000000..eb6363fdaa --- /dev/null +++ b/public/js/website_utils.js @@ -0,0 +1,45 @@ + +var erpnext = {}; + +// subject, sender, description +erpnext.send_message = function(opts) { + if(opts.btn) { + $(opts.btn).attr("disabled", "disabled"); + } + + $.ajax({ + method: "POST", + url: "server.py", + data: { + cmd: "website.send_message", + subject: opts.subject, + sender: opts.sender, + message: typeof opts.message == "string" + ? opts.message + : JSON.stringify(opts.message) + }, + dataType: "json", + success: function(data) { + if(opts.btn) { + $(opts.btn).attr("disabled", false); + } + if(opts.callback) + opts.callback(data); + } + }); +} + +function valid_email(id) { + if(id.toLowerCase().search("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")==-1) + return 0; else return 1; } + +function get_url_arg(name) { + name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( window.location.href ); + if(results == null) + return ""; + else + return decodeURIComponent(results[1]); +} \ No newline at end of file diff --git a/stock/doctype/featured_item/featured_item.py b/stock/doctype/featured_item/featured_item.py new file mode 100644 index 0000000000..7f48feb2eb --- /dev/null +++ b/stock/doctype/featured_item/featured_item.py @@ -0,0 +1,22 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/website/__init__.py b/website/__init__.py index 1a5a338a92..32d7116b9c 100644 --- a/website/__init__.py +++ b/website/__init__.py @@ -6,6 +6,8 @@ install_docs = [ import webnotes +max_tickets_per_hour = 200 + @webnotes.whitelist(allow_guest=True) def send_message(): from webnotes.model.doc import Document @@ -17,15 +19,21 @@ def send_message(): d.raised_by = webnotes.form_dict.get('sender') if not d.description: - webnotes.msgprint('Please write something', raise_exception=True) + webnotes.response["message"] = 'Please write something' + return if not d.raised_by: - webnotes.msgprint('Please give us your email id so that we can write back to you', raise_exception=True) + webnotes.response["message"] = 'Email Id Required' + return - # make lead or contact + # guest method, cap max writes per hour + if webnotes.conn.sql("""select count(*) from `tabSupport Ticket` + where TIMEDIFF(NOW(), modified) < '01:00:00'""")[0][0] > max_tickets_per_hour: + webnotes.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later" + return d.save() - webnotes.msgprint('Thank you!') + webnotes.response["message"] = 'Thank You' def get_site_address(): from webnotes.utils import get_request_site_address diff --git a/website/templates/css/login.css b/website/templates/css/login.css index 1f36e53f0c..b7b7fca1de 100644 --- a/website/templates/css/login.css +++ b/website/templates/css/login.css @@ -5,6 +5,7 @@ } .layout-wrapper { + background-color: #fff; padding: 10px; box-shadow: 1px 1px 3px 3px #ccc; font-size: 12px; diff --git a/website/templates/html/page.html b/website/templates/html/page.html index e2eb6f4824..11d7b0f1c2 100644 --- a/website/templates/html/page.html +++ b/website/templates/html/page.html @@ -5,28 +5,12 @@ {% block header %} {{ super() }} - {% block css %} - {% if insert_style %} - + {% if insert_style %} - {% endif %} {% endblock %} {% endblock %} diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html new file mode 100644 index 0000000000..d5e18714b2 --- /dev/null +++ b/website/templates/html/product_group.html @@ -0,0 +1 @@ +{% extends "html/page.html" %} diff --git a/website/templates/js/login.js b/website/templates/js/login.js index eb3a65c9b3..b57db49e0e 100644 --- a/website/templates/js/login.js +++ b/website/templates/js/login.js @@ -1,13 +1,13 @@ -wn.provide('erpnext.login'); +var login = {}; $(document).ready(function(wrapper) { - $('#login_btn').click(erpnext.login.doLogin) + $('#login_btn').click(login.do_login) $('#password').keypress(function(ev){ if(ev.which==13 && $('#password').val()) { $('form').submit(function() { - erpnext.login.doLogin(); + login.do_login(); return false; }); } @@ -16,54 +16,60 @@ $(document).ready(function(wrapper) { }) // Login -erpnext.login.doLogin = function(){ +login.do_login = function(){ var args = {}; args['usr']=$("#login_id").val(); args['pwd']=$("#password").val(); if(!args.usr || !args.pwd) { - msgprint("Sorry, you can't login if you don't enter both the email id and password.") + login.set_message("Both login and password required."); } - $('#login_btn').set_working(); - $('#login_message').empty(); + $('#login_btn').attr("disabled", "disabled"); + $('#login_message').toggle(false); + + $.ajax({ + type: "POST", + url: "server.py", + data: {cmd:"login", usr:args.usr, pwd: args.pwd}, + dataType: "json", + success: function(data) { + $('#login_btn').attr("disabled", false); + if(data.message=="Logged In") { + window.location.href = "app.html"; + } else { + login.set_message(data.message); + } + } + }) - $c("login", args, function(r, rtext) { - $('#login_btn').done_working(); - if(r.message=="Logged In"){ - window.location.href='app.html' + (get_url_arg('page') - ? ('?page='+get_url_arg('page')) : ''); - } else { - $i('login_message').innerHTML = '' - +(r.message)+''; - } - }); - return false; } - -erpnext.login.show_forgot_password = function(){ +login.show_forgot_password = function(){ // create dialog - var d = new wn.ui.Dialog({ - title:"Forgot Password", - fields: [ - {'label':'Email Id', 'fieldname':'email_id', 'fieldtype':'Data', 'reqd':true}, - {'label':'Email Me A New Password', 'fieldname':'run', 'fieldtype':'Button'} - ] - }); + var login_id = $("#login_id").val(); + if(!login_id || !valid_email(login_id)) { + login.set_message("Please set your login id (which is your email where the password will be sent);"); + return; + } + login.set_message("Sending email with new password..."); + $("#forgot-password").remove(); - $(d.fields_dict.run.input).click(function() { - var values = d.get_values(); - if(!values) return; - wn.call({ - method:'reset_password', - args: { user: values.email_id }, - callback: function() { - d.hide(); - } - }) + $.ajax({ + method: "POST", + url: "server.py", + data: { + cmd: "reset_password", + user: login_id + }, + success: function(data) { + login.set_message("A new password has been sent to your email id.", "GREEN"); + } }) - d.show(); +} + +login.set_message = function(message, color) { + $('#login_message').html(message).toggle(true); } \ No newline at end of file diff --git a/website/templates/pages/login.html b/website/templates/pages/login.html index a81b2f5cea..0828f65ae3 100644 --- a/website/templates/pages/login.html +++ b/website/templates/pages/login.html @@ -14,6 +14,7 @@ {% block body %}
+

Login

@@ -33,15 +34,12 @@ class="btn btn-small btn-primary">Login - - - -
-

Forgot Password

+
+

Forgot Password

diff --git a/website/templates/js/blog.js b/website/templates/js/blog.js index 24cdf15ae4..43b2d70a96 100644 --- a/website/templates/js/blog.js +++ b/website/templates/js/blog.js @@ -15,29 +15,54 @@ // along with this program. If not, see . // js inside blog page -wn.pages['{{ name }}'].onload = function(wrapper) { - erpnext.blog_list = new wn.ui.Listing({ - parent: $(wrapper).find('#blog-list').get(0), - method: 'website.helpers.blog.get_blog_list', - hide_refresh: true, - no_toolbar: true, - render_row: function(parent, data) { - if(!data.comments) { - data.comment_text = 'No comments yet.' - } else if (data.comments===1) { - data.comment_text = '1 comment.' + +$(document).ready(function() { + // make list of blogs + blog.get_list(); + + $("#next-page").click(function() { + blog.get_list(); + }) +}); + +var blog = { + start: 0, + get_list: function() { + $.ajax({ + method: "GET", + url: "server.py", + data: { + cmd: "website.helpers.blog.get_blog_list", + start: blog.start + }, + dataType: "json", + success: function(data) { + blog.render(data.message); + } + }); + }, + render: function(data) { + var $wrap = $("#blog-list"); + $.each(data, function(i, b) { + // comments + if(!b.comments) { + b.comment_text = 'No comments yet.' + } else if (b.comments===1) { + b.comment_text = '1 comment.' } else { - data.comment_text = data.comments + ' comments.' + b.comment_text = b.comments + ' comments.' } - if(data.content && data.content.length==1000) { - data.content += repl('... (read on)', data); - } - parent.innerHTML = repl('

%(title)s

\ + $(repl('

%(title)s

\
%(comment_text)s
\ - %(content)s

', data); - }, - page_length: 10 - }); - erpnext.blog_list.run(); + %(content)s
\ +

Read with comments...

\ +

', b)).appendTo($wrap); + }); + blog.start += data.length; + if(!data.length) { + $("#next-page").toggle(false) + .parent().append("
Nothing more to show.
"); + } + } } \ No newline at end of file diff --git a/website/templates/js/blog_page.js b/website/templates/js/blog_page.js index 12dcac139f..2e8de7e90c 100644 --- a/website/templates/js/blog_page.js +++ b/website/templates/js/blog_page.js @@ -16,166 +16,61 @@ // js inside blog page -wn.provide('erpnext.blog'); -wn.pages['{{ name }}'].onload = function(wrapper) { - erpnext.blog.wrapper = wrapper; +$(document).ready(function() { + var n_comments = $(".comment-row").length; - // sidebar - //erpnext.blog.render_recent_list(wrapper); - - // unhide no-result if no comments found - erpnext.blog.toggle_no_result(wrapper); - - // bind add comment button to comment dialog - erpnext.blog.make_comment_dialog(wrapper); - - // hide add comment button after 50 comments - erpnext.blog.toggle_add_comment_btn(wrapper); -} - -erpnext.blog.adjust_page_height = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - // adjust page height based on sidebar height - var $main_page = $(wrapper).find('.layout-main-section'); - var $sidebar = $(wrapper).find('.layout-side-section'); - if ($sidebar.height() > $main_page.height()) { - $main_page.height($sidebar.height()); + if(n_comments) { + $(".no_comment").toggle(false); } -} - -erpnext.blog.render_recent_list = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - wrapper.recent_list = new wn.ui.Listing({ - parent: $(wrapper).find('.recent-posts'), - no_toolbar: true, - method: 'website.helpers.blog.get_recent_blog_list', - get_args: function() { - return { name: '{{ name }}' } - }, - hide_refresh: true, - render_row: function(parent, data) { - if(data.content && data.content.length>=100) data.content += '...'; - parent.innerHTML = repl('
\ - %(title)s\ -
%(content)s

', data); - - // adjust page height depending on sidebar height - erpnext.blog.adjust_page_height(wrapper); - }, - page_length: 5, - }); - wrapper.recent_list.run(); -} - -erpnext.blog.toggle_no_result = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - var $blog_comments = $(wrapper).find('.blog-comments'); - var $comment_rows = $blog_comments.find('.comment-row'); - var $no_result = $blog_comments.find('.no-result'); - - if ($comment_rows.length == 0) { - $no_result.removeClass('hide'); - } else { - $no_result.addClass('hide'); + if(n_comments > 50) { + $(".add-comment").toggle(false) + .parent().append("
Comments are closed.
") } -} - -erpnext.blog.make_comment_dialog = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - var $comment_btn = $(wrapper).find('button.add-comment'); - - $comment_btn.click(function() { - if(!erpnext.blog.comment_dialog) { - var d = new wn.ui.Dialog({ - title: 'Add Comment', - fields: [ - { - fieldname: 'comment_by_fullname', label: 'Your Name', - reqd: 1, fieldtype: 'Data' - }, - { - fieldname: 'comment_by', label: 'Email Id', - reqd: 1, fieldtype: 'Data' - }, - { - fieldname: 'comment', label: 'Comment', - reqd: 1, fieldtype: 'Text' - }, - { - fieldname: 'post_comment', label: 'Post Comment', - fieldtype: 'Button' - }, - ], - }); - - erpnext.blog.comment_dialog = d; + $(".add-comment").click(function() { + $("#comment-form").toggle(); + $("#comment-form input, #comment-form, textarea").val(""); + }) + $("#submit-comment").click(function() { + var args = { + comment_by_fullname: $("[name='comment_by_fullname']").val(), + comment_by: $("[name='comment_by']").val(), + comment: $("[name='comment']").val(), + cmd: "website.helpers.blog.add_comment", + comment_doctype: "Blog", + comment_docname: "{{ name }}", + page_name: "{{ page_name }}" } - erpnext.blog.comment_dialog.fields_dict.post_comment - .input.onclick = function() { - erpnext.blog.add_comment(wrapper); + $("#comment-form .alert").toggle(false); + + if(!args.comment_by_fullname || !args.comment_by || !args.comment) { + $("#comment-form .alert") + .html("All fields are necessary to submit the comment.") + .toggle(true); + return false; } - erpnext.blog.comment_dialog.show(); - }); - -} - -erpnext.blog.add_comment = function(wrapper) { - var args = erpnext.blog.comment_dialog.get_values(); - - if(!args) return; - - args.comment_doctype = 'Blog'; - args.comment_docname = '{{ name }}'; - args.page_name = '{{ page_name }}'; - - wn.call({ - method: 'website.helpers.blog.add_comment', - args: args, - btn: this, - callback: function(r) { - if(!r.exc) { - erpnext.blog.add_comment_to_page(wrapper, r.message); - erpnext.blog.comment_dialog.hide(); + + $.ajax({ + method: "POST", + url: "server.py", + data: args, + dataType: "json", + success: function(data) { + if(data.exc) { + $("#comment-form .alert") + .html(data.exc) + .toggle(true) + } else { + $(data.message).appendTo(".blog-comments"); + $(".no_comment").toggle(false); + $(".add-comment").toggle(false); + $("#comment-form") + .replaceWith("
Thank you for your comment!
") + } } - } - }); -} - -erpnext.blog.add_comment_to_page = function(wrapper, comment) { - $blog_comments = $(wrapper).find('.blog-comments'); - $comment_rows = $blog_comments.find('.comment-row'); - - if ($comment_rows.length) { - $blog_comments.append(comment); - } else { - $blog_comments.append(comment); - } - - erpnext.blog.toggle_no_result(wrapper); - erpnext.blog.toggle_add_comment_btn(wrapper); -} - -erpnext.blog.toggle_add_comment_btn = function(wrapper) { - var $wrapper = $(wrapper); - if ($wrapper.find('.blog-comments .comment-row').length > 50) { - var $comment_btn = $wrapper.find('button.add-comment'); - $comment_btn.addClass('hide'); + }) - // show comments are close - $wrapper.find('.blog-comments').append("\ -
\ -

Comments Closed

\ -
\ -
"); - } -} \ No newline at end of file + return false; + }) +}) \ No newline at end of file diff --git a/website/templates/pages/blog.html b/website/templates/pages/blog.html index c4a5dad3d9..75681d5045 100644 --- a/website/templates/pages/blog.html +++ b/website/templates/pages/blog.html @@ -2,7 +2,6 @@ {% block javascript %} {% include "js/blog.js" %} - {% include "js/blog_subscribe.js" %} {% endblock %} {% block css %} @@ -18,9 +17,12 @@

Blog


-
+
+
+ +
From cdcd15d9e23ceef37a84a003e919e937e9630dc5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 17 Dec 2012 13:30:51 +0530 Subject: [PATCH 3/3] added font-awesome --- home/page/attributions/attributions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/page/attributions/attributions.html b/home/page/attributions/attributions.html index 113b969c13..ab879b7d48 100644 --- a/home/page/attributions/attributions.html +++ b/home/page/attributions/attributions.html @@ -59,7 +59,7 @@

Icons

  • The Noun Project
  • -
  • Glyphicons
  • +
  • Font Awesome: http://fortawesome.github.com/Font-Awesome

Web Frameworks