[REF] web: use many2many tag widget in kanban
Some commits haven't been correctly forward-ported, like https://github.com/odoo/enterprise/commit/2a3494a005f38baf2fd3db2c23844129e969e464 or https://github.com/odoo/enterprise/commit/5664a19045abed0cf900ef255bd3c96e16e8886c There purpose is to use the many2many tag widget in the kanban renderer instead of custom manipulation. The tests have also been adapted to correspond to the new tags.
This commit is contained in:
committed by
Aaron Bohy
parent
7f4e552e3f
commit
07f5ac3dab
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
$('<span>')
|
||||
.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,
|
||||
|
||||
@@ -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"]);
|
||||
},
|
||||
|
||||
@@ -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
|
||||
$('<span>')
|
||||
.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}});
|
||||
},
|
||||
|
||||
@@ -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 || '';
|
||||
|
||||
@@ -434,7 +434,7 @@ QUnit.module('Views', {
|
||||
arch: '<kanban class="o_kanban_test">' +
|
||||
'<templates><t t-name="kanban-box">' +
|
||||
'<div>' +
|
||||
'<div class="o_kanban_tags_section"><field name="category_ids" widget="many2many_tags"/></div>' +
|
||||
'<field name="category_ids"/>' +
|
||||
'<field name="foo"/>' +
|
||||
'</div>' +
|
||||
'</t></templates>' +
|
||||
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user