From 091c86c21bdebe4592fb64ba0f0a589a25b93a27 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 28 Nov 2017 10:22:09 +0100 Subject: [PATCH] [FIX] web: unselect row before resequencing in editable list If a row is being edited, this row will be refocused when performing changes (i.e. resequencing records). It can cause an issue if an onchange modifies the record being focused. To avoid this issue, the row is unselected before resequencing records. The row isn't selected anymore but this behaviour wasn't expected anyway. --- .../js/views/list/list_editable_renderer.js | 11 ++-- .../tests/fields/relational_fields_tests.js | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) 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 2ca50804a08..b57d44e7de2 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 @@ -579,11 +579,12 @@ ListRenderer.include({ if (!asc) { rowIDs.reverse(); } - - this.trigger_up('resequence', { - rowIDs: rowIDs, - offset: _.min(sequences), - handleField: this.handleField, + this.unselectRow().then(function () { + self.trigger_up('resequence', { + rowIDs: rowIDs, + offset: _.min(sequences), + handleField: self.handleField, + }); }); }, /** diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 2fece637fbb..38da53c177a 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -2410,6 +2410,57 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('onchange (with command 5) for embedded one2many with handle widget', function (assert) { + assert.expect(2); + + this.data.partner.records[0].turtles = [1, 2, 3]; + this.data.partner.onchanges = { + turtles: function (obj) { + obj.turtles = [[5]].concat(obj.turtles); + }, + }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + }); + + assert.strictEqual(form.$('td.o_data_cell:not(.o_handle_cell)').text(), "yopblipkawa", + "should have the 3 rows in the correct order"); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_field_one2many .o_list_view tbody tr:first td:first').click(); + form.$('.o_field_one2many .o_list_view tbody tr:first input:first').val('blurp').trigger('input'); + + // Drag and drop the third line in second position + testUtils.dragAndDrop( + form.$('.ui-sortable-handle').eq(2), + form.$('.o_field_one2many tbody tr').eq(1), + {position: 'top'} + ); + + form.$buttons.find('.o_form_button_save').click(); + + assert.strictEqual(form.$('.o_data_cell:not(.o_handle_cell)').text(), "blurpkawablip", + "should display to record in 'turtle_int' order"); + + form.destroy(); + }); + QUnit.test('embedded one2many with handle widget with minimum setValue calls', function (assert) { var done = assert.async(); assert.expect(20);