diff --git a/addons/hr_timesheet/static/src/js/task_with_hours.js b/addons/hr_timesheet/static/src/js/task_with_hours.js
deleted file mode 100644
index c9471854125..00000000000
--- a/addons/hr_timesheet/static/src/js/task_with_hours.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/** @odoo-module alias=hr_timesheet.task_with_hours **/
-
-import field_registry from 'web.field_registry';
-import { FieldMany2One } from 'web.relational_fields';
-
-const TaskWithHours = FieldMany2One.extend({
- /**
- * @override
- */
- init: function () {
- this._super.apply(this, arguments);
- this.additionalContext.hr_timesheet_display_remaining_hours = true;
- // By default, we keep the no_quick_create value or we set to false.
- this.nodeOptions.no_quick_create = this.nodeOptions.no_quick_create || false;
- },
- /**
- * @override
- */
- _getDisplayNameWithoutHours: function (value) {
- return value && value.split('\u00A0')[0];
- },
- /**
- * @override
- * @private
- */
- _onInputClick: function () {
- const context = Object.assign(
- this.record.getContext(this.recordParams),
- this.additionalContext
- );
- // We don't want to quick create if no project is set in the timesheet
- const canCreate = 'default_project_id' in context && context.default_project_id;
- this.nodeOptions.no_quick_create =
- this.nodeOptions.no_quick_create || !canCreate;
- this.can_create = this.can_create && canCreate;
- this._super.apply(this, arguments);
- },
- /**
- * @override
- * @private
- */
- _renderEdit: function (){
- this.m2o_value = this._getDisplayNameWithoutHours(this.m2o_value);
- this._super.apply(this, arguments);
- },
-});
-
-field_registry.add('task_with_hours', TaskWithHours);
-
-export default TaskWithHours;
diff --git a/addons/hr_timesheet/static/src/js/timesheet_uom.js b/addons/hr_timesheet/static/src/js/timesheet_uom.js
deleted file mode 100644
index fafad2c4f85..00000000000
--- a/addons/hr_timesheet/static/src/js/timesheet_uom.js
+++ /dev/null
@@ -1,186 +0,0 @@
-odoo.define('hr_timesheet.timesheet_uom', function (require) {
-'use strict';
-
-const { registry } = require("@web/core/registry");
-const basicFields = require('web.basic_fields');
-const fieldUtils = require('web.field_utils');
-
-const fieldRegistry = require('web.field_registry');
-
-const session = require('web.session');
-
-const TimesheetUOMMultiCompanyMixin = {
- init: function(parent, name, record, options) {
- this._super(parent, name, record, options);
- const currentCompanyId = session.user_context.allowed_company_ids[0];
- const currentCompany = session.user_companies.allowed_companies[currentCompanyId];
- this.currentCompanyTimesheetUOMFactor = currentCompany.timesheet_uom_factor || 1;
- }
-};
-
-/**
- * Extend the float factor widget to set default value for timesheet
- * use case. The 'factor' is forced to be the UoM timesheet
- * conversion from the session info.
- **/
-const FieldTimesheetFactor = basicFields.FieldFloatFactor.extend(TimesheetUOMMultiCompanyMixin).extend({
- formatType: 'float_factor',
- /**
- * Override init to tweak options depending on the session info
- *
- * @constructor
- * @override
- */
- init: function(parent, name, record, options) {
- this._super(parent, name, record, options);
-
- // force factor in format and parse options
- this.nodeOptions.factor = this.currentCompanyTimesheetUOMFactor;
- this.parseOptions.factor = this.currentCompanyTimesheetUOMFactor;
- },
-});
-
-
-/**
- * Extend the float toggle widget to set default value for timesheet
- * use case. The 'range' is different from the default one of the
- * native widget, and the 'factor' is forced to be the UoM timesheet
- * conversion.
- **/
-const FieldTimesheetToggle = basicFields.FieldFloatToggle.extend(TimesheetUOMMultiCompanyMixin).extend({
- formatType: 'float_factor',
- /**
- * Override init to tweak options depending on the session info
- *
- * @constructor
- * @override
- */
- init: function(parent, name, record, options) {
- options = options || {};
- var fieldsInfo = record.fieldsInfo[options.viewType || 'default'];
- var attrs = options.attrs || (fieldsInfo && fieldsInfo[name]) || {};
-
- var hasRange = _.contains(_.keys(attrs.options || {}), 'range');
-
- this._super(parent, name, record, options);
-
- // Set the timesheet widget options: the range can be customized
- // by setting the option on the field in the view. The factor
- // is forced to be the UoM conversion factor.
- if (!hasRange) {
- this.nodeOptions.range = [0.00, 1.00, 0.50];
- }
- this.nodeOptions.factor = this.currentCompanyTimesheetUOMFactor;
- },
-});
-
-
-/**
- * Extend float time widget
- */
-const FieldTimesheetTime = basicFields.FieldFloatTime.extend(TimesheetUOMMultiCompanyMixin).extend({
- init: function () {
- this._super.apply(this, arguments);
- this.nodeOptions.factor = this.currentCompanyTimesheetUOMFactor;
- this.parseOptions.factor = this.currentCompanyTimesheetUOMFactor;
- }
-});
-
-const timesheetUomService = {
- dependencies: ["legacy_session"],
- start() {
- const timesheetUomInfo = {
- widget: null,
- factor: 1,
- };
- if (session.user_context &&
- session.user_context.allowed_company_ids &&
- session.user_context.allowed_company_ids.length) {
- const currentCompanyId = session.user_context.allowed_company_ids[0];
- const currentCompany = session.user_companies.allowed_companies[currentCompanyId];
- const currentCompanyTimesheetUOMId = currentCompany.timesheet_uom_id || false;
- timesheetUomInfo.factor = currentCompany.timesheet_uom_factor || 1;
- if (currentCompanyTimesheetUOMId) {
- timesheetUomInfo.widget = session.uom_ids[currentCompanyTimesheetUOMId].timesheet_widget;
- }
- }
-
- /**
- * Binding depending on Company Preference
- *
- * determine wich widget will be the timesheet one.
- * Simply match the 'timesheet_uom' widget key with the correct
- * implementation (float_time, float_toggle, ...). The default
- * value will be 'float_factor'.
- **/
- const widgetName = timesheetUomInfo.widget || 'float_factor';
-
- let FieldTimesheetUom = null;
-
- if (widgetName === 'float_toggle') {
- FieldTimesheetUom = FieldTimesheetToggle;
- } else if (widgetName === 'float_time') {
- FieldTimesheetUom = FieldTimesheetTime;
- } else {
- FieldTimesheetUom = (
- fieldRegistry.get(widgetName) &&
- fieldRegistry.get(widgetName).extend({ })
- ) || FieldTimesheetFactor;
- }
- fieldRegistry.add('timesheet_uom', FieldTimesheetUom);
-
- // widget timesheet_uom_no_toggle is the same as timesheet_uom but without toggle.
- // We can modify easly huge amount of days.
- let FieldTimesheetUomWithoutToggle = null;
- if (widgetName === 'float_toggle') {
- FieldTimesheetUomWithoutToggle = FieldTimesheetFactor;
- } else {
- FieldTimesheetUomWithoutToggle = FieldTimesheetTime;
- }
- fieldRegistry.add('timesheet_uom_no_toggle', FieldTimesheetUomWithoutToggle);
-
-
- // bind the formatter and parser method, and tweak the options
- const _tweak_options = (options) => {
- if (!_.contains(options, 'factor')) {
- options.factor = timesheetUomInfo.factor;
- }
- return options;
- };
-
- fieldUtils.format.timesheet_uom = function(value, field, options) {
- options = _tweak_options(options || { });
- const formatter = fieldUtils.format[FieldTimesheetUom.prototype.formatType];
- return formatter(value, field, options);
- };
-
- fieldUtils.parse.timesheet_uom = function(value, field, options) {
- options = _tweak_options(options || { });
- const parser = fieldUtils.parse[FieldTimesheetUom.prototype.formatType];
- return parser(value, field, options);
- };
-
- fieldUtils.format.timesheet_uom_no_toggle = function(value, field, options) {
- options = _tweak_options(options || { });
- const formatter = fieldUtils.format[FieldTimesheetUom.prototype.formatType];
- return formatter(value, field, options);
- };
-
- fieldUtils.parse.timesheet_uom_no_toggle = function(value, field, options) {
- options = _tweak_options(options || { });
- const parser = fieldUtils.parse[FieldTimesheetUom.prototype.formatType];
- return parser(value, field, options);
- };
- return timesheetUomInfo;
- },
-};
-registry.category("services").add("timesheet_uom", timesheetUomService);
-
-return {
- FieldTimesheetFactor,
- FieldTimesheetTime,
- FieldTimesheetToggle,
- timesheetUomService,
-};
-
-});
diff --git a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_common.js b/addons/hr_timesheet/static/tests/legacy/timesheet_uom_common.js
deleted file mode 100644
index c3e202b2dda..00000000000
--- a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_common.js
+++ /dev/null
@@ -1,190 +0,0 @@
-odoo.define("hr_timesheet.timesheet_uom_tests_env", function (require) {
-"use strict";
-
-const session = require('web.session');
-const { createView } = require("web.test_utils");
-const { timesheetUomService } = require('hr_timesheet.timesheet_uom');
-const { makeTestEnv } = require("@web/../tests/helpers/mock_env");
-const { registry } = require("@web/core/registry");
-
-/**
- * Sets the timesheet related widgets testing environment up.
- */
-function SetupTimesheetUOMWidgetsTestEnvironment () {
- this.allowedCompanies = {
- 1: {
- id: 1,
- name: 'Company 1',
- timesheet_uom_id: 1,
- timesheet_uom_factor: 1,
- },
- 2: {
- id: 2,
- name: 'Company 2',
- timesheet_uom_id: 2,
- timesheet_uom_factor: 0.125,
- },
- 3: {
- id: 3,
- name: 'Company 3',
- timesheet_uom_id: 2,
- timesheet_uom_factor: 0.125,
- },
- };
- this.uomIds = {
- 1: {
- id: 1,
- name: 'hour',
- rounding: 0.01,
- timesheet_widget: 'float_time',
- },
- 2: {
- id: 2,
- name: 'day',
- rounding: 0.01,
- timesheet_widget: 'float_toggle',
- },
- };
- this.singleCompanyHourUOMUser = {
- allowed_company_ids: [this.allowedCompanies[1].id],
- };
- this.singleCompanyDayUOMUser = {
- allowed_company_ids: [this.allowedCompanies[2].id],
- };
- this.multiCompanyHourUOMUser = {
- allowed_company_ids: [
- this.allowedCompanies[1].id,
- this.allowedCompanies[3].id,
- ],
- };
- this.multiCompanyDayUOMUser = {
- allowed_company_ids: [
- this.allowedCompanies[3].id,
- this.allowedCompanies[1].id,
- ],
- };
- this.session = {
- uid: 0, // In order to avoid bbqState and cookies to be taken into account in AbstractWebClient.
- user_companies: {
- current_company: 1,
- allowed_companies: this.allowedCompanies,
- },
- user_context: this.singleCompanyHourUOMUser,
- uom_ids: this.uomIds,
- };
- this.data = {
- 'account.analytic.line': {
- fields: {
- project_id: {
- string: "Project",
- type: "many2one",
- relation: "project.project",
- },
- task_id: {
- string:"Task",
- type: "many2one",
- relation: "project.task",
- },
- date: {
- string: "Date",
- type: "date",
- },
- unit_amount: {
- string: "Unit Amount",
- type: "float",
- },
- },
- records: [
- {
- id: 1,
- project_id: 1,
- task_id: 1,
- date: "2021-01-12",
- unit_amount: 8,
- },
- ],
- },
- 'project.project': {
- fields: {
- name: {
- string: "Project Name",
- type: "char",
- },
- },
- records: [
- {
- id: 1,
- display_name: "P1",
- },
- ],
- },
- 'project.task': {
- fields: {
- name: {
- string: "Task Name",
- type: "char",
- },
- project_id: {
- string: "Project",
- type: "many2one",
- relation: "project.project",
- },
- },
- records: [
- {
- id: 1,
- display_name: "T1",
- project_id: 1,
- },
- ],
- },
- };
- this.patchSessionAndStartServices = async function (sessionToApply, doNotUseEnvSession = false) {
- /*
- Adds the timesheet_uom to the fieldRegistry by setting the session and
- starting the timesheet_uom service which registers the widget in the registry.
- */
- session.user_companies = Object.assign(
- { },
- !doNotUseEnvSession && this.session.user_companies || { },
- sessionToApply && sessionToApply.user_companies);
- if (Object.keys(session.user_companies).length === 0) {
- delete session.user_companies;
- }
- session.user_context = Object.assign(
- { },
- !doNotUseEnvSession && this.session.user_context || { },
- sessionToApply && sessionToApply.user_context);
- session.uom_ids = Object.assign(
- { },
- !doNotUseEnvSession && this.session.uom_ids || { },
- sessionToApply && sessionToApply.uom_ids);
- if (!doNotUseEnvSession && 'uid' in this.session) {
- session.uid = this.session.uid;
- }
- if (sessionToApply && 'uid' in sessionToApply) {
- session.uid = sessionToApply.uid;
- }
- const serviceRegistry = registry.category("services");
- if (!serviceRegistry.contains("timesheet_uom")) {
- // Remove dependency on legacy_session since we're patching the session directly
- serviceRegistry.add("timesheet_uom", Object.assign({}, timesheetUomService, { dependencies: [] }));
- }
- await makeTestEnv(); // Start services
- };
- this.createView = async function (options) {
- const sessionToApply = options && options.session || { };
- await this.patchSessionAndStartServices(sessionToApply);
- return await createView(Object.assign(
- {
- data: this.data,
- model: 'account.analytic.line',
- },
- options || { },
- ));
- };
-};
-
-return SetupTimesheetUOMWidgetsTestEnvironment;
-
-});
diff --git a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_tests.js b/addons/hr_timesheet/static/tests/legacy/timesheet_uom_tests.js
deleted file mode 100644
index f54706d23b2..00000000000
--- a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_tests.js
+++ /dev/null
@@ -1,74 +0,0 @@
-odoo.define("hr_timesheet.timesheet_uom_tests", function (require) {
-"use strict";
-
-const session = require('web.session');
-const SetupTimesheetUOMWidgetsTestEnvironment = require('hr_timesheet.timesheet_uom_tests_env');
-const fieldUtils = require('web.field_utils');
-
-QUnit.module('Timesheet UOM Widgets', function (hooks) {
- let env;
- let sessionUserCompaniesBackup;
- let sessionUserContextBackup;
- let sessionUOMIdsBackup;
- let sessionUIDBackup;
- hooks.beforeEach(async function (assert) {
- env = new SetupTimesheetUOMWidgetsTestEnvironment();
- // Backups session parts that this testing module will alter in order to restore it at the end.
- sessionUserCompaniesBackup = session.user_companies || false;
- sessionUserContextBackup = session.user_context || false;
- sessionUOMIdsBackup = session.uom_ids || false;
- sessionUIDBackup = session.uid || false;
- });
- hooks.afterEach(async function (assert) {
- // Restores the session
- const sessionToApply = Object.assign(
- { },
- sessionUserCompaniesBackup && {
- user_companies: sessionUserCompaniesBackup,
- } || { },
- sessionUserContextBackup && {
- user_context: sessionUserContextBackup,
- } || { },
- sessionUOMIdsBackup && {
- uom_ids: sessionUOMIdsBackup,
- } || { },
- sessionUIDBackup && {
- uid: sessionUIDBackup,
- } || { });
- await env.patchSessionAndStartServices(sessionToApply, true);
- });
- QUnit.module('timesheet_uom', function (hooks) {
- QUnit.module('timesheet_uom_factor', function (hooks) {
- QUnit.test('the timesheet_uom_factor usage in formatters and parsers is company related', async function (assert) {
- assert.expect(4);
-
- await env.patchSessionAndStartServices();
- assert.strictEqual(fieldUtils.format.timesheet_uom(1), '01:00', 'The format is taking the timesheet_uom_factor into account');
- assert.strictEqual(fieldUtils.parse.timesheet_uom('01:00'), 1, 'The parsing is taking the timesheet_uom_factor into account');
-
- const sessionToApply = {
- user_context: env.singleCompanyDayUOMUser,
- };
- await env.patchSessionAndStartServices(sessionToApply);
- assert.strictEqual(fieldUtils.format.timesheet_uom(8), '1.00', 'The format is taking the timesheet_uom_factor into account');
- assert.strictEqual(fieldUtils.parse.timesheet_uom('1.00'), 8, 'The parsing is taking the timesheet_uom_factor into account');
- });
- QUnit.test('the timesheet_uom_factor taken into account in a multi company environment is the current company', async function (assert) {
- assert.expect(4);
-
- let sessionToApply = {
- user_context: env.multiCompanyHourUOMUser,
- };
- await env.patchSessionAndStartServices(sessionToApply);
- assert.strictEqual(fieldUtils.format.timesheet_uom(1), '01:00', 'The format is taking the timesheet_uom_factor into account');
- assert.strictEqual(fieldUtils.parse.timesheet_uom('01:00'), 1, 'The parsing is taking the timesheet_uom_factor into account');
-
- sessionToApply.user_context = env.singleCompanyDayUOMUser;
- await env.patchSessionAndStartServices(sessionToApply);
- assert.strictEqual(fieldUtils.format.timesheet_uom(8), '1.00', 'The format is taking the timesheet_uom_factor into account');
- assert.strictEqual(fieldUtils.parse.timesheet_uom('1.00'), 8, 'The parsing is taking the timesheet_uom_factor into account');
- });
- });
- });
-});
-});
diff --git a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_widgets_tests.js b/addons/hr_timesheet/static/tests/legacy/timesheet_uom_widgets_tests.js
deleted file mode 100644
index 18ebe885244..00000000000
--- a/addons/hr_timesheet/static/tests/legacy/timesheet_uom_widgets_tests.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/** @odoo-module */
-
-import { registry } from "@web/core/registry";
-import { session } from "@web/session";
-import { companyService } from "@web/webclient/company_service";
-import { uiService } from "@web/core/ui/ui_service";
-import { makeView, setupViewRegistries} from "@web/../tests/views/helpers";
-import { click, getFixture, patchWithCleanup } from "@web/../tests/helpers/utils";
-
-const serviceRegistry = registry.category("services");
-
-QUnit.module("Timesheet UOM Widgets", (hooks) => {
- let serverData;
- let target;
- hooks.beforeEach(async function (assert) {
- setupViewRegistries();
- target = getFixture();
- serverData = {
- models: {
- 'account.analytic.line': {
- fields: {
- unit_amount: { string: "Unit Amount", type: "float" },
- },
- records: [
- { id: 1, unit_amount: 8 }
- ],
- },
- },
- views: {
- "account.analytic.line,false,list": `
-
-
-
- `,
- },
- };
- serviceRegistry.add("ui", uiService);
- serviceRegistry.add("company", companyService, { force: true });
- patchWithCleanup(session, {
- user_companies: {
- current_company: 1,
- allowed_companies: {
- 1: {
- id: 1,
- name: 'Company',
- timesheet_uom_id: 2,
- timesheet_uom_factor: 0.125,
- },
- },
- },
- user_context: {
- allowed_company_ids: [1],
- },
- uom_ids: {
- 1: {
- id: 1,
- name: 'hour',
- rounding: 0.01,
- timesheet_widget: 'float_time',
- },
- 2: {
- id: 2,
- name: 'day',
- rounding: 0.01,
- timesheet_widget: 'float_toggle',
- },
- }
- });
- });
-
- QUnit.module("TimesheetFloatToggleField");
-
- QUnit.test("factor is applied in TimesheetFloatToggleField", async function (assert) {
- await makeView({
- serverData,
- type: "list",
- resModel: "account.analytic.line",
- });
- assert.containsOnce(target, 'div[name="unit_amount"]:contains("1")', "TimesheetFloatToggleField should take `timesheet_uom_factor` into account");
- });
-
- QUnit.test("ranges are working properly in TimesheetFloatToggleField", async function (assert) {
- serverData.models["account.analytic.line"].records[0].unit_amount = 1;
- serverData.views["account.analytic.line,false,list"] = serverData.views["account.analytic.line,false,list"].replace('