diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 42041f1b024..7398732e1d2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -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(); - this.view.on_form_changed(this); + 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,19 +849,17 @@ 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(':'); - this.set_value(parseInt(time[0], 10) + parseInt(time[1], 10) / 60); - } - } + 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); } }); @@ -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,22 +977,22 @@ 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; - + function filter( array, term ) { var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); return $.grep( array, function(value) { return matcher.test( $( "