OCA reporting engine fork for dev and update.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

164 lines
5.8 KiB

/*
global py
*/
odoo.define("kpi_dashboard.DashboardController", function (require) {
"use strict";
var BasicController = require("web.BasicController");
var core = require("web.core");
var qweb = core.qweb;
var _t = core._t;
var DashboardController = BasicController.extend({
init: function () {
this._super.apply(this, arguments);
this.dashboard_context = {};
this.dashboard_color_data = [];
},
custom_events: _.extend({}, BasicController.prototype.custom_events, {
addDashboard: "_addDashboard",
refresh_on_fly: "_refreshOnFly",
modify_context: "_modifyContext",
add_modify_color: "_addModifyColor",
refresh_colors: "_refreshColors",
}),
_refreshOnFly: function () {
var self = this;
this._rpc({
model: this.modelName,
method: "read_dashboard_on_fly",
args: [[this.renderer.state.res_id]],
context: this._getContext(),
}).then(function (data) {
_.each(data, function (item) {
// We will follow the same logic used on Bus Notifications
self.renderer._onNotification([
["kpi_dashboard_" + self.renderer.state.res_id, item],
]);
});
});
},
renderPager: function ($node, options) {
// eslint-disable-next-line no-param-reassign
options = _.extend({}, options, {
validate: this.canBeDiscarded.bind(this),
});
this._super($node, options);
},
_pushState: function (state) {
// eslint-disable-next-line no-param-reassign
state = state || {};
var env = this.model.get(this.handle, {env: true});
state.id = env.currentId;
this._super(state);
},
_addDashboard: function () {
var self = this;
var action = self.initialState.specialData.action_id;
var name = self.initialState.specialData.name;
if (!action) {
self.do_warn(_t("First you must create the Menu"));
}
return self
._rpc({
route: "/board/add_to_dashboard",
params: {
action_id: action,
context_to_save: {res_id: self.initialState.res_id},
domain: [("id", "=", self.initialState.res_id)],
view_mode: "dashboard",
name: name,
},
})
.then(function (r) {
if (r) {
self.do_notify(
_.str.sprintf(_t("'%s' added to dashboard"), name),
_t(
"Please refresh your browser for the changes to take effect."
)
);
} else {
self.do_warn(_t("Could not add KPI dashboard to dashboard"));
}
});
},
_updateButtons: function () {
// HOOK Function
this.$buttons.on(
"click",
".o_dashboard_button_add",
this._addDashboard.bind(this)
);
},
renderButtons: function ($node) {
if (!$node) {
return;
}
this.$buttons = $("<div/>");
this.$buttons.append(qweb.render("kpi_dashboard.buttons", {widget: this}));
this._updateButtons();
this.$buttons.appendTo($node);
},
_getContext: function () {
return _.extend(
{},
this.model.get(this.handle, {raw: true}).getContext(),
{bin_size: true},
this.dashboard_context
);
},
_modifyContext: function (event) {
var ctx = this._getContext();
this.dashboard_context = _.extend(
this.dashboard_context,
py.eval(event.data.context, {
context: _.extend(
ctx,
{
__getattr__: function () {
return false;
},
}
// We need to add this in order to allow to use undefined
// context items
),
})
);
this._refreshOnFly(event);
this._refreshColors();
},
_addModifyColor: function (event) {
this.dashboard_color_data.push([
event.data.element_id,
event.data.expression,
]);
},
_refreshColors: function () {
var self = this;
var ctx = this._getContext();
_.each(this.dashboard_color_data, function (data) {
var color = py.eval(data[1], {
context: _.extend(ctx, {
__getattr__: function () {
return false;
},
}),
check_if: function (args) {
if (args[0].toJSON()) {
return args[1];
}
return args[2];
},
});
var $element = self.renderer.$el.find("#" + data[0]);
$element.css("background-color", color);
});
},
});
return DashboardController;
});