From 8c57fcc0b24f7a9862974daaf523ca986ec4e6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 11 Dec 2023 18:47:12 +0100 Subject: [PATCH] Return a promise when executing an action This is useful to trigger event after the action is executed. --- sao/src/action.js | 17 +++++++---------- sao/src/tab.js | 2 +- sao/src/wizard.js | 31 +++++++++++++++++-------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/sao/src/action.js b/sao/src/action.js index f930c2a433..83fc9ad977 100644 --- a/sao/src/action.js +++ b/sao/src/action.js @@ -110,11 +110,10 @@ if (action.keyword) { name_prm = add_name_suffix(action.name, params.context); } - name_prm.then(function(name) { + return name_prm.then(function(name) { params.name = name; - Sao.Tab.create(params); + return Sao.Tab.create(params); }); - return; case 'ir.action.wizard': params.action = action.wiz_name; params.data = data; @@ -124,21 +123,19 @@ if ((action.keyword || 'form_action') === 'form_action') { name_prm = add_name_suffix(action.name, context); } - name_prm.done(function(name) { + return name_prm.then(function(name) { params.name = name; - Sao.Wizard.create(params); + return Sao.Wizard.create(params); }); - return; case 'ir.action.report': params.name = action.report_name; params.data = data; params.direct_print = action.direct_print; params.context = context; - Sao.Action.exec_report(params); - return; + return Sao.Action.exec_report(params); case 'ir.action.url': window.open(action.url, '_blank', 'noreferrer,noopener'); - return; + return jQuery.when(); } }; @@ -213,7 +210,7 @@ action.keyword = keywords[action.type]; } } - Sao.Action.exec_action(action, data, context); + return Sao.Action.exec_action(action, data, context); }; Sao.Action.evaluate = function(action, atype, record) { diff --git a/sao/src/tab.js b/sao/src/tab.js index 8bc5702aed..5ceac5f1cd 100644 --- a/sao/src/tab.js +++ b/sao/src/tab.js @@ -420,7 +420,7 @@ } else { tab = new Sao.Tab.Board(attributes); } - tab.view_prm.done(function() { + return tab.view_prm.then(function() { Sao.Tab.add(tab); }); }; diff --git a/sao/src/wizard.js b/sao/src/wizard.js index 1b0f576ea2..72a029045f 100644 --- a/sao/src/wizard.js +++ b/sao/src/wizard.js @@ -37,42 +37,42 @@ this.context.active_ids = this.ids; this.context.active_model = this.model; this.context.action_id = this.action_id; - Sao.rpc({ + return Sao.rpc({ 'method': 'wizard.' + this.action + '.create', 'params': [this.session.context] }, this.session).then(result => { this.session_id = result[0]; this.start_state = this.state = result[1]; this.end_state = result[2]; - this.process(); + return this.process(); }, () => { this.destroy(); }); }, process: function() { if (this.__processing || this.__waiting_response) { - return; + return jQuery.when(); } var process = function() { if (this.state == this.end_state) { - this.end(); - return; + return this.end(); } var ctx = jQuery.extend({}, this.context); var data = {}; if (this.screen) { data[this.screen_state] = this.screen.get_on_change_value(); } - Sao.rpc({ + return Sao.rpc({ 'method': 'wizard.' + this.action + '.execute', 'params': [this.session_id, data, this.state, ctx] }, this.session).then(result => { + var prms = []; if (result.view) { this.clean(); var view = result.view; this.update(view.fields_view, view.buttons); - this.screen.new_(false).then(() => { + prms.push(this.screen.new_(false).then(() => { this.screen.current_record.set_default( view.defaults || {}) .then(() => { @@ -81,7 +81,7 @@ this.update_buttons(); this.screen.set_cursor(); }); - }); + })); this.screen_state = view.state; this.__waiting_response = true; @@ -90,6 +90,7 @@ } const execute_actions = () => { + var prms = []; if (result.actions) { for (const action of result.actions) { var context = jQuery.extend({}, this.context); @@ -98,24 +99,26 @@ delete context.active_ids; delete context.active_model; delete context.action_id; - Sao.Action.execute( - action[0], action[1], context); + prms.push(Sao.Action.execute( + action[0], action[1], context)); } } + return jQuery.when.apply(jQuery, prms); }; if (this.state == this.end_state) { - this.end().then(execute_actions); + prms.push(this.end().then(execute_actions)); } else { - execute_actions(); + prms.push(execute_actions()); } this.__processing = false; + return jQuery.when.apply(jQuery, prms); }, result => { // TODO end for server error. this.__processing = false; }); }; - process.call(this); + return process.call(this); }, destroy: function(action) { // TODO @@ -203,7 +206,7 @@ } else { win = new Sao.Wizard.Dialog(attributes.name); } - win.run(attributes); + return win.run(attributes); }; Sao.Wizard.Form = Sao.class_(Sao.Wizard, {