summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2020-04-29 07:21:37 +0000
committerAaron Bohy <aab@odoo.com>2020-05-05 08:48:34 +0000
commit4f8860e5038711c0da5b26584c4b72663908ddbc (patch)
treeffbe4f19554bf39b9211272fc768aeaba7e63216 /addons/web/static/src/js/fields
parenta3c0d6ee714277819f541c6fa24934db55dfef0c (diff)
[IMP] web: add RemainingDays field widget
This widget can be used on date and datetime fields. In readonly, it displays the delta (in days) between the value of the field and today. In edit, it behaves like a regular date(time) widget. Part of task 2195254
Diffstat (limited to 'addons/web/static/src/js/fields')
-rw-r--r--addons/web/static/src/js/fields/abstract_field.js5
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js44
-rw-r--r--addons/web/static/src/js/fields/field_registry.js1
3 files changed, 48 insertions, 2 deletions
diff --git a/addons/web/static/src/js/fields/abstract_field.js b/addons/web/static/src/js/fields/abstract_field.js
index 5ed42e54e04..4767f54d998 100644
--- a/addons/web/static/src/js/fields/abstract_field.js
+++ b/addons/web/static/src/js/fields/abstract_field.js
@@ -379,11 +379,12 @@ var AbstractField = Widget.extend({
*
* @private
* @param {any} value (from the field type)
+ * @param {string} [formatType=this.formatType] the formatter to use
* @returns {string}
*/
- _formatValue: function (value) {
+ _formatValue: function (value, formatType) {
var options = _.extend({}, this.nodeOptions, { data: this.recordData }, this.formatOptions);
- return field_utils.format[this.formatType](value, this.field, options);
+ return field_utils.format[formatType || this.formatType](value, this.field, options);
},
/**
* Returns the className corresponding to a given decoration. A
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 721d6618e83..4c5bef2c366 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -887,6 +887,49 @@ var FieldDateTime = FieldDate.extend({
},
});
+const RemainingDays = FieldDate.extend({
+ description: _lt("Remaining Days"),
+ supportedFieldTypes: ['date', 'datetime'],
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * Displays the delta (in days) between the value of the field and today. If
+ * the delta is larger than 99 days, displays the date as usual (without
+ * time).
+ *
+ * @override
+ */
+ _renderReadonly() {
+ if (this.value === false) {
+ this.$el.removeClass('text-bf text-danger text-warning');
+ return;
+ }
+ // compare the value (in the user timezone) with now (also in the user
+ // timezone), to get a meaningful delta for the user
+ const nowUTC = moment().utc();
+ const nowUserTZ = nowUTC.clone().add(session.getTZOffset(nowUTC), 'minutes');
+ const valueUserTZ = this.value.clone().add(session.getTZOffset(this.value), 'minutes');
+ const diffDays = valueUserTZ.startOf('day').diff(nowUserTZ.startOf('day'), 'days');
+ let text;
+ if (Math.abs(diffDays) > 99) {
+ text = this._formatValue(this.value, 'date');
+ } else if (diffDays === 0) {
+ text = _t("Today");
+ } else if (diffDays < 0) {
+ text = diffDays === -1 ? _t("Yesterday") : _t(`${-diffDays} days ago`);
+ } else {
+ text = diffDays === 1 ? _t("Tomorrow") : _t(`In ${diffDays} days`);
+ }
+ this.$el.text(text).attr('title', this._formatValue(this.value, 'date'));
+ this.$el.toggleClass('text-bf', diffDays <= 0);
+ this.$el.toggleClass('text-danger', diffDays < 0);
+ this.$el.toggleClass('text-warning', diffDays === 0);
+ },
+});
+
var FieldMonetary = NumericField.extend({
description: _lt("Monetary"),
className: 'o_field_monetary o_field_number',
@@ -3437,6 +3480,7 @@ return {
FieldDate: FieldDate,
FieldDateTime: FieldDateTime,
FieldDateRange: FieldDateRange,
+ RemainingDays: RemainingDays,
FieldDomain: FieldDomain,
FieldFloat: FieldFloat,
FieldFloatTime: FieldFloatTime,
diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js
index b8b3fe61452..3cadf6cf6fa 100644
--- a/addons/web/static/src/js/fields/field_registry.js
+++ b/addons/web/static/src/js/fields/field_registry.js
@@ -34,6 +34,7 @@ registry
.add('date', basic_fields.FieldDate)
.add('datetime', basic_fields.FieldDateTime)
.add('daterange', basic_fields.FieldDateRange)
+ .add('remaining_days', basic_fields.RemainingDays)
.add('domain', basic_fields.FieldDomain)
.add('text', basic_fields.FieldText)
.add('list.text', basic_fields.ListFieldText)