diff options
| author | Xavier Morel <xmo@openerp.com> | 2012-02-07 17:01:58 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2012-02-07 17:01:58 +0100 |
| commit | bba8fde187dabf4c8b5f8ac46bb56e43c845ae69 (patch) | |
| tree | 4b714504ad6ee9d5876f1d48a407ad0867c67e0a | |
| parent | ff7a161404509a78687c595d8844a2261aa5506b (diff) | |
[ADD] handling of change_default to onchange process
bzr revid: xmo@openerp.com-20120207160158-kxbue424wa3nxz03
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 3dcda5e5c08..16fe4ec2d47 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -314,6 +314,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# var self = this; return this.on_change_mutex.exec(function() { try { + var response = {}, can_process_onchange = $.Deferred(); processed = processed || []; var on_change = widget.node.attrs.on_change; if (on_change) { @@ -323,18 +324,60 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# url: '/web/dataset/onchange', async: false }; - return self.rpc(ajax, { + 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 - }).pipe(function(response) { - return self.on_processed_onchange(response, processed); + }).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; + } + + 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_on_change_value(); + } + 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); } catch(e) { console.error(e); return $.Deferred().reject(); |
