[FIX] web: undefined group name for group by date:<interval>

Previously, grouping a list by a non-default time interval (e.g.
'creation date:week') yielded a grouped list of records with undefined
group names.
This commit is contained in:
Khoi Nguyen
2017-07-17 15:40:44 +02:00
parent 779fc8e4fe
commit 3dd1c0f87e
4 changed files with 29 additions and 5 deletions
@@ -84,8 +84,8 @@ odoo.define('web.BasicModel', function (require) {
var AbstractModel = require('web.AbstractModel'); var AbstractModel = require('web.AbstractModel');
var concurrency = require('web.concurrency'); var concurrency = require('web.concurrency');
var core = require('web.core');
var Context = require('web.Context'); var Context = require('web.Context');
var core = require('web.core');
var Domain = require('web.Domain'); var Domain = require('web.Domain');
var fieldUtils = require('web.field_utils'); var fieldUtils = require('web.field_utils');
var session = require('web.session'); var session = require('web.session');
@@ -3087,7 +3087,8 @@ var BasicModel = AbstractModel.extend({
lazy: true, lazy: true,
}) })
.then(function (groups) { .then(function (groups) {
var rawGroupBy = list.groupedBy[0].split(':')[0]; var groupByField = list.groupedBy[0];
var rawGroupBy = groupByField.split(':')[0];
var previousGroups = _.map(list.data, function (groupID) { var previousGroups = _.map(list.data, function (groupID) {
return self.localData[groupID]; return self.localData[groupID];
}); });
@@ -3098,13 +3099,13 @@ var BasicModel = AbstractModel.extend({
_.each(groups, function (group) { _.each(groups, function (group) {
var aggregateValues = {}; var aggregateValues = {};
_.each(group, function (value, key) { _.each(group, function (value, key) {
if (_.contains(fields, key) && key !== list.groupedBy[0]) { if (_.contains(fields, key) && key !== groupByField) {
aggregateValues[key] = value; aggregateValues[key] = value;
} }
}); });
// When a view is grouped, we need to display the name of each group in // When a view is grouped, we need to display the name of each group in
// the 'title'. // the 'title'.
var value = group[rawGroupBy]; var value = group[groupByField];
if (list.fields[rawGroupBy].type === "selection") { if (list.fields[rawGroupBy].type === "selection") {
var choice = _.find(list.fields[rawGroupBy].selection, function (c) { var choice = _.find(list.fields[rawGroupBy].selection, function (c) {
return c[0] === value; return c[0] === value;
@@ -377,6 +377,10 @@ var ListRenderer = BasicRenderer.extend({
$cells.unshift($('<td>')); $cells.unshift($('<td>'));
} }
var name = group.value === undefined ? _t('Undefined') : group.value; var name = group.value === undefined ? _t('Undefined') : group.value;
var groupBy = this.state.groupedBy[groupLevel];
if (group.fields[groupBy.split(':')[0]].type !== 'boolean') {
name = name || _t('Undefined');
}
var $th = $('<th>') var $th = $('<th>')
.addClass('o_group_name') .addClass('o_group_name')
.text(name + ' (' + group.count + ')'); .text(name + ' (' + group.count + ')');
@@ -632,7 +632,9 @@ var MockServer = Class.extend({
var fieldName = groupByField.split(':')[0]; var fieldName = groupByField.split(':')[0];
var aggregateFunction = groupByField.split(':')[1] || 'month'; var aggregateFunction = groupByField.split(':')[1] || 'month';
if (fields[fieldName].type === 'date') { if (fields[fieldName].type === 'date') {
if (aggregateFunction === 'day') { if (!val) {
return false;
} else if (aggregateFunction === 'day') {
return moment(val).format('YYYY-MM-DD'); return moment(val).format('YYYY-MM-DD');
} else { } else {
return moment(val).format('MMMM YYYY'); return moment(val).format('MMMM YYYY');
@@ -2466,6 +2466,23 @@ QUnit.module('Views', {
list.destroy(); list.destroy();
}); });
QUnit.test('list grouped by date:month', function (assert) {
assert.expect(1);
var list = createView({
View: ListView,
model: 'foo',
data: this.data,
arch: '<tree><field name="date"/></tree>',
groupBy: ['date:month'],
});
assert.strictEqual(list.$('tbody').text(), "January 2017 (1)Undefined (3)",
"the group names should be correct");
list.destroy();
});
}); });
}); });