summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/core
diff options
context:
space:
mode:
authorMathieu Duckerts-Antoine <dam@odoo.com>2018-07-06 17:08:52 +0200
committerMathieu Duckerts-Antoine <dam@odoo.com>2018-08-14 12:30:51 +0200
commit333ac27cd5c23e3e1a4f7d78828f28a2c844f8f4 (patch)
tree763baedd55af4c60c73eb112940ae660bca37241 /addons/web/static/src/js/core
parent3523694b6cdce621585893100c7cfbe9495c9eff (diff)
[IMP] web: new TimeRangeMenu widget in search view
This commit introduces a new widget 'TimeRangeMenu' used in the search view. It allows a user to easily: - search data with a given date or datetime field value in a specified period of time - compare the data of interest with data of the previous period or the previous year. The time range menu is available in the search view when one of the four following view types is instantiated: graph, pivot, cohort, or dashboard. Task Id: 1835644
Diffstat (limited to 'addons/web/static/src/js/core')
-rw-r--r--addons/web/static/src/js/core/data_comparison_utils.js83
-rw-r--r--addons/web/static/src/js/core/domain.js111
2 files changed, 163 insertions, 31 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
new file mode 100644
index 00000000000..bdf74b56a24
--- /dev/null
+++ b/addons/web/static/src/js/core/data_comparison_utils.js
@@ -0,0 +1,83 @@
+odoo.define('web.dataComparisonUtils', function (require) {
+"use strict";
+
+var fieldUtils = require('web.field_utils');
+
+/**
+ * @param {Number} value
+ * @param {Number} comparisonValue
+ * @returns {Object}
+ */
+function computeVariation (value, comparisonValue) {
+ var magnitude;
+ var signClass;
+ if (!isNaN(value) && !isNaN(comparisonValue)) {
+ if (comparisonValue === 0) {
+ if (value === 0) {
+ magnitude = 0;
+ } else if (value > 0){
+ magnitude = 1;
+ } else {
+ magnitude = -1;
+ }
+ } else {
+ magnitude = Math.sign(comparisonValue) * (value - comparisonValue) / comparisonValue;
+ }
+ if (magnitude > 0) {
+ signClass = ' o_positive';
+ } else if (magnitude < 0) {
+ signClass = ' o_negative';
+ } else if (magnitude === 0) {
+ signClass = ' o_null';
+ }
+ return {magnitude: magnitude, signClass: signClass};
+ } else {
+ return {magnitude: NaN};
+ }
+}
+
+/**
+ * @param {Object} variation
+ * @param {Object} field
+ * @param {Object} options
+ * @returns {Object}
+ */
+function renderVariation (variation, field, options) {
+ var $variation;
+ if (!isNaN(variation.magnitude)) {
+ $variation = $('<div>', {class: 'o_variation' + variation.signClass}).html(
+ fieldUtils.format.percentage(variation.magnitude, field, options
+ ));
+ } else {
+ $variation = $('<div>', {class: 'o_variation'}).html('-');
+ }
+ return $variation;
+}
+
+/**
+ * @param {JQuery} $node
+ * @param {Number} value
+ * @param {Number} comparisonValue
+ * @param {Object} variation (with key 'magnitude' and 'signClass')
+ * @param {function} formatter
+ * @param {Object} field
+ * @param {Object} options
+ * @returns {Object}
+ */
+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) + ' vs ' + formatter(comparisonValue, field, options))
+ );
+ }
+}
+
+return {
+ computeVariation: computeVariation,
+ renderComparison: renderComparison
+};
+
+});
diff --git a/addons/web/static/src/js/core/domain.js b/addons/web/static/src/js/core/domain.js
index c4011b049b9..5ebc6bd22c9 100644
--- a/addons/web/static/src/js/core/domain.js
+++ b/addons/web/static/src/js/core/domain.js
@@ -234,78 +234,127 @@ var Domain = collections.Tree.extend({
* @param {string} period
* @param {string} type ('date' or 'datetime')
* @param {boolean} forTooltip indicates if domain is used to print a tooltip
+ * @param {string} comparisonPeriod
+ * @returns {string} a domain in string form
*/
- constructDomain: function (fieldName, period, type, forTooltip) {
+ constructDomain: function (fieldName, period, type, forTooltip, comparisonPeriod) {
var leftBoundaryParams, rightBoundaryParams;
+ var offsetPeriodParams;
var t = forTooltip || false;
function makeInterval () {
+ switch (comparisonPeriod) {
+ case 'previous_period':
+ _.map(offsetPeriodParams, function (value, key) {
+ if (_.isNumber(value)) {
+ leftBoundaryParams[key] = value + (leftBoundaryParams[key] || 0);
+ } else {
+ leftBoundaryParams[key] = value + ' + ' + (leftBoundaryParams[key] || 0);
+ }
+ });
+ _.map(offsetPeriodParams, function (value, key) {
+ if (_.isNumber(value)) {
+ rightBoundaryParams[key] = value + (rightBoundaryParams[key] || 0);
+ } else {
+ rightBoundaryParams[key] = value + ' + ' + (rightBoundaryParams[key] || 0);
+ }
+ });
+ break;
+ case 'previous_year':
+ leftBoundaryParams.years = leftBoundaryParams.years ? leftBoundaryParams.years-- : -1;
+ rightBoundaryParams.years = rightBoundaryParams.years ? rightBoundaryParams.years-- : -1;
+ break;
+ }
+
+ var stringifyParams = function (value, key) {
+ return key + '=' + value;
+ };
+ var leftBoundaryStringifyParams = _.map(leftBoundaryParams, stringifyParams).join(', ');
+ var rightBoundaryStringifyParams = _.map(rightBoundaryParams, stringifyParams).join(', ');
+
if (type === 'date') {
return "['&'," +
- "('" + fieldName + "', '>=', (context_today() + relativedelta(" + leftBoundaryParams + ")).strftime('%Y-%m-%d'))," +
- "('" + fieldName + "', '<', (context_today() + relativedelta(" + rightBoundaryParams + ")).strftime('%Y-%m-%d'))"+
+ "('" + fieldName + "', '>=', (context_today() + relativedelta(" + leftBoundaryStringifyParams + ")).strftime('%Y-%m-%d'))," +
+ "('" + fieldName + "', '<', (context_today() + relativedelta(" + rightBoundaryStringifyParams + ")).strftime('%Y-%m-%d'))"+
"]";
}
else {
return "['&'," +
"('" + fieldName + "', '>=', " +
- "(datetime.datetime.combine(context_today() + relativedelta(" + leftBoundaryParams + "), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))," +
+ "(datetime.datetime.combine(context_today() + relativedelta(" + leftBoundaryStringifyParams + "), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))," +
"('" + fieldName + "', '<', " +
- "(datetime.datetime.combine(context_today() + relativedelta(" + rightBoundaryParams + "), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))"+
+ "(datetime.datetime.combine(context_today() + relativedelta(" + rightBoundaryStringifyParams + "), datetime.time(0,0,0)).to_utc()).strftime('%Y-%m-%d %H:%M:%S'))"+
"]";
}
}
switch (period) {
case 'today':
- leftBoundaryParams = "";
- rightBoundaryParams = t ? "" : "days=1";
+ leftBoundaryParams = {};
+ rightBoundaryParams = t ? {} : {days: 1};
+ offsetPeriodParams = {days: -1};
return makeInterval();
case 'this_week':
- leftBoundaryParams = "weeks=-1, days=1, weekday=0";
- rightBoundaryParams = t ? "weekday=6" : "days=1, weekday=0";
+ leftBoundaryParams = {weeks: -1, days: 1, weekday: 0};
+ rightBoundaryParams = t ? {weekday: 6} : {days: 1, weekday: 0};
+ offsetPeriodParams = {weeks: -1};
return makeInterval();
case 'this_month':
- leftBoundaryParams = "day=1";
- rightBoundaryParams = (t ? "days=-1, " : "") + "day=1, months=1";
+ leftBoundaryParams = {day: 1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {},
+ {day: 1, months: 1});
+ offsetPeriodParams = {months: -1};
return makeInterval();
case 'this_quarter':
- leftBoundaryParams = "months= - (context_today().month - 1) % 3, day=1";
- rightBoundaryParams = (t ? "days=-1, " : "") + "months= 3 - (context_today().month -1 ) % 3, day=1";
+ leftBoundaryParams = {months: '- (context_today().month - 1) % 3', day: 1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {},
+ {months: '3 - (context_today().month - 1) % 3', day: 1});
+ offsetPeriodParams = {months: -3};
return makeInterval();
case 'this_year':
- leftBoundaryParams = "month=1, day=1";
- rightBoundaryParams = (t ? "days=-1, " : "") + "month=1, day=1, years=1";
+ leftBoundaryParams = {month: 1, day: 1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {},
+ {month: 1, day: 1, years: 1});
+ offsetPeriodParams = {years: -1};
return makeInterval();
case 'yesterday':
- leftBoundaryParams = "days=-1";
- rightBoundaryParams = (t ? "days=-1" : "");
+ leftBoundaryParams = {days: -1};
+ rightBoundaryParams = (t ? {days: -1} : {});
+ offsetPeriodParams = {days: -1};
return makeInterval();
case 'last_week':
- leftBoundaryParams = "weeks=-2, days=1, weekday=0";
- rightBoundaryParams = t ? "weeks=-1, weekday=6" : "weeks=-1, days=1, weekday=0";
+ leftBoundaryParams = {weeks: -2, days: 1, weekday: 0};
+ rightBoundaryParams = t ? {weeks: -1, weekday: 6} : {weeks: -1, days: 1, weekday: 0};
+ offsetPeriodParams = {weeks: -1};
return makeInterval();
case 'last_month':
- leftBoundaryParams = "months=-1, day=1";
- rightBoundaryParams = (t ? "days=-1 , " : "") + "day=1";
+ leftBoundaryParams = {months: -1, day: 1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {}, {day: 1});
+ offsetPeriodParams = {months: -1};
return makeInterval();
case 'last_quarter':
- leftBoundaryParams = "months= - 3 - (context_today().month - 1) % 3, day=1";
- rightBoundaryParams = (t ? "days=-1 , " : "") + "months= - (context_today().month - 1) % 3, day=1";
+ leftBoundaryParams = {months: '- 3 - (context_today().month - 1) % 3', day: 1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {},
+ {months: '- (context_today().month - 1) % 3', day: 1});
+ offsetPeriodParams = {months: -3};
return makeInterval();
case 'last_year':
- leftBoundaryParams = "month=1, day=1, years=-1";
- rightBoundaryParams = (t ? "days=-1 , " : "") + "month=1, day=1";
+ leftBoundaryParams = {month: 1, day: 1, years: -1};
+ rightBoundaryParams = _.extend(t ? {days: -1} : {}, {month: 1, day: 1});
+ offsetPeriodParams = {years: -1};
return makeInterval();
case 'last_7_days':
- leftBoundaryParams = "days=-7";
- rightBoundaryParams = t ? "days=-1" : "";
+ leftBoundaryParams = {days: -7};
+ rightBoundaryParams = t ? {days: -1} : {};
+ offsetPeriodParams = {days: -7};
return makeInterval();
case 'last_30_days':
- leftBoundaryParams = "days=-30";
- rightBoundaryParams = t ? "days=-1" : "";
+ leftBoundaryParams = {days: -30};
+ rightBoundaryParams = t ? {days: -1} : {};
+ offsetPeriodParams = {days: -30};
return makeInterval();
case 'last_365_days':
- leftBoundaryParams = "days=-365";
- rightBoundaryParams = t ? "days=-1" : "";
+ leftBoundaryParams = {days: -365};
+ rightBoundaryParams = t ? {days: -1} : {};
+ offsetPeriodParams = {days: -365};
return makeInterval();
}
},