From 3fd24cba2afea6985593896229d8ffca3a5770d6 Mon Sep 17 00:00:00 2001 From: pka-odoo Date: Fri, 20 Apr 2018 19:59:50 +0530 Subject: [PATCH] [FIX] web: calendar: show Undefined label if sidebar filter has no value and keep all those filters at last. (PR#20463) e.g. If field used in color attribute of calendar view does not have value then such sidebar filters will not have string besides filter checkbox in such cases we should set Undefined string and put all those filters at last in filter list Currently we can see issue in calendar of manufacturing orders in db with demo data Related to Issue #1778360 Co-authored-by: Mohammed Shekha --- .../src/js/views/calendar/calendar_model.js | 12 ++++++--- .../web/static/tests/views/calendar_tests.js | 26 +++++++++++++++---- 2 files changed, 29 insertions(+), 9 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 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