diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index 0398ed5db1..a00779c69e 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -69,23 +69,61 @@ frappe.ui.form.Toolbar = Class.extend({ can_rename: function() { return this.frm.perm[0].write && this.frm.meta.allow_rename && !this.frm.doc.__islocal; }, + show_unchanged_document_alert: function() { + frappe.show_alert({ + indicator: "yellow", + message: __("Unchanged") + }); + }, + rename_document_title(new_name, new_title, merge=false) { + const docname = this.frm.doc.name; + const title_field = this.frm.meta.title_field || ''; + const doctype = this.frm.doctype; + + const warning = __("This cannot be undone"); + const message = __("Are you sure you want to merge {0} with {1}?", [docname.bold(), new_name.bold()]); + const confirm_message = message + "
" + warning + ""; + + let rename_document = () => { + return frappe.xcall("frappe.model.rename_doc.update_document_title", { + doctype, + docname, + title_field, + old_title: this.frm.doc[title_field], + new_name: new_name, + new_title: new_title, + merge: merge + }).then(new_docname => { + if (new_name != docname) { + $(document).trigger("rename", [doctype, docname, new_docname || new_name]); + if (locals[doctype] && locals[doctype][docname]) delete locals[doctype][docname]; + } + }); + }; + + return new Promise((resolve, reject) => { + if (new_title === this.frm.doc[title_field] && new_name === docname) { + this.show_unchanged_document_alert(); + resolve(); + } else if (merge) { + frappe.confirm(confirm_message, () => { + rename_document().then(resolve).catch(reject); + }, reject); + } else { + rename_document().then(resolve).catch(reject); + } + }); + + }, setup_editable_title: function () { let me = this; - function document_unchanged(){ - frappe.show_alert({ - indicator: "yellow", - message: __("Unchanged") - }) - } - this.page.$title_area.find(".title-text").on("click", () => { let fields = []; - let doctype = me.frm.doctype; let docname = me.frm.doc.name; let title_field = me.frm.meta.title_field || ''; - // check if title is updateable + // check if title is updatable if (me.is_title_editable()) { let title_field_label = me.frm.get_docfield(title_field).label; @@ -98,7 +136,7 @@ frappe.ui.form.Toolbar = Class.extend({ }); } - // check if docname is updateable + // check if docname is updatable if (me.can_rename()) { fields.push(...[{ label: __("New Name"), @@ -121,45 +159,15 @@ frappe.ui.form.Toolbar = Class.extend({ fields: fields }); d.show(); - - d.set_primary_action(__("Rename"), function () { - let args = d.get_values(); - if (args.title != me.frm.doc[title_field] || args.name != docname) { - if (args.merge) { - let warning = __("This cannot be undone"); - let message = __("Are you sure you want to merge {0} with {1}?", [docname.bold(), args.name.bold()]) - let confirm_message = message + "
" + warning + ""; - - frappe.confirm( - confirm_message, - function() { - frappe.call({ - method: "frappe.model.rename_doc.update_document_title", - args: { - doctype, - docname, - title_field, - old_title: me.frm.doc[title_field], - new_title: args.title, - new_name: args.name, - merge: args.merge - }, - btn: d.get_primary_btn() - }).then((res) => { - me.frm.reload_doc(); - if (!res.exc && (args.name != docname)) { - $(document).trigger("rename", [doctype, docname, res.message || args.name]); - if (locals[doctype] && locals[doctype][docname]) delete locals[doctype][docname]; - } - }) - }, - document_unchanged - ); - } - } else { - document_unchanged() - } - d.hide(); + d.set_primary_action(__("Rename"), (values) => { + d.disable_primary_action(); + this.rename_document_title(values.name, values.title, values.merge) + .then(() => { + d.hide(); + }) + .catch(() => { + d.enable_primary_action(); + }); }); } });