diff options
| author | Mathieu Duckerts-Antoine <dam@odoo.com> | 2019-02-21 14:29:26 +0000 |
|---|---|---|
| committer | Mathieu Duckerts-Antoine <dam@odoo.com> | 2019-04-01 14:40:51 +0000 |
| commit | a9bcb12f6419aaf087bad4c8a3f7ed7c00dbf3c5 (patch) | |
| tree | 5f25467a6a22ab75db6077eb35bf1b7ff83408a6 /addons/web/static/src/js/core | |
| parent | d23419fd86d5f8266c37526176c1bf79a09a1684 (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.js | 111 |
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 }; }); |
