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);