diff --git a/addons/web/static/src/js/framework/formats.js b/addons/web/static/src/js/framework/formats.js index 4b5ff8b4048f1cbba5ac574bb4021cbe1dd7257b..52a2fa5b0b05ebe02317c9c9ab3c46ff57c53d77 100644 --- a/addons/web/static/src/js/framework/formats.js +++ b/addons/web/static/src/js/framework/formats.js @@ -160,17 +160,17 @@ function parse_value (value, descriptor, value_if_empty) { case 'progressbar': return parse_value(value, {type: "float"}); case 'datetime': - var datetime = moment(value, [date_pattern + ' ' + time_pattern, date_pattern_wo_zero + ' ' + time_pattern_wo_zero], true); + var datetime = moment(value, [date_pattern + ' ' + time_pattern, date_pattern_wo_zero + ' ' + time_pattern_wo_zero, moment.ISO_8601], true); if (datetime.isValid()) return time.datetime_to_str(datetime.toDate()); throw new Error(_.str.sprintf(_t("'%s' is not a correct datetime"), value)); case 'date': - var date = moment(value, [date_pattern, date_pattern_wo_zero], true); + var date = moment(value, [date_pattern, date_pattern_wo_zero, moment.ISO_8601], true); if (date.isValid()) return time.date_to_str(date.toDate()); throw new Error(_.str.sprintf(_t("'%s' is not a correct date"), value)); case 'time': - var _time = moment(value, [time_pattern, time_pattern_wo_zero], true); + var _time = moment(value, [time_pattern, time_pattern_wo_zero, moment.ISO_8601], true); if (_time.isValid()) return time.time_to_str(_time.toDate()); throw new Error(_.str.sprintf(_t("'%s' is not a correct time"), value)); diff --git a/addons/web/static/src/js/views/search_inputs.js b/addons/web/static/src/js/views/search_inputs.js index 9d08a537e9d369af4dd06c28f3fd15ff84fde52a..edeffd874b086fddaddc552669de80977071a623 100644 --- a/addons/web/static/src/js/views/search_inputs.js +++ b/addons/web/static/src/js/views/search_inputs.js @@ -341,7 +341,17 @@ var DateField = Field.extend(/** @lends instance.web.search.DateField# */{ return time.date_to_str(facetValue.get('value')); }, complete: function (needle) { - var m = moment(needle); + // Make sure the needle has a correct format before the creation of the moment object. See + // issue https://github.com/moment/moment/issues/1407 + var t, v; + try { + t = (this.attrs && this.attrs.type === 'datetime') ? 'datetime' : 'date'; + v = formats.parse_value(needle, {'widget': t}); + } catch (e) { + return $.when(null); + } + + var m = moment(v, t === 'datetime' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'); if (!m.isValid()) { return $.when(null); } var d = m.toDate(); var date_string = formats.format_value(d, this.attrs); diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index 4f35801cb1092261709020d29299e60b4e598f0d..d163913b0f488629b0e7969c621b9c601944f6ba 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -643,7 +643,7 @@ odoo.define_section('search.completions', ['web.search_inputs', 'web.SearchView' var view = {inputs: []}; var f = new DateField( {attrs: {string: "Dummy"}}, {type: 'datetime'}, view); - return f.complete('2012-05-21T21:21:21') + return f.complete('2012-05-21T21:21:21Z') .done(function (completions) { assert.equal(completions.length, 1, "should provide a single completion"); var c = completions[0]; @@ -1615,5 +1615,3 @@ odoo.define_section('search.advanced', ['web.search_inputs', 'web.SearchView', ' }); }); - -