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