[FIX] Fixed & refactored form

in on_ui_change(), validate() is called first. set_value_from_ui() is only called if field is valid
datetimepicker wrongly trigger on_change event when using 'setDate' method
openerp on_changes were using widget.value instead of wiget.get_value() thus breaking relational fields on_changes

bzr revid: fme@openerp.com-20110620144348-cuuubj3e5acx82zr
This commit is contained in:
Fabien Meghazi 2011-06-20 16:43:48 +02:00
parent e0f94944ad
commit d7b930e791
1 changed files with 53 additions and 56 deletions

View File

@ -89,9 +89,6 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
var field = this.fields[f];
field.touched = false;
field.set_value(this.datarecord[f] || false);
// TODO: here we should be able to alter the 'touched' state when setting value
// the following line will be removed by fme as soon as refactoring has been done
field.touched = false;
field.validate();
}
if (!record.id) {
@ -163,7 +160,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
if (field in argument_replacement) {
args.push(argument_replacement[field]);
} else if (self.fields[field]) {
var value = self.fields[field].value;
var value = self.fields[field].get_value();
args.push(value == null ? false : value);
} else {
args.push(false);
@ -194,7 +191,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV
if (field) {
var value = result.value[f];
processed.push(field.name);
if (field.value != value) {
if (field.get_value() != value) {
field.set_value(value);
if (_.indexOf(processed, field.name) < 0) {
this.do_onchange(field, processed);
@ -694,11 +691,16 @@ openerp.base.form.Field = openerp.base.form.Widget.extend({
},
on_ui_change: function() {
this.touched = this.view.touched = true;
this.set_value_from_ui();
this.validate();
if (!this.invalid) {
this.set_value_from_ui();
this.view.on_form_changed(this);
} else {
this.update_dom();
}
},
validate: function() {
this.invalid = false;
}
});
@ -725,10 +727,11 @@ openerp.base.form.FieldChar = openerp.base.form.Field.extend({
},
validate: function() {
this.invalid = false;
if (this.value === false || this.value === "") {
var value = this.$element.find('input').val();
if (value === "") {
this.invalid = this.required;
} else if (this.validation_regex) {
this.invalid = !this.validation_regex.test(this.value);
this.invalid = !this.validation_regex.test(value);
}
}
});
@ -781,23 +784,16 @@ openerp.base.form.FieldFloat = openerp.base.form.FieldChar.extend({
this.validation_regex = /^-?\d+(\.\d+)?$/;
},
set_value: function(value) {
if (!value) {
this._super.apply(this, [value]);
if (value === false || value === undefined) {
// As in GTK client, floats default to 0
this.touched = this.view.touched = true;
value = 0;
}
this._super.apply(this, [value]);
var show_value = value.toFixed(2);
this.$element.find('input').val(show_value);
},
set_value_from_ui: function() {
this.value = this.$element.find('input').val().replace(/,/g, '.');
},
validate: function() {
this._super.apply(this, arguments);
if (!this.invalid) {
this.value = Number(this.value);
}
this.value = Number(this.$element.find('input').val().replace(/,/g, '.'));
}
});
@ -819,8 +815,10 @@ openerp.base.form.FieldDatetime = openerp.base.form.Field.extend({
if (value == null || value == false) {
this.$element.find('input').val('');
} else {
this.value = this.parse(value);
this.$element.find('input')[this.jqueryui_object]('setDate', this.value);
this.$element.find('input').unbind('change');
// jQuery UI date picker wrongly call on_change event herebelow
this.$element.find('input')[this.jqueryui_object]('setDate', this.parse(value));
this.$element.find('input').change(this.on_ui_change);
}
},
set_value_from_ui: function() {
@ -830,7 +828,7 @@ openerp.base.form.FieldDatetime = openerp.base.form.Field.extend({
}
},
validate: function() {
this.invalid = this.required && this.value === false;
this.invalid = this.required && this.$element.find('input')[this.jqueryui_object]('getDate') === '';
},
parse: openerp.base.parse_datetime,
format: openerp.base.format_datetime
@ -851,20 +849,18 @@ openerp.base.form.FieldFloatTime = openerp.base.form.FieldChar.extend({
this.validation_regex = /^\d+:\d+$/;
},
set_value: function(value) {
value = value || 0;
this._super.apply(this, [value]);
if (value === false || value === undefined) {
// As in GTK client, floats default to 0
value = 0;
}
var show_value = _.sprintf("%02d:%02d", Math.floor(value), Math.round((value % 1) * 60));
this.$element.find('input').val(show_value);
},
validate: function() {
if (typeof(this.value) == "string") {
this._super.apply(this, arguments);
if (!this.invalid) {
var time = this.value.split(':');
set_value_from_ui: function() {
var time = this.$element.find('input').val().split(':');
this.set_value(parseInt(time[0], 10) + parseInt(time[1], 10) / 60);
}
}
}
});
openerp.base.form.FieldText = openerp.base.form.Field.extend({
@ -891,10 +887,11 @@ openerp.base.form.FieldText = openerp.base.form.Field.extend({
},
validate: function() {
this.invalid = false;
if (this.value === false || this.value === "") {
var value = this.$element.find('textarea').val();
if (value === "") {
this.invalid = this.required;
} else if (this.validation_regex) {
this.invalid = !this.validation_regex.test(this.value);
this.invalid = !this.validation_regex.test(value);
}
}
});
@ -925,7 +922,7 @@ openerp.base.form.FieldBoolean = openerp.base.form.Field.extend({
this.$element.find('input').attr('disabled', this.readonly);
},
validate: function() {
this.invalid = this.required && !this.value;
this.invalid = this.required && !this.$element.find('input').is(':checked');
}
});
@ -980,12 +977,12 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({
this.$element.find('select').attr('disabled', this.readonly);
},
validate: function() {
this.invalid = this.required && this.value === "";
this.invalid = this.required && this.$element.find('select').val() === "";
}
});
// jquery autocomplete tweak to allow html
(function(x) {
(function() {
var proto = $.ui.autocomplete.prototype,
initSource = proto._initSource;
@ -1014,7 +1011,7 @@ openerp.base.form.FieldSelection = openerp.base.form.Field.extend({
.appendTo( ul );
}
});
})(null);
})();
/**
* Builds a new context usable for operations related to fields by merging