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"> - +