From c9f7de4dea76cbca6369907e343605f2ed9685f9 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 27 Jul 2011 11:09:05 +0200 Subject: [PATCH 1/5] [fix] some bugs related to validation + removed save button in o2m bzr revid: nicolas.vanhoren@openerp.com-20110727090905-adbyclomw24uaj5a --- addons/base/static/src/js/form.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 5c14b953b70..be09c5741d2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -827,10 +827,12 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ }, update_dom: function() { this._super.apply(this, arguments); - this.$element.toggleClass('disabled', this.readonly); - this.$element.toggleClass('required', this.required); - if (this.view.show_invalid) { - this.$element.toggleClass('invalid', this.invalid); + if (!this.disable_utility_classes) { + this.$element.toggleClass('disabled', this.readonly); + this.$element.toggleClass('required', this.required); + if (this.view.show_invalid) { + this.$element.toggleClass('invalid', this.invalid); + } } }, on_ui_change: function() { @@ -1589,6 +1591,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this.template = "FieldOne2Many"; this.is_started = $.Deferred(); this.form_last_update = $.Deferred(); + this.disable_utility_classes = true; }, start: function() { this._super.apply(this, arguments); @@ -1635,8 +1638,12 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ once.resolve(); }); controller.on_form_changed.add_last(function() { - self.save_form_view(); + if (self.save_form_view() === false) { + // we assume one value was changed to invalid state + self.validate(); + } }); + controller.$element.find(".oe_form_button_save_edit").hide(); } self.is_started.resolve(); }); @@ -1709,6 +1716,9 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this._super(value); this.dataset.reset_ids(value); } + if (this.dataset.index === null && this.dataset.ids.length > 0) { + this.dataset.index = 0; + } $.when(this.is_started).then(function() { self.reload_current_view(); }); @@ -1717,7 +1727,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; if (!this.dataset) return []; - this.save_form_view(); var val = this.dataset.delete_all ? [commands.delete_all()] : []; val = val.concat(_.map(this.dataset.ids, function(id) { var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;}); @@ -1748,8 +1757,10 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ } else if (!res.isResolved()) { throw "Asynchronous get_value() is not supported in form view."; } + return res; } } + return false; }, validate: function() { this.invalid = false; @@ -1766,6 +1777,10 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ } } } + }, + update_dom: function() { + this._super.apply(this, arguments); + this.$element.toggleClass('disabled', this.readonly); } }); From 62e969578f89d9a3440dd694fe909b3e5a9f43fc Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 27 Jul 2011 11:30:14 +0200 Subject: [PATCH 2/5] [fix] small inconsistency with deferred in dataset bzr revid: nicolas.vanhoren@openerp.com-20110727093014-fe1uhbkcyxl86qyz --- addons/base/static/src/js/data.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 385bd93d360..9eb08cf0fde 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -291,14 +291,18 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. * Read the indexed record. */ read_index: function (fields, callback) { + var def = $.Deferred().then(callback); if (_.isEmpty(this.ids)) { - return $.Deferred().reject().promise(); + def.reject(); } else { fields = fields || false; - return this.read_ids([this.ids[this.index]], fields, function(records) { - callback(records[0]); + return this.read_ids([this.ids[this.index]], fields).then(function(records) { + def.resolve(records[0]); + }, function() { + def.reject.apply(def, arguments); }); } + return def.promise(); }, default_get: function(fields, callback) { return this.rpc('/base/dataset/default_get', { From 278a0b6a674e41f47856ba92e950dd45d8e515b5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 27 Jul 2011 14:22:29 +0200 Subject: [PATCH 3/5] [fix] removed auto-save and put save on get_value() bzr revid: nicolas.vanhoren@openerp.com-20110727122229-hqdh03hux2lu6a3t --- addons/base/static/src/js/form.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index be09c5741d2..5b21ecb7e45 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1638,10 +1638,9 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ once.resolve(); }); controller.on_form_changed.add_last(function() { - if (self.save_form_view() === false) { - // we assume one value was changed to invalid state - self.validate(); - } + // may not be the better solution but I can't imagine a better one, + // auto-save in form view is way harder to do anyway + self.on_ui_change(); }); controller.$element.find(".oe_form_button_save_edit").hide(); } @@ -1727,6 +1726,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; if (!this.dataset) return []; + self.save_form_view() var val = this.dataset.delete_all ? [commands.delete_all()] : []; val = val.concat(_.map(this.dataset.ids, function(id) { var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;}); From f93d975835e5e50fb8a572e8512768ea5c1435b8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 27 Jul 2011 15:36:28 +0200 Subject: [PATCH 4/5] [imp] used is_valid() and is_dirty() bzr revid: nicolas.vanhoren@openerp.com-20110727133628-jked4rp8uvot9951 --- addons/base/static/src/js/form.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 2fbe0009f2f..4645a88d665 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1642,11 +1642,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ controller.on_record_loaded.add_last(function() { once.resolve(); }); - controller.on_form_changed.add_last(function() { - // may not be the better solution but I can't imagine a better one, - // auto-save in form view is way harder to do anyway - self.on_ui_change(); - }); controller.$element.find(".oe_form_button_save_edit").hide(); } self.is_started.resolve(); @@ -1731,7 +1726,6 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; if (!this.dataset) return []; - self.save_form_view() var val = this.dataset.delete_all ? [commands.delete_all()] : []; val = val.concat(_.map(this.dataset.ids, function(id) { var alter_order = _.detect(self.dataset.to_create, function(x) {return x.id === id;}); @@ -1767,21 +1761,28 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ } return false; }, - validate: function() { - this.invalid = false; + is_valid: function() { var self = this; var view = self.viewmanager.views[self.viewmanager.active_view].controller; - if(self.viewmanager.active_view === "list") { - return; - } else if (self.viewmanager.active_view === "form") { + if (self.viewmanager.active_view === "form") { for (var f in view.fields) { f = view.fields[f]; if (!f.is_valid()) { - this.invalid = true; - return; + return false; } } } + return true; + }, + is_dirty: function() { + if (!this.dataset) + return false; + this.save_form_view(); + if (this.dataset.delete_all || this.dataset.to_create.length > 0 || this.dataset.to_write.length > 0 + || this.dataset.to_delete > 0) { + return true; + } + return false; }, update_dom: function() { this._super.apply(this, arguments); From 0d9150bfa0b62c2a623849d4e4f96c59d239fb89 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 27 Jul 2011 16:03:32 +0200 Subject: [PATCH 5/5] [fix] added save of o2m when using pager & when switching view bzr revid: nicolas.vanhoren@openerp.com-20110727140332-p1blww1imh3irn6u --- addons/base/static/src/js/form.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 4645a88d665..c19e611e42a 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1642,10 +1642,16 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ controller.on_record_loaded.add_last(function() { once.resolve(); }); + controller.on_pager_action.add_first(function() { + self.save_form_view(); + }); controller.$element.find(".oe_form_button_save_edit").hide(); } self.is_started.resolve(); }); + this.viewmanager.on_mode_switch.add_first(function() { + self.save_form_view(); + }); setTimeout(function () { self.viewmanager.start(); }, 0); @@ -1762,27 +1768,26 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ return false; }, is_valid: function() { + this.validate(); + return this._super(); + }, + validate: function() { + this.invalid = false; var self = this; var view = self.viewmanager.views[self.viewmanager.active_view].controller; if (self.viewmanager.active_view === "form") { for (var f in view.fields) { f = view.fields[f]; if (!f.is_valid()) { - return false; + this.invalid = true; + return; } } } - return true; }, is_dirty: function() { - if (!this.dataset) - return false; this.save_form_view(); - if (this.dataset.delete_all || this.dataset.to_create.length > 0 || this.dataset.to_write.length > 0 - || this.dataset.to_delete > 0) { - return true; - } - return false; + return this._super(); }, update_dom: function() { this._super.apply(this, arguments);