web/web_pivot_computed_measure/static/src/js/pivot_controller.js

191 lines
6.6 KiB
JavaScript

/* Copyright 2020 Tecnativa - Alexandre Díaz
* License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) */
odoo.define("web_pivot_computed_measure.PivotController", function(require) {
"use strict";
var core = require("web.core");
var config = require("web.config");
var PivotController = require("web.PivotController");
var QWeb = core.qweb;
PivotController.include({
custom_events: _.extend({}, PivotController.prototype.custom_events, {
add_measure: "_onAddMeasure",
remove_measure: "_onRemoveMeasure",
}),
computed_measures_open: false,
/**
* Add the computed measures to the context. This
* will be used when save a filter.
*
* @override
*/
getContext: function() {
var res = this._super.apply(this, arguments);
var state = this.model.get();
res.pivot_computed_measures = state.computed_measures;
return res;
},
/**
* @override
*/
renderButtons: function($node) {
this._super.apply(this, arguments);
if ($node) {
this._renderComputedMeasures();
}
},
/**
* Handle click event on measures menu to support computed measures sub-menu
*
* @override
*/
_onButtonClick: function(event) {
var $target = $(event.target);
if ($target.parents("div[data-id='__computed__']").length) {
var hideMenu = false;
event.preventDefault();
if (
$target.hasClass("dropdown-item") ||
$target.hasClass("o_submenu_switcher")
) {
this.computed_measures_open = !this.computed_measures_open;
this._renderComputedMeasures();
} else if ($target.hasClass("o_add_computed_measure")) {
hideMenu = true;
var field1 = this.$buttons_measures_ex
.find("#computed_measure_field_1")
.val();
var field2 = this.$buttons_measures_ex
.find("#computed_measure_field_2")
.val();
var oper = this.$buttons_measures_ex
.find("#computed_measure_operation")
.val();
if (oper === "custom") {
oper = this.$buttons_measures_ex
.find("#computed_measure_operation_custom")
.val();
}
var name = this.$buttons_measures_ex
.find("#computed_measure_name")
.val();
var format = this.$buttons_measures_ex
.find("#computed_measure_format")
.val();
var uniqueId = new Date().getTime();
this.model
.createComputedMeasure(
uniqueId,
field1,
field2,
oper,
name,
format
)
.then(this.update.bind(this, {}, {reload: false}));
}
if (!hideMenu) {
event.stopPropagation();
}
return;
}
this._super.apply(this, arguments);
},
/**
* Render computed measures menu
*/
_renderComputedMeasures: function() {
if (this.$buttons_measures_ex && this.$buttons_measures_ex.length) {
this.$buttons_measures_ex.remove();
}
var self = this;
var measures = _.sortBy(_.pairs(_.omit(this.measures, "__count")), function(
x
) {
return x[1].string.toLowerCase();
});
this.$buttons_measures_ex = $(
QWeb.render("web_pivot_computed_measure.ExtendedMenu", {
isOpen: this.computed_measures_open,
debug: config.debug,
measures: measures,
computed_measures: _.map(
_.reject(measures, function(item) {
return !item[1].__computed_id;
}),
function(item) {
item[1].active = _.contains(
self.model.data.measures,
item[0]
);
return item;
}
),
})
);
this.$buttons_measures_ex
.find("#computed_measure_operation")
.on("change", this._onChangeComputedMeasureOperation.bind(this));
this.$buttons
.find(".o_pivot_measures_list")
.append(this.$buttons_measures_ex);
},
/**
* Custom event to add a new measure
*
* @param {CustomEvent} ev
*/
_onAddMeasure: function(ev) {
this.measures[ev.data.id] = ev.data.def;
this._renderComputedMeasures();
},
/**
* Custom event to remove a measure
*
* @param {CustomEvent} ev
*/
_onRemoveMeasure: function(ev) {
delete this.measures[ev.data.id];
this._renderComputedMeasures();
},
/**
* Set default values related with the selected operation
*
* @param {ChangeEvent} ev
*/
_onChangeComputedMeasureOperation: function(ev) {
var $option = $(ev.target.options[ev.target.selectedIndex]);
if ($(ev.target).val() === "custom") {
this.$buttons_measures_ex
.find("#container_computed_measure_operation_custom")
.removeClass("d-none");
} else {
var format = $option.data("format");
if (format) {
this.$buttons_measures_ex
.find("#computed_measure_format")
.val(format);
}
this.$buttons_measures_ex
.find("#container_computed_measure_operation_custom")
.addClass("d-none");
}
},
});
});