/* 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'); } } }); });