From 955856abf4d17c55f769b9aafffd7f23ebbf7097 Mon Sep 17 00:00:00 2001 From: Julien Mougenot Date: Wed, 14 Aug 2019 13:34:23 +0000 Subject: [PATCH] [FIX] web: no selected records after multi edition After editing multiple record, we want don't want any record selected. This commit ensures that. closes odoo/odoo#35678 Signed-off-by: Aaron Bohy (aab) --- .../src/js/views/list/list_controller.js | 2 +- .../js/views/list/list_editable_renderer.js | 19 ++++++++++++------- addons/web/static/tests/views/list_tests.js | 3 ++- 3 files changed, 15 insertions(+), 9 deletions(-) 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 65e2ed7f5a0..c09abc54b91 100644 --- a/addons/web/static/src/js/views/list/list_controller.js +++ b/addons/web/static/src/js/views/list/list_controller.js @@ -406,7 +406,7 @@ var ListController = BasicController.extend({ this._updateButtons('readonly'); const state = this.model.get(this.handle); this.renderer.updateState(state, {}); - resolve(); + resolve(Object.keys(changes)); }) .guardedCatch(rejectAndDiscard); }, 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 3943446d9b6..df0ad782b60 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 @@ -430,7 +430,6 @@ ListRenderer.include({ * user refuses to discard its changes. */ unselectRow: function () { - var self = this; // Protect against calling this method when no row is selected if (this.currentRow === null) { return Promise.resolve(); @@ -439,17 +438,20 @@ ListRenderer.include({ var recordWidgets = this.allFieldWidgets[recordID]; toggleWidgets(true); - var prom = new Promise(function (resolve, reject) { - self.trigger_up('save_line', { + return new Promise((resolve, reject) => { + this.trigger_up('save_line', { recordID: recordID, onSuccess: resolve, onFailure: reject, }); - }); - prom.guardedCatch(function() { + }).then(changedFields => { + // If any field has changed and if the list is in multiple edition, + // we send a truthy boolean to _selectRow to tell it not to select + // the following record. + return changedFields && changedFields.length && this.inMultipleRecordEdition(recordID); + }).guardedCatch(() => { toggleWidgets(false); }); - return prom; function toggleWidgets(disabled) { _.each(recordWidgets, function (widget) { @@ -1004,7 +1006,10 @@ ListRenderer.include({ var recordId = this._getRecordID(rowIndex); // To select a row, the currently selected one must be unselected first var self = this; - return this.unselectRow().then(function () { + return this.unselectRow().then(noSelectNext => { + if (noSelectNext) { + return Promise.resolve(); + } if (!recordId) { // The row to selected doesn't exist anymore (probably because // an onchange triggered when unselecting the previous one diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 36137e4fced..d74bda7578b 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -4448,7 +4448,7 @@ QUnit.module('Views', { }); QUnit.test('editable list view: multi edition', async function (assert) { - assert.expect(21); + assert.expect(22); var list = await createView({ View: ListView, @@ -4511,6 +4511,7 @@ QUnit.module('Views', { await testUtils.dom.click(list.$('.o_data_row:eq(1) .o_data_cell:eq(0)')); assert.ok($('.modal').text().includes('2 selected records'), "the number of records should be correctly displayed"); await testUtils.dom.click($('.modal .btn-primary')); + assert.containsNone(list, '.o_data_cell input.o_field_widget', "no field should be editable anymore"); assert.verifySteps(['write', 'read']); assert.strictEqual(list.$('.o_data_row:eq(0) .o_data_cell').text(), "yop666", "the first row should be updated");