summaryrefslogtreecommitdiff
path: root/addons/base/static/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/base/static/src/js')
-rw-r--r--addons/base/static/src/js/form.js64
1 files changed, 57 insertions, 7 deletions
diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js
index 4067ccc4056..9760c278699 100644
--- a/addons/base/static/src/js/form.js
+++ b/addons/base/static/src/js/form.js
@@ -75,14 +75,64 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base
w.process_attrs();
w.update_dom();
}
- if (widget) {
- // TODO: check if and trigger
- // if (onchange for this field) {
- // this.ready = false;
- // rpc - process.callback ( this.ready = true; )
- // }
+ if (widget && widget.node.attrs.on_change) {
+ this.do_onchange(widget);
}
},
+ do_onchange: function(widget) {
+ var self = this;
+ this.ready = false;
+ var onchange = _.trim(widget.node.attrs.on_change);
+ var call = onchange.match(/^\s?(.*?)\((.*?)\)\s?$/);
+ if (call) {
+ var method = call[1], args = [];
+ _.each(call[2].split(','), function(a) {
+ var field = _.trim(a);
+ if (self.fields[field]) {
+ args.push(self.fields[field].value);
+ } else {
+ args.push(false);
+ this.log("warning : on_change can't find field " + field, onchange);
+ }
+ });
+ this.dataset.call(method, [this.datarecord.id], args, this.on_processed_onchange);
+ } else {
+ this.log("Wrong on_change format", on_change);
+ }
+ },
+ on_processed_onchange: function(response) {
+ console.log("onchange result :", response);
+ var result = response.result;
+ if (result.value) {
+ for (var f in result.value) {
+ var field = this.fields[f];
+ if (field) {
+ var value = result.value[f];
+ if (field.value != value) {
+ field.set_value(value);
+ // TODO: Recursive on_change
+ // this.on_form_changed(field);
+ }
+ } else {
+ this.log("warning : on_processed_onchange can't find field " + field, result);
+ }
+ }
+ }
+ if (result.warning) {
+ $(QWeb.render("DialogWarning", result.warning)).dialog({
+ modal: true,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ });
+ }
+ if (result.domain) {
+ // Will be removed ?
+ }
+ this.ready = true;
+ },
do_save: function() {
if (!this.ready) {
return false;
@@ -555,7 +605,7 @@ openerp.base.form.FieldBoolean = openerp.base.form.Field.extend({
var self = this;
this._super.apply(this, arguments);
this.$element.find('input').click(function() {
- if ($(this)[0].checked != this.value) {
+ if ($(this).is(':checked') != self.value) {
self.on_ui_change();
}
});