diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index 418c39b14e0..5cf4b022c5d 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -989,6 +989,9 @@ var ListRenderer = BasicRenderer.extend({ return _.contains(self.selection, $(el).data('id')); }); $checked_rows.find('.o_list_record_selector input').prop('checked', true); + if ($checked_rows.length === self.$('.o_data_row').length) { // all rows are checked + self.$('thead .o_list_record_selector input').prop('checked', true); + } } }); return Promise.all([this._super.apply(this, arguments), prom]); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index f2a49f5c339..94a7a3bb156 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -8839,6 +8839,55 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('selection is kept when optional fields are toggled', async function (assert) { + assert.expect(7); + + var RamStorageService = AbstractStorageService.extend({ + storage: new RamStorage(), + }); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '' + + '' + + '' + + '', + services: { + local_storage: RamStorageService, + }, + }); + + assert.containsN(list, 'th', 2); + + // select a record + await testUtils.dom.click(list.$('.o_data_row .o_list_record_selector input:first')); + + assert.containsOnce(list, '.o_list_record_selector input:checked'); + + // add an optional field + await testUtils.dom.click(list.$('table .o_optional_columns_dropdown_toggle')); + await testUtils.dom.click(list.$('div.o_optional_columns div.dropdown-item:first input')); + assert.containsN(list, 'th', 3); + + assert.containsOnce(list, '.o_list_record_selector input:checked'); + + // select all records + await testUtils.dom.click(list.$('thead .o_list_record_selector input')); + + assert.containsN(list, '.o_list_record_selector input:checked', 5); + + // remove an optional field + await testUtils.dom.click(list.$('table .o_optional_columns_dropdown_toggle')); + await testUtils.dom.click(list.$('div.o_optional_columns div.dropdown-item:first input')); + assert.containsN(list, 'th', 2); + + assert.containsN(list, '.o_list_record_selector input:checked', 5); + + list.destroy(); + }); + QUnit.test('change the viewType of the current action', async function (assert) { assert.expect(25);