diff --git a/frappe/public/js/frappe/form/save.js b/frappe/public/js/frappe/form/save.js index 46bf42b421..2826c0e6ec 100644 --- a/frappe/public/js/frappe/form/save.js +++ b/frappe/public/js/frappe/form/save.js @@ -168,7 +168,6 @@ frappe.ui.form.save = function (frm, action, callback, btn) { // callback: callback, // btn: btn // } - $(opts.btn).prop("disabled", true); if (frappe.ui.form.is_saving) { // this is likely to happen if the user presses the shortcut cmd+s for a longer duration or uses double click @@ -190,6 +189,7 @@ frappe.ui.form.save = function (frm, action, callback, btn) { opts.callback && opts.callback(r); }, always: function (r) { + $(btn).prop("disabled", false); frappe.ui.form.is_saving = false; if (r) { var doc = r.docs && r.docs[0]; diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index a428e0db07..5357f7160c 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -290,16 +290,16 @@ frappe.ui.form.Toolbar = Class.extend({ } else { var click = { "Save": function() { - me.frm.save('Save', null, this); + return me.frm.save('Save', null, this); }, "Submit": function() { - me.frm.savesubmit(this); + return me.frm.savesubmit(this); }, "Update": function() { - me.frm.save('Update', null, this); + return me.frm.save('Update', null, this); }, "Amend": function() { - me.frm.amend_doc(); + return me.frm.amend_doc(); } }[status]; diff --git a/frappe/public/js/frappe/request.js b/frappe/public/js/frappe/request.js index e2a894af7b..1100d86f26 100644 --- a/frappe/public/js/frappe/request.js +++ b/frappe/public/js/frappe/request.js @@ -239,7 +239,9 @@ frappe.request.prepare = function(opts) { frappe.request.cleanup = function(opts, r) { // stop button indicator - if(opts.btn) $(opts.btn).prop("disabled", false); + if(opts.btn) { + $(opts.btn).prop("disabled", false); + } $("body").attr("data-ajax-state", "complete"); diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index f0deb6ba01..416a7a1f17 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -698,7 +698,7 @@ _f.Frm.prototype.save = function(save_action, callback, btn, on_error) { _f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve) { var me = this; if(!save_action) save_action = "Save"; - this.validate_form_action(save_action); + this.validate_form_action(save_action, resolve); if((!this.meta.in_dialog || this.in_form) && !this.meta.istable) { frappe.utils.scroll_to(0); @@ -712,8 +712,9 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve) me.script_manager.trigger("after_save"); me.refresh(); } else { - if(on_error) + if(on_error) { on_error(); + } } callback && callback(r); resolve(); @@ -722,23 +723,22 @@ _f.Frm.prototype._save = function(save_action, callback, btn, on_error, resolve) if(save_action != "Update") { // validate frappe.validated = true; - Promise.all([ - this.script_manager.trigger("validate"), - this.script_manager.trigger("before_save") - ]).then(() => { - // done is called after all ajaxes in validate & before_save are completed :) - - if(!frappe.validated) { - btn && $(btn).prop("disabled", false); - if(on_error) { - on_error(); + frappe.run_serially([ + () => this.script_manager.trigger("validate"), + () => this.script_manager.trigger("before_save"), + () => { + if(!frappe.validated) { + btn && $(btn).prop("disabled", false); + if(on_error) { + on_error(); + } + resolve(); + return; } - resolve(); - return; - } - frappe.ui.form.save(me, save_action, after_save, btn); - }); + frappe.ui.form.save(me, save_action, after_save, btn); + } + ]); } else { frappe.ui.form.save(me, save_action, after_save, btn); } @@ -757,7 +757,7 @@ _f.Frm.prototype.savesubmit = function(btn, callback, on_error) { return; } - me.save('Submit', function(r) { + return me.save('Submit', function(r) { if(!r.exc) { frappe.utils.play_sound("submit"); callback && callback(); @@ -929,7 +929,7 @@ _f.Frm.prototype.action_perm_type_map = { "Delete": "delete" }; -_f.Frm.prototype.validate_form_action = function(action) { +_f.Frm.prototype.validate_form_action = function(action, resolve) { var perm_to_check = this.action_perm_type_map[action]; var allowed_for_workflow = false; var perms = frappe.perm.get_perm(this.doc.doctype)[0]; @@ -943,6 +943,10 @@ _f.Frm.prototype.validate_form_action = function(action) { } if (!this.perm[0][perm_to_check] && !allowed_for_workflow) { + if(resolve) { + // re-enable buttons + resolve(); + } frappe.throw (__("No permission to '{0}' {1}", [__(action), __(this.doc.doctype)])); } };