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 e8e2b245369..8de8fd1f8c3 100644 --- a/addons/web/static/src/js/views/calendar/calendar_model.js +++ b/addons/web/static/src/js/views/calendar/calendar_model.js @@ -542,6 +542,7 @@ return AbstractModel.extend({ }); var fs = []; + var undefined_fs = []; _.each(events, function (event) { var data = event.record[fieldName]; if (!_.contains(['many2many', 'one2many'], field.type)) { @@ -551,15 +552,18 @@ return AbstractModel.extend({ } _.each(data, function (_value) { var value = _.isArray(_value) ? _value[0] : _value; - fs.push({ + var f = { 'color_index': self.model_color === (field.relation || element.model) ? value : false, 'value': value, - 'label': fieldUtils.format[field.type](_value, field), + 'label': fieldUtils.format[field.type](_value, field) || _t("Undefined"), 'avatar_model': field.relation || element.model, - }); + }; + // if field used as color does not have value then push filter in undefined_fs, + // such filters should come last in filter list with Undefined string, later merge it with fs + value ? fs.push(f) : undefined_fs.push(f); }); }); - _.each(fs, function (f) { + _.each(_.union(fs, undefined_fs), function (f) { var f1 = _.findWhere(filter.filters, f); if (f1) { f1.display = true; diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js index 198fd8a9d99..b6bebc0f4a2 100644 --- a/addons/web/static/tests/views/calendar_tests.js +++ b/addons/web/static/tests/views/calendar_tests.js @@ -146,7 +146,19 @@ QUnit.module('Views', { }; QUnit.test('simple calendar rendering', function (assert) { - assert.expect(22); + assert.expect(24); + + this.data.event.records.push({ + id: 7, + user_id: session.uid, + partner_id: false, + name: "event 7", + start: "2016-12-18 09:00:00", + stop: "2016-12-18 10:00:00", + allday: false, + partner_ids: [2], + type: 1 + }); var calendar = createView({ View: CalendarView, @@ -187,7 +199,7 @@ QUnit.module('Views', { assert.strictEqual($sidebar.find('.o_selected_range').length, 1, "should highlight the target day in mini calendar"); calendar.$buttons.find('.o_calendar_button_month').trigger('click'); // display all the month - assert.strictEqual(calendar.$('.fc-event').length, 6, "should display 6 events on the month (5 events + 2 week event - 1 'event 6' is filtered)"); + assert.strictEqual(calendar.$('.fc-event').length, 7, "should display 7 events on the month (5 events + 2 week event - 1 'event 6' is filtered + 1 'Undefined event')"); assert.strictEqual($sidebar.find('.o_selected_range').length, 31, "month scale should highlight all days in mini calendar"); // test filters @@ -196,15 +208,19 @@ QUnit.module('Views', { var $typeFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(user))'); assert.ok($typeFilter.length, "should display 'user' filter"); - assert.strictEqual($typeFilter.find('.o_calendar_filter_item').length, 2, "should display 2 filter items for 'user'"); + assert.strictEqual($typeFilter.find('.o_calendar_filter_item').length, 3, "should display 3 filter items for 'user'"); + + // filters which has no value should show with string "Undefined" and should show at the last + assert.strictEqual($typeFilter.find('.o_calendar_filter_item:last').data('value'), false, "filters having false value should be displayed at last in filter items"); + assert.strictEqual($typeFilter.find('.o_calendar_filter_item:last > span').text(), "Undefined", "filters having false value should display 'Undefined' string"); var $attendeesFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(attendees))'); assert.ok($attendeesFilter.length, "should display 'attendees' filter"); 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)"); + assert.strictEqual(calendar.$('.fc-event').length, 7, + "should display 7 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