From 1bfc3aa1cf52905acdaabbf015e844f3838f498e Mon Sep 17 00:00:00 2001 From: fdardenne Date: Tue, 24 Jan 2023 11:56:29 +0000 Subject: [PATCH] [IMP] web: x2many list: deactivate modal when in editable Before this commit, in a form view, it was possible to open a record in a x2many list field when the list is editable (`editable="top|bottom"`) and the form view or the field is in readonly. We want to disable the opening of the record in this case to stay consistant for a better UX: - when in a editable x2many list, the record form view never opens (even if the form view or the field is in readonly) - when not in editable, the form view always opens This commit does not modify the behaviour of the x2many field kanban view. task-2964320 closes odoo/odoo#110838 Signed-off-by: Aaron Bohy (aab) --- .../question_page_one2many_field.js | 1 + .../src/views/fields/x2many/x2many_field.js | 7 +++++- .../views/fields/one2many_field_tests.js | 25 +++++++++++++++++++ .../tests/views/form/form_view_tests.js | 2 +- .../src/slide_category_one2many_field.js | 7 +++++- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/addons/survey/static/src/question_page/question_page_one2many_field.js b/addons/survey/static/src/question_page/question_page_one2many_field.js index 67671a1313b..22a96f0ce3c 100644 --- a/addons/survey/static/src/question_page/question_page_one2many_field.js +++ b/addons/survey/static/src/question_page/question_page_one2many_field.js @@ -86,6 +86,7 @@ class QuestionPageOneToManyField extends X2ManyField { } openRecord(params); }; + this.canOpenRecord = true; } /** 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 166070a30df..a282337a18c 100644 --- a/addons/web/static/src/views/fields/x2many/x2many_field.js +++ b/addons/web/static/src/views/fields/x2many/x2many_field.js @@ -91,6 +91,9 @@ export class X2ManyField extends Component { }, }); }; + this.canOpenRecord = + this.viewMode === "list" ? !(archInfo.editable || this.props.editable) : true; + const selectCreate = useSelectCreate({ resModel: this.props.value.resModel, activeActions: this.activeActions, @@ -237,7 +240,9 @@ export class X2ManyField extends Component { } async openRecord(record) { - return this._openRecord({ record, mode: this.props.readonly ? "readonly" : "edit" }); + if (this.canOpenRecord) { + return this._openRecord({ record, mode: this.props.readonly ? "readonly" : "edit" }); + } } } X2ManyField.components = { Pager, KanbanRenderer, ListRenderer, ViewButton }; 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 3da9cb6d49b..80246fa777a 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -2861,6 +2861,31 @@ QUnit.module("Fields", (hooks) => { assert.containsNone(target, ".o_field_x2many_list_row_add"); }); + QUnit.test( + "one2many list: cannot open record in editable list and form in readonly mode", + 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({ diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index 528764a3977..4fb480c09f8 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -670,7 +670,7 @@ QUnit.module("Views", (hooks) => { arch: `
- + diff --git a/addons/website_slides/static/src/slide_category_one2many_field.js b/addons/website_slides/static/src/slide_category_one2many_field.js index 9f97839b038..eb4fc168916 100644 --- a/addons/website_slides/static/src/slide_category_one2many_field.js +++ b/addons/website_slides/static/src/slide_category_one2many_field.js @@ -4,7 +4,12 @@ import { registry } from "@web/core/registry"; import { SlideCategoryListRenderer } from "./slide_category_list_renderer"; import { X2ManyField } from "@web/views/fields/x2many/x2many_field"; -class SlideCategoryOneToManyField extends X2ManyField {} +class SlideCategoryOneToManyField extends X2ManyField { + setup() { + super.setup(); + this.canOpenRecord = true; + } +} SlideCategoryOneToManyField.components = { ...X2ManyField.components, ListRenderer: SlideCategoryListRenderer,