diff --git a/addons/web/static/src/js/core/domain.js b/addons/web/static/src/js/core/domain.js
index 01d9aaee8ff..c31feb61a8f 100644
--- a/addons/web/static/src/js/core/domain.js
+++ b/addons/web/static/src/js/core/domain.js
@@ -244,18 +244,16 @@ var Domain = collections.Tree.extend({
function makeInterval () {
switch (comparisonPeriod) {
case 'previous_period':
- _.map(offsetPeriodParams, function (value, key) {
- if (_.isNumber(value)) {
+ _.each(offsetPeriodParams, function (value, key) {
+ if (!leftBoundaryParams[key] ||_.isNumber(leftBoundaryParams[key])) {
leftBoundaryParams[key] = value + (leftBoundaryParams[key] || 0);
} else {
- leftBoundaryParams[key] = value + ' + ' + (leftBoundaryParams[key] || 0);
+ leftBoundaryParams[key] = value + ' + ' + leftBoundaryParams[key];
}
- });
- _.map(offsetPeriodParams, function (value, key) {
- if (_.isNumber(value)) {
+ if (!rightBoundaryParams[key] || _.isNumber(rightBoundaryParams[key])) {
rightBoundaryParams[key] = value + (rightBoundaryParams[key] || 0);
} else {
- rightBoundaryParams[key] = value + ' + ' + (rightBoundaryParams[key] || 0);
+ rightBoundaryParams[key] = value + ' + ' + rightBoundaryParams[key];
}
});
break;
diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js
index 9b1248bb309..c2b06f2c49a 100644
--- a/addons/web/static/tests/views/search_view_tests.js
+++ b/addons/web/static/tests/views/search_view_tests.js
@@ -3,6 +3,7 @@ odoo.define('web.search_view_tests', function (require) {
var testUtils = require('web.test_utils');
var createActionManager = testUtils.createActionManager;
+var patchDate = testUtils.patchDate;
QUnit.module('Search View', {
beforeEach: function () {
@@ -184,6 +185,82 @@ QUnit.module('Search View', {
'' +
'',
};
+
+ this.periodOptions = [
+ 'today',
+ 'this_week',
+ 'this_month',
+ 'this_quarter',
+ 'this_year',
+ 'yesterday',
+ 'last_week',
+ 'last_month',
+ 'last_quarter',
+ 'last_year',
+ 'last_7_days',
+ 'last_30_days',
+ 'last_365_days'
+ ];
+
+ // assuming that the current time is: 2017-03-22:01:00:00
+ this.periodDomains = [
+ // today
+ ['&', ["date_field", ">=", "2017-03-22"],["date_field", "<", "2017-03-23"]],
+ // this week
+ ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-27"]],
+ // this month
+ ['&', ["date_field", ">=", "2017-03-01"],["date_field", "<", "2017-04-01"]],
+ // this quarter
+ ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-04-01"]],
+ // this year
+ ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2018-01-01"]],
+ // yesterday
+ ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]],
+ // last week
+ ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]],
+ // last month
+ ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]],
+ // last quarter
+ ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]],
+ // last year
+ ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]],
+ // last 7 days (whole days)
+ ['&', ["date_field", ">=", "2017-03-15"],["date_field", "<", "2017-03-22"]],
+ // last 30 days
+ ['&', ["date_field", ">=", "2017-02-20"],["date_field", "<", "2017-03-22"]],
+ // last 365 days
+ ['&', ["date_field", ">=", "2016-03-22"],["date_field", "<", "2017-03-22"]],
+ ];
+
+ // assuming that the current time is: 2017-03-22:01:00:00
+ this.previousPeriodDomains = [
+ // today - 1 day
+ ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]],
+ // this week - 1 week
+ ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]],
+ // this month - 1 month
+ ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]],
+ // this quarter - 3 months
+ ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]],
+ // this year - 1 year
+ ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]],
+ // yesterday - 1 day
+ ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-21"]],
+ // last week - 1 week
+ ['&', ["date_field", ">=", "2017-03-06"],["date_field", "<", "2017-03-13"]],
+ // last month - 1 month
+ ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-02-01"]],
+ // last quarter - 3 months
+ ['&', ["date_field", ">=", "2016-07-01"],["date_field", "<", "2016-10-01"]],
+ // last year - 1 year
+ ['&', ["date_field", ">=", "2015-01-01"],["date_field", "<", "2016-01-01"]],
+ // last 7 days (whole days) - 1 week
+ ['&', ["date_field", ">=", "2017-03-08"],["date_field", "<", "2017-03-15"]],
+ // last 30 days - 30 days
+ ['&', ["date_field", ">=", "2017-01-21"],["date_field", "<", "2017-02-20"]],
+ // last 365 days
+ ['&', ["date_field", ">=", "2015-03-23"],["date_field", "<", "2016-03-22"]],
+ ];
},
}, function () {
QUnit.module('Groupby Menu');
@@ -420,43 +497,14 @@ QUnit.module('Search View', {
});
QUnit.test('filter by a date field using period works', function (assert) {
-
assert.expect(14);
+ var self = this;
+
this.archs['partner,4,search'] = ''+
'' +
'';
- var domains = [
- [],
- // today
- ['&', ["date_field", ">=", "2017-03-22"],["date_field", "<", "2017-03-23"]],
- // this week
- ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-27"]],
- // this month
- ['&', ["date_field", ">=", "2017-03-01"],["date_field", "<", "2017-04-01"]],
- // this quarter
- ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-04-01"]],
- // this year
- ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2018-01-01"]],
- // yesterday
- ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]],
- // last week
- ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]],
- // last month
- ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]],
- // last quarter
- ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]],
- // last year
- ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]],
- // last 7 days (whole days)
- ['&', ["date_field", ">=", "2017-03-15"],["date_field", "<", "2017-03-22"]],
- // last 30 days
- ['&', ["date_field", ">=", "2017-02-20"],["date_field", "<", "2017-03-22"]],
- // last 365 days
- ['&', ["date_field", ">=", "2016-03-22"],["date_field", "<", "2017-03-22"]],
- ];
-
var RealDate = window.Date;
window.Date = function TestDate() {
@@ -472,8 +520,8 @@ QUnit.module('Search View', {
archs: this.archs,
data: this.data,
mockRPC: function (route, args) {
- if (route === '/web/dataset/search_read') {
- assert.deepEqual(args.domain, domains.shift());
+ if (route === '/web/dataset/search_read' && args.domain.length) {
+ assert.deepEqual(args.domain, self.periodDomains.shift());
}
return this._super.apply(this, arguments);
},
@@ -485,6 +533,13 @@ QUnit.module('Search View', {
$('.o_search_options .fa-filter').click();
// open menu options
$('.o_menu_item').click();
+
+ var periodOptions = $('.o_menu_item .o_item_option').map(function () {
+ return $(this).data('option_id');
+ }).toArray();
+ assert.deepEqual(periodOptions, this.periodOptions,
+ "13 period options should be available:");
+
$('.o_menu_item .o_item_option[data-option_id="today"]').click();
$('.o_menu_item .o_item_option[data-option_id="this_week"]').click();
$('.o_menu_item .o_item_option[data-option_id="this_month"]').click();
@@ -664,5 +719,73 @@ QUnit.module('Search View', {
actionManager.destroy();
});
+ QUnit.test('time range menu in comparison mode', function (assert) {
+ assert.expect(43);
+
+ var self = this;
+
+ var periodOptionText, periodOptionValue;
+ var unpatchDate = patchDate(2017, 2, 22, 1, 0, 0);
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/call_kw/partner/read_group') {
+ var timeRangeMenuData = args.kwargs.context.timeRangeMenuData;
+ if (timeRangeMenuData) {
+ assert.deepEqual(timeRangeMenuData.timeRange,
+ self.periodDomains.shift(),
+ "time range domain for " + periodOptionText);
+ assert.deepEqual(timeRangeMenuData.comparisonTimeRange,
+ self.previousPeriodDomains.shift(),
+ "comparaison time range domain for " + periodOptionText);
+ }
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ // time range menu should be available in graph view
+ actionManager.doAction(4);
+
+ var $timeRangeMenu = $('.o_time_range_menu');
+ assert.strictEqual($timeRangeMenu.not('.o_hidden').length, 1,
+ "Time range menu should be visible");
+ assert.strictEqual($('.o_facet_values').length, 0,
+ "Search view has no facet");
+
+ var $periodOptions = $timeRangeMenu.find('.o_time_range_selector option');
+ var periodOptions = $periodOptions.map(function () {
+ return $(this).val();
+ }).toArray();
+ assert.deepEqual(periodOptions, this.periodOptions,
+ "13 period options should be available:");
+
+ $periodOptions.each(function () {
+ periodOptionText = $(this).text().trim();
+ periodOptionValue = $(this).val();
+ // opens time range menu dropdown
+ $('.o_time_range_menu_button').click();
+ var $timeRangeMenu = $('.o_time_range_menu');
+ // comparison is not checked by default
+ if (!$timeRangeMenu.find('.o_comparison_checkbox').is(':checked')) {
+ $timeRangeMenu.find('.o_comparison_checkbox').click();
+ assert.strictEqual($('.o_comparison_time_range_selector:visible').length, 1,
+ "Comparison has to be checked (only at the first time)");
+ }
+ // select one period option to test it
+ $timeRangeMenu.find('.o_time_range_selector').val(periodOptionValue);
+ // apply
+ $timeRangeMenu.find('.o_apply_range').click();
+ assert.strictEqual($('.o_facet_values').text().trim(),
+ "Date: " + periodOptionText + " / Previous Period",
+ "Facet should be updated with this period: " + periodOptionValue);
+ });
+
+ unpatchDate();
+ actionManager.destroy();
+ });
+
});
});