diff options
| author | Aaron Bohy <aab@odoo.com> | 2020-04-29 07:21:37 +0000 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2020-05-05 08:48:34 +0000 |
| commit | 4f8860e5038711c0da5b26584c4b72663908ddbc (patch) | |
| tree | ffbe4f19554bf39b9211272fc768aeaba7e63216 /addons/web/static/src | |
| parent | a3c0d6ee714277819f541c6fa24934db55dfef0c (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')
| -rw-r--r-- | addons/web/static/src/js/fields/abstract_field.js | 5 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/basic_fields.js | 44 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/field_registry.js | 1 |
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) |
