diff options
| author | Martin Geubelle <mge@odoo.com> | 2017-06-14 16:56:48 +0200 |
|---|---|---|
| committer | Martin Geubelle <mge@odoo.com> | 2017-06-15 13:22:07 +0200 |
| commit | d88d1abcf07f6f644f2039baf4b53c218cb95f84 (patch) | |
| tree | 8dc230a878daea616061ca437a408c1a454b7b3b /addons/web/static/src | |
| parent | 46751de5069960fdc282446212998f82cede646b (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')
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, }); |
