[fixes] portal, issues, addresses etc
diff --git a/erpnext/templates/includes/address_row.html b/erpnext/templates/includes/address_row.html
new file mode 100644
index 0000000..f7eaa76
--- /dev/null
+++ b/erpnext/templates/includes/address_row.html
@@ -0,0 +1,20 @@
+<div class="web-list-item">
+ <a href="/addresses?name={{ doc.name }}" no-pjax>
+ <div class="row">
+ <div class="col-sm-4">
+ <span class="strong">{{ doc.address_title }}</span>
+ </div>
+ <div class="col-sm-2">
+ {{ doc.address_type }}
+ </div>
+ <div class="col-sm-4">
+ {{ doc.address_line1 }}<br>
+ {% if doc.address_line2 %}{{ doc.address_line2 }}<br>{% endif %}
+ {{ doc.city }}<br>
+ </div>
+ <div class="col-sm-2">
+ {% if doc.state %}{{ doc.state }}, {% endif %}{{ doc.country }}
+ </div>
+ </div>
+ </a>
+</div>
diff --git a/erpnext/templates/includes/issue_row.html b/erpnext/templates/includes/issue_row.html
new file mode 100644
index 0000000..30b2ab0
--- /dev/null
+++ b/erpnext/templates/includes/issue_row.html
@@ -0,0 +1,16 @@
+<div class="web-list-item">
+ <div class="row">
+ <div class="col-sm-8">
+ <a class="no-decoration" href="/issues?name={{ doc.name }}" no-pjax>
+ {{ doc.subject }}
+ </a>
+ </div>
+ <div class="col-sm-2">
+ <span class="indicator {{ "red" if doc.status=="Open" else "blue" }}">
+ {{ doc.status }}</span>
+ </div>
+ <div class="col-sm-2 text-muted text-right small">
+ {{ frappe.format_date(doc.creation) }}
+ </div>
+ </div>
+</div>
diff --git a/erpnext/templates/includes/transaction_row.html b/erpnext/templates/includes/transaction_row.html
index ca03bd3..a677fa5 100644
--- a/erpnext/templates/includes/transaction_row.html
+++ b/erpnext/templates/includes/transaction_row.html
@@ -1,5 +1,6 @@
{% set doc = frappe.get_doc(doc) %}
-<a class="website-list-row" href="/{{ pathname }}/{{ doc.name }}" no-pjax>
+<div class="web-list-item">
+<a href="/{{ pathname }}/{{ doc.name }}" no-pjax>
<div class="row">
<div class="col-sm-6 col-xs-7">
<div class="row">
@@ -12,7 +13,7 @@
<span class="indicator orange">{{ doc.status_display }}</span>
{%- endif -%}
{%- elif doc.status -%}
- <span class="indicator">{{ doc.status }}</span>
+ <span class="indicator blue">{{ doc.status }}</span>
{%- endif -%}
</div>
</div>
@@ -27,4 +28,4 @@
{{ frappe.utils.pretty_date(doc.creation) }}</div>
</div>
</a>
-
+</div>
diff --git a/erpnext/templates/pages/address.html b/erpnext/templates/pages/address.html
deleted file mode 100644
index 8544604..0000000
--- a/erpnext/templates/pages/address.html
+++ /dev/null
@@ -1,112 +0,0 @@
-{% block title %} {{ title }} {% endblock %}
-
-{% block header %}<h2>{{ title }}</h2>{% endblock %}
-
-{% block content %}
-{% macro render_fields(docfields) -%}
-{% for df in docfields -%}
- {% if df.fieldtype == "Data" -%}
- <fieldset>
- <label>{{ df.label }}</label>
- <input class="form-control" type="text" placeholder="Type {{ df.label }}"
- data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}"
- {% if doc and doc.get(df.fieldname) -%} value="{{ doc[df.fieldname] }}" {%- endif %}>
- </fieldset>
- {% elif df.fieldtype == "Check" -%}
- <fieldset class="checkbox">
- <label><input type="checkbox" data-fieldname="{{ df.fieldname }}"
- data-fieldtype="{{ df.fieldtype }}"
- {% if doc and frappe.utils.cint(doc.get(df.fieldname)) -%} checked="checked" {%- endif %}>
- {{ df.label }}</label>
- </fieldset>
- {% elif df.fieldtype in ("Select", "Link") -%}
- <fieldset>
- {% set select_options = frappe.get_list(df.options)|map(attribute="name")
- if df.fieldtype == "Link" else df.options.split("\n") %}
- <label>{{ df.label }}</label>
- <select class="form-control" data-fieldname="{{ df.fieldname }}" data-fieldtype="{{ df.fieldtype }}">
- {% for value in select_options -%}
- {% if doc and doc.get(df.fieldname) == value -%}
- <option selected="selected">{{ value }}</option>
- {% else -%}
- <option>{{ value }}</option>
- {%- endif %}
- {%- endfor %}
- </select>
- </fieldset>
- {%- endif %}
-{%- endfor %}
-{%- endmacro %}
-
-<div class="container content">
- <ul class="breadcrumb">
- <li><a href="/index">Home</a></li>
- <li><a href="/addresses">My Addresses</a></li>
- <li class="active"><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</li>
- </ul>
- <h3><i class="icon-map-marker icon-fixed-width"></i> {{ title }}</h3>
- <button type="button" class="btn btn-primary pull-right" id="address-save"><i class="icon-ok"></i>
- {{ doc and "Save" or "Insert" }}</button>
- <div class="clearfix"></div>
- <hr>
- <div id="address-error" class="alert alert-danger" style="display:none"></div>
- <form autocomplete="on">
- <div class="row">
- <section class="col-md-6">
- {{ render_fields(meta.left_fields) }}
- </section>
- <section class="col-md-6">
- {{ render_fields(meta.right_fields) }}
- </section>
- </section>
- </form>
-</div>
-
-<script>
-;(function() {
- console.log("yoyo");
- frappe.ready(function() {
- bind_save();
- });
-
- var bind_save = function() {
- $("#address-save").on("click", function() {
- console.log("clicked!");
-
- var fields = {
- name: "{{ docname or '' }}"
- };
-
- $("form").find("[data-fieldname]").each(function(i, input) {
- var $input = $(input);
- var fieldname = $(input).attr("data-fieldname");
- var fieldtype = $(input).attr("data-fieldtype");
-
- if(fieldtype == "Check") {
- fields[fieldname] = $input.is(":checked") ? 1 : 0;
- } else {
- fields[fieldname] = $input.val();
- }
- });
-
- frappe.call({
- btn: $(this),
- type: "POST",
- method: "erpnext.templates.pages.address.save_address",
- args: { fields: fields, address_fieldname: get_url_arg("address_fieldname") },
- error_msg: "#address-error",
- callback: function(r) {
- if(get_url_arg("address_fieldname")) {
- window.location.href = "cart";
- } else {
- window.location.href = "address?name=" + encodeURIComponent(r.message);
- }
- }
- });
- });
- };
-})();
-</script>
-
-<!-- no-sidebar -->
-{% endblock %}
diff --git a/erpnext/templates/pages/address.py b/erpnext/templates/pages/address.py
deleted file mode 100644
index 20f2798..0000000
--- a/erpnext/templates/pages/address.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import json
-
-import frappe
-from erpnext.shopping_cart.cart import get_lead_or_customer, update_cart_address
-from frappe.desk.form.meta import get_meta
-
-no_cache = 1
-no_sitemap = 1
-
-def get_context(context):
- def _get_fields(fieldnames):
- return [frappe._dict(zip(["label", "fieldname", "fieldtype", "options"],
- [df.label, df.fieldname, df.fieldtype, df.options]))
- for df in get_meta("Address").get("fields", {"fieldname": ["in", fieldnames]})]
-
- docname = doc = None
- title = "New Address"
- if frappe.form_dict.name:
- doc = frappe.get_doc("Address", frappe.form_dict.name)
- docname = doc.name
- title = doc.name
-
- return {
- "doc": doc,
- "meta": frappe._dict({
- "left_fields": _get_fields(["address_title", "address_type", "address_line1", "address_line2",
- "city", "state", "pincode", "country"]),
- "right_fields": _get_fields(["email_id", "phone", "fax", "is_primary_address",
- "is_shipping_address"])
- }),
- "docname": docname,
- "title": title
- }
-
-@frappe.whitelist()
-def save_address(fields, address_fieldname=None):
- party = get_lead_or_customer()
- fields = json.loads(fields)
-
- if fields.get("name"):
- doc = frappe.get_doc("Address", fields.get("name"))
- else:
- doc = frappe.get_doc({"doctype": "Address", "__islocal": 1})
-
- doc.update(fields)
-
- party_fieldname = party.doctype.lower()
- doc.update({
- party_fieldname: party.name,
- (party_fieldname + "_name"): party.get(party_fieldname + "_name")
- })
- doc.flags.ignore_permissions = True
- doc.save()
-
- if address_fieldname:
- update_cart_address(address_fieldname, doc.name)
-
- return doc.name
diff --git a/erpnext/templates/pages/addresses.html b/erpnext/templates/pages/addresses.html
deleted file mode 100644
index a0562c6..0000000
--- a/erpnext/templates/pages/addresses.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{% block title %} {{ "My Addresses" }} {% endblock %}
-
-{% block header %}<h2>My Addresses</h2>{% endblock %}
-
-{% block breadcrumbs %}{% include "templates/includes/breadcrumbs.html" %}{% endblock %}
-
-{% block content %}
-<div class="addresses-content">
- <p><a class="btn btn-default" href="/address"><i class="icon-plus"> New Address</i></a></p>
- <hr>
- <div id="address-list">
- <div class="text-muted progress">{{ _("Loading") }}...</div>
- </div>
-</div>
-
-<script>
-;(function() {
- var fetch_addresses = function() {
- frappe.call({
- method: "erpnext.templates.pages.addresses.get_addresses",
- callback: function(r) {
- $("#address-list .progress").remove();
- var $list = $("#address-list");
-
- if(!(r.message && r.message.length)) {
- $list.html("<div class='alert'>No Addresses Found</div>");
- return;
- }
-
- $.each(r.message, function(i, address) {
- address.url_name = encodeURIComponent(address.name);
- $(repl('<div> \
- <p><a href="/address?name=%(url_name)s">%(name)s</a></p> \
- <p>%(display)s</p> \
- <hr> \
- </div>', address)).appendTo($list);
- });
- }
- });
- };
-
- $(document).ready(function() {
- fetch_addresses();
- });
-})();
-</script>
-
-<!-- no-sidebar -->
-{% endblock %}
-
diff --git a/erpnext/templates/pages/addresses.py b/erpnext/templates/pages/addresses.py
deleted file mode 100644
index d96ae9b..0000000
--- a/erpnext/templates/pages/addresses.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from erpnext.shopping_cart.cart import get_address_docs
-
-no_cache = 1
-no_sitemap = 1
-
-@frappe.whitelist()
-def get_addresses():
- return get_address_docs()
diff --git a/erpnext/templates/pages/ticket.html b/erpnext/templates/pages/ticket.html
deleted file mode 100644
index 67d4800..0000000
--- a/erpnext/templates/pages/ticket.html
+++ /dev/null
@@ -1,116 +0,0 @@
-{% block title %} {{ title }} {% endblock %}
-
-{% block header %}<h2><i class="icon-ticket icon-fixed-width"></i> {{ title }}</h2>{% endblock %}
-
-{% block content %}
-{% set status_label = {
- "Open": "label-success",
- "To Reply": "label-danger",
- "Closed": "label-default"
-} %}
-
-<div class="ticket-content">
- <ul class="breadcrumb">
- <li><a href="/index">Home</a></li>
- <li><a href="/tickets">My Tickets</a></li>
- <li class="active"><i class="icon-ticket icon-fixed-width"></i> {{ doc.name or "" }}</li>
- </ul>
- {% if not doc -%}
- <script>ask_to_login();</script>
- {% else %}
- <hr>
- {%- if doc.status -%}
- {% if doc.status == "Waiting for Customer" -%}
- {% set status = "To Reply" %}
- {% else %}
- {% set status = doc.status %}
- {%- endif -%}
- <div class="row">
- <div class="col-md-2" style="margin-bottom: 7px;">
- <span class="label {{ status_label.get(status) or 'label-default' }}">{{ status }}</span>
- </div>
- <div class="col-md-8">
- <div class="row col-md-12">{{ doc.subject }}</div>
- </div>
- <div class="col-md-2">
- <span class="text-muted pull-right">{{ frappe.utils.formatdate(doc.creation) }}</span>
- </div>
- </div>
- <div class="row">
- <h4 class="col-xs-6">Messages</h4>
- <div class="col-xs-6">
- <button class="btn btn-sm btn-primary pull-right" id="ticket-reply">
- <i class="icon-envelope icon-fixed-width"></i> Reply</button>
- <button class="btn btn-sm btn-success pull-right hide" id="ticket-reply-send">
- <i class="icon-arrow-right icon-fixed-width"></i> Send</button>
- </div>
- </div>
- <p id="ticket-alert" class="alert alert-danger"
- style="display: none;"> </p>
- <div>
- <table class="table table-bordered table-striped" id="ticket-thread">
- <tbody>
- {%- for comm in
- (doc.get({"doctype":"Communication"})|sort(reverse=True, attribute="creation")) %}
- <tr>
- <td>
- <h5 style="text-transform: none">
- {{ comm.sender }} on {{ frappe.utils.formatdate(comm.creation) }}</h5>
- <hr>
- <p>{{ frappe.utils.is_html(comm.content) and comm.content or
- comm.content.replace("\n", "<br>")}}</p>
- </td>
- </tr>
- {% endfor -%}
- </tbody>
- </table>
- </div>
- {%- endif -%}
- {% endif -%}
-</div>
-
-<script>
-$(document).ready(function() {
- $("#ticket-reply").on("click", function() {
- if(!$("#ticket-reply-editor").length) {
- $('<tr id="ticket-reply-editor"><td>\
- <h5 style="text-transform: none">Reply</h5>\
- <hr>\
- <textarea rows=10 class="form-control" style="resize: vertical;"></textarea>\
- </td></tr>').prependTo($("#ticket-thread").find("tbody"));
- $("#ticket-reply").addClass("hide");
- $("#ticket-reply-send").removeClass("hide");
- }
- });
-
- $("#ticket-reply-send").on("click", function() {
- var reply = $("#ticket-reply-editor").find("textarea").val().trim();
- if(!reply) {
- msgprint("Please write something in reply!");
- } else {
- frappe.call({
- type: "POST",
- method: "erpnext.templates.pages.ticket.add_reply",
- btn: this,
- args: { ticket: "{{ doc.name }}", message: reply },
- callback: function(r) {
- if(r.exc) {
- msgprint(r._server_messages
- ? JSON.parse(r._server_messages).join("<br>")
- : "Something went wrong!");
- } else {
- window.location.reload();
- }
- }
- })
- }
- });
-});
-
-var msgprint = function(txt) {
- if(txt) $("#ticket-alert").html(txt).toggle(true);
-}
-</script>
-
-<!-- no-sidebar -->
-{% endblock %}
diff --git a/erpnext/templates/pages/ticket.py b/erpnext/templates/pages/ticket.py
deleted file mode 100644
index 811f4fb..0000000
--- a/erpnext/templates/pages/ticket.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe import _
-from frappe.utils import today
-
-no_cache = 1
-no_sitemap = 1
-
-def get_context(context):
- doc = frappe.get_doc("Issue", frappe.form_dict.name)
- if doc.raised_by == frappe.session.user:
- ticket_context = {
- "title": doc.name,
- "doc": doc
- }
- else:
- ticket_context = {"title": "Not Allowed", "doc": {}}
-
- return ticket_context
-
-@frappe.whitelist()
-def add_reply(ticket, message):
- if not message:
- raise frappe.throw(_("Please write something"))
-
- doc = frappe.get_doc("Issue", ticket)
- if doc.raised_by != frappe.session.user:
- raise frappe.throw(_("You are not allowed to reply to this ticket."), frappe.PermissionError)
-
- comm = frappe.get_doc({
- "doctype":"Communication",
- "subject": doc.subject,
- "content": message,
- "sender": doc.raised_by,
- "sent_or_received": "Received"
- })
- comm.insert(ignore_permissions=True)
-
diff --git a/erpnext/templates/pages/tickets.html b/erpnext/templates/pages/tickets.html
deleted file mode 100644
index 40cd80e..0000000
--- a/erpnext/templates/pages/tickets.html
+++ /dev/null
@@ -1,92 +0,0 @@
-{% block title %} {{ title }} {% endblock %}
-
-{% block header %}<h2>{{ title }}</h2>{% endblock %}
-
-{% block content %}
-{% include "templates/includes/transactions.html" %}
-
-<script>
- 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-2" style="margin-bottom: 7px;"><span class="label %(label_class)s">\
- %(status)s</span></div>\
- <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-2 pull-right">\
- <span class="text-muted">%(creation)s</span>\
- </div>\
- </div>\
- </a>', doc)).appendTo($list);
- };
-
- frappe.ready(function() {
- if(!window.$new_ticket) {
- window.$new_ticket = $('<div>\
- <button class="btn btn-primary" style="margin-bottom: 15px;" id="new-ticket">\
- <i class="icon-tag icon-fixed-width"></i> New Ticket\
- </button>\
- <button class="btn btn-success hide" style="margin-bottom: 15px;" id="new-ticket-send">\
- <i class="icon-arrow-right icon-fixed-width"></i> Send\
- </button>\
- </div>').insertBefore(".transaction-list");
- }
-
- window.$new_ticket.find("#new-ticket").on("click", function() {
- $(this).addClass("hide");
- $(window.$new_ticket).find("#new-ticket-send").removeClass("hide");
- $('<div class="well" id="ticket-editor">\
- <div class="form-group"><input class="form-control" type="data"\
- placeholder="Subject" data-fieldname="subject"></div>\
- <div class="form-group"><textarea rows=10 class="form-control" \
- style="resize: vertical;" placeholder="Message" \
- data-fieldname="message"></textarea></div>\
- </div>')
- .insertAfter(window.$new_ticket);
- });
-
- window.$new_ticket.find("#new-ticket-send").on("click", function() {
- var subject = $("#ticket-editor").find('[data-fieldname="subject"]').val().trim();
- var message = $("#ticket-editor").find('[data-fieldname="message"]').val().trim();
- if(!(subject && message)) {
- msgprint("Please write something in subject and message!");
- } else {
- frappe.call({
- type: "POST",
- method: "erpnext.templates.pages.tickets.make_new_ticket",
- btn: this,
- args: { subject: subject, message: message },
- callback: function(r) {
- if(r.exc) {
- msgprint(r._server_messages
- ? JSON.parse(r._server_messages).join("<br>")
- : "Something went wrong!");
- } else {
- window.location.href = "ticket?name=" + encodeURIComponent(r.message);
- }
- }
- })
- }
- });
- });
-
- var msgprint = function(txt) {
- if(txt) $("#msgprint-alert").html(txt).toggle(true);
- }
-</script>
-
-<!-- no-sidebar -->
-{% endblock %}
-
diff --git a/erpnext/templates/pages/tickets.py b/erpnext/templates/pages/tickets.py
deleted file mode 100644
index 393c020..0000000
--- a/erpnext/templates/pages/tickets.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.utils import cint, formatdate
-
-no_cache = 1
-no_sitemap = 1
-
-def get_context(context):
- return {
- "title": "My Tickets",
- "method": "erpnext.templates.pages.tickets.get_tickets",
- "icon": "icon-ticket",
- "empty_list_message": "No Tickets Raised",
- "page": "ticket"
- }
-
-@frappe.whitelist()
-def get_tickets(start=0):
- tickets = frappe.db.sql("""select name, subject, status, creation
- from `tabIssue` where raised_by=%s
- order by modified desc
- limit %s, 20""", (frappe.session.user, cint(start)), as_dict=True)
- for t in tickets:
- t.creation = formatdate(t.creation)
-
- return tickets
-
-@frappe.whitelist()
-def make_new_ticket(subject, message):
- if not (subject and message):
- raise frappe.throw(_("Please write something in subject and message!"))
-
- ticket = frappe.get_doc({
- "doctype":"Issue",
- "subject": subject,
- "raised_by": frappe.session.user,
- })
- ticket.insert(ignore_permissions=True)
-
- comm = frappe.get_doc({
- "doctype":"Communication",
- "subject": subject,
- "content": message,
- "sender": frappe.session.user,
- "sent_or_received": "Received",
- "reference_doctype": "Issue",
- "reference_name": ticket.name
- })
- comm.insert(ignore_permissions=True)
-
- return ticket.name