mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-06 21:59:13 +00:00
[fixes] portal, issues, addresses etc
This commit is contained in:
@@ -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 %}
|
||||
@@ -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
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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()
|
||||
@@ -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 %}
|
||||
@@ -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)
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user