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 09908212237..f5cb3a2c732 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 @@ -841,8 +841,16 @@ ListRenderer.include({ */ _onTrashIconClick: function (event) { event.stopPropagation(); - var id = $(event.target).closest('tr').data('id'); - this.trigger_up('list_record_delete', {id: id}); + var $row = $(event.target).closest('tr') + var id = $row.data('id'); + if ($row.hasClass('o_selected_row')) { + this.trigger_up('list_record_delete', {id: id}); + } else { + var self = this; + this.unselectRow().then(function () { + self.trigger_up('list_record_delete', {id: id}); + }); + } }, /** * When a click happens outside the list view, or outside a currently diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index dfd58db57c2..70f9ec3014c 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -3067,6 +3067,42 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('delete a line in a one2many while editing another line triggers a warning', function (assert) { + assert.expect(3); + + this.data.partner.records[0].p = [1, 2]; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + res_id: 1, + }); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_data_cell').first().click(); // edit first row + form.$('input').val('').trigger('input'); + form.$('.fa-trash-o').eq(1).click(); // delete second row + + assert.strictEqual($('.modal').find('.modal-title').first().text(), "Warning", + "Clicking out of a dirty line while editing should trigger a warning modal."); + + $('.modal').find('.btn-primary').click(); // discard changes + + assert.strictEqual(form.$('.o_data_cell').first().text(), "first record", + "Value should have been reset to what it was before editing began."); + assert.strictEqual(form.$('.o_data_row').length, 1, + "The other line should have been deleted."); + form.destroy(); + }); + QUnit.test('properly apply onchange on many2many fields', function (assert) { assert.expect(14);