summaryrefslogtreecommitdiff
path: root/addons/hr_timesheet/static/src/js/timesheet_uom.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/hr_timesheet/static/src/js/timesheet_uom.js')
-rw-r--r--addons/hr_timesheet/static/src/js/timesheet_uom.js164
1 files changed, 164 insertions, 0 deletions
diff --git a/addons/hr_timesheet/static/src/js/timesheet_uom.js b/addons/hr_timesheet/static/src/js/timesheet_uom.js
new file mode 100644
index 00000000..982caa46
--- /dev/null
+++ b/addons/hr_timesheet/static/src/js/timesheet_uom.js
@@ -0,0 +1,164 @@
+odoo.define('hr_timesheet.timesheet_uom', function (require) {
+'use strict';
+
+const basicFields = require('web.basic_fields');
+const fieldUtils = require('web.field_utils');
+
+const fieldRegistry = require('web.field_registry');
+
+// We need the field registry to be populated, as we bind the
+// timesheet_uom widget on existing field widgets.
+require('web._field_registry');
+
+const session = require('web.session');
+
+/**
+ * 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({
+ 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
+ if (session.timesheet_uom_factor) {
+ this.nodeOptions.factor = session.timesheet_uom_factor;
+ this.parseOptions.factor = session.timesheet_uom_factor;
+ }
+ },
+});
+
+
+/**
+ * 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({
+ 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 = session.timesheet_uom_factor;
+ },
+});
+
+
+/**
+ * Extend float time widget
+ */
+const FieldTimesheetTime = basicFields.FieldFloatTime.extend({
+ init: function () {
+ this._super.apply(this, arguments);
+
+ if (session.timesheet_uom_factor) {
+ this.nodeOptions.factor = session.timesheet_uom_factor;
+ this.parseOptions.factor = session.timesheet_uom_factor;
+ }
+ }
+});
+
+
+/**
+ * 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 = 'timesheet_uom' in session ?
+ session.timesheet_uom.timesheet_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 = function(options) {
+ if (!_.contains(options, 'factor')) {
+ options.factor = session.timesheet_uom_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 {
+ FieldTimesheetUom,
+ FieldTimesheetFactor,
+ FieldTimesheetTime,
+ FieldTimesheetToggle
+};
+
+});