From 52b483e6f81579a58498e665200bc5d290489013 Mon Sep 17 00:00:00 2001 From: "Julien Carion (juca)" Date: Fri, 26 May 2023 12:47:56 +0000 Subject: [PATCH] [FIX] project,web: fix readonly in list view cells This commit changes how automatic readonly props are applied to list fields so that it doesn't override the getFieldProps method It also fixes the method 'getCellReadonly' in ProjectTaskListRenderer, which was renamed to 'isCellReadonly' in the framework but not in the custom renderer. Task-3340379 closes odoo/odoo#123026 X-original-commit: da3b2421b3f851629d5d287223b7ef581a30a5ab Signed-off-by: Xavier Bol (xbo) Signed-off-by: Larcin Vincent (vila) Co-authored-by: Vincent Larcin --- addons/project/__manifest__.py | 1 + .../project_task_list_renderer.js | 4 +- .../project_task_list_view_tests.js | 79 +++++++++++++++++++ .../static/src/views/list/list_renderer.js | 2 +- .../static/src/views/list/list_renderer.xml | 2 +- 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 addons/project/static/tests/views/project_task_list/project_task_list_view_tests.js diff --git a/addons/project/__manifest__.py b/addons/project/__manifest__.py index b8a9f8e49f9..e22e56c315e 100644 --- a/addons/project/__manifest__.py +++ b/addons/project/__manifest__.py @@ -90,6 +90,7 @@ ], 'web.assets_tests': [ 'project/static/tests/tours/**/*', + 'project/static/tests/views/**/*', ], 'project.webclient': [ ('include', 'web._assets_helpers'), diff --git a/addons/project/static/src/views/project_task_list/project_task_list_renderer.js b/addons/project/static/src/views/project_task_list/project_task_list_renderer.js index e1d01a68546..8ff3e9d0552 100644 --- a/addons/project/static/src/views/project_task_list/project_task_list_renderer.js +++ b/addons/project/static/src/views/project_task_list/project_task_list_renderer.js @@ -4,7 +4,7 @@ import { ListRenderer } from "@web/views/list/list_renderer"; import { getRawValue } from "@web/views/kanban/kanban_record"; export class ProjectTaskListRenderer extends ListRenderer { - getCellReadonly(column, record) { + isCellReadonly(column, record) { let readonly = false; const selection = this.props.list.selection; if (column.name === "stage_id" && selection.length) { @@ -13,6 +13,6 @@ export class ProjectTaskListRenderer extends ListRenderer { (task) => getRawValue(task, "project_id") !== projectId ); } - return readonly || super.getCellReadonly(column, record); + return readonly || super.isCellReadonly(column, record); } } diff --git a/addons/project/static/tests/views/project_task_list/project_task_list_view_tests.js b/addons/project/static/tests/views/project_task_list/project_task_list_view_tests.js new file mode 100644 index 00000000000..34911ce75f5 --- /dev/null +++ b/addons/project/static/tests/views/project_task_list/project_task_list_view_tests.js @@ -0,0 +1,79 @@ +/** @odoo-module **/ + +import { click, getFixture } from "@web/../tests/helpers/utils"; +import { makeView, setupViewRegistries } from "@web/../tests/views/helpers"; + +QUnit.module("Project Task List View", (hooks) => { + QUnit.test("cannot edit stage_id with different projects", async function (assert) { + const target = getFixture(); + setupViewRegistries(); + await makeView({ + type: "list", + resModel: "project.task", + arch: ` + + + + + `, + serverData: { + models: { + "project.task": { + fields: { + project_id: { + string: "Project", + type: "many2one", + relation: "project.project", + }, + stage_id: { + string: "Stage", + type: "many2one", + relation: "project.task.type", + } + }, + records: [ + { + id: 1, + project_id: 1, + stage_id: 1, + }, { + id: 2, + project_id: 2, + stage_id: 1, + }, + ], + }, + "project.project": { + records: [ + { + id: 1, + }, { + id: 2, + }, + ], + }, + "project.task.type": { + records: [ + { + id: 1, + }, { + id: 2, + }, + ], + }, + }, + } + }); + + const [firstRow, secondRow] = target.querySelectorAll(".o_data_row"); + await click(firstRow.querySelector(".o_data_row .o_list_record_selector input")); + assert.containsNone(firstRow, ".o_readonly_modifier", "None of the fields should be readonly"); + assert.containsNone(secondRow, ".o_readonly_modifier", "None of the fields should be readonly"); + + await click(secondRow.querySelector(".o_data_row .o_list_record_selector input")); + assert.containsOnce(firstRow, ".o_readonly_modifier"); + assert.hasClass(firstRow.querySelectorAll(".o_data_cell")[1], "o_readonly_modifier", "The stage_id should be readonly"); + assert.containsOnce(secondRow, ".o_readonly_modifier"); + assert.hasClass(secondRow.querySelectorAll(".o_data_cell")[1], "o_readonly_modifier", "The stage_id should be readonly"); + }); +}); diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js index 4099442a1c9..4c89e49d95a 100644 --- a/addons/web/static/src/views/list/list_renderer.js +++ b/addons/web/static/src/views/list/list_renderer.js @@ -258,7 +258,7 @@ export class ListRenderer extends Component { } getFieldProps(record, column) { - if (this.isCellReadonly(column, record)) { + if (this.isCellReadonly(column, record) || (this.props.activeActions?.edit === false && !record.isNew)) { return { readonly: true, }; diff --git a/addons/web/static/src/views/list/list_renderer.xml b/addons/web/static/src/views/list/list_renderer.xml index 5d5df5ba627..1b15a4d0bbd 100644 --- a/addons/web/static/src/views/list/list_renderer.xml +++ b/addons/web/static/src/views/list/list_renderer.xml @@ -237,7 +237,7 @@ t-on-click="(ev) => this.onCellClicked(record, column, ev)" tabindex="-1"> - +