diff --git a/frappe/contacts/address_and_contact.py b/frappe/contacts/address_and_contact.py index 5a004f153b..51f13fb1a1 100644 --- a/frappe/contacts/address_and_contact.py +++ b/frappe/contacts/address_and_contact.py @@ -146,6 +146,7 @@ def delete_contact_and_address(doctype, docname): if len(doc.links)==1: doc.delete() +@frappe.whitelist() def filter_dynamic_link_doctypes(doctype, txt, searchfield, start, page_len, filters): if not txt: txt = "" diff --git a/frappe/contacts/doctype/address/address.py b/frappe/contacts/doctype/address/address.py index b85d578353..57dea8284c 100644 --- a/frappe/contacts/doctype/address/address.py +++ b/frappe/contacts/doctype/address/address.py @@ -230,6 +230,7 @@ def get_company_address(company): return ret +@frappe.whitelist() def address_query(doctype, txt, searchfield, start, page_len, filters): from frappe.desk.reportview import get_match_cond @@ -237,16 +238,17 @@ def address_query(doctype, txt, searchfield, start, page_len, filters): link_name = filters.pop('link_name') condition = "" - for fieldname, value in iteritems(filters): - condition += " and {field}={value}".format( - field=fieldname, - value=value - ) - meta = frappe.get_meta("Address") + for fieldname, value in iteritems(filters): + if meta.get_field(fieldname) or fieldname in frappe.db.DEFAULT_COLUMNS: + condition += " and {field}={value}".format( + field=fieldname, + value=frappe.db.escape(value)) + searchfields = meta.get_search_fields() - if searchfield: + if searchfield and (meta.get_field(searchfield)\ + or searchfield in frappe.db.DEFAULT_COLUMNS): searchfields.append(searchfield) search_condition = '' @@ -289,4 +291,4 @@ def get_condensed_address(doc): return ", ".join([doc.get(d) for d in fields if doc.get(d)]) def update_preferred_address(address, field): - frappe.db.set_value('Address', address, field, 0) \ No newline at end of file + frappe.db.set_value('Address', address, field, 0) diff --git a/frappe/contacts/doctype/contact/contact.py b/frappe/contacts/doctype/contact/contact.py index 4cf209541c..8240940d2f 100644 --- a/frappe/contacts/doctype/contact/contact.py +++ b/frappe/contacts/doctype/contact/contact.py @@ -182,19 +182,17 @@ def update_contact(doc, method): contact.flags.ignore_mandatory = True contact.save(ignore_permissions=True) +@frappe.whitelist() def contact_query(doctype, txt, searchfield, start, page_len, filters): from frappe.desk.reportview import get_match_cond + if not frappe.get_meta("Contact").get_field(searchfield)\ + or searchfield not in frappe.db.DEFAULT_COLUMNS: + return [] + link_doctype = filters.pop('link_doctype') link_name = filters.pop('link_name') - condition = "" - for fieldname, value in iteritems(filters): - condition += " and {field}={value}".format( - field=fieldname, - value=value - ) - return frappe.db.sql("""select `tabContact`.name, `tabContact`.first_name, `tabContact`.last_name from @@ -209,9 +207,7 @@ def contact_query(doctype, txt, searchfield, start, page_len, filters): order by if(locate(%(_txt)s, `tabContact`.name), locate(%(_txt)s, `tabContact`.name), 99999), `tabContact`.idx desc, `tabContact`.name - limit %(start)s, %(page_len)s """.format( - mcond=get_match_cond(doctype), - key=searchfield), { + limit %(start)s, %(page_len)s """.format(mcond=get_match_cond(doctype), key=searchfield), { 'txt': '%' + txt + '%', '_txt': txt.replace("%", ""), 'start': start, diff --git a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js index 6d33d7717b..ee6eb3289d 100644 --- a/frappe/desk/doctype/dashboard_chart/dashboard_chart.js +++ b/frappe/desk/doctype/dashboard_chart/dashboard_chart.js @@ -176,7 +176,7 @@ frappe.ui.form.on('Dashboard Chart', { set_chart_field_options: function(frm) { let filters = frm.doc.filters_json.length > 2 ? JSON.parse(frm.doc.filters_json) : null; - if (frm.doc.dynamic_filters_json.length > 2) { + if (frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2) { filters = frappe.dashboard_utils.get_all_filters(frm.doc); } frappe.xcall( diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js index 8e05a28783..42899a4ebb 100644 --- a/frappe/desk/doctype/number_card/number_card.js +++ b/frappe/desk/doctype/number_card/number_card.js @@ -215,7 +215,7 @@ frappe.ui.form.on('Number Card', { set_report_field_options: function(frm) { let filters = frm.doc.filters_json.length > 2 ? JSON.parse(frm.doc.filters_json) : null; - if (frm.doc.dynamic_filters_json.length > 2) { + if (frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2) { filters = frappe.dashboard_utils.get_all_filters(frm.doc); } frappe.xcall( diff --git a/frappe/email/doctype/email_account/email_account.js b/frappe/email/doctype/email_account/email_account.js index 71f9cccb0d..83896e0af7 100644 --- a/frappe/email/doctype/email_account/email_account.js +++ b/frappe/email/doctype/email_account/email_account.js @@ -95,6 +95,11 @@ frappe.ui.form.on("Email Account", { enable_incoming: function(frm) { frm.doc.no_remaining = null; //perform full sync //frm.set_df_property("append_to", "reqd", frm.doc.enable_incoming); + frm.trigger("warn_autoreply_on_incoming"); + }, + + enable_auto_reply: function(frm) { + frm.trigger("warn_autoreply_on_incoming"); }, notify_if_unreplied: function(frm) { @@ -184,7 +189,18 @@ frappe.ui.form.on("Email Account", { read as well as unread message from server. This may also cause the duplication\ of Communication (emails)."); frappe.confirm(msg, null, function() { - frm.set_value("email_sync_option", "ALL"); + frm.set_value("email_sync_option", "UNSEEN"); + }); + } + }, + + warn_autoreply_on_incoming: function(frm) { + if (frm.doc.enable_incoming && frm.doc.enable_auto_reply && frm.doc.__islocal) { + var msg = __("Enabling auto reply on an incoming email account will send automated replies \ + to all the synchronized emails. Do you wish to continue?"); + frappe.confirm(msg, null, function() { + frm.set_value("enable_auto_reply", 0); + frappe.show_alert({message: __("Disabled Auto Reply"), indicator: "blue"}); }); } } diff --git a/frappe/public/css/email.css b/frappe/public/css/email.css index 40c6149927..5c398009ff 100644 --- a/frappe/public/css/email.css +++ b/frappe/public/css/email.css @@ -7,6 +7,12 @@ body { p { margin: 1em 0 !important; } +.ql-editor { + white-space: normal; +} +.ql-editor p { + margin: 0 !important; +} hr { border-top: 1px solid #d1d8dd; } diff --git a/frappe/public/js/frappe/form/controls/text_editor.js b/frappe/public/js/frappe/form/controls/text_editor.js index e367989b81..3fe0b60ae0 100644 --- a/frappe/public/js/frappe/form/controls/text_editor.js +++ b/frappe/public/js/frappe/form/controls/text_editor.js @@ -69,7 +69,6 @@ Quill.register(CustomColor, true); frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ make_wrapper() { this._super(); - this.$wrapper.find(".like-disabled-input").addClass('ql-editor'); }, make_input() { @@ -201,6 +200,10 @@ frappe.ui.form.ControlTextEditor = frappe.ui.form.ControlCode.extend({ let value = this.quill ? this.quill.root.innerHTML : ''; // hack to retain space sequence. value = value.replace(/(\s)(\s)/g, '  '); + + if (!$(value).find('.ql-editor').length) { + value = `
${value}
`; + } return value; }, diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index 4f9dd377c9..a7adc9175a 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -228,7 +228,12 @@ frappe.form.formatters = { return frappe.form.formatters.Text(value); }, TextEditor: function(value) { - return frappe.form.formatters.Text(value); + let formatted_value = frappe.form.formatters.Text(value); + // to use ql-editor styles + if (!$(formatted_value).find('.ql-editor').length) { + formatted_value = `
${formatted_value}
`; + } + return formatted_value; }, Code: function(value) { return "
" + (value==null ? "" : $("
").text(value).html()) + "
" diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index f5a06311e9..f4bcecc68e 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -392,8 +392,11 @@ export default class GridRow { // sync get_query field.get_query = this.grid.get_field(df.fieldname).get_query; - field.df.onchange = function() { - me.grid.grid_rows[this.doc.idx-1].refresh_field(this.df.fieldname); + + var field_on_change_function = field.df.onchange; + field.df.onchange = function(e) { + field_on_change_function && field_on_change_function(e); + me.grid.grid_rows[this.doc.idx - 1].refresh_field(this.df.fieldname); }; field.refresh(); if(field.$input) { diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index 1f5c8b5cf6..67e674b1c1 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -111,7 +111,7 @@
  • {% if(frappe.get_form_sidebar_extension) { %} - {{ frappe.get_form_sidebar_extension() }} + {{ frappe.get_form_sidebar_extension() }} {% } %}