From 6df623519b0598ae3d34177a708f83e4a8da669a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 29 Jun 2011 17:35:26 +0200 Subject: [PATCH 1/2] [imp] added possibility to set value of a one2many using an on_change bzr revid: nicolas.vanhoren@openerp.com-20110629153526-ewu12haop290o6ru --- addons/base/static/src/js/data.js | 1 + addons/base/static/src/js/form.js | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index a76d203ff7a..a8cdfb7f201 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -527,6 +527,7 @@ openerp.base.BufferedDataSet = openerp.base.DataSetStatic.extend({ this.to_create = []; this.to_write = []; this.cache = []; + this.delete_all = false; }, on_change: function() {}, read_ids: function (ids, fields, callback) { diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index cb90b6123e4..1509c2b6bcd 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1396,8 +1396,8 @@ var commands = { return [commands.LINK_TO, id, false]; }, // (5[, _[, _]]) - FORGET_ALL: 5, - 'forget_all': function () { + DELETE_ALL: 5, + 'delete_all': function () { return [5, false, false]; }, // (6, _, ids) replaces all linked records with provided ids @@ -1469,6 +1469,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ set_value: function(value) { value = value || []; var self = this; + this.dataset.reset_ids([]); if(value.length >= 1 && value[0] instanceof Array) { var ids = []; _.each(value, function(command) { @@ -1492,10 +1493,25 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ case commands.LINK_TO: ids.push(command[1]); return; + case commands.DELETE_ALL: + self.dataset.delete_all = true; + return; } }); this._super(ids); this.dataset.set_ids(ids); + } else if (value.length >= 1 && typeof(value[0]) === "object") { + var ids = []; + this.dataset.delete_all = true; + _.each(value, function(command) { + var obj = {values: command}; + obj['id'] = _.uniqueId(self.dataset.virtual_id_prefix); + self.dataset.to_create.push(obj); + self.dataset.cache.push(_.clone(obj)); + ids.push(obj.id); + }); + this._super(ids); + this.dataset.set_ids(ids); } else { this._super(value); this.dataset.reset_ids(value); @@ -1508,7 +1524,8 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ var self = this; if (!this.dataset) return []; - var val = _.map(this.dataset.ids, function(id) { + 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;}); if (alter_order) { return commands.create(alter_order.values); @@ -1518,7 +1535,7 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ return commands.update(alter_order.id, alter_order.values); } return commands.link_to(id); - }); + })); return val.concat(_.map( this.dataset.to_delete, function(x) { return commands['delete'](x.id);})); From b76fa13dc7aa08760d564b9e2f9489ed4453ca5e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 29 Jun 2011 18:21:36 +0200 Subject: [PATCH 2/2] [imp] made o2m capable of giving a correct value for on_change bzr revid: nicolas.vanhoren@openerp.com-20110629162136-fmg79kt6549rd9gx --- addons/base/static/src/js/form.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 1509c2b6bcd..e4cc0172789 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -181,11 +181,10 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV args.push(argument_replacement[field]); return; } else if (self.fields[field]) { - var value = self.fields[field].get_value(); + var value = self.fields[field].get_on_change_value(); args.push(value == null ? false : value); return; } else { - debugger; var splitted = field.split('.'); if (splitted.length > 1 && _.trim(splitted[0]) === "parent" && self.dataset.parent_view) { if (parent_fields === null) { @@ -748,6 +747,9 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({ get_value: function() { return this.value; }, + get_on_change_value: function() { + return this.get_value(); + }, update_dom: function() { this._super.apply(this, arguments); this.$element.toggleClass('disabled', this.readonly); @@ -1540,6 +1542,20 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this.dataset.to_delete, function(x) { return commands['delete'](x.id);})); }, + get_on_change_value: function() { + var self; + return _.map(this.dataset.ids, function(id) { + var values = _.detect(self.dataset.cache, function(x) {return x.id === id}); + if (values) { + values = _.clone(values); + delete values["id"]; + return values; + } else { + console.info("trying to get value in a o2m before that value is loaded"); + return {}; + } + }); + }, validate: function() { this.invalid = false; // TODO niv