[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:
parent
e0f94944ad
commit
d7b930e791
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue