diff --git a/addons/web/static/src/views/fields/x2many/x2many_field.js b/addons/web/static/src/views/fields/x2many/x2many_field.js index 529c3997dfa..05dd67b17f4 100644 --- a/addons/web/static/src/views/fields/x2many/x2many_field.js +++ b/addons/web/static/src/views/fields/x2many/x2many_field.js @@ -216,7 +216,8 @@ export class X2ManyField extends Component { return true; }); - const editable = archInfo.editable || this.props.editable; + const editable = + (this.archInfo.activeActions.edit && archInfo.editable) || this.props.editable; props.activeActions = this.activeActions; props.archInfo = { ...archInfo, columns }; props.cycleOnTab = false; diff --git a/addons/web/static/src/views/list/list_arch_parser.js b/addons/web/static/src/views/list/list_arch_parser.js index 1f9b7157225..b7e0f9b4b21 100644 --- a/addons/web/static/src/views/list/list_arch_parser.js +++ b/addons/web/static/src/views/list/list_arch_parser.js @@ -213,7 +213,7 @@ export class ListArchParser extends XMLParser { treeAttr.activeActions = activeActions; treeAttr.className = xmlDoc.getAttribute("class") || null; - treeAttr.editable = activeActions.edit ? xmlDoc.getAttribute("editable") : false; + treeAttr.editable = xmlDoc.getAttribute("editable"); treeAttr.multiEdit = activeActions.edit ? archParseBoolean(node.getAttribute("multi_edit") || "") : false; diff --git a/addons/web/static/src/views/list/list_controller.js b/addons/web/static/src/views/list/list_controller.js index 3cccb502870..189d7baa3d4 100644 --- a/addons/web/static/src/views/list/list_controller.js +++ b/addons/web/static/src/views/list/list_controller.js @@ -34,9 +34,10 @@ export class ListController extends Component { this.rootRef = useRef("root"); this.archInfo = this.props.archInfo; - this.editable = this.props.editable ? this.archInfo.editable : false; - this.multiEdit = this.archInfo.multiEdit; this.activeActions = this.archInfo.activeActions; + this.editable = + this.activeActions.edit && this.props.editable ? this.archInfo.editable : false; + this.multiEdit = this.archInfo.multiEdit; const fields = { ...this.props.fields }; const { rootState } = this.props.state || {}; const { defaultGroupBy, rawExpand } = this.archInfo; diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index 72a6dae8fd3..6c052616fb8 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -2956,6 +2956,31 @@ QUnit.module("Fields", (hooks) => { } ); + QUnit.test( + "one2many list: cannot open record in editable=bottom and edit=false list", + async function (assert) { + serverData.models.partner.records[0].p = [2]; + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
`, + resId: 1, + }); + + assert.containsOnce(target, ".o_data_cell[name='display_name']"); + await click(target, ".o_data_cell[name='display_name']"); + assert.containsNone(target, ".modal-dialog"); + } + ); + QUnit.test("one2many list: conditional create/delete actions", async function (assert) { serverData.models.partner.records[0].p = [2, 4]; await makeView({