[FIX] On new record, FormView shall apply on_changes to fields using same order as...
authorFabien Meghazi <fme@openerp.com>
Thu, 1 Dec 2011 15:50:29 +0000 (16:50 +0100)
committerFabien Meghazi <fme@openerp.com>
Thu, 1 Dec 2011 15:50:29 +0000 (16:50 +0100)
bzr revid: fme@openerp.com-20111201155029-bi4zjgvwkt7gjapy

addons/web/static/src/js/view_form.js

index fdcfbbb..fecfbf8 100644 (file)
@@ -33,6 +33,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
         this.widgets = {};
         this.widgets_counter = 0;
         this.fields = {};
+        this.fields_order = [];
         this.datarecord = {};
         this.show_invalid = true;
         this.default_focus_field = null;
@@ -86,6 +87,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
     on_loaded: function(data) {
         var self = this;
         if (data) {
+            this.fields_order = [];
             this.fields_view = data;
             var frame = new (this.registry.get_object('frame'))(this, this.fields_view.arch);
 
@@ -122,6 +124,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
         self.translatable_fields = [];
         self.widgets = {};
         self.fields = {};
+        self.fields_order = [];
         self.$form_header.find('button').unbind('click');
         self.readonly = !self.readonly;
         self.registry = self.readonly ? openerp.web.form.readonly : openerp.web.form.widgets;
@@ -188,15 +191,16 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
         deferred_stack.push('force resolution if no fields');
         return deferred_stack.then(function() {
             if (!record.id) {
-                // New record: Second pass in order to trigger the onchanges
                 self.show_invalid = false;
-                for (var f in record) {
-                    var field = self.fields[f];
-                    if (field) {
+                // New record: Second pass in order to trigger the onchanges
+                // respecting the fields order defined in the view
+                _.each(self.fields_order, function(field_name) {
+                    if (record[field_name] !== undefined) {
+                        var field = self.fields[field_name];
                         field.dirty = true;
                         self.do_onchange(field);
                     }
-                }
+                });
             }
             self.on_form_changed();
             self.initial_mutating_lock.resolve();
@@ -1219,6 +1223,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f
         this.name = node.attrs.name;
         this.value = undefined;
         view.fields[this.name] = this;
+        view.fields_order.push(this.name);
         this.type = node.attrs.widget || view.fields_view.fields[node.attrs.name].type;
         this.element_name = "field_" + this.name + "_" + this.type;
 
@@ -2830,6 +2835,7 @@ openerp.web.form.FieldReference = openerp.web.form.Field.extend({
         this.view_id = 'reference_' + _.uniqueId();
         this.widgets = {};
         this.fields = {};
+        this.fields_order = [];
         this.selection = new openerp.web.form.FieldSelection(this, { attrs: {
             name: 'selection',
             widget: 'selection'