Redirected onchange and save to a common operation

bzr revid: nicolas.vanhoren@openerp.com-20121031153946-zvmoh7g7rtc69pyc
This commit is contained in:
niv-openerp 2012-10-31 16:39:46 +01:00
parent 00fc09890b
commit 2d93553e0d
1 changed files with 99 additions and 68 deletions

View File

@ -114,7 +114,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}); });
this.is_initialized = $.Deferred(); this.is_initialized = $.Deferred();
this.mutating_mutex = new $.Mutex(); this.mutating_mutex = new $.Mutex();
this.on_change_mutex = new $.Mutex(); this.on_change_list = [];
this.save_list = [];
this.reload_mutex = new $.Mutex(); this.reload_mutex = new $.Mutex();
this.__clicked_inside = false; this.__clicked_inside = false;
this.__blur_timeout = null; this.__blur_timeout = null;
@ -492,67 +493,72 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}, },
do_onchange: function(widget, processed) { do_onchange: function(widget, processed) {
var self = this; var self = this;
return this.on_change_mutex.exec(function() { this.on_change_list = [{widget: widget, processed: processed}].concat(this.on_change_list);
try { return this._process_operations();
var def; },
processed = processed || []; _process_onchange: function(on_change_obj) {
processed.push(widget.name); var self = this;
var on_change = widget.node.attrs.on_change; var widget = on_change_obj.widget;
if (on_change) { var processed = on_change_obj.processed;
var change_spec = self.parse_on_change(on_change, widget); try {
def = self.rpc('/web/dataset/onchange', { var def;
model: self.dataset.model, processed = processed || [];
method: change_spec.method, processed.push(widget.name);
args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args), var on_change = widget.node.attrs.on_change;
context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1 if (on_change) {
}); var change_spec = self.parse_on_change(on_change, widget);
} else { def = self.rpc('/web/dataset/onchange', {
def = $.when({}); model: self.dataset.model,
} method: change_spec.method,
return def.pipe(function(response) { args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
if (widget.field['change_default']) { context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
var fieldname = widget.name
var value_;
if (response.value && (fieldname in response.value)) {
// Use value from onchange if onchange executed
value_ = response.value[fieldname];
} else {
// otherwise get form value for field
value_ = self.fields[fieldname].get_value();
}
var condition = fieldname + '=' + value_;
if (value_) {
return self.rpc('/web/dataset/call', {
model: 'ir.values',
method: 'get_defaults',
args: [self.model, condition]
}).pipe(function (results) {
if (!results.length) {
return response;
}
if (!response.value) {
response.value = {};
}
for(var i=0; i<results.length; ++i) {
// [whatever, key, value]
var triplet = results[i];
response.value[triplet[1]] = triplet[2];
}
return response;
});
}
}
return response;
}).pipe(function(response) {
return self.on_processed_onchange(response, processed);
}); });
} catch(e) { } else {
console.error(e); def = $.when({});
instance.webclient.crashmanager.show_message(e);
return $.Deferred().reject();
} }
}); return def.pipe(function(response) {
if (widget.field['change_default']) {
var fieldname = widget.name
var value_;
if (response.value && (fieldname in response.value)) {
// Use value from onchange if onchange executed
value_ = response.value[fieldname];
} else {
// otherwise get form value for field
value_ = self.fields[fieldname].get_value();
}
var condition = fieldname + '=' + value_;
if (value_) {
return self.rpc('/web/dataset/call', {
model: 'ir.values',
method: 'get_defaults',
args: [self.model, condition]
}).pipe(function (results) {
if (!results.length) {
return response;
}
if (!response.value) {
response.value = {};
}
for(var i=0; i<results.length; ++i) {
// [whatever, key, value]
var triplet = results[i];
response.value[triplet[1]] = triplet[2];
}
return response;
});
}
}
return response;
}).pipe(function(response) {
return self.on_processed_onchange(response, processed);
});
} catch(e) {
console.error(e);
instance.webclient.crashmanager.show_message(e);
return $.Deferred().reject();
}
}, },
on_processed_onchange: function(result, processed) { on_processed_onchange: function(result, processed) {
try { try {
@ -588,6 +594,27 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
return $.Deferred().reject(); return $.Deferred().reject();
} }
}, },
_process_operations: function() {
var self = this;
return this.mutating_mutex.exec(function() {
function iterate() {
var on_change_obj = self.on_change_list.shift();
if (on_change_obj) {
return self._process_onchange(on_change_obj).pipe(function() {
return iterate();
});
}
var save_obj = self.save_list.pop();
if (save_obj) {
return self._process_save(save_obj).pipe(function() {
return iterate.apply(null, arguments);
});
}
return $.when.apply($, arguments);
};
return iterate();
});
},
_internal_set_values: function(values, exclude) { _internal_set_values: function(values, exclude) {
exclude = exclude || []; exclude = exclude || [];
for (var f in values) { for (var f in values) {
@ -611,7 +638,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}, },
set_values: function(values) { set_values: function(values) {
var self = this; var self = this;
return this.on_change_mutex.exec(function() { return this.mutating_mutex.exec(function() {
self._internal_set_values(values); self._internal_set_values(values);
}); });
}, },
@ -765,8 +792,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
*/ */
save: function(prepend_on_create) { save: function(prepend_on_create) {
var self = this; var self = this;
return this.mutating_mutex.exec(function() { return self.is_initialized.pipe(function() { this.save_list.push({prepend_on_create: prepend_on_create});
try { return this._process_operations();
},
_process_save: function(save_obj) {
var self = this;
var prepend_on_create = save_obj.prepend_on_create;
try {
var form_invalid = false, var form_invalid = false,
values = {}, values = {},
first_invalid_field = null; first_invalid_field = null;
@ -810,11 +842,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
} }
return save_deferral; return save_deferral;
} }
} catch (e) { } catch (e) {
console.error(e); console.error(e);
return $.Deferred().reject(); return $.Deferred().reject();
} }
});});
}, },
on_invalid: function() { on_invalid: function() {
var warnings = _(this.fields).chain() var warnings = _(this.fields).chain()