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 a857fee7103..e65b8332e7a 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 @@ -251,6 +251,12 @@ ListRenderer.include({ * @private */ _moveToNextLine: function () { + var record = this.state.data[this.currentRow]; + var fieldNames = this.canBeSaved(record.id); + if (fieldNames.length) { + return; + } + if (this.currentRow < this.state.data.length - 1) { this._selectCell(this.currentRow + 1, 0); } else { diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index d80b5ee0050..15248b950ce 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -816,7 +816,6 @@ QUnit.module('relational_fields', { }); }); - QUnit.module('FieldOne2Many'); QUnit.test('one2many basic properties', function (assert) { @@ -1721,6 +1720,44 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('pressing enter in a o2m with a required empty m2o', function (assert) { + assert.expect(4); + + this.data.turtle.fields.turtle_foo.required = true; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + res_id: 2, + mockRPC: function (route, args) { + assert.step(args.method); + return this._super.apply(this, arguments); + }, + }); + + // edit mode, then click on Add an item, then click elsewhere + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_field_x2many_list_row_add a').click(); + form.$('input[name="turtle_foo"]').trigger($.Event('keydown', { + which: $.ui.keyCode.ENTER, + keyCode: $.ui.keyCode.ENTER, + })); + assert.ok(form.$('input[name="turtle_foo"]').hasClass('o_field_invalid'), + "input should be marked invalid"); + assert.verifySteps(['read', 'default_get']); + form.destroy(); + }); + QUnit.test('editing a o2m, with required field and onchange', function (assert) { assert.expect(12);