From c8474c8ab443164901ef5ff2aa26ed27c42d69da Mon Sep 17 00:00:00 2001 From: len-odoo Date: Wed, 4 Jul 2018 10:17:39 +0200 Subject: [PATCH] [FIX] web: trigger a warning modal when deleting a line while editing in a one2many In a one2many, if the user clicked the trash button while editing another line, the row was not unselected. Thus the modal was not triggered, which entailed that the currently edited line was always saved. In particular, it allowed to give empty values to required fields. opw 1834346 --- .../js/views/list/list_editable_renderer.js | 12 +++++-- addons/web/static/tests/views/form_tests.js | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 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 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);