Changed the onchange handling to be async
bzr revid: nicolas.vanhoren@openerp.com-20121031143036-eventomyjpwgalxb
This commit is contained in:
parent
95131d6fa9
commit
1622caae27
|
@ -427,7 +427,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
var onchange = _.str.trim(on_change);
|
||||
var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/);
|
||||
if (!call) {
|
||||
return null;
|
||||
throw new Error("Wrong on change format: " + onchange);
|
||||
}
|
||||
|
||||
var method = call[1];
|
||||
|
@ -494,71 +494,59 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
var self = this;
|
||||
return this.on_change_mutex.exec(function() {
|
||||
try {
|
||||
var response = {}, can_process_onchange = $.Deferred();
|
||||
var def;
|
||||
processed = processed || [];
|
||||
processed.push(widget.name);
|
||||
var on_change = widget.node.attrs.on_change;
|
||||
if (on_change) {
|
||||
var change_spec = self.parse_on_change(on_change, widget);
|
||||
if (change_spec) {
|
||||
var ajax = {
|
||||
url: '/web/dataset/onchange',
|
||||
async: false
|
||||
};
|
||||
can_process_onchange = self.rpc(ajax, {
|
||||
model: self.dataset.model,
|
||||
method: change_spec.method,
|
||||
args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
|
||||
context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
|
||||
}).then(function(r) {
|
||||
_.extend(response, r);
|
||||
});
|
||||
} else {
|
||||
console.warn("Wrong on_change format", on_change);
|
||||
}
|
||||
}
|
||||
// fail if onchange failed
|
||||
if (can_process_onchange.isRejected()) {
|
||||
return can_process_onchange;
|
||||
def = self.rpc('/web/dataset/onchange', {
|
||||
model: self.dataset.model,
|
||||
method: change_spec.method,
|
||||
args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
|
||||
context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
|
||||
});
|
||||
} else {
|
||||
def = $.when({});
|
||||
}
|
||||
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 (widget.field['change_default']) {
|
||||
var fieldname = widget.name, 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();
|
||||
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;
|
||||
});
|
||||
}
|
||||
}
|
||||
var condition = fieldname + '=' + value_;
|
||||
|
||||
if (value_) {
|
||||
can_process_onchange = self.rpc({
|
||||
url: '/web/dataset/call',
|
||||
async: false
|
||||
}, {
|
||||
model: 'ir.values',
|
||||
method: 'get_defaults',
|
||||
args: [self.model, condition]
|
||||
}).then(function (results) {
|
||||
if (!results.length) { return; }
|
||||
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];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (can_process_onchange.isRejected()) {
|
||||
return can_process_onchange;
|
||||
}
|
||||
|
||||
return self.on_processed_onchange(response, processed);
|
||||
return response;
|
||||
}).pipe(function(response) {
|
||||
return self.on_processed_onchange(response, processed);
|
||||
});
|
||||
} catch(e) {
|
||||
console.error(e);
|
||||
instance.webclient.crashmanager.show_message(e);
|
||||
|
|
Loading…
Reference in New Issue