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('