summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Geubelle <mge@odoo.com>2017-03-28 11:01:36 +0200
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commit07f5ac3dabd09dafca261ee596015a50c061a8f8 (patch)
treea50cee0938038a7a2c03e4662e285d60ef9653d0
parent7f4e552e3fdea33179c41004ee2b35292534ad08 (diff)
[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.
-rw-r--r--addons/web/static/src/js/fields/field_registry.js3
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js17
-rw-r--r--addons/web/static/src/js/services/data_manager.js4
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_record.js29
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_renderer.js32
-rw-r--r--addons/web/static/test/views/kanban_tests.js6
6 files changed, 32 insertions, 59 deletions
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) {
+ $('<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,
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
- $('<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}});
},
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: '<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');