Redirected onchange and save to a common operation
bzr revid: nicolas.vanhoren@openerp.com-20121031153946-zvmoh7g7rtc69pyc
This commit is contained in:
parent
00fc09890b
commit
2d93553e0d
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue