From 7d31b863ca404bd328840f8f3288cfc3034a3559 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Mon, 8 Apr 2019 06:23:53 +0000 Subject: [PATCH] [FIX] web: list: re-evalute modifiers depending on id In an editable (main) list view with modifiers depending on the record id, add a new record. While the record isn't created yet, the modifiers were correctly evaluated. However, they weren't re-evaluted when the record was saved (thus getting an id), and a reload of the view was necessary for the modifiers to be correctly applied. With this rev. they are now correctly re-evaluated when the record is saved. closes odoo/odoo#32483 Signed-off-by: Martin Geubelle (mge) --- .../js/views/list/list_editable_renderer.js | 12 ++++++ addons/web/static/tests/views/list_tests.js | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js index 07363b2febd..04da1bc4983 100644 --- a/addons/web/static/src/js/views/list/list_editable_renderer.js +++ b/addons/web/static/src/js/views/list/list_editable_renderer.js @@ -428,6 +428,18 @@ ListRenderer.include({ }); } }, + /** + * @override + */ + updateState: function (state, params) { + if (params.noRender) { + // the state changed, but we won't do a re-rendering right now, so + // remove computed modifiers data (as they are obsolete) to force + // them to be recomputed at next (sub-)rendering + this.allModifiersData = []; + } + return this._super.apply(this, arguments); + }, //-------------------------------------------------------------------------- // Private diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 13b5740b66a..d3ffba0a077 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -4153,6 +4153,47 @@ QUnit.module('Views', { list.destroy(); }); + + QUnit.test('create record on list with modifiers depending on id', function (assert) { + assert.expect(8); + + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '' + + '' + + '' + + '' + + '', + }); + + // add a new record + testUtils.dom.click(list.$buttons.find('.o_list_button_add')); + + // modifiers should be evaluted to false + assert.containsOnce(list, '.o_selected_row'); + assert.doesNotHaveClass(list.$('.o_selected_row .o_data_cell:first'), 'o_readonly_modifier'); + assert.doesNotHaveClass(list.$('.o_selected_row .o_data_cell:nth(1)'), 'o_invisible_modifier'); + + // set a value and save + testUtils.fields.editInput(list.$('.o_selected_row input[name=foo]'), 'some value'); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); + + // modifiers should be evaluted to true + assert.hasClass(list.$('.o_data_row:first .o_data_cell:first'), 'o_readonly_modifier'); + assert.hasClass(list.$('.o_data_row:first .o_data_cell:nth(1)'), 'o_invisible_modifier'); + + // edit again the just created record + testUtils.dom.click(list.$('.o_data_row:first .o_data_cell:first')); + + // modifiers should be evaluted to true + assert.containsOnce(list, '.o_selected_row'); + assert.hasClass(list.$('.o_selected_row .o_data_cell:first'), 'o_readonly_modifier'); + assert.hasClass(list.$('.o_selected_row .o_data_cell:nth(1)'), 'o_invisible_modifier'); + + list.destroy(); + }); }); });