flectra/addons/account/static/src/js/account_dashboard_setup_bar.js

228 lines
7.1 KiB
JavaScript

flectra.define('account.dashboard_setup_bar', function (require) {
"use strict";
var core = require('web.core');
var field_utils = require('web.field_utils');
var KanbanView = require('web.KanbanView');
var KanbanModel = require('web.KanbanModel');
var KanbanRenderer = require('web.KanbanRenderer');
var KanbanController = require('web.KanbanController');
var session = require('web.session');
var view_registry = require('web.view_registry');
var QWeb = core.qweb;
var _t = core._t;
var _lt = core._lt;
var COMPANY_METHOD_TYPE = "company_object";
var AccountSetupBarRenderer = KanbanRenderer.extend({
events: _.extend({}, KanbanRenderer.prototype.events, {
'click .account_setup_dashboard_action': 'onActionClicked',
}),
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* Notifies the controller that the target has changed.
*
* @private
* @param {string} target_name the name of the changed target
* @param {string} value the new value
*/
_notifyTargetChange: function (target_name, value) {
this.trigger_up('dashboard_edit_target', {
target_name: target_name,
target_value: value,
});
},
/**
* @override
* @private
* @returns {Deferred}
*/
_render: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
var values = self.state.dashboardValues;
var account_dashboard = QWeb.render('account.AccountDashboardSetupBar', {
widget: self,
values: values,
});
self.$el.prepend(account_dashboard);
});
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {MouseEvent}
*/
onActionClicked: function(e) {
e.preventDefault();
var self = this;
var $action = $(e.currentTarget);
var name_attr = $action.attr('name');
var type_attr = $action.attr('type');
var action_context = $action.data('context');
if(type_attr == COMPANY_METHOD_TYPE) {
self.trigger_up('company_button_action', {rpc_method: name_attr, context: action_context})
}
},
});
var AccountSetupBarModel = KanbanModel.extend({
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* @override
*/
init: function () {
this.dashboardValues = {};
this._super.apply(this, arguments);
},
/**
* @override
*/
get: function (localID) {
var result = this._super.apply(this, arguments);
if (this.dashboardValues[localID]) {
result.dashboardValues = this.dashboardValues[localID];
}
return result;
},
/**
* @œverride
* @returns {Deferred}
*/
load: function () {
return this._loadDashboard(this._super.apply(this, arguments));
},
/**
* @œverride
* @returns {Deferred}
*/
reload: function () {
return this._loadDashboard(this._super.apply(this, arguments));
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* @abstract
* @returns {Deferred<Object>} resolves to the required dashboard data
*/
_fetchDashboardData: function () {
return $.when(this._rpc({
model: 'account.journal',
method: 'retrieve_account_dashboard_setup_bar',
args: [],
}));
},
/**
* @private
* @param {Deferred} super_def a deferred that resolves with a dataPoint id
* @returns {Deferred<string>} resolves to the dataPoint id
*/
_loadDashboard: function (super_def) {
var self = this;
var dashboard_def = this._fetchDashboardData();
return $.when(super_def, dashboard_def).then(function (id, dashboardValues) {
self.dashboardValues[id] = dashboardValues;
return id;
});
},
});
var AccountSetupBarController = KanbanController.extend({
/* The company_button_action action allows the buttons of the setup bar to
* trigger Python code defined in api.model functions in res.company model,
* and to execute the action returned them.
* It uses the 'type' attributes on buttons : if 'company_object', it will
* run Python function 'name' of company model.
*/
custom_events: _.extend({}, KanbanController.prototype.custom_events, {
dashboard_open_action: '_onDashboardOpenAction',
company_button_action: '_triggerCompanyButtonAction',
}),
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @param {FlectraEvent} e
*/
_onDashboardOpenAction: function (e) {
var action_name = e.data.action_name;
var action_context = e.data.action_context;
return this.do_action(action_name, {
additional_context: action_context,
});
},
/**
* Manages the clicks on the setup bar buttons.
**/
_triggerCompanyButtonAction: function (flectraEvent) {
var self = this
if (flectraEvent.data.rpc_method !== undefined) {
self._rpc({
model: 'res.company',
method: flectraEvent.data.rpc_method,
args: [],
})
.then(
function(rslt_action) {
if (rslt_action !== undefined) {
self.do_action(rslt_action, {
action_context: flectraEvent.data.context,
on_close: function () {
self.trigger_up('reload'); //Reloads the dashboard to refresh the status of the setup bar.
},
});
}
else { //Happens for any button not returning anything, like the cross to close the setup bar, for example.
self.trigger_up('reload');
}
});
}
}
});
var AccountDashboardView = KanbanView.extend({
config: _.extend({}, KanbanView.prototype.config, {
Model: AccountSetupBarModel,
Renderer: AccountSetupBarRenderer,
Controller: AccountSetupBarController,
}),
display_name: _lt('Dashboard'),
icon: 'fa-dashboard',
searchview_hidden: false,
});
view_registry.add('account_setup_bar', AccountDashboardView);
return {
Model: AccountSetupBarModel,
Renderer: AccountSetupBarRenderer,
Controller: AccountSetupBarController,
};
});