From 0ee38e29ade5acc7fd9aa8955901c5fbc69c788f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 16 Sep 2011 15:22:28 +0200 Subject: [PATCH 01/14] [IMP] convert form widgets to use a root class to find themselves back in the rendered dom, instead of a root id bzr revid: xmo@openerp.com-20110916132228-h2qszo33q6z289qf --- addons/web/static/src/js/view_form.js | 22 ++++++++-------- addons/web/static/src/xml/base.xml | 37 +++++++++++++-------------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index e28936b850d..16a4ba908a7 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -82,7 +82,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# _.each(this.widgets, function(w) { w.start(); }); - this.$form_header = this.$element.find('#' + this.element_id + '_header'); + this.$form_header = this.$element.find('.oe_form_header'); this.$form_header.find('div.oe_form_pager button[data-pager-action]').click(function() { var action = $(this).data('pager-action'); self.on_pager_action(action); @@ -196,7 +196,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# } }, do_update_pager: function(hide_index) { - var $pager = this.$element.find('#' + this.element_id + '_header div.oe_form_pager'); + var $pager = this.$form_header.find('div.oe_form_pager'); var index = hide_index ? '-' : this.dataset.index + 1; $pager.find('span.oe_pager_index').html(index); $pager.find('span.oe_pager_count').html(this.dataset.ids.length); @@ -619,6 +619,7 @@ openerp.web.form.compute_domain = function(expr, fields) { openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.Widget# */{ template: 'Widget', + identifier_prefix: 'formview-widget-', /** * @constructs openerp.web.form.Widget * @extends openerp.web.Widget @@ -632,11 +633,13 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. this.modifiers = JSON.parse(this.node.attrs.modifiers || '{}'); this.type = this.type || node.tag; this.element_name = this.element_name || this.type; - this.element_id = [this.view.element_id, this.element_name, this.view.widgets_counter++].join("_"); + this.element_class = [ + 'formview', this.view.view_id, this.element_name, + this.view.widgets_counter++].join("_"); - this._super(view, this.element_id); + this._super(view); - this.view.widgets[this.element_id] = this; + this.view.widgets[this.element_class] = this; this.children = node.children; this.colspan = parseInt(node.attrs.colspan || 1, 10); this.decrease_max_width = 0; @@ -649,7 +652,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form. this.width = this.node.attrs.width; }, start: function() { - this.$element = $('#' + this.element_id); + this.$element = this.view.$element.find('.' + this.element_class); }, stop: function() { if (this.$element) { @@ -896,7 +899,7 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({ var self = this; this.$element.find("label").dblclick(function() { var widget = self['for'] || self; - console.log(widget.element_id , widget); + console.log(widget.element_class , widget); window.w = widget; }); } @@ -1932,9 +1935,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ }, validate: function() { this.invalid = false; - var self = this; - var view = self.viewmanager.views[self.viewmanager.active_view].controller; - if (self.viewmanager.active_view === "form") { + var view = this.viewmanager.views[this.viewmanager.active_view].controller; + if (this.viewmanager.active_view === "form") { for (var f in view.fields) { f = view.fields[f]; if (!f.is_valid()) { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index c2b6ca0bdf2..daf85c43ee7 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -649,7 +649,7 @@ -
+
+
From 079f817e1cc21119560e291aaf8f4179acde3668 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 19 Sep 2011 17:22:10 +0200 Subject: [PATCH 11/14] [IMP] cleanup random stuff so events don't accumulate across switches, ending up breaking the form bzr revid: xmo@openerp.com-20110919152210-o828pz00vp7vuf5j --- addons/web/static/src/js/view_form.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index b3fd3d6dd6f..fdaff535fb8 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -94,6 +94,10 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# this.$form_header.find('button.oe_form_button_new').click(this.on_button_new); this.$form_header.find('button.oe_form_button_duplicate').click(this.on_button_duplicate); this.$form_header.find('button.oe_form_button_toggle').click(function () { + self.translatable_fields = []; + self.widgets = {}; + self.fields = {}; + self.$form_header.find('button').unbind('click'); self.registry = self.registry === openerp.web.form.widgets ? openerp.web.form.readonly : openerp.web.form.widgets; From 134437d3d1801223ad04ad870cd285401771ecdd Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 20 Sep 2011 13:21:47 +0200 Subject: [PATCH 12/14] [IMP] memoize template, add hacky form-repositioning method bzr revid: xmo@openerp.com-20110920112147-we4sqnc3we1v38lv --- addons/web/static/src/js/view_form.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 82bfa817ef1..c9dcb65cba9 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -73,12 +73,19 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# w.stop(); }); }, + reposition: function ($e) { + this.$element = $e; + this.on_loaded(); + }, on_loaded: function(data) { var self = this; - this.fields_view = data; - var frame = new (this.registry.get_object('frame'))(this, this.fields_view.arch); + if (data) { + this.fields_view = data; + var frame = new (this.registry.get_object('frame'))(this, this.fields_view.arch); - this.$element.html(QWeb.render(this.form_template, { 'frame': frame, 'view': this })); + this.rendered = QWeb.render(this.form_template, { 'frame': frame, 'view': this }); + } + this.$element.html(this.rendered); _.each(this.widgets, function(w) { w.start(); }); From 0166aeabff370945f0e9c74cdd2128dccb27e7a1 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 20 Sep 2011 14:28:20 +0200 Subject: [PATCH 13/14] [ADD] bunch of tests bzr revid: xmo@openerp.com-20110920122820-5ql07msi0zjljhxn --- addons/web_tests/__init__.py | 1 + addons/web_tests/__openerp__.py | 8 ++++ addons/web_tests/static/src/css/web_tests.css | 3 ++ addons/web_tests/static/src/js/web_tests.js | 37 +++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 addons/web_tests/__init__.py create mode 100644 addons/web_tests/__openerp__.py create mode 100644 addons/web_tests/static/src/css/web_tests.css create mode 100644 addons/web_tests/static/src/js/web_tests.js diff --git a/addons/web_tests/__init__.py b/addons/web_tests/__init__.py new file mode 100644 index 00000000000..40a96afc6ff --- /dev/null +++ b/addons/web_tests/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/addons/web_tests/__openerp__.py b/addons/web_tests/__openerp__.py new file mode 100644 index 00000000000..d6221900f00 --- /dev/null +++ b/addons/web_tests/__openerp__.py @@ -0,0 +1,8 @@ +{ + "name": "Tests", + "version": "2.0", + "depends": [], + "js": ["static/src/js/*.js"], + "css": ['static/src/css/*.css'], + 'active': True, +} diff --git a/addons/web_tests/static/src/css/web_tests.css b/addons/web_tests/static/src/css/web_tests.css new file mode 100644 index 00000000000..b14d6541f43 --- /dev/null +++ b/addons/web_tests/static/src/css/web_tests.css @@ -0,0 +1,3 @@ +.oe-bunchaforms > div { + float: left; +} diff --git a/addons/web_tests/static/src/js/web_tests.js b/addons/web_tests/static/src/js/web_tests.js new file mode 100644 index 00000000000..b21275d1eb7 --- /dev/null +++ b/addons/web_tests/static/src/js/web_tests.js @@ -0,0 +1,37 @@ +openerp.web_tests = function (db) { + db.web.client_actions.add( + 'buncha-forms', 'instance.web_tests.BunchaForms'); + db.web_tests = {}; + db.web_tests.BunchaForms = db.web.Widget.extend({ + init: function (parent) { + this._super(parent); + this.dataset = new db.web.DataSetSearch(this, 'test.listview.relations'); + this.form = new db.web.FormView(this, this.dataset, false, { + action_buttons: false, + pager: false + }); + this.form.registry = db.web.form.readonly; + }, + render: function () { + return '
'; + }, + start: function () { + $.when( + this.dataset.read_slice(), + this.form.appendTo(this.$element)).then(this.on_everything_loaded); + }, + on_everything_loaded: function (slice) { + var records = slice[0].records; + if (!records.length) { + this.form.on_record_loaded({}); + return; + } + this.form.on_record_loaded(records[0]); + _(records.slice(1)).each(function (record, index) { + this.dataset.index = index+1; + this.form.reposition($('
').appendTo(this.$element)); + this.form.on_record_loaded(record); + }, this); + } + }); +}; From c6e77707ee07cae611ae18176103300e94e7463d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 29 Sep 2011 11:02:05 +0200 Subject: [PATCH 14/14] [FIX] match first form header only so that we get the header for current form not sub-forms bzr revid: xmo@openerp.com-20110929090205-0vn4dt4qixao5us1 --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index c9dcb65cba9..e39b1966556 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -89,7 +89,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# _.each(this.widgets, function(w) { w.start(); }); - this.$form_header = this.$element.find('.oe_form_header'); + this.$form_header = this.$element.find('.oe_form_header:first'); this.$form_header.find('div.oe_form_pager button[data-pager-action]').click(function() { var action = $(this).data('pager-action'); self.on_pager_action(action);