summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorMartin Geubelle <mge@odoo.com>2017-06-14 16:56:48 +0200
committerMartin Geubelle <mge@odoo.com>2017-06-15 13:22:07 +0200
commitd88d1abcf07f6f644f2039baf4b53c218cb95f84 (patch)
tree8dc230a878daea616061ca437a408c1a454b7b3b /addons/web/static/src
parent46751de5069960fdc282446212998f82cede646b (diff)
[FIX] web: reimplement `group_by_tooltip` option in kanban
This option hadn't been implemented in the new views. It allows to display informative explanations as tooltips on column over. It can be set on a many2one field in the kanban view, e.g.: ```<field name="stage_id" options='{"group_by_tooltip": {"<tooltipFieldOnStageModel>": "<ABeautifulTitle>"} }'/> ``` An extra RPC needs to be done on the many2one relation to fetch these additional fields and the data are stored in the datapoint under the key `tooltipData`.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_column.js12
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_model.js62
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_renderer.js3
3 files changed, 69 insertions, 8 deletions
diff --git a/addons/web/static/src/js/views/kanban/kanban_column.js b/addons/web/static/src/js/views/kanban/kanban_column.js
index 642ab2e8aeb..d999ee74025 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column.js
@@ -44,7 +44,6 @@ var KanbanColumn = Widget.extend({
this.folded = !data.isOpen;
this.has_active_field = 'active' in data.fields;
this.size = data.count;
- this.values = data.values;
this.fields = data.fields;
this.records = [];
this.modelName = data.model;
@@ -62,13 +61,12 @@ var KanbanColumn = Widget.extend({
this.record_options = _.clone(recordOptions);
- if (data.options && data.options.group_by_tooltip) {
- var self = this;
- this.tooltip_info = _.map(data.options.group_by_tooltip, function (key, value) {
- return (self.values && self.values[value] && "<div>" +key + "<br>" + self.values[value] + "</div>") || '';
+ if (options.group_by_tooltip) {
+ this.tooltipInfo = _.map(options.group_by_tooltip, function (help, field) {
+ return (data.tooltipData && data.tooltipData[field] && "<div>" + help + "<br>" + data.tooltipData[field] + "</div>") || '';
}).join('');
} else {
- this.tooltip_info = "";
+ this.tooltipInfo = "";
}
},
/**
@@ -216,7 +214,7 @@ var KanbanColumn = Widget.extend({
this.$el.toggleClass('o_column_folded', this.folded);
var tooltip = this.size + _t(' records');
- tooltip = '<p>' + tooltip + '</p>' + this.tooltip_info;
+ tooltip = '<p>' + tooltip + '</p>' + this.tooltipInfo;
this.$header.tooltip({html: true}).attr('data-original-title', tooltip);
if (!this.remaining) {
this.$('.o_kanban_load_more').remove();
diff --git a/addons/web/static/src/js/views/kanban/kanban_model.js b/addons/web/static/src/js/views/kanban/kanban_model.js
index c606776ccc0..cd69889bda9 100644
--- a/addons/web/static/src/js/views/kanban/kanban_model.js
+++ b/addons/web/static/src/js/views/kanban/kanban_model.js
@@ -90,6 +90,21 @@ var KanbanModel = BasicModel.extend({
});
},
/**
+ * Add the key `tooltipData` (kanban specific) when performing a `geĊ§`.
+ *
+ * @override
+ * @see _readTooltipFields
+ * @returns {Object}
+ */
+ get: function () {
+ var result = this._super.apply(this, arguments);
+ var dp = result && this.localData[result.id];
+ if (dp && dp.tooltipData) {
+ result.tooltipData = $.extend(true, {}, dp.tooltipData);
+ }
+ return result;
+ },
+ /**
* @override
*/
load: function (params) {
@@ -203,10 +218,55 @@ var KanbanModel = BasicModel.extend({
* @param {Object} list valid resource object
*/
_readGroup: function (list) {
+ var self = this;
if (list.groupedBy.length > 1) {
list.groupedBy = [list.groupedBy[0]];
}
- return this._super.apply(this, arguments);
+ return this._super.apply(this, arguments).then(function (result) {
+ return self._readTooltipFields(list).then(_.constant(result));
+ });
+ },
+ /**
+ * Fetches tooltip specific fields on the group by relation and stores it in
+ * the column datapoint in a special key `tooltipData`.
+ * Data for the tooltips (group_by_tooltip) are fetched in batch for all
+ * groups, to avoid doing multiple calls.
+ * Data are stored in a special key `tooltipData` on the datapoint.
+ * Note that the option `group_by_tooltip` is only for m2o fields.
+ *
+ * @private
+ * @param {Object} list a list of groups
+ * @returns {Deferred}
+ */
+ _readTooltipFields: function (list) {
+ var self = this;
+ var groupedByField = list.fields[list.groupedBy[0]];
+ if (groupedByField.type !== 'many2one') {
+ return $.when();
+ }
+ var groupIds = _.map(list.data, function (id) {
+ return self.get(id, {raw: true}).res_id;
+ });
+ var tooltipFields = [];
+ var groupedByFieldInfo = list.fieldsInfo.kanban[list.groupedBy[0]];
+ if (groupedByFieldInfo && groupedByFieldInfo.options) {
+ tooltipFields = Object.keys(groupedByFieldInfo.options.group_by_tooltip || {});
+ }
+ if (groupIds.length && tooltipFields.length) {
+ var fieldNames = _.union(['display_name'], tooltipFields);
+ return this._rpc({
+ model: groupedByField.relation,
+ method: 'read',
+ args: [groupIds, fieldNames],
+ context: list.context,
+ }).then(function (result) {
+ _.each(list.data, function (id) {
+ var dp = self.localData[id];
+ dp.tooltipData = _.findWhere(result, {id: dp.res_id});
+ });
+ });
+ }
+ return $.when();
},
});
diff --git a/addons/web/static/src/js/views/kanban/kanban_renderer.js b/addons/web/static/src/js/views/kanban/kanban_renderer.js
index 7bfe21e66a9..87275260b01 100644
--- a/addons/web/static/src/js/views/kanban/kanban_renderer.js
+++ b/addons/web/static/src/js/views/kanban/kanban_renderer.js
@@ -188,6 +188,7 @@ var KanbanRenderer = BasicRenderer.extend({
_renderGrouped: function (fragment) {
var self = this;
var groupByFieldAttrs = this.state.fields[this.state.groupedBy[0]];
+ var groupByFieldInfo = this.state.fieldsInfo.kanban[this.state.groupedBy[0]];
// Deactivate the drag'n'drop if the groupedBy field:
// - is a date or datetime since we group by month or
// - is readonly
@@ -201,8 +202,10 @@ var KanbanRenderer = BasicRenderer.extend({
}
var groupedByM2O = groupByFieldAttrs && (groupByFieldAttrs.type === 'many2one');
var grouped_by_field = groupedByM2O && groupByFieldAttrs.relation;
+ var groupByTooltip = groupByFieldInfo && groupByFieldInfo.options.group_by_tooltip;
this.columnOptions = _.extend(this.columnOptions, {
draggable: draggable,
+ group_by_tooltip: groupByTooltip,
grouped_by_m2o: groupedByM2O,
relation: grouped_by_field,
});