diff options
Diffstat (limited to 'addons/web/static/src/js/fields')
| -rw-r--r-- | addons/web/static/src/js/fields/basic_fields.js | 19 | ||||
| -rw-r--r-- | addons/web/static/src/js/fields/field_utils.js | 66 |
2 files changed, 75 insertions, 10 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 8657e44c49b..252ef70894e 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -863,6 +863,25 @@ var FieldDate = InputField.extend({ this.datewidget.setValue(this.value); this.$input = this.datewidget.$input; }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Confirm the value on hit enter and re-render + * + * @private + * @override + * @param {KeyboardEvent} ev + */ + async _onKeydown(ev) { + this._super(...arguments); + if (ev.which === $.ui.keyCode.ENTER) { + await this._setValue(this.$input.val()); + this._render(); + } + }, }); var FieldDateTime = FieldDate.extend({ diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js index 8f8b9bbb2ab..4ffceb93408 100644 --- a/addons/web/static/src/js/fields/field_utils.js +++ b/addons/web/static/src/js/fields/field_utils.js @@ -414,6 +414,42 @@ function formatSelection(value, field, options) { //////////////////////////////////////////////////////////////////////////////// /** + * Smart date inputs are shortcuts to write dates quicker. + * These shortcuts should respect the format ^[+-]\d+[dmwy]?$ + * + * e.g. + * "+1d" or "+1" will return now + 1 day + * "-2w" will return now - 2 weeks + * "+3m" will return now + 3 months + * "-4y" will return now + 4 years + * + * @param {string} value + * @returns {Moment|false} Moment date object + */ +function parseSmartDateInput(value) { + const units = { + d: 'days', + m: 'months', + w: 'weeks', + y: 'years', + }; + const re = new RegExp(`^([+-])(\\d+)([${Object.keys(units).join('')}]?)$`); + const match = re.exec(value); + if (match) { + let date = moment(); + const offset = parseInt(match[2], 10); + const unit = units[match[3] || 'd']; + if (match[1] === '+') { + date.add(offset, unit); + } else { + date.subtract(offset, unit); + } + return date; + } + return false; +} + +/** * Create an Date object * The method toJSON return the formated value to send value server side * @@ -433,11 +469,16 @@ function parseDate(value, field, options) { var datePattern = time.getLangDateFormat(); var datePatternWoZero = datePattern.replace('MM', 'M').replace('DD', 'D'); var date; - if (options && options.isUTC) { - value = value.padStart(10, "0"); // server may send "932-10-10" for "0932-10-10" on some OS - date = moment.utc(value); + const smartDate = parseSmartDateInput(value); + if (smartDate) { + date = smartDate; } else { - date = moment.utc(value, [datePattern, datePatternWoZero, moment.ISO_8601]); + if (options && options.isUTC) { + value = value.padStart(10, "0"); // server may send "932-10-10" for "0932-10-10" on some OS + date = moment.utc(value); + } else { + date = moment.utc(value, [datePattern, datePatternWoZero, moment.ISO_8601]); + } } if (date.isValid()) { if (date.year() === 0) { @@ -475,13 +516,18 @@ function parseDateTime(value, field, options) { var pattern1 = datePattern + ' ' + timePattern; var pattern2 = datePatternWoZero + ' ' + timePatternWoZero; var datetime; - if (options && options.isUTC) { - // phatomjs crash if we don't use this format - datetime = moment.utc(value.replace(' ', 'T') + 'Z'); + const smartDate = parseSmartDateInput(value); + if (smartDate) { + datetime = smartDate; } else { - datetime = moment.utc(value, [pattern1, pattern2, moment.ISO_8601]); - if (options && options.timezone) { - datetime.add(-session.getTZOffset(datetime), 'minutes'); + if (options && options.isUTC) { + // phatomjs crash if we don't use this format + datetime = moment.utc(value.replace(' ', 'T') + 'Z'); + } else { + datetime = moment.utc(value, [pattern1, pattern2, moment.ISO_8601]); + if (options && options.timezone) { + datetime.add(-session.getTZOffset(datetime), 'minutes'); + } } } if (datetime.isValid()) { |
