[customer login] [minor] commonified listing of orders, invoices, shipments, tickets and messages
diff --git a/config.json b/config.json
index f9c71b4..6656ed3 100644
--- a/config.json
+++ b/config.json
@@ -106,14 +106,24 @@
},
"orders": {
"no_cache": true,
- "template": "app/website/templates/pages/transaction_list",
+ "template": "app/website/templates/pages/sales_transactions",
"args_method": "website.helpers.transaction.order_list_args"
},
"invoices": {
"no_cache": true,
- "template": "app/website/templates/pages/transaction_list",
+ "template": "app/website/templates/pages/sales_transactions",
"args_method": "website.helpers.transaction.invoice_list_args"
},
+ "shipments": {
+ "no_cache": true,
+ "template": "app/website/templates/pages/sales_transactions",
+ "args_method": "website.helpers.transaction.shipment_list_args"
+ },
+ "messages": {
+ "no_cache": true,
+ "template": "app/website/templates/pages/messages",
+ "args_method": "website.helpers.transaction.message_list_args"
+ },
"product_search": {
"template": "app/website/templates/pages/product_search"
},
@@ -123,7 +133,8 @@
"args_method": "support.doctype.support_ticket.support_ticket.get_website_args"
},
"tickets": {
- "template": "app/website/templates/pages/tickets"
+ "template": "app/website/templates/pages/tickets",
+ "args_method": "website.helpers.transaction.ticket_list_args"
},
"address": {
"no_cache": true,
diff --git a/public/js/website_utils.js b/public/js/website_utils.js
index d22d765..1b7f0f7 100644
--- a/public/js/website_utils.js
+++ b/public/js/website_utils.js
@@ -2,8 +2,8 @@
// License: GNU General Public License v3. See license.txt
-var erpnext = {};
-var wn = {};
+if(!window.erpnext) erpnext = {};
+if(!window.wn) wn = {};
// Add / update a new Lead / Communication
// subject, sender, description
@@ -229,4 +229,17 @@
if(cart_count)
$(".cart-count").html("( "+ cart_count +" )")
}
-});
\ No newline at end of file
+});
+
+function remove_script_and_style(txt) {
+ return (!txt || (txt.indexOf("<script>")===-1 && txt.indexOf("<style>")===-1)) ? txt :
+ $("<div></div>").html(txt).find("script,noscript,style,title,meta").remove().end().html();
+}
+
+function is_html(txt) {
+ if(txt.indexOf("<br>")==-1 && txt.indexOf("<p")==-1
+ && txt.indexOf("<img")==-1 && txt.indexOf("<div")==-1) {
+ return false;
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/support/doctype/support_ticket/support_ticket.py b/support/doctype/support_ticket/support_ticket.py
index 2b8fe85..5e0ffd5 100644
--- a/support/doctype/support_ticket/support_ticket.py
+++ b/support/doctype/support_ticket/support_ticket.py
@@ -73,17 +73,6 @@
st.doc.status = status
st.save()
-@webnotes.whitelist()
-def get_tickets():
- tickets = webnotes.conn.sql("""select
- name, subject, status
- from `tabSupport Ticket`
- where raised_by=%s
- order by modified desc
- limit 20""",
- webnotes.session.user, as_dict=1)
- return tickets
-
def get_website_args():
bean = webnotes.bean("Support Ticket", webnotes.form_dict.name)
if bean.doc.raised_by != webnotes.session.user:
diff --git a/website/css/website.css b/website/css/website.css
index 88bf7fd..619658e 100644
--- a/website/css/website.css
+++ b/website/css/website.css
@@ -164,21 +164,32 @@
}
/* buttons */
+
.btn-default {
color: #ffffff;
background-color: #a7a9aa;
border-color: #a7a9aa;
}
+.dropup .btn-default .caret,
+.btn-default .caret {
+ border-bottom-color: #ffffff;
+ border-top-color: #ffffff;
+}
+
.btn-default:hover,
.btn-default:focus,
.btn-default:active,
-.btn-default.active {
- color: #ffffff;
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
background-color: #9a9c9d;
border-color: #8d9091;
+ color: #ffffff;
}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
@@ -193,4 +204,4 @@
fieldset[disabled] .btn-default.active {
background-color: #a7a9aa;
border-color: #a7a9aa;
-}
\ No newline at end of file
+}
diff --git a/website/helpers/transaction.py b/website/helpers/transaction.py
index 336be2a..1aded2e 100644
--- a/website/helpers/transaction.py
+++ b/website/helpers/transaction.py
@@ -15,7 +15,7 @@
transactions = webnotes.conn.sql("""select name, creation, currency, grand_total_export
from `tab%s` where customer=%s and docstatus=1
order by creation desc
- limit %s, 20""" % (doctype, "%s", "%s"), (customer, cint(start)), as_dict=1)
+ limit %s, 20""" % (doctype, "%s", "%s"), (customer, cint(start)), as_dict=True)
for doc in transactions:
doc.items = ", ".join(webnotes.conn.sql_list("""select item_name
from `tab%s Item` where parent=%s limit 5""" % (doctype, "%s"), doc.name))
@@ -60,4 +60,60 @@
"empty_list_message": "No Invoices Found",
"page": "invoice"
})
- return args
\ No newline at end of file
+ return args
+
+@webnotes.whitelist()
+def get_shipments(start=0):
+ return get_transaction_list("Delivery Note", start)
+
+def shipment_list_args():
+ args = get_common_args()
+ args.update({
+ "title": "Shipments",
+ "method": "website.helpers.transaction.get_shipments",
+ "icon": "icon-truck",
+ "empty_list_message": "No Shipments Found",
+ "page": "shipment"
+ })
+ return args
+
+@webnotes.whitelist()
+def get_tickets(start=0):
+ tickets = webnotes.conn.sql("""select name, subject, status, creation
+ from `tabSupport Ticket` where raised_by=%s
+ order by modified desc
+ limit %s, 20""", (webnotes.session.user, cint(start)), as_dict=True)
+ for t in tickets:
+ t.creation = formatdate(t.creation)
+
+ return tickets
+
+def ticket_list_args():
+ return {
+ "title": "My Tickets",
+ "method": "website.helpers.transaction.get_tickets",
+ "icon": "icon-ticket",
+ "empty_list_message": "No Tickets Raised",
+ "page": "ticket"
+ }
+
+@webnotes.whitelist()
+def get_messages(start=0):
+ search_term = "%%%s%%" % webnotes.session.user
+ messages = webnotes.conn.sql("""select name, subject, creation,
+ sender, recipients, content
+ from `tabCommunication` where sender like %s or recipients like %s
+ order by creation desc
+ limit %s, 20""", (search_term, search_term, cint(start)), as_dict=True)
+ for m in messages:
+ m.creation = formatdate(m.creation)
+
+ return messages
+
+def message_list_args():
+ return {
+ "title": "Messages",
+ "method": "website.helpers.transaction.get_messages",
+ "icon": "icon-comments",
+ "empty_list_message": "No Messages Found",
+ }
diff --git a/website/templates/html/transactions.html b/website/templates/html/transactions.html
new file mode 100644
index 0000000..1e61124
--- /dev/null
+++ b/website/templates/html/transactions.html
@@ -0,0 +1,59 @@
+{% extends "app/website/templates/html/page.html" %}
+
+{% block content -%}
+<div class="col-md-12">
+ <ul class="breadcrumb">
+ <li><a href="index">Home</a></li>
+ <li><a href="account">My Account</a></li>
+ <li class="active"><i class="{{ icon }} icon-fixed-width"></i> {{ title }}</li>
+ </ul>
+ <div class="list-group transaction-list">
+ <div class="progress progress-striped active">
+ <div class="progress-bar progress-bar-info" style="width: 100%;"></div>
+ </div>
+ </div>
+ <div class="text-center">
+ <button class="btn btn-default btn-show-more hide">More</button>
+ </div>
+</div>
+{%- endblock %}
+
+{% block javascript -%}
+$(document).ready(function() {
+ window.start = 0;
+ window.$list = $(".transaction-list");
+ window.$show_more = $(".btn-show-more").on("click", function() { get_transactions(this); })
+
+ get_transactions();
+});
+
+var get_transactions = function(btn) {
+ wn.call({
+ method: "{{ method }}",
+ args: { start: start },
+ btn: btn,
+ callback: function(r) {
+ $list.find(".progress").remove();
+ $show_more.toggleClass("hide", !(r.message && r.message.length===20));
+
+ if(!(r.message && r.message.length)) {
+ console.log("empty");
+ if(!$list.html().trim()) {
+ $list.html("<div class='alert alert-warning'>\
+ {{ empty_list_message }}</div>");
+ }
+ return;
+ }
+
+ start += r.message.length;
+
+ $.each(r.message, function(i, doc) {
+ render(doc);
+ });
+ }
+ })
+};
+
+// var render = function(doc) { };
+
+{% endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/account.html b/website/templates/pages/account.html
index 6dcc497..9d29589 100644
--- a/website/templates/pages/account.html
+++ b/website/templates/pages/account.html
@@ -17,11 +17,9 @@
<li><a href="orders"><i class="icon-list icon-fixed-width"></i> My Orders</a></li>
<li><a href="tickets"><i class="icon-tags icon-fixed-width"></i> My Tickets</a></li>
<li style="border-top: 1px solid #ddd"></li>
- <li><a href="messages"><i class="icon-comments icon-fixed-width"></i> Messages</a></li>
- <li><a href="quotations"><i class="icon-shopping-cart icon-fixed-width"></i>
- Quotations</a></li>
<li><a href="invoices"><i class="icon-file-text icon-fixed-width"></i> Invoices</a></li>
- <li><a href="delivery_notes"><i class="icon-truck icon-fixed-width"></i> Shipments</a></li>
+ <li><a href="shipments"><i class="icon-truck icon-fixed-width"></i> Shipments</a></li>
+ <li><a href="messages"><i class="icon-comments icon-fixed-width"></i> Messages</a></li>
<li style="border-top: 1px solid #ddd"></li>
<li><a href="server.py?cmd=web_logout"><i class="icon-signout icon-fixed-width"></i>
Logout</a></li>
diff --git a/website/templates/pages/messages.html b/website/templates/pages/messages.html
new file mode 100644
index 0000000..e1ea8d0
--- /dev/null
+++ b/website/templates/pages/messages.html
@@ -0,0 +1,31 @@
+{% extends "app/website/templates/html/transactions.html" %}
+
+{% block javascript -%}
+{{ super() }}
+
+var render = function(doc) {
+ doc.sender = doc.sender ? doc.sender : "To ";
+ doc.recipients = doc.recipients ? (" to " + doc.recipients) : "";
+ doc.content = remove_script_and_style(doc.content);
+
+ if(!is_html(doc.content)) {
+ doc.content = doc.content.replace("\n", "<br>");
+ }
+
+ $(repl('<a class="list-group-item">\
+ <div class="row col-md-12">%(subject)s</div>\
+ <div class="row text-muted">\
+ <div class="col-md-6">%(sender)s%(recipients)s</div>\
+ <div class="col-md-6 text-right">%(creation)s</div>\
+ </div>\
+ <div class="row col-md-12 msg-content" style="display: none;"><hr>%(content)s</div>\
+ </a>', doc))
+ .appendTo($list)
+ .on("click", function() {
+ $(this).find(".msg-content").toggle();
+ });
+
+
+}
+
+{%- endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/sales_transactions.html b/website/templates/pages/sales_transactions.html
new file mode 100644
index 0000000..7215339
--- /dev/null
+++ b/website/templates/pages/sales_transactions.html
@@ -0,0 +1,25 @@
+{% extends "app/website/templates/html/transactions.html" %}
+
+{% block javascript -%}
+global_number_format = "{{ global_number_format }}";
+currency = "{{ currency }}";
+wn.currency_symbols = {{ currency_symbols }};
+
+{{ super() }}
+
+var render = function(doc) {
+ doc.grand_total_export = format_currency(doc.grand_total_export, doc.currency);
+
+ $(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
+ <div class="row">\
+ <div class="col-md-6">\
+ <div class="row col-md-12">%(name)s</div>\
+ <div class="row col-md-12 text-muted">%(items)s...</div>\
+ </div>\
+ <div class="col-md-3 text-right">%(grand_total_export)s</div>\
+ <div class="col-md-3 text-right text-muted">%(creation)s</div>\
+ </div>\
+ </a>', doc)).appendTo($list);
+};
+
+{%- endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/tickets.html b/website/templates/pages/tickets.html
index 9c476ff..248384d 100644
--- a/website/templates/pages/tickets.html
+++ b/website/templates/pages/tickets.html
@@ -1,51 +1,35 @@
-{% extends "app/website/templates/html/page.html" %}
+{% extends "app/website/templates/html/transactions.html" %}
-{% set title="My Tickets" %}
+{% block javascript -%}
+{{ super() }}
-{% block content %}
-<div class="col-md-12">
- <ul class="breadcrumb">
- <li><a href="index">Home</a></li>
- <li><a href="account">My Account</a></li>
- <li class="active"><i class="icon-ticket icon-fixed-width"></i> My Tickets</li>
- </ul>
- <div id="ticket-list" style="font-size: 13px;">
- <div class="progress progress-striped active">
- <div class="progress-bar progress-bar-info" style="width: 100%;"></div>
- </div>
- </div>
-</div>
-<script>
-$(document).ready(function() {
- var order_start = 0;
-
- wn.call({
- method: "support.doctype.support_ticket.support_ticket.get_tickets",
- args: {
- start: order_start
- },
- callback: function(r) {
- $("#ticket-list .progress").remove();
- var $list = $("#ticket-list");
-
- if(!(r.message && r.message.length)) {
- $list.html("<div class='alert'>No Tickets Yet</div>");
- return;
- }
-
- $.each(r.message, function(i, ticket) {
-
- // parent
- var $ticket = $(repl('<div class="row">\
- <div class="col-md-2"><span class="label">%(status)s</span></div>\
- <div class="col-md-3"><a href="ticket?name=%(name)s">%(name)s</a></div>\
- <div class="col-md-7">%(subject)s</div>\
- </div>', ticket)).appendTo($list);
-
- $("<hr>").appendTo($list);
- });
- }
- })
-})
-</script>
-{% endblock %}
\ No newline at end of file
+var status_label = {
+ "Open": "label-success",
+ "Waiting for Customer": "label-danger",
+ "Closed": "label-default"
+}
+
+var render = function(doc) {
+ doc.status = doc.status.trim();
+ doc.label_class = status_label[doc.status] || "label-default";
+ if(doc.status==="Waiting for Customer") doc.status = "To Reply";
+
+ $(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
+ <div class="row">\
+ <div class="col-md-8">\
+ <div class="row col-md-12">%(name)s</div>\
+ <div class="row col-md-12 text-muted">%(subject)s</div>\
+ </div>\
+ <div class="col-md-4">\
+ <div class="pull-left">\
+ <span class="label %(label_class)s" \
+ style="padding-top: 0.3em; margin-right: 5px;">%(status)s</span>\
+ </div>\
+ <div class="pull-right">\
+ <span class="text-muted">%(creation)s</span>\
+ </div>\
+ </div>\
+ </div>\
+ </a>', doc)).appendTo($list);
+};
+{%- endblock %}
\ No newline at end of file
diff --git a/website/templates/pages/transaction_list.html b/website/templates/pages/transaction_list.html
deleted file mode 100644
index e92764a..0000000
--- a/website/templates/pages/transaction_list.html
+++ /dev/null
@@ -1,69 +0,0 @@
-{% extends "app/website/templates/html/page.html" %}
-
-{% block content %}
-<div class="col-md-12">
- <ul class="breadcrumb">
- <li><a href="index">Home</a></li>
- <li><a href="account">My Account</a></li>
- <li class="active"><i class="{{ icon }} icon-fixed-width"></i> {{ title }}</li>
- </ul>
- <div class="list-group transaction-list">
- <div class="progress progress-striped active">
- <div class="progress-bar progress-bar-info" style="width: 100%;"></div>
- </div>
- </div>
-</div>
-
-<script>
-global_number_format = "{{ global_number_format }}";
-currency = "{{ currency }}";
-wn.currency_symbols = {{ currency_symbols }};
-
-$(document).ready(function() {
- var start = 0;
- var $list = $(".transaction-list");
-
- var get_transactions = function() {
- wn.call({
- method: "{{ method }}",
- args: { start: start },
- callback: function(r) {
- $list.find(".progress").remove();
-
- if(!(r.message && r.message.length)) {
- console.log("empty");
- if(!$list.html().trim()) {
- $list.html("<div class='alert alert-warning'>\
- {{ empty_list_message }}</div>");
- }
- return;
- }
-
- start += r.message.length;
-
- $.each(r.message, function(i, doc) {
- render(doc);
- });
- }
- })
- };
-
- var render = function(doc) {
- doc.grand_total_export = format_currency(doc.grand_total_export, doc.currency);
-
- var $row = $(repl('<a href="{{ page }}?name=%(name)s" class="list-group-item">\
- <div class="row">\
- <div class="col-md-6">\
- <div class="row col-md-12">%(name)s</div>\
- <div class="row col-md-12 text-muted">%(items)s...</div>\
- </div>\
- <div class="col-md-3 text-right">%(grand_total_export)s</div>\
- <div class="col-md-3 text-right text-muted">%(creation)s</div>\
- </div>\
- </a>', doc)).appendTo($list);
- };
-
- get_transactions();
-});
-</script>
-{% endblock %}
\ No newline at end of file