diff --git a/addons/project/__manifest__.py b/addons/project/__manifest__.py
index d635e16c866..831a8482575 100644
--- a/addons/project/__manifest__.py
+++ b/addons/project/__manifest__.py
@@ -59,6 +59,7 @@
'post_init_hook': '_project_post_init',
'assets': {
'web.assets_backend': [
+ 'project/static/src/project_control_panel/*',
'project/static/src/css/project.css',
'project/static/src/js/project_activity.js',
'project/static/src/js/project_control_panel.js',
@@ -85,7 +86,7 @@
'project/static/src/js/portal_rating.js',
],
'web.assets_qweb': [
- 'project/static/src/xml/**/*',
+ 'project/static/src/**/*.xml',
],
'web.qunit_suite_tests': [
'project/static/tests/burndown_chart_tests.js',
diff --git a/addons/project/static/src/project_control_panel/project_control_panel.js b/addons/project/static/src/project_control_panel/project_control_panel.js
new file mode 100644
index 00000000000..6d415a547ff
--- /dev/null
+++ b/addons/project/static/src/project_control_panel/project_control_panel.js
@@ -0,0 +1,51 @@
+/** @odoo-module **/
+
+import { ControlPanel } from "@web/search/control_panel/control_panel";
+import { useService } from "@web/core/utils/hooks";
+
+export class ProjectControlPanel extends ControlPanel {
+ constructor() {
+ super(...arguments);
+ this.orm = useService("orm");
+ this.user = useService("user");
+ const { active_id, show_project_update } = this.env.searchModel.globalContext;
+ this.showProjectUpdate = this.env.searchModel.view.type === "form" || show_project_update;
+ this.projectId = this.showProjectUpdate ? active_id : false;
+ }
+
+ async willStart() {
+ const proms = [super.willStart(...arguments)];
+ if (this.showProjectUpdate) {
+ proms.push(this.loadData());
+ }
+ await Promise.all(proms);
+ }
+
+ async willUpdateProps() {
+ const proms = [super.willUpdateProps(...arguments)];
+ if (this.showProjectUpdate) {
+ proms.push(this.loadData());
+ }
+ await Promise.all(proms);
+ }
+
+ async loadData() {
+ const [data, isProjectUser] = await Promise.all([
+ this.orm.call("project.project", "get_last_update_or_default", [this.projectId]),
+ this.user.hasGroup("project.group_project_user"),
+ ]);
+ this.data = data;
+ this.isProjectUser = isProjectUser;
+ }
+
+ async onStatusClick(ev) {
+ ev.preventDefault();
+ this.actionService.doAction("project.project_update_all_action", {
+ additionalContext: {
+ default_project_id: this.projectId,
+ active_id: this.projectId,
+ },
+ });
+ }
+}
+ProjectControlPanel.template = "project.ProjectControlPanel";
diff --git a/addons/project/static/src/project_control_panel/project_control_panel.xml b/addons/project/static/src/project_control_panel/project_control_panel.xml
new file mode 100644
index 00000000000..44aa7941a7f
--- /dev/null
+++ b/addons/project/static/src/project_control_panel/project_control_panel.xml
@@ -0,0 +1,34 @@
+
+