From b4212ad05f1dbe044b19a00a05c742b76597baf1 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Thu, 13 Jan 2022 18:34:41 +0530 Subject: [PATCH] refactor: setting input value for link fields --- frappe/boot.py | 4 +- frappe/public/js/frappe/form/controls/link.js | 74 +++++++------------ 2 files changed, 27 insertions(+), 51 deletions(-) diff --git a/frappe/boot.py b/frappe/boot.py index 0bccda7b8f..ca48f8b42e 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -89,7 +89,7 @@ def get_bootinfo(): bootinfo.additional_filters_config = get_additional_filters_from_hooks() bootinfo.desk_settings = get_desk_settings() bootinfo.app_logo_url = get_app_logo() - bootinfo.doctypes_with_show_link_field_title = doctypes_with_show_link_field_title() + bootinfo.link_title_doctypes = get_link_title_doctypes() return bootinfo @@ -328,7 +328,7 @@ def get_desk_settings(): def get_notification_settings(): return frappe.get_cached_doc('Notification Settings', frappe.session.user) -def doctypes_with_show_link_field_title(): +def get_link_title_doctypes(): dts = frappe.get_all("DocType", {"show_title_field_in_link": 1}) custom_dts = frappe.get_all("Property Setter", {"field_name": "show_title_field_in_link", "value": 1}) return [d.name for d in dts + custom_dts if d] diff --git a/frappe/public/js/frappe/form/controls/link.js b/frappe/public/js/frappe/form/controls/link.js index 4dc6cc8681..974bff6f1f 100644 --- a/frappe/public/js/frappe/form/controls/link.js +++ b/frappe/public/js/frappe/form/controls/link.js @@ -74,17 +74,32 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat set_formatted_input(value) { super.set_formatted_input(); if (!value) return; - let doctype = this.get_options(); - this.set_data_value(frappe.utils.get_link_title(doctype, value) || value, value); - } - set_data_value(link_display, value) { - if (!this.$input) { - return; - } - this.$input.val(link_display); + this.set_link_title(value); this.data_value = value; } + set_link_title(value) { + let doctype = this.get_options(); + + if (!doctype) return; + if (!in_list(frappe.boot.link_title_doctypes, doctype)) return; + + let link_title = frappe.utils.get_link_title(doctype, value); + if (!link_title) { + frappe.xcall("frappe.desk.search.get_link_title", { + "doctype": doctype, + "docname": value + }).then(link_title => { + if (link_title && value !== link_title) { + this.set_input_value(link_title); + } else { + this.set_input_value(value); + } + }); + } else { + this.set_input_value(link_title); + } + } parse_validate_and_set_in_model(value, label, e) { if (this.parse) value = this.parse(value, label); if (label) { @@ -94,53 +109,14 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat return this.validate_and_set_in_model(value, e); } - validate_and_set_in_model(value, e) { - var me = this; - let force_value_set = (this.doc && this.doc.__run_link_triggers); - let is_value_same = (this.get_model_value() === value); - - if (this.inside_change_event || (!force_value_set && is_value_same)) { - return Promise.resolve(); - } - - this.inside_change_event = true; - function set(value) { - me.inside_change_event = false; - return frappe.run_serially([ - () => me._validated = true, - () => me.set_model_value(value), - () => delete me._validated, - () => { - me.set_mandatory && me.set_mandatory(value); - - if(me.df.change || me.df.onchange) { - // onchange event specified in df - frappe.utils.set_link_title(me); - let set = (me.df.change || me.df.onchange).apply(me, [e]); - me.set_invalid && me.set_invalid(); - return set; - } - me.set_invalid && me.set_invalid(); - } - ]); - }; - value = this.validate(value); - if (value && value.then) { - // got a promise - return value.then((value) => set(value)); - } else { - // all clear - return set(value); - } - } get_input_value() { return (this.$input && this.data_value && this.$input.val()) ? this.data_value : ""; } get_label_value() { return this.$input ? this.$input.val() : ""; } - set_input_label(label) { - this.$input && this.$input.val(label); + set_input_value(value) { + this.$input && this.$input.val(value); } reset_value() { if (!this.$input) {