diff --git a/addons/mrp_subcontracting/__manifest__.py b/addons/mrp_subcontracting/__manifest__.py index 83a8bf8cff3..5af0dfc8794 100644 --- a/addons/mrp_subcontracting/__manifest__.py +++ b/addons/mrp_subcontracting/__manifest__.py @@ -175,7 +175,6 @@ 'web/static/src/legacy/utils.js', 'web/static/src/legacy/js/core/dates.js', 'web/static/src/legacy/js/services/session.js', - 'web/static/src/legacy/js/widgets/date_picker.js', 'web/static/src/legacy/js/env.js', 'web/static/src/legacy/js/owl_compatibility.js', diff --git a/addons/project/__manifest__.py b/addons/project/__manifest__.py index 1d45df8c871..4d0d5e7638e 100644 --- a/addons/project/__manifest__.py +++ b/addons/project/__manifest__.py @@ -226,7 +226,6 @@ 'web/static/src/legacy/utils.js', 'web/static/src/legacy/js/core/dates.js', 'web/static/src/legacy/js/services/session.js', - 'web/static/src/legacy/js/widgets/date_picker.js', 'web/static/src/legacy/js/env.js', 'web/static/src/legacy/js/owl_compatibility.js', diff --git a/addons/web/__manifest__.py b/addons/web/__manifest__.py index 171f1cfd77d..cc459f304f2 100644 --- a/addons/web/__manifest__.py +++ b/addons/web/__manifest__.py @@ -166,7 +166,6 @@ This module provides the core of the Odoo Web Client. 'web/static/src/legacy/utils.js', 'web/static/src/legacy/js/core/dates.js', 'web/static/src/legacy/js/services/session.js', - 'web/static/src/legacy/js/widgets/date_picker.js', 'web/static/src/legacy/js/env.js', 'web/static/src/legacy/js/owl_compatibility.js', diff --git a/addons/web/static/src/legacy/js/widgets/date_picker.js b/addons/web/static/src/legacy/js/widgets/date_picker.js deleted file mode 100644 index 81dc748557e..00000000000 --- a/addons/web/static/src/legacy/js/widgets/date_picker.js +++ /dev/null @@ -1,362 +0,0 @@ -/** @odoo-module **/ - -import { _t } from "@web/core/l10n/translation"; -import { formatDate, formatDateTime, parseDate, parseDateTime } from "@web/legacy/js/core/dates"; -import time from "@web/legacy/js/core/time"; -import Widget from "@web/legacy/js/core/widget"; - -var DateWidget = Widget.extend({ - template: "web.datepicker", - type_of_date: "date", - events: { - 'error.datetimepicker': 'errorDatetime', - 'change .o_datepicker_input': 'changeDatetime', - 'click input': '_onInputClicked', - 'input input': '_onInput', - 'keydown': '_onKeydown', - 'show.datetimepicker': '_onDateTimePickerShow', - 'hide.datetimepicker': '_onDateTimePickerHide', - }, - jsLibs: (Widget.prototype.jsLibs || []).concat([ - "/web/static/lib/tempusdominus/tempusdominus.js", - ]), - /** - * @override - */ - init: function (parent, options) { - this._super.apply(this, arguments); - - this.name = parent.name; - this.options = Object.assign({ - locale: moment.locale(), - format : this.type_of_date === 'datetime' ? time.getLangDatetimeFormat() : time.getLangDateFormat(), - minDate: moment({ y: 1000 }), - maxDate: moment({ y: 9999, M: 11, d: 31 }), - useCurrent: false, - icons: { - time: 'fa fa-clock-o', - date: 'fa fa-calendar', - up: 'oi oi-chevron-up', - down: 'oi oi-chevron-down', - previous: 'oi oi-chevron-left', - next: 'oi oi-chevron-right', - today: 'fa fa-calendar-check-o', - clear: 'fa fa-trash', - close: 'fa fa-check primary', - }, - calendarWeeks: true, - buttons: { - showToday: false, - showClear: false, - showClose: false, - }, - widgetParent: 'body', - keyBinds: null, - }, options || {}); - - this.__libInput = 0; - // tempusdominus doesn't offer any elegant way to check whether the - // datepicker is open or not, so we have to listen to hide/show events - // and manually keep track of the 'open' state - this.__isOpen = false; - }, - /** - * @override - */ - start: function () { - this.$input = this.$('input.o_datepicker_input'); - this.__libInput++; - this.$el.datetimepicker(this.options); - this.__libInput--; - this._setReadonly(false); - }, - /** - * @override - */ - destroy: function () { - if (this._onScroll) { - window.removeEventListener('wheel', this._onScroll, true); - } - this.__libInput++; - this.$el.datetimepicker('destroy'); - this.__libInput--; - this._super.apply(this, arguments); - }, - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - /** - * set datetime value - */ - changeDatetime: function () { - if (this.__libInput > 0) { - if (this.options.warn_future) { - this._warnFuture(this.getValue()); - } - this.trigger("datetime_changed"); - return; - } - var oldValue = this.getValue(); - if (this.isValid()) { - this._setValueFromUi(); - var newValue = this.getValue(); - var hasChanged = !oldValue !== !newValue; - if (oldValue && newValue) { - var formattedOldValue = oldValue.format(time.getLangDatetimeFormat()); - var formattedNewValue = newValue.format(time.getLangDatetimeFormat()); - if (formattedNewValue !== formattedOldValue) { - hasChanged = true; - } - } - if (hasChanged) { - if (this.options.warn_future) { - this._warnFuture(newValue); - } - this.trigger("datetime_changed"); - } - } else { - var formattedValue = oldValue ? this._formatClient(oldValue) : null; - this.$input.val(formattedValue); - } - }, - /** - * Library clears the wrong date format so just ignore error - */ - errorDatetime: function (e) { - return false; - }, - /** - * Focuses the datepicker input. This function must be called in order to - * prevent 'input' events triggered by the lib to bubble up, and to cause - * unwanted effects (like triggering 'field_changed' events) - */ - focus: function () { - this.__libInput++; - this.$input.focus(); - this.__libInput--; - }, - /** - * @returns {Moment|false} - */ - getValue: function () { - var value = this.get('value'); - return value && value.clone(); - }, - /** - * @returns {boolean} - */ - isValid: function () { - var value = this.$input.val(); - if (value === "") { - return true; - } else { - try { - this._parseClient(value); - return true; - } catch { - return false; - } - } - }, - /** - * @returns {Moment|false} value - */ - maxDate: function (date) { - this.__libInput++; - this.$el.datetimepicker('maxDate', date || null); - this.__libInput--; - }, - /** - * @returns {Moment|false} value - */ - minDate: function (date) { - this.__libInput++; - this.$el.datetimepicker('minDate', date || null); - this.__libInput--; - }, - /** - * @param {Moment|false} value - */ - setValue: function (value) { - this.set({'value': value}); - var formatted_value = value ? this._formatClient(value) : null; - this.$input.val(formatted_value); - this._setLibInputValue(value); - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * add a warning to communicate that a date in the future has been set - * - * @private - * @param {Moment} currentDate - */ - _warnFuture: function (currentDate) { - if (!this.$warning) { - this.$warning = $('', { - class: 'fa fa-exclamation-triangle o_tz_warning o_datepicker_warning', - }); - var title = _t("This date is in the future. Make sure this is what you expect."); - this.$warning.attr('title', title); - this.$input.after(this.$warning); - } - // Get rid of time and TZ crap for comparison - if (currentDate && currentDate.format('YYYY-MM-DD') > moment().format('YYYY-MM-DD')) { - this.$warning.show(); - } else { - this.$warning.hide(); - } - }, - - /** - * @private - * @param {Moment} v - * @returns {string} - */ - _formatClient: function (v) { - if (this.type_of_date === "date") { - return formatDate(v, null, {timezone: false}); - } - return formatDateTime(v, null, {timezone: false}); - }, - /** - * @private - * @param {string|false} v - * @returns {Moment} - */ - _parseClient: function (v) { - if (this.type_of_date === "date") { - return parseDate(v, null, {timezone: false}); - } - return parseDateTime(v, null, {timezone: false}); - }, - /** - * @private - * @param {Moment|false} value - */ - _setLibInputValue: function (value) { - this.__libInput++; - this.$el.datetimepicker('date', value || null); - this.__libInput--; - }, - /** - * @private - * @param {boolean} readonly - */ - _setReadonly: function (readonly) { - this.readonly = readonly; - this.$input.prop('readonly', this.readonly); - }, - /** - * set the value from the input value - * - * @private - */ - _setValueFromUi: function () { - var value = this.$input.val() || false; - this.setValue(this._parseClient(value)); - }, - - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * Reacts to the datetimepicker being hidden - * Used to unbind the scroll event from the datetimepicker - * - * @private - */ - _onDateTimePickerHide: function () { - this.__isOpen = false; - this.changeDatetime(); - if (this._onScroll) { - window.removeEventListener('wheel', this._onScroll, true); - } - this.changeDatetime(); - }, - /** - * Reacts to the datetimepicker being shown - * Could set/verify our widget value - * And subsequently update the datetimepicker - * - * @private - */ - _onDateTimePickerShow: function () { - this.__isOpen = true; - if (this.$input.val().length !== 0 && this.isValid()) { - this.$input.select(); - } - var self = this; - this._onScroll = function (ev) { - if (ev.target !== self.$input.get(0)) { - self.__libInput++; - self.$el.datetimepicker('hide'); - self.__libInput--; - } - }; - window.addEventListener('wheel', this._onScroll, true); - }, - /** - * @private - * @param {KeyEvent} ev - */ - _onKeydown: function (ev) { - if (ev.which === $.ui.keyCode.ESCAPE) { - if (this.__isOpen) { - // we don't want any other effects than closing the datepicker, - // like leaving the edition of a row in editable list view - ev.stopImmediatePropagation(); - this.__libInput++; - this.$el.datetimepicker('hide'); - this.__libInput--; - this.focus(); - } - } - }, - /** - * Prevents 'input' events triggered by the library to bubble up, as they - * might have unwanted effects (like triggering 'field_changed' events in - * the context of field widgets) - * - * @private - * @param {Event} ev - */ - _onInput: function (ev) { - if (this.__libInput > 0) { - ev.stopImmediatePropagation(); - } - }, - /** - * @private - */ - _onInputClicked: function () { - this.__libInput++; - this.$el.datetimepicker('toggle'); - this.__libInput--; - this.focus(); - }, -}); - -var DateTimeWidget = DateWidget.extend({ - type_of_date: "datetime", - init: function (parent, options) { - this._super(parent, Object.assign({ - buttons: { - showToday: false, - showClear: false, - showClose: true, - }, - }, options || {})); - }, -}); - -export default { - DateWidget: DateWidget, - DateTimeWidget: DateTimeWidget, -};