From 852f597eeab49824cebec7b4cc9130b460d59dd3 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 10:46:40 +0530 Subject: [PATCH 01/13] added utility to check broken links from web pages --- frappe/website/doctype/web_page/web_page.py | 26 ++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index 7ec632b776..e352b88668 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -2,10 +2,34 @@ # MIT License. See license.txt from __future__ import unicode_literals -import frappe, os, time +import frappe, os, time, re +import requests, requests.exceptions from frappe.website.website_generator import WebsiteGenerator from frappe.website.utils import cleanup_page_name from frappe.utils import cint class WebPage(WebsiteGenerator): save_versions = True + +def check_broken_links(): + cnt = 0 + for p in frappe.db.sql("select name, main_section from `tabWeb Page`", as_dict=True): + for link in re.findall('href=["\']([^"\']*)["\']', p.main_section): + if link.startswith("http"): + try: + res = requests.get(link) + except requests.exceptions.SSLError: + res = frappe._dict({"status_code": "SSL Error"}) + + if res.status_code!=200: + print "[{0}] {1}: {2}".format(res.status_code, p.name, link) + cnt += 1 + else: + link = link[1:] # remove leading / + link = link.split("#")[0] + + if not frappe.db.exists("Website Route", link): + print p.name + ":" + link + cnt += 1 + + print "{0} links broken".format(cnt) From 6b18f5f6f952e9245def3ac81b23e477e9912893 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 13:59:16 +0530 Subject: [PATCH 02/13] show timestamp on date (fixes frappe/erpnext#1085), fix to bad link checker --- frappe/public/js/frappe/misc/pretty_date.js | 12 +++++++----- frappe/website/doctype/web_page/web_page.py | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/misc/pretty_date.js b/frappe/public/js/frappe/misc/pretty_date.js index a35ff08d22..3933d93bc2 100644 --- a/frappe/public/js/frappe/misc/pretty_date.js +++ b/frappe/public/js/frappe/misc/pretty_date.js @@ -3,13 +3,13 @@ function prettyDate(time){ var date = time; if(typeof(time)=="string") date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")); - + var diff = (((new Date()).getTime() - date.getTime()) / 1000), day_diff = Math.floor(diff / 86400); - + if ( isNaN(day_diff) || day_diff < 0 ) return ''; - + return when = day_diff == 0 && ( diff < 60 && "just now" || diff < 120 && "1 minute ago" || @@ -21,12 +21,14 @@ function prettyDate(time){ day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" || day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" || "> " + Math.floor( day_diff / 365 ) + " year(s) ago"; - + } var comment_when = function(datetime) { - return '' + prettyDate(datetime) + ''; + return '' + + prettyDate(datetime) + ''; }; frappe.provide("frappe.datetime"); diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index e352b88668..d2eebc093f 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -20,6 +20,8 @@ def check_broken_links(): res = requests.get(link) except requests.exceptions.SSLError: res = frappe._dict({"status_code": "SSL Error"}) + except requests.exceptions.ConnectionError: + res = frappe._dict({"status_code": "Connection Error"}) if res.status_code!=200: print "[{0}] {1}: {2}".format(res.status_code, p.name, link) From 4d3d309ab9cd73cca71db8de804a0ba283684299 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 14:08:04 +0530 Subject: [PATCH 03/13] add export button to actions, fixes frappe/erpnext#1043 --- frappe/public/js/frappe/views/grid_report.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/views/grid_report.js b/frappe/public/js/frappe/views/grid_report.js index 3dc7314cd0..fb36df5ace 100644 --- a/frappe/public/js/frappe/views/grid_report.js +++ b/frappe/public/js/frappe/views/grid_report.js @@ -374,11 +374,9 @@ frappe.views.GridReport = Class.extend({ $('
\ \ - \ - Export \
').appendTo(this.wrapper); - this.wrapper.find(".grid-report-export").click(function() { return me.export(); }); + this.appframe.add_primary_action(__("Export"), function() { return me.export(); }, "icon-download"); // grid wrapper this.grid_wrapper = $("
=0; i--) { + for (var i=integer.length; i>=0; i--) { var l = replace_all(str, info.group_sep, "").length; if(format=="#,##,###.##" && str.indexOf(",")!=-1) { // INR group_position = 2; l += 1; } - - str += integer.charAt(i); + + str += integer.charAt(i); if (l && !((l+1) % group_position) && i!=0 ) { str += info.group_sep; @@ -110,10 +111,10 @@ window.format_number = function(v, format, decimals){ if(part[0]+""=="") { part[0]="0"; } - + // join decimal part[1] = part[1] ? (info.decimal_str + part[1]) : ""; - + // join return (is_negative ? "-" : "") + part[0] + part[1]; }; @@ -150,13 +151,13 @@ function get_number_format(currency) { || frappe.model.get_value("Currency", frappe.boot.sysdefaults.currency, "number_format") || "#,###.##"; } - + var number_format; if(currency && frappe.boot) { - number_format = frappe.model.get_value("Currency", currency, + number_format = frappe.model.get_value("Currency", currency, "number_format"); } - + return number_format || global_number_format; } @@ -205,4 +206,4 @@ function in_list(list, item) { for(var i=0, j=list.length; i Date: Tue, 27 May 2014 16:27:08 +0530 Subject: [PATCH 06/13] validate docstatus in workflow, fixes frappe/erpnext#1349 --- frappe/core/doctype/workflow/workflow.py | 23 +++++++++++++++++++ .../workflow_document_state.json | 8 ++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/frappe/core/doctype/workflow/workflow.py b/frappe/core/doctype/workflow/workflow.py index 629b63b9d1..14dc47bcdc 100644 --- a/frappe/core/doctype/workflow/workflow.py +++ b/frappe/core/doctype/workflow/workflow.py @@ -13,6 +13,7 @@ class Workflow(Document): self.set_active() self.create_custom_field_for_workflow_state() self.update_default_workflow_status() + self.validate_docstatus() def on_update(self): frappe.clear_cache(doctype=self.document_type) @@ -46,6 +47,28 @@ class Workflow(Document): '%s', self.workflow_state_field, "%s"), (d.state, d.doc_status)) docstatus_map[d.doc_status] = d.state + def validate_docstatus(self): + def get_state(state): + for s in self.workflow_document_states: + if s.state==state: + return s + + frappe.throw(frappe._("{0} in not a valid States").format(state)) + + for t in self.workflow_transitions: + state = get_state(t.state) + next_state = get_state(t.next_state) + + if state.doc_status=="2": + frappe.throw(frappe._("Cannot change state of Cancelled Document. Transition row {0}").format(t.idx)) + + if state.doc_status=="1" and next_state.doc_status=="0": + frappe.throw(frappe._("Submitted Document cannot be converted back to draft. Transition row {0}").format(t.idx)) + + if state.doc_status=="0" and next_state.doc_status=="2": + frappe.throw(frappe._("Cannot cancel before submitting. See Transition {0}").format(t.idx)) + + def set_active(self): if int(self.is_active or 0): # clear all other diff --git a/frappe/core/doctype/workflow_document_state/workflow_document_state.json b/frappe/core/doctype/workflow_document_state/workflow_document_state.json index 67fb37028a..dfe287074d 100644 --- a/frappe/core/doctype/workflow_document_state/workflow_document_state.json +++ b/frappe/core/doctype/workflow_document_state/workflow_document_state.json @@ -1,6 +1,6 @@ { "allow_import": 1, - "creation": "2013-02-22 01:27:36.000000", + "creation": "2013-02-22 01:27:36", "description": "Represents the states allowed in one document and role assigned to change the state.", "docstatus": 0, "doctype": "DocType", @@ -18,6 +18,7 @@ "width": "160px" }, { + "description": "0 - Draft; 1 - Submitted; 2 - Cancelled", "fieldname": "doc_status", "fieldtype": "Select", "in_list_view": 1, @@ -65,9 +66,10 @@ ], "idx": 1, "istable": 1, - "modified": "2013-12-20 19:21:55.000000", + "modified": "2014-05-27 06:35:01.070157", "modified_by": "Administrator", "module": "Core", "name": "Workflow Document State", - "owner": "Administrator" + "owner": "Administrator", + "permissions": [] } \ No newline at end of file From 8da423b46e43b6efe8676eed20c5b45f72d3b0cb Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 16:46:31 +0530 Subject: [PATCH 07/13] id missing in filters, fixes frappe/erpnext#1697 --- frappe/public/js/frappe/ui/filters.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frappe/public/js/frappe/ui/filters.js b/frappe/public/js/frappe/ui/filters.js index 1b9409e1a6..3fef1c6bd8 100644 --- a/frappe/public/js/frappe/ui/filters.js +++ b/frappe/public/js/frappe/ui/filters.js @@ -21,8 +21,10 @@ frappe.ui.FilterList = Class.extend({ show_filters: function() { this.$w.find('.show_filters').toggle(); - if(!this.filters.length) + if(!this.filters.length) { this.add_filter(); + this.filters[0].$w.find(".filter_field input").focus(); + } }, clear_filters: function() { @@ -116,7 +118,9 @@ frappe.ui.Filter = Class.extend({ me.set_field(doctype, fieldname); } }); - this.fieldselect.set_value(this.doctype, this.fieldname); + if(this.fieldname) { + this.fieldselect.set_value(this.doctype, this.fieldname); + } }, set_events: function() { var me = this; @@ -300,7 +304,7 @@ frappe.ui.FieldSelect = Class.extend({ source: me.options, minLength: 0, focus: function(event, ui) { - me.$select.val(ui.item.label); + ui.item && me.$select.val(ui.item.label); return false; }, select: function(event, ui) { From a833627bb5ff17e1ec8fe704b98035d9906cc7d0 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 17:23:55 +0530 Subject: [PATCH 08/13] moved draft/submitted/cancelled selectors to listing.js, fixes frappe/erpnext#1519 --- frappe/public/js/frappe/ui/listing.js | 31 ++++++++++++++++ frappe/public/js/frappe/views/doclistview.js | 39 -------------------- frappe/public/js/frappe/views/listview.js | 1 + frappe/public/js/frappe/views/reportview.js | 1 - 4 files changed, 32 insertions(+), 40 deletions(-) diff --git a/frappe/public/js/frappe/ui/listing.js b/frappe/public/js/frappe/ui/listing.js index 31518fff2b..f5924ebc48 100644 --- a/frappe/public/js/frappe/ui/listing.js +++ b/frappe/public/js/frappe/ui/listing.js @@ -64,6 +64,20 @@ frappe.ui.Listing = Class.extend({ $.extend(this, this.opts); $(this.parent).html(repl('\ +
\ +
\ +
\ +
\ +
\
\

%(title)s

\ \ @@ -120,6 +134,7 @@ frappe.ui.Listing = Class.extend({ if(this.show_filters) { this.make_filters(); } + this.setup_docstatus_filter(); }, add_button: function(label, click, icon) { if(this.appframe) { @@ -213,6 +228,17 @@ frappe.ui.Listing = Class.extend({ }); }, + setup_docstatus_filter: function() { + var me = this; + this.can_submit = frappe.model.is_submittable(me.doctype); + if(this.can_submit) { + $(this.parent).find('.show-docstatus').removeClass('hide'); + $(this.parent).find('.show-docstatus input').click(function() { + me.run(); + }) + } + }, + clear: function() { this.data = []; this.$w.find('.result-list').empty(); @@ -263,6 +289,11 @@ frappe.ui.Listing = Class.extend({ } } + args.docstatus = this.can_submit ? $.map($(this.parent).find('.show-docstatus :checked'), + function(inp) { + return $(inp).attr('data-docstatus'); + }) : [] + // append user-defined arguments if(this.args) $.extend(args, this.args) diff --git a/frappe/public/js/frappe/views/doclistview.js b/frappe/public/js/frappe/views/doclistview.js index 86c9b0cf80..8621e5465b 100644 --- a/frappe/public/js/frappe/views/doclistview.js +++ b/frappe/public/js/frappe/views/doclistview.js @@ -57,25 +57,6 @@ frappe.views.DocListView = frappe.ui.Listing.extend({
'+__('Loading')+'...
') .appendTo(this.$page.find(".layout-main-section")); - $('
\ -
Show
\ -
\ -
\ -
\ -
\ -
\ -
') - .appendTo(this.$page.find(".layout-side-section")); - this.$page.find(".layout-main-section") .addClass("listview-main-section") .parent().css({"margin-top":"-15px"}); @@ -93,7 +74,6 @@ frappe.views.DocListView = frappe.ui.Listing.extend({ this.meta = locals.DocType[this.doctype]; this.$page.find('.frappe-list-area').empty(), this.setup_listview(); - this.setup_docstatus_filter(); this.init_list(false); this.init_stats(); this.init_minbar(); @@ -149,19 +129,6 @@ frappe.views.DocListView = frappe.ui.Listing.extend({ this.appframe.add_help_button(this.meta.description); } }, - setup_docstatus_filter: function() { - var me = this; - this.can_submit = $.map(locals.DocPerm || [], function(d) { - if(d.parent==me.meta.name && d.submit) return 1 - else return null; - }).length; - if(this.can_submit) { - this.$page.find('.show-docstatus').removeClass('hide'); - this.$page.find('.show-docstatus input').click(function() { - me.run(); - }) - } - }, setup_listview: function() { this.listview = frappe.views.get_listview(this.doctype, this); this.wrapper = this.$page.find('.frappe-list-area'); @@ -252,16 +219,10 @@ frappe.views.DocListView = frappe.ui.Listing.extend({ this.listview.render(row, data, this); }, get_args: function() { - var docstatus_list = this.can_submit ? $.map(this.$page.find('.show-docstatus :checked'), - function(inp) { - return $(inp).attr('data-docstatus'); - }) : [] - var args = { doctype: this.doctype, fields: this.listview.fields, filters: this.filter_list.get_filters(), - docstatus: docstatus_list, order_by: this.listview.order_by || undefined, group_by: this.listview.group_by || undefined, } diff --git a/frappe/public/js/frappe/views/listview.js b/frappe/public/js/frappe/views/listview.js index 4ceb618202..144974bc58 100644 --- a/frappe/public/js/frappe/views/listview.js +++ b/frappe/public/js/frappe/views/listview.js @@ -246,6 +246,7 @@ frappe.views.ListView = Class.extend({ var col = $("
") .appendTo(body) .addClass("col-sm-" + cint(colspan)) + .addClass("col-xs-" + (cint(colspan) + 2)) .css({ "white-space": "nowrap", "text-overflow": "ellipsis", diff --git a/frappe/public/js/frappe/views/reportview.js b/frappe/public/js/frappe/views/reportview.js index 07960f6bc0..b4bbad8b75 100644 --- a/frappe/public/js/frappe/views/reportview.js +++ b/frappe/public/js/frappe/views/reportview.js @@ -171,7 +171,6 @@ frappe.views.ReportView = frappe.ui.Listing.extend({ fields: $.map(this.columns, function(v) { return me.get_full_column_name(v) }), order_by: this.get_order_by(), filters: this.filter_list.get_filters(), - docstatus: ['0','1','2'], with_childnames: 1 } }, From c61b45dcedddc7689e9e9f404f53fa5f9ca3028c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 17:29:24 +0530 Subject: [PATCH 09/13] added german date format dd.mm.yyyy fixes frappe/erpnext#1185 --- .../system_settings/system_settings.json | 4 ++-- frappe/public/js/legacy/datetime.js | 6 ++++++ frappe/utils/dateutils.py | 17 +++++++++-------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 572120bcb8..940b9ab63b 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -37,7 +37,7 @@ "fieldname": "date_format", "fieldtype": "Select", "label": "Date Format", - "options": "yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\nmm/dd/yyyy\nmm-dd-yyyy", + "options": "yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\ndd.mm.yyyy\nmm/dd/yyyy\nmm-dd-yyyy", "permlevel": 0, "reqd": 1 }, @@ -74,7 +74,7 @@ ], "icon": "icon-cog", "issingle": 1, - "modified": "2014-05-27 06:29:28.922976", + "modified": "2014-05-27 07:58:24.700595", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/public/js/legacy/datetime.js b/frappe/public/js/legacy/datetime.js index ff56951989..7b466c706f 100644 --- a/frappe/public/js/legacy/datetime.js +++ b/frappe/public/js/legacy/datetime.js @@ -128,6 +128,8 @@ frappe.datetime = { val = d[2]+'-'+d[1]+'-'+d[0] + time_str; else if(user_fmt=='dd/mm/yyyy') val = d[2]+'/'+d[1]+'/'+d[0] + time_str; + else if(user_fmt=='dd.mm.yyyy') + val = d[2]+'.'+d[1]+'.'+d[0] + time_str; else if(user_fmt=='yyyy-mm-dd') val = d[0]+'-'+d[1]+'-'+d[2] + time_str; else if(user_fmt=='mm/dd/yyyy') @@ -162,6 +164,10 @@ frappe.datetime = { var d = d.split('/'); var val = d[2]+'-'+d[1]+'-'+d[0]; } + else if(user_fmt=='dd.mm.yyyy') { + var d = d.split('.'); + var val = d[2]+'-'+d[1]+'-'+d[0]; + } else if(user_fmt=='yyyy-mm-dd') { var val = d; } diff --git a/frappe/utils/dateutils.py b/frappe/utils/dateutils.py index 096fb44aa8..d244d67d13 100644 --- a/frappe/utils/dateutils.py +++ b/frappe/utils/dateutils.py @@ -12,21 +12,22 @@ dateformats = { 'yyyy-mm-dd': '%Y-%m-%d', 'mm/dd/yyyy': '%m/%d/%Y', 'mm-dd-yyyy': '%m-%d-%Y', - "mm/dd/yy": "%m/%d/%y", + "mm/dd/yy": "%m/%d/%y", 'dd-mmm-yyyy': '%d-%b-%Y', # numbers app format 'dd/mm/yyyy': '%d/%m/%Y', + 'dd.mm.yyyy': '%d.%m.%Y', 'dd-mm-yyyy': '%d-%m-%Y', "dd/mm/yy": "%d/%m/%y", } def user_to_str(date, date_format=None): if not date: return date - + if not date_format: date_format = get_user_date_format() try: - return datetime.datetime.strptime(date, + return datetime.datetime.strptime(date, dateformats[date_format]).strftime('%Y-%m-%d') except ValueError, e: raise ValueError, "Date %s must be in format %s" % (date, date_format) @@ -34,11 +35,11 @@ def user_to_str(date, date_format=None): def parse_date(date): """tries to parse given date to system's format i.e. yyyy-mm-dd. returns a string""" parsed_date = None - + # why the sorting? checking should be done in a predictable order check_formats = [None] + sorted(dateformats.keys(), reverse=not get_user_date_format().startswith("dd")) - + for f in check_formats: try: parsed_date = user_to_str(date, f) @@ -53,17 +54,17 @@ def parse_date(date): (date, get_user_date_format()) return parsed_date - + def get_user_date_format(): if getattr(frappe.local, "user_date_format", None) is None: frappe.local.user_date_format = frappe.defaults.get_global_default("date_format") or "yyyy-mm-dd" return frappe.local.user_date_format - + def datetime_in_user_format(date_time): if not date_time: return "" if isinstance(date_time, basestring): date_time = get_datetime(date_time) from frappe.utils import formatdate - return formatdate(date_time.date()) + " " + date_time.strftime("%H:%M") \ No newline at end of file + return formatdate(date_time.date()) + " " + date_time.strftime("%H:%M") From 3d9abfb185f60a66ba77f0044d4ac4891dfd7792 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 27 May 2014 17:51:19 +0530 Subject: [PATCH 10/13] typo workflow.py --- frappe/core/doctype/workflow/workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/workflow/workflow.py b/frappe/core/doctype/workflow/workflow.py index 14dc47bcdc..3a009af6fa 100644 --- a/frappe/core/doctype/workflow/workflow.py +++ b/frappe/core/doctype/workflow/workflow.py @@ -53,7 +53,7 @@ class Workflow(Document): if s.state==state: return s - frappe.throw(frappe._("{0} in not a valid States").format(state)) + frappe.throw(frappe._("{0} not a valid State").format(state)) for t in self.workflow_transitions: state = get_state(t.state) From 7272290eb18e481a449c90abe05a48574c60a0fa Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 28 May 2014 10:25:46 +0530 Subject: [PATCH 11/13] fixed style for docstatus and filter in listing.js --- frappe/core/doctype/workflow/workflow.py | 1 - frappe/public/css/appframe.css | 2 +- frappe/public/js/frappe/ui/appframe.js | 4 ++-- frappe/public/js/frappe/ui/listing.js | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/workflow/workflow.py b/frappe/core/doctype/workflow/workflow.py index 3a009af6fa..d34b7126a4 100644 --- a/frappe/core/doctype/workflow/workflow.py +++ b/frappe/core/doctype/workflow/workflow.py @@ -68,7 +68,6 @@ class Workflow(Document): if state.doc_status=="0" and next_state.doc_status=="2": frappe.throw(frappe._("Cannot cancel before submitting. See Transition {0}").format(t.idx)) - def set_active(self): if int(self.is_active or 0): # clear all other diff --git a/frappe/public/css/appframe.css b/frappe/public/css/appframe.css index ff4c28d237..464dd49de5 100644 --- a/frappe/public/css/appframe.css +++ b/frappe/public/css/appframe.css @@ -38,7 +38,7 @@ } .titlebar-item.text-right { - margin-top: 5px; + margin-top: 3px; } .titlebar-left-item { diff --git a/frappe/public/js/frappe/ui/appframe.js b/frappe/public/js/frappe/ui/appframe.js index d40b8e556a..1c4d9799da 100644 --- a/frappe/public/js/frappe/ui/appframe.js +++ b/frappe/public/js/frappe/ui/appframe.js @@ -16,7 +16,7 @@ frappe.ui.AppFrame = Class.extend({ \ ').appendTo($center); - this.$sub_title_area = $('
') + this.$sub_title_area = $('
') .appendTo($center); this.setup_iconbar(); @@ -53,7 +53,7 @@ frappe.ui.AppFrame = Class.extend({ set_title_sub: function(txt) { // strip icon - this.$sub_title_area.html(txt); + this.$sub_title_area.html(txt).toggleClass("hide", !!!txt); }, set_title_left: function(click) { diff --git a/frappe/public/js/frappe/ui/listing.js b/frappe/public/js/frappe/ui/listing.js index f5924ebc48..655437874f 100644 --- a/frappe/public/js/frappe/ui/listing.js +++ b/frappe/public/js/frappe/ui/listing.js @@ -64,7 +64,7 @@ frappe.ui.Listing = Class.extend({ $.extend(this, this.opts); $(this.parent).html(repl('\ -
\ +
\