diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py
index 710274e2380..e4ebc4d3389 100644
--- a/addons/hr_timesheet/models/project.py
+++ b/addons/hr_timesheet/models/project.py
@@ -120,6 +120,17 @@ class Task(models.Model):
raise UserError(_('This task must be part of a project because there are some timesheets linked to it.'))
return super(Task, self).write(values)
+ def name_get(self):
+ if self.env.context.get('hr_timesheet_display_remaining_hours'):
+ name_mapping = dict(super().name_get())
+ for task in self:
+ if task.allow_timesheets and task.planned_hours > 0:
+ hours, mins = (str(int(duration)).rjust(2, '0') for duration in divmod(abs(task.remaining_hours) * 60, 60))
+ hours_left = _("(%s%s:%s remaining)") % ('-' if task.remaining_hours < 0 else '', hours, mins)
+ name_mapping[task.id] = name_mapping.get(task.id, '') + " ‒ " + hours_left
+ return list(name_mapping.items())
+ return super().name_get()
+
@api.model
def _fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False):
""" Set the correct label for `unit_amount`, depending on company UoM """
diff --git a/addons/hr_timesheet/static/src/js/task_with_hours.js b/addons/hr_timesheet/static/src/js/task_with_hours.js
new file mode 100644
index 00000000000..d2ed5a64d06
--- /dev/null
+++ b/addons/hr_timesheet/static/src/js/task_with_hours.js
@@ -0,0 +1,36 @@
+odoo.define('hr_timesheet.task_with_hours', function (require) {
+"use strict";
+
+var field_registry = require('web.field_registry');
+var relational_fields = require('web.relational_fields');
+var FieldMany2One = relational_fields.FieldMany2One;
+
+var TaskWithHours = FieldMany2One.extend({
+ /**
+ * @override
+ */
+ init: function () {
+ this._super.apply(this, arguments);
+ this.additionalContext.hr_timesheet_display_remaining_hours = true;
+ },
+ /**
+ * @override
+ */
+ _getDisplayNameWithoutHours: function (value) {
+ return value.split(' ‒ ')[0];
+ },
+ /**
+ * @override
+ * @private
+ */
+ _renderEdit: function (){
+ this.m2o_value = this._getDisplayNameWithoutHours(this.m2o_value);
+ this._super.apply(this, arguments);
+ },
+});
+
+field_registry.add('task_with_hours', TaskWithHours);
+
+return TaskWithHours;
+
+});
\ No newline at end of file
diff --git a/addons/hr_timesheet/views/assets.xml b/addons/hr_timesheet/views/assets.xml
index bc14570e60e..54a2b0af002 100644
--- a/addons/hr_timesheet/views/assets.xml
+++ b/addons/hr_timesheet/views/assets.xml
@@ -3,6 +3,7 @@
+
diff --git a/addons/hr_timesheet/views/hr_timesheet_views.xml b/addons/hr_timesheet/views/hr_timesheet_views.xml
index 0cbd6536f1b..eaf5013e498 100644
--- a/addons/hr_timesheet/views/hr_timesheet_views.xml
+++ b/addons/hr_timesheet/views/hr_timesheet_views.xml
@@ -25,7 +25,7 @@
-
+
@@ -83,7 +83,7 @@
-
+