diff options
Diffstat (limited to 'addons/web/static/src/js/views/graph/graph_model.js')
| -rw-r--r-- | addons/web/static/src/js/views/graph/graph_model.js | 112 |
1 files changed, 48 insertions, 64 deletions
diff --git a/addons/web/static/src/js/views/graph/graph_model.js b/addons/web/static/src/js/views/graph/graph_model.js index d8b8df2f1fd..8dcb241ae9c 100644 --- a/addons/web/static/src/js/views/graph/graph_model.js +++ b/addons/web/static/src/js/views/graph/graph_model.js @@ -2,7 +2,7 @@ odoo.define('web.GraphModel', function (require) { "use strict"; var core = require('web.core'); -const { DEFAULT_INTERVAL, rank } = require('web.controlPanelViewParameters'); +const { DEFAULT_INTERVAL, rankInterval } = require('web.searchUtils'); var _t = core._t; @@ -35,10 +35,7 @@ return AbstractModel.extend({ * @returns {Object} */ get: function () { - var self = this; - return _.extend({}, this.chart, { - comparisonFieldIndex: self._getComparisonFieldIndex(), - }); + return _.extend({}, this.chart); }, /** * Initial loading. @@ -47,21 +44,16 @@ return AbstractModel.extend({ * should be done by the graphView I think. * * @param {Object} params - * @param {boolean} params.compare * @param {Object} params.context * @param {Object} params.fields - * @param {string[]} params.comparisonTimeRange * @param {string[]} params.domain * @param {string[]} params.groupBys a list of valid field names * @param {string[]} params.groupedBy a list of valid field names * @param {boolean} params.stacked - * @param {string[]} params.timeRange - * @param {string} params.comparisonField - * @param {string} params.comparisonTimeRangeDescription * @param {string} params.measure a valid field name * @param {'pie'|'bar'|'line'} params.mode * @param {string} params.modelName - * @param {string} params.timeRangeDescription + * @param {Object} params.timeRanges * @returns {Promise} The promise does not return a handle, we don't need * to keep track of various entities. */ @@ -70,11 +62,7 @@ return AbstractModel.extend({ this.initialGroupBys = groupBys; this.fields = params.fields; this.modelName = params.modelName; - this.chart = { - comparisonField: params.comparisonField, - comparisonTimeRange: params.comparisonTimeRange, - comparisonTimeRangeDescription: params.comparisonTimeRangeDescription, - compare: params.compare, + this.chart = Object.assign({ context: params.context, dataPoints: [], domain: params.domain, @@ -83,11 +71,12 @@ return AbstractModel.extend({ mode: params.context.graph_mode || params.mode, origins: [], stacked: params.stacked, - timeRange: params.timeRange, - timeRangeDescription: params.timeRangeDescription, - }; - this.chart.processedGroupBy = this._processGroupBy(this.chart.groupBy); - return this._loadGraph(this._getDomains()); + timeRanges: params.timeRanges, + }); + + this._computeDerivedParams(); + + return this._loadGraph(); }, /** * Reload data. It is similar to the load function. Note that we ignore the @@ -104,6 +93,7 @@ return AbstractModel.extend({ * @param {string[]} [params.groupBy] * @param {string} [params.measure] a valid field name * @param {string} [params.mode] one of 'bar', 'pie', 'line' + * @param {Object} [params.timeRanges] * @returns {Promise} */ reload: function (handle, params) { @@ -112,22 +102,6 @@ return AbstractModel.extend({ this.chart.groupBy = params.context.graph_groupbys || this.chart.groupBy; this.chart.measure = params.context.graph_measure || this.chart.measure; this.chart.mode = params.context.graph_mode || this.chart.mode; - var timeRangeMenuData = params.context.timeRangeMenuData; - if (timeRangeMenuData) { - this.chart.comparisonField = timeRangeMenuData.comparisonField || undefined; - this.chart.comparisonTimeRange = timeRangeMenuData.comparisonTimeRange || []; - this.chart.compare = this.chart.comparisonTimeRange.length > 0; - this.chart.comparisonTimeRangeDescription = timeRangeMenuData.comparisonTimeRangeDescription; - this.chart.timeRange = timeRangeMenuData.timeRange || []; - this.chart.timeRangeDescription = timeRangeMenuData.timeRangeDescription; - } else { - this.chart.comparisonField = undefined; - this.chart.comparisonTimeRange = []; - this.chart.compare = false; - this.chart.comparisonTimeRangeDescription = undefined; - this.chart.timeRange = []; - this.chart.timeRangeDescription = undefined; - } } if ('domain' in params) { this.chart.domain = params.domain; @@ -138,7 +112,12 @@ return AbstractModel.extend({ if ('measure' in params) { this.chart.measure = params.measure; } - this.chart.processedGroupBy = this._processGroupBy(this.chart.groupBy); + if ('timeRanges' in params) { + this.chart.timeRanges = params.timeRanges; + } + + this._computeDerivedParams(); + if ('mode' in params) { this.chart.mode = params.mode; return Promise.resolve(); @@ -147,7 +126,7 @@ return AbstractModel.extend({ this.chart.stacked = params.stacked; return Promise.resolve(); } - return this._loadGraph(this._getDomains()); + return this._loadGraph(); }, //-------------------------------------------------------------------------- @@ -155,28 +134,34 @@ return AbstractModel.extend({ //-------------------------------------------------------------------------- /** + * Compute this.chart.processedGroupBy, this.chart.domains, this.chart.origins, + * and this.chart.comparisonFieldIndex. + * Those parameters are determined by this.chart.timeRanges, this.chart.groupBy, and this.chart.domain. + * * @private - * @returns {number} - */ - _getComparisonFieldIndex: function () { - var groupBys = this.chart.processedGroupBy.map(function (gb) { - return gb.split(":")[0]; - }); - return groupBys.indexOf(this.chart.comparisonField); - }, - /** - * @private - * @returns {Array[]} */ - _getDomains: function () { - var domains = [this.chart.domain.concat(this.chart.timeRange)]; - this.chart.origins = [this.chart.timeRangeDescription || ""]; - if (this.chart.compare) { - domains.push(this.chart.domain.concat(this.chart.comparisonTimeRange)); - this.chart.origins.push(this.chart.comparisonTimeRangeDescription); + _computeDerivedParams: function () { + this.chart.processedGroupBy = this._processGroupBy(this.chart.groupBy); + + const { range, rangeDescription, comparisonRange, comparisonRangeDescription, fieldName } = this.chart.timeRanges; + if (range) { + this.chart.domains = [this.chart.domain.concat(range)]; + this.chart.origins = [rangeDescription]; + if (comparisonRange) { + this.chart.domains.push(this.chart.domain.concat(comparisonRange)); + this.chart.origins.push(comparisonRangeDescription); + } + const groupBys = this.chart.processedGroupBy.map(function (gb) { + return gb.split(":")[0]; + }); + this.chart.comparisonFieldIndex = groupBys.indexOf(fieldName); + } else { + this.chart.domains = [this.chart.domain]; + this.chart.origins = [""]; + this.chart.comparisonFieldIndex = -1; } - return domains; }, + /** * Fetch and process graph data. It is basically a(some) read_group(s) * with correct fields for each domain. We have to do some light processing @@ -184,10 +169,9 @@ return AbstractModel.extend({ * with an aggregation function, such as my_date:week. * * @private - * @param {Array[]} domains * @returns {Promise} */ - _loadGraph: function (domains) { + _loadGraph: function () { var self = this; this.chart.dataPoints = []; var groupBy = this.chart.processedGroupBy; @@ -205,10 +189,10 @@ return AbstractModel.extend({ } var context = _.extend({fill_temporal: true}, this.chart.context); - var defs = []; - domains.forEach(function (domain, originIndex) { - defs.push(self._rpc({ + var proms = []; + this.chart.domains.forEach(function (domain, originIndex) { + proms.push(self._rpc({ model: self.modelName, method: 'read_group', context: context, @@ -218,7 +202,7 @@ return AbstractModel.extend({ lazy: false, }).then(self._processData.bind(self, originIndex))); }); - return Promise.all(defs); + return Promise.all(proms); }, /** * Since read_group is insane and returns its result on different keys @@ -286,7 +270,7 @@ return AbstractModel.extend({ } if (groupBysMap.has(fieldName)) { const registeredInterval = groupBysMap.get(fieldName); - if (rank(registeredInterval) < rank(interval)) { + if (rankInterval(registeredInterval) < rankInterval(interval)) { groupBysMap.set(fieldName, interval); } } else { |
