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] && "
' + tooltip + '
' + this.tooltip_info; + tooltip = '' + tooltip + '
' + 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 @@ -89,6 +89,21 @@ var KanbanModel = BasicModel.extend({ return newGroup.id; }); }, + /** + * 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 */ @@ -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, }); diff --git a/addons/web/static/tests/views/kanban_model_tests.js b/addons/web/static/tests/views/kanban_model_tests.js index eeb07c17358..1a3391c720d 100644 --- a/addons/web/static/tests/views/kanban_model_tests.js +++ b/addons/web/static/tests/views/kanban_model_tests.js @@ -55,6 +55,7 @@ QUnit.module('Views', { limit: 40, modelName: 'partner', openGroupByDefault: true, + viewType: 'kanban', }; } }, function () { diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index f7ea586da6c..89fc72691f0 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -1491,6 +1491,43 @@ QUnit.module('Views', { "Create button should now be highlighted"); kanban.destroy(); }); + + QUnit.test('group_by_tooltip option when grouping on a many2one', function (assert) { + assert.expect(5); + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '2 records