From 2e2ab4e954cd5da8c0c06d393b334cefc7627315 Mon Sep 17 00:00:00 2001 From: David Monjoie Date: Thu, 29 Jun 2017 08:52:43 +0200 Subject: [PATCH] [FIX] web: don't read events if no filter is enabled Previously, enabling some filters created a domain of which events to display, but disabling all filters resulted in a domain of [] which, instead of showing no events at all, actually showed all events. --- .../static/src/js/views/calendar/calendar_model.js | 13 ++++++++----- addons/web/static/tests/views/calendar_tests.js | 11 +++++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js index cb371bfe6f9..ded7938605f 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -393,16 +393,19 @@ return AbstractModel.extend({ this.data.fc_options = this._getFullCalendarOptions(); var defs = _.map(this.data.filters, this._loadFilter.bind(this)); - return $.when.apply($, defs).then(function () { - return self._rpc({ + var eventsDef = $.Deferred().resolve([]); + var filterDomain = self._getFilterDomain(); + if (filterDomain.length || _.isEmpty(self.data.filters)) { + eventsDef = self._rpc({ model: self.modelName, method: 'search_read', context: self.data.context, fields: self.fieldNames, - domain: self.data.domain.concat(self._getRangeDomain()).concat(self._getFilterDomain()) - }) - .then(function (events) { + domain: self.data.domain.concat(self._getRangeDomain()).concat(filterDomain) + }); + } + return eventsDef.then(function (events) { self.data.data = _.map(events, self._recordToCalendarEvent.bind(self)); return $.when( self._loadColors(self.data, self.data.data), diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index 725eb831080..011843eefee 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -143,7 +143,7 @@ QUnit.module('Views', { }; QUnit.test('simple calendar rendering', function (assert) { - assert.expect(19); + assert.expect(22); var calendar = createView({ View: CalendarView, @@ -200,6 +200,13 @@ QUnit.module('Views', { assert.strictEqual($attendeesFilter.find('.o_calendar_filter_item').length, 3, "should display 3 filter items for 'attendees' who use write_model (2 saved + Everything)"); assert.ok($attendeesFilter.find('.o_field_many2one').length, "should display one2many search bar for 'attendees' filter"); + assert.strictEqual(calendar.$('.fc-event').length, 6, + "should display 6 events ('event 5' counts for 2 because it spans two weeks and thus generate two fc-event elements)"); + calendar.$('.o_calendar_filter .o_checkbox input').first().click(); // Disable first filter + assert.strictEqual(calendar.$('.fc-event').length, 4, "should now only display 4 event"); + calendar.$('.o_calendar_filter .o_checkbox input').eq(1).click(); // Disable second filter + assert.strictEqual(calendar.$('.fc-event').length, 0, "should not display any event anymore"); + // test search bar in filter $sidebar.find('input[type="text"]').trigger('click'); @@ -208,7 +215,7 @@ QUnit.module('Views', { assert.strictEqual($sidebar.find('.o_calendar_filter:has(h3:contains(attendees)) .o_calendar_filter_item').length, 4, "should display 4 filter items for 'attendees'"); $sidebar.find('input[type="text"]').trigger('click'); assert.strictEqual($('ul.ui-autocomplete li:not(.o_m2o_dropdown_option)').text(), "partner 4", "should display the last choice in one2many autocomplete"); // TODO: remove :not(.o_m2o_dropdown_option) because can't have "create & edit" choice - $sidebar.find('.o_calendar_filter_item[data-id="1"] .o_remove').trigger('click'); + $sidebar.find('.o_calendar_filter_item .o_remove').first().trigger('click'); assert.ok($('.modal button.btn:contains(Ok)').length, "should display the confirm message"); $('.modal button.btn:contains(Ok)').trigger('click'); assert.strictEqual($sidebar.find('.o_calendar_filter:has(h3:contains(attendees)) .o_calendar_filter_item').length, 3, "click on remove then should display 3 filter items for 'attendees'");