From fb6b41eb216197591c02d395f0d427bdeee854de Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Thu, 24 Mar 2016 10:29:45 +0100 Subject: [PATCH] [RFR] in order to work properly, we need to use FieldOne2Many's caching logic --- web_widget_one2many_tags/README.rst | 10 ++ web_widget_one2many_tags/__openerp__.py | 3 + .../static/src/js/web_widget_one2many_tags.js | 166 ++++++++++++------ .../src/xml/web_widget_one2many_tags.xml | 5 + 4 files changed, 134 insertions(+), 50 deletions(-) create mode 100644 web_widget_one2many_tags/static/src/xml/web_widget_one2many_tags.xml diff --git a/web_widget_one2many_tags/README.rst b/web_widget_one2many_tags/README.rst index a35f4a35..44408630 100644 --- a/web_widget_one2many_tags/README.rst +++ b/web_widget_one2many_tags/README.rst @@ -29,6 +29,16 @@ In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed feedback `here `_. +Known issues / Roadmap +====================== + +* as one2many fields are cached on the client side until the user hits `Save` + on the main form, no ``name_get`` can be called on those records, which is + why changes that update the display name are not reflected until saving, and + new records are displayed as `New record` until then. If you don't like this, + add the field `display_name` to your form and have it recomputed in an + @onchange handler. + Credits ======= diff --git a/web_widget_one2many_tags/__openerp__.py b/web_widget_one2many_tags/__openerp__.py index 80105d76..d7e4a722 100644 --- a/web_widget_one2many_tags/__openerp__.py +++ b/web_widget_one2many_tags/__openerp__.py @@ -15,4 +15,7 @@ "data": [ 'views/templates.xml', ], + "qweb": [ + 'static/src/xml/web_widget_one2many_tags.xml', + ], } diff --git a/web_widget_one2many_tags/static/src/js/web_widget_one2many_tags.js b/web_widget_one2many_tags/static/src/js/web_widget_one2many_tags.js index bdb3e5ae..bdb08da5 100755 --- a/web_widget_one2many_tags/static/src/js/web_widget_one2many_tags.js +++ b/web_widget_one2many_tags/static/src/js/web_widget_one2many_tags.js @@ -5,72 +5,138 @@ openerp.web_widget_one2many_tags = function(instance) { openerp.web_widget_one2many_tags.FieldOne2ManyTags = - instance.web.form.FieldMany2ManyTags.extend({ + instance.web.form.FieldOne2Many.extend(instance.web.form.ReinitializeFieldMixin, { + template: "FieldOne2ManyTags", + tag_template: "FieldOne2ManyTag", + disable_utility_classes: false, initialize_texttext: function() { - var self = this, - result = this._super.apply(this, arguments), - removeTag = result.ext.tags.removeTag; - result.plugins = 'tags arrow filter'; - result.ext.core.onSetInputData = function(e, data) - { - this.input().val(data); - }; - result.filter = { - items: [] - }; - result.ext.arrow = { - onArrowClick: function(e) - { - var context = self.build_context(), - key = _.str.sprintf( - 'default_%s', self.field.relation_field) - context.add({[key]: self.field_manager.datarecord.id}); - self._search_create_popup('form', undefined, context); + var self = this; + return { + plugins: 'tags arrow filter', + ext: { + itemManager: { + itemToString: function(item) { + return item.name; + }, + }, + arrow: { + onArrowClick: function(e) + { + var list_view = new instance.web.form.One2ManyListView( + self, self.dataset); + list_view.o2m = self; + list_view.editable = function() { return false }; + list_view.do_add_record(); + }, + }, + tags: { + isTagAllowed: function(tag) { + return tag.name; + }, + removeTag: function(tag) + { + self.dataset.unlink([tag.data('id')]); + return $.fn.textext.TextExtTags.prototype.removeTag + .call(this, tag); + }, + renderTag: function(tag) { + return $.fn.textext.TextExtTags.prototype.renderTag + .call(this, tag).data("id", tag.id); + }, + }, + }, + filter: { + items: [] }, - } - result.ext.tags.removeTag = function(tag) - { - var id = tag.data("id"), - dataset = new instance.web.DataSet( - self, self.field.relation, self.build_context()); - dataset.unlink([id]); - return removeTag(tag); }; - return result; }, - initialize_content: function() + build_context: function() + { + var context = this._super.apply(this, arguments), + key = _.str.sprintf('default_%s', this.field.relation_field); + context.add({[key]: this.field_manager.datarecord.id}); + return context; + }, + reload_current_view: function() { - var self = this, - result = this._super.apply(this, arguments); - if(!this.$text) + var self = this; + if(!self.$el.length) { - return result; + return jQuery.when(); } - this.$text.bind('tagClick', function(e, tag, value, callback) + if(!self.get("effective_readonly")) { - var popup = new instance.web.form.FormOpenPopup(self); - popup.show_element( - self.field.relation, value.id, self.build_context(), + self.ignore_blur = false; + if(self.tags) + { + self.tags.tagElements().remove(); + } + if(!self.$text || !self.$text.length) + { + self.$text = this.$("textarea"); + self.$text.textext(self.initialize_texttext()); + self.$text.bind('tagClick', function(e, tag, value, callback) { - title: instance.web._t("Open: ") + value.name, - readonly: self.get("effective_readonly"), + var list_view = new instance.web.form.One2ManyViewManager( + self, self.dataset); + list_view.o2m = self; + self.dataset.select_id(value.id); + list_view.switch_mode('form'); }); - popup.on('write_completed', self, function() + } + if(self.$text.textext().length) { - popup.dataset.name_get(popup.dataset.ids) - .then(function(names) - { - _(names).each(function(name) + self.tags = self.$text.textext()[0].tags(); + } + } + else + { + self.tags = null; + self.$text = null; + } + return self.dataset.read_ids(self.dataset.ids, ['display_name']) + .then(function(names) + { + if(self.get("effective_readonly")) + { + self.$el.html(instance.web.qweb.render( + self.tag_template, { - value.name = name[1]; - callback(value, true); - }) - }); - }); + elements: _(names).map(function(name) + { + return [name.id, name.display_name]; + }) + } + )); + } + else if(self.$text.textext().length) + { + self.tags.addTags(_(names).map(function(name) + { + return { + name: name.display_name || instance.web._t('New record'), + id: name.id, + } + })); + } }); + }, + reinitialize: function() + { + var result = instance.web.form.ReinitializeFieldMixin.reinitialize.call(this); + this.reload_current_view(); return result; }, + // defuse some functions we don't need + get_active_view: function() + { + return false; + }, + load_views: function() + { + return jQuery.when(); + }, }); instance.web.form.widgets.add( diff --git a/web_widget_one2many_tags/static/src/xml/web_widget_one2many_tags.xml b/web_widget_one2many_tags/static/src/xml/web_widget_one2many_tags.xml new file mode 100644 index 00000000..5ec58c72 --- /dev/null +++ b/web_widget_one2many_tags/static/src/xml/web_widget_one2many_tags.xml @@ -0,0 +1,5 @@ + + + + +