From 31621f412a76cdaa04b866d94d94fe0e96f24a12 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 25 Jul 2012 16:13:33 +0200 Subject: [PATCH 1/6] wip bzr revid: nicolas.vanhoren@openerp.com-20120725141333-ueaj3e0i8imlwvre --- addons/web/static/src/js/corelib.js | 12 ++++++---- addons/web/static/src/js/view_form.js | 33 +++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 1ed4c4788e3..a092b670ef1 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -378,7 +378,8 @@ instance.web.PropertiesMixin = _.extend({}, instance.web.EventDispatcherMixin, { instance.web.EventDispatcherMixin.init.call(this); this.__getterSetterInternalMap = {}; }, - set: function(map) { + set: function(map, options) { + options = options || {}; var self = this; var changed = false; _.each(map, function(val, key) { @@ -387,10 +388,11 @@ instance.web.PropertiesMixin = _.extend({}, instance.web.EventDispatcherMixin, { return; changed = true; self.__getterSetterInternalMap[key] = val; - self.trigger("change:" + key, self, { - oldValue: tmp, - newValue: val - }); + if (! options.silent) + self.trigger("change:" + key, self, { + oldValue: tmp, + newValue: val + }); }); if (changed) self.trigger("change", self); diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index f8f09ae2762..7c2ad5cfaf3 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -33,6 +33,14 @@ instance.web.form.FieldManagerMixin = { }; instance.web.views.add('form', 'instance.web.FormView'); +/** + * Properties: + * - mode: always "view" or "edit". Used to switch the view between page (view) and + * form (edit) mode. Depending what is indicated in the dataset, the view can still + * switch to create mode if needed. + * - actual_mode: always "view", "edit" or "create". Read-only property. Determines + * the real mode used by the view. + */ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerMixin, { /** * Indicates that this view is not searchable, and thus that no search @@ -82,6 +90,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.__blur_timeout = null; this.rendering_engine = new instance.web.form.FormRenderingEngine(this); this.qweb = null; // A QWeb instance will be created if the view is a QWeb template + this.on("change:mode", this, this._check_mode); + this.set({mode: "view"}); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -91,6 +101,16 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.$element.off('.formBlur'); this._super(); }, + /** + * Reactualize actual_mode. + */ + _check_mode: function(options) { + options = options || {}; + var mode = this.get("mode"); + if (mode === "edit" && ! this.datarecord.id) + mode = "create"; + this.set({actual_mode: mode}, options); + }, on_loaded: function(data) { var self = this; if (!data) { @@ -149,8 +169,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM { label: _t('Set Default'), callback: function (item) { self.open_defaults_dialog(); } }, ]); } - this.on("change:mode", this, this.switch_mode); - this.set({mode: this.options.initial_mode}); + this.on("change:actual_mode", this, this.switch_mode); + this.set({mode: this.options.initial_mode}, {silent: true}); + this._check_mode({silent: true}); + this.switch_mode(); this.has_been_loaded.resolve(); return $.when(); }, @@ -300,6 +322,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return $.Deferred().reject(); } this.datarecord = record; + this._check_mode(); this.set({ 'title' : record.id ? record.name : "New record" }); if (this.qweb) { @@ -576,9 +599,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return $.Deferred().reject(); } }, - switch_mode: function() { + switch_mode: function(source, options) { var self = this; - if(this.get("mode") == "view") { + if(this.get("actual_mode") === "view") { self.$element.removeClass('oe_form_editable').addClass('oe_form_readonly'); self.$buttons.find('.oe_form_buttons_edit').hide(); self.$buttons.find('.oe_form_buttons_view').show(); @@ -957,7 +980,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return this.fields_view.fields[field_name]; }, is_create_mode: function() { - return !this.datarecord.id; + return this.get("actual_mode") === "create"; }, open_translate_dialog: function(field) { return this._super(field); From fe8b2937c9e8652d5726c4fe74d0c51024923362 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 25 Jul 2012 16:18:32 +0200 Subject: [PATCH 2/6] Solved problems with switch_mode bzr revid: nicolas.vanhoren@openerp.com-20120725141832-4zqw6g0zf9m4hfro --- addons/web/static/src/js/view_form.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7c2ad5cfaf3..5ba4dfcea54 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -63,6 +63,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * @property {instance.web.Registry} registry=instance.web.form.widgets widgets registry for this form view instance */ init: function(parent, dataset, view_id, options) { + var self = this; this._super(parent); this.set_default_options(options); this.dataset = dataset; @@ -92,6 +93,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.qweb = null; // A QWeb instance will be created if the view is a QWeb template this.on("change:mode", this, this._check_mode); this.set({mode: "view"}); + this.has_been_loaded.then(function() { + self.switch_mode(); + self.on("change:actual_mode", self, self.switch_mode); + self.set({mode: self.options.initial_mode}); + }); }, destroy: function() { _.each(this.get_widgets(), function(w) { @@ -104,12 +110,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM /** * Reactualize actual_mode. */ - _check_mode: function(options) { - options = options || {}; + _check_mode: function() { var mode = this.get("mode"); if (mode === "edit" && ! this.datarecord.id) mode = "create"; - this.set({actual_mode: mode}, options); + this.set({actual_mode: mode}); }, on_loaded: function(data) { var self = this; @@ -169,10 +174,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM { label: _t('Set Default'), callback: function (item) { self.open_defaults_dialog(); } }, ]); } - this.on("change:actual_mode", this, this.switch_mode); - this.set({mode: this.options.initial_mode}, {silent: true}); - this._check_mode({silent: true}); - this.switch_mode(); this.has_been_loaded.resolve(); return $.when(); }, From e406b7759ae4fe6240f8ab2c04edd4b163ea1c9c Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 25 Jul 2012 16:31:50 +0200 Subject: [PATCH 3/6] Fixed problem with m2mtags bzr revid: nicolas.vanhoren@openerp.com-20120725143150-x6u8pfira3wbc8mg --- addons/web/static/src/js/view_form.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 5ba4dfcea54..6d55ad40378 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -94,8 +94,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.on("change:mode", this, this._check_mode); this.set({mode: "view"}); this.has_been_loaded.then(function() { - self.switch_mode(); - self.on("change:actual_mode", self, self.switch_mode); + self.check_actual_mode(); + self.on("change:actual_mode", self, self.check_actual_mode); self.set({mode: self.options.initial_mode}); }); }, @@ -112,7 +112,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM */ _check_mode: function() { var mode = this.get("mode"); - if (mode === "edit" && ! this.datarecord.id) + if (! this.datarecord.id) mode = "create"; this.set({actual_mode: mode}); }, @@ -600,7 +600,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return $.Deferred().reject(); } }, - switch_mode: function(source, options) { + check_actual_mode: function(source, options) { var self = this; if(this.get("actual_mode") === "view") { self.$element.removeClass('oe_form_editable').addClass('oe_form_readonly'); @@ -3563,12 +3563,13 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in render_value: function() { var self = this; var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); + var values = self.get("value") var handle_names = function(data) { var indexed = {}; _.each(data, function(el) { indexed[el[0]] = el; }); - data = _.map(self.get("value"), function(el) { return indexed[el]; }); + data = _.map(values, function(el) { return indexed[el]; }); if (! self.get("effective_readonly")) { self.tags.containerElement().children().remove(); $("textarea", self.$element).css("padding-left", "3px"); @@ -3577,8 +3578,8 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in self.$element.html(QWeb.render("FieldMany2ManyTag", {elements: data})); } }; - if (! self.get('values') || self.get('values').length > 0) { - this._display_orderer.add(dataset.name_get(self.get("value"))).then(handle_names); + if (! values || values.length > 0) { + this._display_orderer.add(dataset.name_get(values)).then(handle_names); } else { handle_names([]); } From dd7e7d2c56512989b17533c3eaa12cb4b754a714 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 26 Jul 2012 11:51:04 +0200 Subject: [PATCH 4/6] Removed mode in favor of actual_mode bzr revid: nicolas.vanhoren@openerp.com-20120726095104-txzid0fb9tn3t1ne --- addons/web/static/src/js/view_form.js | 41 +++++++++++++++------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 6d55ad40378..52c12407688 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -91,12 +91,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.__blur_timeout = null; this.rendering_engine = new instance.web.form.FormRenderingEngine(this); this.qweb = null; // A QWeb instance will be created if the view is a QWeb template - this.on("change:mode", this, this._check_mode); - this.set({mode: "view"}); + this.set({actual_mode: "view"}); this.has_been_loaded.then(function() { self.check_actual_mode(); self.on("change:actual_mode", self, self.check_actual_mode); - self.set({mode: self.options.initial_mode}); + self.set({actual_mode: self.options.initial_mode}); }); }, destroy: function() { @@ -107,15 +106,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.$element.off('.formBlur'); this._super(); }, - /** - * Reactualize actual_mode. - */ - _check_mode: function() { - var mode = this.get("mode"); - if (! this.datarecord.id) - mode = "create"; - this.set({actual_mode: mode}); - }, on_loaded: function(data) { var self = this; if (!data) { @@ -298,7 +288,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } return shown.pipe(function() { if (options.editable) { - self.set({mode: "edit"}); + self.to_edit_mode(); } self.$element.css('visibility', 'visible'); }); @@ -600,6 +590,21 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return $.Deferred().reject(); } }, + to_view_mode: function() { + this._check_mode("view"); + }, + to_edit_mode: function() { + this._check_mode("edit"); + }, + /** + * Reactualize actual_mode. + */ + _check_mode: function(switch_to) { + var mode = switch_to || this.get("actual_mode"); + if (! this.datarecord.id) + mode = "create"; + this.set({actual_mode: mode}); + }, check_actual_mode: function(source, options) { var self = this; if(this.get("actual_mode") === "view") { @@ -633,19 +638,19 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM on_button_save: function() { var self = this; return this.do_save().then(function(result) { - self.set({mode: "view"}); + self.to_view_mode(); }); }, on_button_cancel: function(event) { if (this.can_be_discarded()) { - this.set({mode: "view"}); + this.to_view_mode(); this.on_record_loaded(this.datarecord); } return false; }, on_button_new: function() { var self = this; - this.set({mode: "edit"}); + this.to_edit_mode(); return $.when(this.has_been_loaded).pipe(function() { if (self.can_be_discarded()) { return self.load_defaults(); @@ -653,7 +658,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM }); }, on_button_edit: function() { - return this.set({mode: "edit"}); + return this.to_edit_mode(); }, on_button_create: function() { this.dataset.index = null; @@ -666,7 +671,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) { return self.on_created({ result : new_id }); }).then(function() { - return self.set({mode: "edit"}); + return self.to_edit_mode(); }).then(function() { def.resolve(); }); From 5d80e9a3e7dbc88ebb4c36557dee666083295524 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 26 Jul 2012 11:52:31 +0200 Subject: [PATCH 5/6] Small optimization bzr revid: nicolas.vanhoren@openerp.com-20120726095231-k30uufa9ny2bo28h --- addons/web/static/src/js/view_form.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 52c12407688..5f65affce90 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -91,11 +91,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.__blur_timeout = null; this.rendering_engine = new instance.web.form.FormRenderingEngine(this); this.qweb = null; // A QWeb instance will be created if the view is a QWeb template - this.set({actual_mode: "view"}); + self.set({actual_mode: self.options.initial_mode}); this.has_been_loaded.then(function() { - self.check_actual_mode(); self.on("change:actual_mode", self, self.check_actual_mode); - self.set({actual_mode: self.options.initial_mode}); + self.check_actual_mode(); }); }, destroy: function() { From f6e615cedc37bf91ee609aa9bd9120a6bd46e017 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 26 Jul 2012 11:56:53 +0200 Subject: [PATCH 6/6] Changed my mind about method naming bzr revid: nicolas.vanhoren@openerp.com-20120726095653-bi90exba20x8gu4n --- addons/web/static/src/js/view_form.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 5f65affce90..2968fe368dc 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -312,7 +312,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM return $.Deferred().reject(); } this.datarecord = record; - this._check_mode(); + this._actualize_mode(); this.set({ 'title' : record.id ? record.name : "New record" }); if (this.qweb) { @@ -590,15 +590,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } }, to_view_mode: function() { - this._check_mode("view"); + this._actualize_mode("view"); }, to_edit_mode: function() { - this._check_mode("edit"); + this._actualize_mode("edit"); }, /** * Reactualize actual_mode. */ - _check_mode: function(switch_to) { + _actualize_mode: function(switch_to) { var mode = switch_to || this.get("actual_mode"); if (! this.datarecord.id) mode = "create";