odoo-saas-kubernetes/web_cohort/static/src/js/cohort_model.js

144 lines
4.1 KiB
JavaScript
Executable File

odoo.define('web_cohort.CohortModel', function (require) {
'use strict';
var AbstractModel = require('web.AbstractModel');
var CohortModel = AbstractModel.extend({
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* @override
* @returns {Object}
*/
__get: function () {
const { rangeDescription, comparisonRangeDescription } = this.timeRanges;
return Object.assign({}, this.data, {
hasContent: !this._isEmpty(),
isSample: this.isSampleModel,
rangeDescription,
comparisonRangeDescription
});
},
/**
* @override
* @param {Object} params
* @param {string} params.modelName
* @param {string} params.dateStart
* @param {string} params.dateStop
* @param {string} params.measure
* @param {string} params.interval
* @param {Array[]} params.domain
* @param {string} params.mode
* @param {string} params.timeline
* @param {Object} params.timeRanges
* @returns {Promise}
*/
__load: function (params) {
this.modelName = params.modelName;
this.dateStart = params.dateStart;
this.dateStop = params.dateStop;
this.measure = params.measure;
this.interval = params.interval;
this.domain = params.domain;
this.mode = params.mode;
this.timeline = params.timeline;
this.data = {
measure: this.measure,
interval: this.interval,
};
this.context = params.context;
this.timeRanges = params.timeRanges;
return this._fetchData();
},
/**
* Reload data.
*
* @param {any} handle
* @param {Object} params
* @param {string} [params.measure]
* @param {string} [params.interval]
* @param {Array[]} [params.domain]
* @param {Object} [params.timeRanges]
* @returns {Promise}
*/
__reload: function (handle, params) {
if ('measure' in params) {
this.data.measure = params.measure;
}
if ('interval' in params) {
this.data.interval = params.interval;
}
if ('domain' in params) {
this.domain = params.domain;
}
if ('timeRanges' in params) {
this.timeRanges = params.timeRanges;
}
return this._fetchData();
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* Fetch cohort data.
*
* @private
* @returns {Promise}
*/
_fetchData: function () {
const domains = this._getDomains();
const proms = domains.map(domain => {
return this._rpc({
model: this.modelName,
method: 'get_cohort_data',
kwargs: {
date_start: this.dateStart,
date_stop: this.dateStop,
measure: this.data.measure,
interval: this.data.interval,
domain: domain,
mode: this.mode,
timeline: this.timeline,
context: this.context
}
});
});
return Promise.all(proms).then(([report, comparisonReport]) => {
this.data.report = report;
this.data.comparisonReport = comparisonReport;
});
},
/**
* @private
* @returns {Array[]}
*/
_getDomains: function () {
const { range, comparisonRange } = this.timeRanges;
if (!range) {
return [this.domain];
}
return [
this.domain.concat(range),
this.domain.concat(comparisonRange),
];
},
/**
* @override
*/
_isEmpty() {
let rowCount = this.data.report.rows.length;
if (this.data.comparisonReport) {
rowCount += this.data.comparisonReport.rows.length;
}
return rowCount === 0;
},
});
return CohortModel;
});