You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.2 KiB
94 lines
3.2 KiB
/* Copyright 2019 Onestein
|
|
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
|
|
|
odoo.define('web_group_by_percentage', function (require) {
|
|
"use strict";
|
|
|
|
var ListRenderer = require('web.ListRenderer'),
|
|
BasicModel = require('web.BasicModel');
|
|
|
|
ListRenderer.include({
|
|
/**
|
|
* Render the percentage to the group row.
|
|
*
|
|
* @override
|
|
*/
|
|
_renderGroupRow: function (group) {
|
|
var self = this;
|
|
var res = this._super.apply(this, arguments);
|
|
_.each(group.aggregatePercentages, function (percentage, field) {
|
|
var cellIndex = _.findIndex(self.columns, function (column) {
|
|
if (field === column.attrs.name) {
|
|
return true;
|
|
}
|
|
});
|
|
|
|
var $cell = $(res.find('td').get(cellIndex - 1));
|
|
var $b = $('<span>')
|
|
.addClass('web_group_by_percentage')
|
|
.html(_.str.sprintf('%s%% ', percentage.toFixed(2)))
|
|
.data('percentage', percentage);
|
|
$cell.prepend($b);
|
|
});
|
|
return res;
|
|
},
|
|
});
|
|
|
|
BasicModel.include({
|
|
/**
|
|
* Adds aggregatePercentages to the result.
|
|
*
|
|
* @override
|
|
*/
|
|
get: function () {
|
|
var result = this._super.apply(this, arguments),
|
|
dp = result && this.localData[result.id];
|
|
if (dp) {
|
|
if (dp.aggregatePercentages) {
|
|
result.aggregatePercentages = $.extend({}, dp.aggregatePercentages);
|
|
}
|
|
}
|
|
return result;
|
|
},
|
|
|
|
/**
|
|
* Calculate percentages.
|
|
*
|
|
* @override
|
|
*/
|
|
_readGroup: function () {
|
|
var self = this,
|
|
res = this._super.apply(this, arguments);
|
|
res.done(function (list) {
|
|
// Calculate totals
|
|
var sums = {};
|
|
_.each(list.data, function (groupId) {
|
|
var group = self.get(groupId);
|
|
_.each(group.aggregateValues, function (value, field) {
|
|
if (!(field in sums)) {
|
|
sums[field] = 0;
|
|
}
|
|
sums[field] += value;
|
|
});
|
|
});
|
|
|
|
// Calculate percentages
|
|
_.each(list.data, function (groupId) {
|
|
var group = self.get(groupId),
|
|
aggregatePercentages = {};
|
|
_.each(_.keys(sums), function (field) {
|
|
var percentage = 0;
|
|
if (sums[field]) {
|
|
percentage = (group.aggregateValues[field] / sums[field]) * 100;
|
|
}
|
|
aggregatePercentages[field] = percentage;
|
|
});
|
|
var dp = self.localData[groupId];
|
|
dp.aggregatePercentages = aggregatePercentages;
|
|
});
|
|
return list;
|
|
});
|
|
return res;
|
|
},
|
|
});
|
|
});
|