mirror of https://github.com/OCA/web.git
191 lines
6.6 KiB
JavaScript
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");
|
|
}
|
|
},
|
|
});
|
|
});
|