summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/core
diff options
context:
space:
mode:
authorMathieu Duckerts-Antoine <dam@odoo.com>2019-02-21 14:29:26 +0000
committerMathieu Duckerts-Antoine <dam@odoo.com>2019-04-01 14:40:51 +0000
commita9bcb12f6419aaf087bad4c8a3f7ed7c00dbf3c5 (patch)
tree5f25467a6a22ab75db6077eb35bf1b7ff83408a6 /addons/web/static/src/js/core
parentd23419fd86d5f8266c37526176c1bf79a09a1684 (diff)
[IMP] web: graph view improvements
This commit extends the support of comparison mode for the graph view and refine the tooltips and rendering in line mode. The graph view code has also been slightly refactored. Task ID: 1946138
Diffstat (limited to 'addons/web/static/src/js/core')
-rw-r--r--addons/web/static/src/js/core/data_comparison_utils.js111
1 files changed, 95 insertions, 16 deletions
diff --git a/addons/web/static/src/js/core/data_comparison_utils.js b/addons/web/static/src/js/core/data_comparison_utils.js
index 0e62f2d3ffa..60f88e67d8d 100644
--- a/addons/web/static/src/js/core/data_comparison_utils.js
+++ b/addons/web/static/src/js/core/data_comparison_utils.js
@@ -2,7 +2,87 @@ odoo.define('web.dataComparisonUtils', function (require) {
"use strict";
var fieldUtils = require('web.field_utils');
+var Class = require('web.Class');
+var DateClasses = Class.extend({
+ init: function (dateSets, interval) {
+ // dateSets are assumed pairwise disjoint and ordered naturally.
+ // at least one of them is non empty.
+
+ // we complete the first inhabited dateSet. Its elements will be
+ // the default representatives for the classes.
+ this._maximalLength = 1;
+ this._referenceIndex = null;
+ for (var i = 0; i < dateSets.length; i++) {
+ var dateSet = dateSets[i];
+ if (dateSet.length && this._referenceIndex === null) {
+ this._referenceIndex = i;
+ }
+ if (dateSet.length > this._maximalLength) {
+ this._maximalLength = dateSet.length;
+ }
+ }
+ this._referenceSet = this._contructReferenceSet(dateSets[this._referenceIndex], interval);
+ this._dateClasses = this._constructDateClasses(dateSets);
+ },
+
+ //----------------------------------------------------------------------
+ // Public
+ //----------------------------------------------------------------------
+
+ representative: function (date, index) {
+ index = index || this._referenceIndex;
+ return this._dateClass(date)[index];
+ },
+
+ //----------------------------------------------------------------------
+ // Private
+ //----------------------------------------------------------------------
+
+ /**
+ * @param {moment[]} dateSet, ordered dateSet
+ * @param {number} num, indicates number of dates to add
+ * @param {string} interval, determines time interval between two added dates
+ * @returns {function}
+ */
+ _contructReferenceSet: function (dateSet, interval) {
+ var additionalDates = [];
+ var dateSetLength = dateSet.length;
+ var diff = this._maximalLength - dateSetLength;
+ var lastDate = dateSet[dateSetLength - 1];
+ for (var i = 0; i < diff; i++) {
+ var date = moment(lastDate).add(i + 1, interval).format('DD MMM YYYY');
+ additionalDates.push(date);
+ }
+ return dateSet.concat(additionalDates);
+ },
+ _constructDateClasses: function (dateSets) {
+ var dateClasses = [];
+ for (var index = 0; index < this._maximalLength; index++) {
+ var dateClass = [];
+ for (var j = 0; j < dateSets.length; j++) {
+ var dateSet = j=== this._referenceIndex ? this._referenceSet : dateSets[j];
+ if (index < dateSet.length) {
+ dateClass.push(dateSet[index]);
+ } else {
+ dateClass.push(undefined);
+ }
+ }
+ dateClasses.push(dateClass);
+ }
+ return dateClasses;
+ },
+ _dateClass: function (date) {
+ var dateClass;
+ for (var i = 0; i < this._dateClasses.length; i++) {
+ dateClass = this._dateClasses[i];
+ if (_.contains(dateClass, date)) {
+ break;
+ }
+ }
+ return dateClass;
+ },
+});
/**
* @param {Number} value
* @param {Number} comparisonValue
@@ -32,11 +112,10 @@ function computeVariation (value, comparisonValue) {
signClass = ' o_null';
}
return {magnitude: magnitude, signClass: signClass};
- } else {
- return {magnitude: NaN};
- }
+ } else {
+ return {magnitude: NaN};
+ }
}
-
/**
* @param {Object} variation
* @param {Object} field
@@ -44,9 +123,9 @@ function computeVariation (value, comparisonValue) {
* @returns {Object}
*/
function renderVariation (variation, field, options) {
- var $variation;
+ var $variation;
if (!isNaN(variation.magnitude)) {
- $variation = $('<div>', {class: 'o_variation' + variation.signClass}).html(
+ $variation = $('<div>', {class: 'o_variation' + variation.signClass}).html(
fieldUtils.format.percentage(variation.magnitude, field, options
));
} else {
@@ -54,7 +133,6 @@ function renderVariation (variation, field, options) {
}
return $variation;
}
-
/**
* @param {JQuery} $node
* @param {Number} value
@@ -67,18 +145,19 @@ function renderVariation (variation, field, options) {
*/
function renderComparison ($node, value, comparisonValue, variation, formatter, field, options) {
var $variation = renderVariation(variation, field, options);
- $node.append($variation);
- if (!isNaN(variation.magnitude)) {
- $node.append(
- $('<div>', {class: 'o_comparison'})
- .html(formatter(value, field, options) + ' <span>vs</span> ' + formatter(comparisonValue, field, options))
- );
- }
+ $node.append($variation);
+ if (!isNaN(variation.magnitude)) {
+ $node.append(
+ $('<div>', {class: 'o_comparison'})
+ .html(formatter(value, field, options) + ' <span>vs</span> ' + formatter(comparisonValue, field, options))
+ );
+ }
}
return {
- computeVariation: computeVariation,
- renderComparison: renderComparison
+ computeVariation: computeVariation,
+ DateClasses: DateClasses,
+ renderComparison: renderComparison
};
});