diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index c0d3e415321..1db59bbab41 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -812,6 +812,9 @@ var BasicRenderer = AbstractRenderer.extend(WidgetAdapterMixin, { _rerenderFieldWidget: function (widget, record, options) { // Render the new field widget var $el = this._renderFieldWidget(widget.__node, record, options); + // get the new widget that has just been pushed in allFieldWidgets + const recordWidgets = this.allFieldWidgets[record.id]; + const newWidget = recordWidgets[recordWidgets.length - 1]; const def = this.defs[this.defs.length - 1]; // this is the widget's def, resolved when it is ready const $div = $('
'); $div.append($el); // $el will be replaced when widget is ready (see _renderFieldWidget) @@ -819,9 +822,9 @@ var BasicRenderer = AbstractRenderer.extend(WidgetAdapterMixin, { widget.$el.replaceWith($div.children()); // Destroy the old widget and position the new one at the old one's + // (it has been temporarily inserted at the end of the list) + recordWidgets.splice(recordWidgets.indexOf(newWidget), 1); var oldIndex = this._destroyFieldWidget(record.id, widget); - var recordWidgets = this.allFieldWidgets[record.id]; - let newWidget = recordWidgets.pop(); recordWidgets.splice(oldIndex, 0, newWidget); // Mount new widget if necessary (mainly for Owl components) diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index b5ae51af648..852c74d922b 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -6370,6 +6370,42 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('editable list with fields with readonly modifier', async function (assert) { + assert.expect(8); + + const list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: ` + + + + + + `, + }); + + await testUtils.dom.click(list.$('.o_list_button_add')); + + assert.containsOnce(list, '.o_selected_row'); + assert.notOk(list.$('.o_selected_row .o_field_boolean input').is(':checked')); + assert.doesNotHaveClass(list.$('.o_selected_row .o_list_char'), 'o_readonly_modifier'); + assert.hasClass(list.$('.o_selected_row .o_list_many2one'), 'o_readonly_modifier'); + + await testUtils.dom.click(list.$('.o_selected_row .o_field_boolean input')); + + assert.ok(list.$('.o_selected_row .o_field_boolean input').is(':checked')); + assert.hasClass(list.$('.o_selected_row .o_list_char'), 'o_readonly_modifier'); + assert.doesNotHaveClass(list.$('.o_selected_row .o_list_many2one'), 'o_readonly_modifier'); + + await testUtils.dom.click(list.$('.o_selected_row .o_field_many2one input')); + + assert.strictEqual(document.activeElement, list.$('.o_selected_row .o_field_many2one input')[0]); + + list.destroy(); + }); + QUnit.test('list grouped by date:month', async function (assert) { assert.expect(1);