diff --git a/addons/web/static/src/js/views/control_panel/control_panel_model.js b/addons/web/static/src/js/views/control_panel/control_panel_model.js index dc7ab303abd..80a6a6a441d 100644 --- a/addons/web/static/src/js/views/control_panel/control_panel_model.js +++ b/addons/web/static/src/js/views/control_panel/control_panel_model.js @@ -420,7 +420,7 @@ var ControlPanelModel = mvc.Model.extend({ } if (filter.currentOptionIds) { filter.currentOptionIds.clear(); - } + } }) group.activeFilterIds = []; }); @@ -459,9 +459,13 @@ var ControlPanelModel = mvc.Model.extend({ acc.push(y.optionId); } return acc; - }, + }, [] ); + const defaultYearId = (optionId) => { + const year = filter.options.find(o => o.optionId === optionId).defaultYear; + return filter.options.find(o => o.setParam.year === year).optionId; + }; if (filter.type === 'filter') { const alreadyActive = group.activeFilterIds.some(isEqualTo([filterId])); @@ -486,7 +490,7 @@ var ControlPanelModel = mvc.Model.extend({ filter.currentOptionIds.add(optionId); if (!selectedYears().length) { // Here we add 'this_year' as options if no option of type year is already selected. - filter.currentOptionIds.add('this_year'); + filter.currentOptionIds.add(defaultYearId(optionId)); } } } else if (filter.type === 'groupBy') { @@ -726,8 +730,8 @@ var ControlPanelModel = mvc.Model.extend({ return pyUtils.assembleDomains(domains, 'AND'); }, /** - * Return an array containing 'facets' used to create the content of the search bar. - * + * Return an array containing 'facets' used to create the content of the search bar. + * * @returns {Object} */ _getFacets: function () { diff --git a/addons/web/static/src/js/views/control_panel/control_panel_view.js b/addons/web/static/src/js/views/control_panel/control_panel_view.js index 0c862c7cc72..c2d4e3ebf33 100644 --- a/addons/web/static/src/js/views/control_panel/control_panel_view.js +++ b/addons/web/static/src/js/views/control_panel/control_panel_view.js @@ -13,7 +13,6 @@ var Domain = require('web.Domain'); var DEFAULT_INTERVAL = controlPanelViewParameters.DEFAULT_INTERVAL; var DEFAULT_PERIOD = controlPanelViewParameters.DEFAULT_PERIOD; var INTERVAL_OPTIONS = controlPanelViewParameters.INTERVAL_OPTIONS; -var PERIOD_OPTIONS = controlPanelViewParameters.PERIOD_OPTIONS; const OPTION_GENERATORS = controlPanelViewParameters.OPTION_GENERATORS; var Factory = mvc.Factory; @@ -74,18 +73,28 @@ var ControlPanelView = Factory.extend({ this.fields = viewInfo.fields; this.referenceMoment = moment(); - this.optionGenerators = OPTION_GENERATORS.map(o => { - const description = o.description ? + + const setDescriptions = (options) => { + return options.map(o => { + const oClone = JSON.parse(JSON.stringify(o)); + const description = o.description ? o.description.toString () : - this.referenceMoment.clone().set(o.setParam).add(o.addParam).format(o.format); - return _.extend({}, o, {description: description}); - }); - PERIOD_OPTIONS = PERIOD_OPTIONS.map(option => - _.extend({}, option, {description: option.description.toString()}) - ); - INTERVAL_OPTIONS = INTERVAL_OPTIONS.map(option => - _.extend({}, option, {description: option.description.toString()}) - ); + this.referenceMoment.clone().add(o.addParam).format(o.format); + return _.extend(oClone, {description: description}); + }); + }; + const process = (options) => { + return options.map(o => { + const date = this.referenceMoment.clone().set(o.setParam).add(o.addParam); + delete o.addParam; + o.setParam[o.granularity] = date[o.granularity](); + o.defaultYear = date.year(); + return o; + }); + } + + this.optionGenerators = process(setDescriptions(OPTION_GENERATORS)); + this.intervalOptions = setDescriptions(INTERVAL_OPTIONS); this.controllerParams.modelName = params.modelName; @@ -196,7 +205,7 @@ var ControlPanelView = Factory.extend({ filter.fieldType = this.fields[attrs.fieldName].type; if (_.contains(['date', 'datetime'], filter.fieldType)) { filter.hasOptions = true; - filter.options = INTERVAL_OPTIONS; + filter.options = this.intervalOptions; filter.defaultOptionId = attrs.defaultInterval || DEFAULT_INTERVAL; filter.currentOptionIds = new Set(); @@ -227,10 +236,9 @@ var ControlPanelView = Factory.extend({ */ _getDateFilterBasicDomains: function (filter) { const _constructBasicDomain = (y, o) => { - const addParam = _.extend({}, y.addParam, o ? o.addParam : {}); - const setParam = _.extend({}, y.setParam, o ? o.setParam : {}); + const setParam = Object.assign({}, y.setParam, o ? o.setParam : {}); const granularity = o ? o.granularity : y.granularity; - const date = this.referenceMoment.clone().set(setParam).add(addParam); + const date = this.referenceMoment.clone().set(setParam); let leftBound = date.clone().startOf(granularity).locale('en'); let rightBound = date.clone().endOf(granularity).locale('en'); diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js index 5d680488981..96e8d0b552b 100644 --- a/addons/web/static/tests/views/search_view_tests.js +++ b/addons/web/static/tests/views/search_view_tests.js @@ -753,7 +753,7 @@ QUnit.module('Search View', { var self = this; this.archs['partner,4,search'] = ''+ - '' + + '' + ''; var unpatchDate = patchDate(2017,2,22,1,0,0); @@ -803,6 +803,45 @@ QUnit.module('Search View', { unpatchDate(); }); + QUnit.test('filter by a date field using period works even in January', async function (assert) { + assert.expect(3); + + this.archs['partner,4,search'] = ''+ + '' + + ''; + + var unpatchDate = patchDate(2017,0,7,3,0,0); + + var actionManager = await createActionManager({ + actions: this.actions, + archs: this.archs, + data: this.data, + mockRPC: function(route, args) { + if (route === '/web/dataset/search_read' && args.domain.length) { + assert.deepEqual(args.domain, + ['&', ["date_field", ">=", "2016-12-01"], ["date_field", "<=", "2016-12-31"]] + ); + } + return this._super.apply(this, arguments); + }, + }); + + this.actions[4].context = {search_default_some_filter: true}; + + await actionManager.doAction(5); + + // open menu 'Filter' + await testUtils.dom.click($('.o_search_options .fa-filter')); + // open menu options + await testUtils.dom.click($('.o_menu_item')); + + assert.hasClass($('.o_item_option[data-option_id="last_month"] a'), 'selected'); + assert.hasClass($('.o_item_option[data-option_id="last_year"] a'), 'selected'); + + actionManager.destroy(); + unpatchDate(); + }); + QUnit.test('`context` key in is used', async function (assert) { assert.expect(3);