summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2017-04-23 13:51:52 +0200
committerGéry Debongnie <ged@odoo.com>2017-04-24 10:43:20 +0200
commita765ff503d3d60eb1dbc3a2c175b60fcafdcd083 (patch)
treed668ea14468d685b7f693250a212b5590615525d /addons/web/static
parente59c1b49c2d9729e5f7576e1c205701a340f9396 (diff)
[FIX] web: reload list view after button action
Before this commit, the code that handled buttons in list view was kind of simple, and did not reload the view after. But clicking on action button is not only a problem for the list view, the form view already had something in the controller doing exactly that. With this commit, we move that code to the basic controller, and use the method in the list view.
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/src/js/views/basic/basic_controller.js35
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js35
-rw-r--r--addons/web/static/src/js/views/list/list_controller.js7
-rw-r--r--addons/web/static/tests/views/list_tests.js9
4 files changed, 45 insertions, 41 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js
index 5293ee6f4b6..7beb15a9d70 100644
--- a/addons/web/static/src/js/views/basic/basic_controller.js
+++ b/addons/web/static/src/js/views/basic/basic_controller.js
@@ -88,6 +88,41 @@ return AbstractController.extend(FieldManagerMixin, {
//--------------------------------------------------------------------------
/**
+ * When the user clicks on a 'action button', this function determines what
+ * should happen.
+ *
+ * @private
+ * @param {Object} attrs the attrs of the button clicked
+ * @param {Object} [record] the current state of the view
+ * @returns {Deferred}
+ */
+ _callButtonAction: function (attrs, record) {
+ var self = this;
+ var def = $.Deferred();
+ var reload = function () {
+ if (!self.isDestroyed()) {
+ self.reload();
+ }
+ };
+ record = record || this.model.get(this.handle);
+ var recordID = record.data.id;
+ this.trigger_up('execute_action', {
+ action_data: _.extend({}, attrs, {
+ context: record.getContext({additionalContext: attrs.context}),
+ }),
+ model: record.model,
+ record_id: recordID,
+ on_closed: function (reason) {
+ if (!_.isObject(reason)) {
+ reload();
+ }
+ },
+ on_fail: reload,
+ on_success: def.resolve.bind(def),
+ });
+ return this.alive(def);
+ },
+ /**
* Called by the field manager mixin to confirm that a change just occured
* (after that potential onchanges have been applied).
*
diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js
index e833c80e3b2..981d614f52c 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -261,41 +261,6 @@ var FormController = BasicController.extend({
//--------------------------------------------------------------------------
/**
- * When the user clicks on a form button, this function determines what
- * should happen.
- *
- * @private
- * @param {Object} attrs the attrs of the button clicked
- * @param {Object} [record] the current state of the view
- * @returns {Deferred}
- */
- _callButtonAction: function (attrs, record) {
- var self = this;
- var def = $.Deferred();
- var reload = function () {
- if (!self.isDestroyed()) {
- self.reload();
- }
- };
- record = record || this.model.get(this.handle);
- var recordID = record.data.id;
- this.trigger_up('execute_action', {
- action_data: _.extend({}, attrs, {
- context: record.getContext({additionalContext: attrs.context}),
- }),
- model: record.model,
- record_id: recordID,
- on_closed: function (reason) {
- if (!_.isObject(reason)) {
- reload();
- }
- },
- on_fail: reload,
- on_success: def.resolve.bind(def),
- });
- return this.alive(def);
- },
- /**
* When a save operation has been confirmed from the model, this method is
* called.
*
diff --git a/addons/web/static/src/js/views/list/list_controller.js b/addons/web/static/src/js/views/list/list_controller.js
index 1f5bb64cac8..d4d1fe9debe 100644
--- a/addons/web/static/src/js/views/list/list_controller.js
+++ b/addons/web/static/src/js/views/list/list_controller.js
@@ -210,11 +210,8 @@ var ListController = BasicController.extend({
* @param {OdooEvent} event
*/
_onButtonClicked: function (event) {
- this.trigger_up('execute_action', {
- action_data: event.data.attrs,
- model: this.modelName,
- record_id: event.data.record.res_id,
- });
+ event.stopPropagation();
+ this._callButtonAction(event.data.attrs, event.data.record);
},
/**
* This event is triggered when a list renderer goes from mode = readonly to
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 59a7aa774b8..a3abe59892b 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -969,7 +969,7 @@ QUnit.module('Views', {
});
QUnit.test('click on a button in a list view', function (assert) {
- assert.expect(6);
+ assert.expect(9);
var list = createView({
View: ListView,
@@ -979,6 +979,10 @@ QUnit.module('Views', {
'<field name="foo"/>' +
'<button string="a button" name="button_action" icon="fa-car" type="object"/>' +
'</tree>',
+ mockRPC: function (route) {
+ assert.step(route);
+ return this._super.apply(this, arguments);
+ },
intercepts: {
execute_action: function (event) {
assert.strictEqual(event.data.record_id, 1,
@@ -989,6 +993,7 @@ QUnit.module('Views', {
"should call correct method");
assert.strictEqual(event.data.action_data.type, 'object',
'should have correct type');
+ event.data.on_closed();
},
},
});
@@ -999,6 +1004,8 @@ QUnit.module('Views', {
'buttons should have correct icon');
list.$('.o_list_button:first > button').click(); // click on the button
+ assert.verifySteps(['/web/dataset/search_read', '/web/dataset/search_read'],
+ "should have reloaded the view (after the action is complete)");
list.destroy();
});