diff --git a/addons/web/static/src/js/fields/field_registry.js b/addons/web/static/src/js/fields/field_registry.js index 405af71438b..0130d20a211 100644 --- a/addons/web/static/src/js/fields/field_registry.js +++ b/addons/web/static/src/js/fields/field_registry.js @@ -58,8 +58,9 @@ registry .add('kanban.many2one', relational_fields.KanbanFieldMany2One) .add('many2many', relational_fields.FieldMany2Many) .add('many2many_tags', relational_fields.FieldMany2ManyTags) - .add('many2many_checkboxes', relational_fields.FieldMany2ManyCheckBoxes) .add('form.many2many_tags', relational_fields.FormFieldMany2ManyTags) + .add('kanban.many2many_tags', relational_fields.KanbanFieldMany2ManyTags) + .add('many2many_checkboxes', relational_fields.FieldMany2ManyCheckBoxes) .add('one2many', relational_fields.FieldOne2Many) .add('statusbar', relational_fields.FieldStatus) .add('one2many_list', relational_fields.FieldOne2Many); diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index bdd291c6fab..dbc18efd560 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -1122,6 +1122,22 @@ var FormFieldMany2ManyTags = FieldMany2ManyTags.extend({ }, }); +var KanbanFieldMany2ManyTags = FieldMany2Many.extend({ + _render: function () { + var self = this; + this.$el.addClass('o_form_field_many2manytags o_kanban_tags'); + _.each(this.value.data, function (m2m) { + // 10th color is invisible + if ('color' in m2m.data && m2m.data.color !== 10) { + $('') + .addClass('o_tag o_tag_color_' + m2m.data.color) + .attr('title', _.str.escapeHTML(m2m.data.display_name)) + .appendTo(self.$el); + } + }); + }, +}); + var FieldMany2ManyCheckBoxes = AbstractField.extend({ template: 'FieldMany2ManyCheckBoxes', events: _.extend({}, AbstractField.prototype.events, { @@ -1464,6 +1480,7 @@ return { FieldMany2ManyCheckBoxes: FieldMany2ManyCheckBoxes, FieldMany2ManyTags: FieldMany2ManyTags, FormFieldMany2ManyTags: FormFieldMany2ManyTags, + KanbanFieldMany2ManyTags: KanbanFieldMany2ManyTags, FieldRadio: FieldRadio, FieldSelection: FieldSelection, diff --git a/addons/web/static/src/js/services/data_manager.js b/addons/web/static/src/js/services/data_manager.js index abcf10a2e6d..cb2773fd2be 100644 --- a/addons/web/static/src/js/services/data_manager.js +++ b/addons/web/static/src/js/services/data_manager.js @@ -392,6 +392,10 @@ return core.Class.extend({ if (!Widget) { console.warn("Missing widget: ", attrs.widget, " for field", attrs.name, "of type", field.type); } + } else if (viewType === 'kanban' && field.type === 'many2many') { + // we want to display the widget many2manytags in kanban even if it + // is not specified in the view + Widget = fieldRegistry.get('kanban.many2many_tags'); } return Widget || fieldRegistry.getAny([viewType + "." + field.type, field.type, "abstract"]); }, diff --git a/addons/web/static/src/js/views/kanban/kanban_record.js b/addons/web/static/src/js/views/kanban/kanban_record.js index 55bfcc6650e..128dda9413f 100644 --- a/addons/web/static/src/js/views/kanban/kanban_record.js +++ b/addons/web/static/src/js/views/kanban/kanban_record.js @@ -176,8 +176,11 @@ var KanbanRecord = Widget.extend({ var $field = $(this); var field_name = $field.attr("name"); var field_widget = $field.attr("widget"); - if (field_widget) { - // a widget is specified for that field + + // a widget is specified for that field or a field is a many2many ; + // in this latest case, we want to display the widget many2manytags + // even if it is not specified in the view. + if (field_widget || self.fields[field_name].type === 'many2many') { var widget = self.subWidgets[field_name]; if (!widget) { // the widget doesn't exist yet, so instanciate it @@ -270,28 +273,8 @@ var KanbanRecord = Widget.extend({ this._processFields(); this._setupColor(); this._setupColorPicker(); - this._renderM2MTags(); this._attachTooltip(); - }, - /** - * @private - */ - _renderM2MTags: function () { - var self = this; - _.each(this.recordData, function (values, field_name) { - if (self.fields[field_name].type !== 'many2many') { return; } - var rel_ids = self.record[field_name].raw_value; - var $m2m_tags = self.$('.o_form_field_many2manytags[name=' + field_name + ']'); - _.each(rel_ids, function (id) { - var m2m = _.findWhere(values.data, {res_id: id}).data; - if (typeof m2m.color !== 'undefined' && m2m.color !== 10) { // 10th color is invisible - $('') - .addClass('o_tag o_tag_color_' + m2m.color) - .attr('title', _.str.escapeHTML(m2m.display_name)) - .appendTo($m2m_tags); - } - }); - }); + // We use boostrap tooltips for better and faster display this.$('span.o_tag').tooltip({delay: {'show': 50}}); }, 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 d49149debc3..dd6c193701b 100644 --- a/addons/web/static/src/js/views/kanban/kanban_renderer.js +++ b/addons/web/static/src/js/views/kanban/kanban_renderer.js @@ -3,7 +3,6 @@ odoo.define('web.KanbanRenderer', function (require) { var BasicRenderer = require('web.BasicRenderer'); var core = require('web.core'); -var field_registry = require('web.field_registry'); var KanbanColumn = require('web.KanbanColumn'); var KanbanRecord = require('web.KanbanRecord'); var quick_create = require('web.kanban_quick_create'); @@ -45,37 +44,6 @@ function transformQwebTemplate(node, fields) { } } switch (node.tag) { - case 'field': - var ftype = fields[node.attrs.name].type; - ftype = node.attrs.widget ? node.attrs.widget : ftype; - if (ftype === 'many2many') { - node.tag = 'div'; - node.attrs['class'] = (node.attrs['class'] || '') + ' oe_form_field o_form_field_many2manytags o_kanban_tags'; - } else if (field_registry.contains(ftype)) { - // do nothing, the kanban record will handle it - } else { - node.tag = 'span'; - var child_node = { - attrs: {}, - children: [], - tag: qweb.prefix, - }; - child_node.attrs[qweb.prefix + '-esc'] = 'record.' + node.attrs.name + '.value'; - node.children.push(child_node); - - // set class according to field attribute - var child_classes = []; - if (node.attrs.display === 'right') { - child_classes.push('pull-right'); - } else if (node.attrs.display === 'full') { - child_classes.push('o_text_block'); - } - if (node.attrs.bold) { - child_classes.push('o_text_bold'); - } - node.attrs['class'] = child_classes.join(' '); - } - break; case 'button': case 'a': var type = node.attrs.type || ''; diff --git a/addons/web/static/test/views/kanban_tests.js b/addons/web/static/test/views/kanban_tests.js index 8ee8f794878..3bad0b176ee 100644 --- a/addons/web/static/test/views/kanban_tests.js +++ b/addons/web/static/test/views/kanban_tests.js @@ -434,7 +434,7 @@ QUnit.module('Views', { arch: '' + '' + '
' + - '
' + + '' + '' + '
' + '
' + @@ -446,9 +446,9 @@ QUnit.module('Views', { }); var $first_record = kanban.$('.o_kanban_record:first()'); - assert.strictEqual($first_record.find('.o_form_field_many2manytags .badge').length, 2, + assert.strictEqual($first_record.find('.o_form_field_many2manytags .o_tag').length, 2, 'first record should contain 2 tags'); - assert.ok($first_record.find('span:first()').hasClass('o_tag_color_2'), + assert.ok($first_record.find('.o_tag:first()').hasClass('o_tag_color_2'), 'first tag should have color 2'); assert.strictEqual(count, 2, 'two RPC should have been done(one search read and one read for the m2m');