X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fweb%2Fstatic%2Fsrc%2Fjs%2Fview_form.js;h=195b672f863a823a932b580334fcada2d53aa444;hb=025f1f1aabb094b4df8ba81eb1f5dd9d7a533758;hp=c5cc4989d4adb2eedb86b7fbb08656fb289b0273;hpb=f9d143c216f36ada7b160b76a298d5cfc1613b65;p=odoo%2Fodoo.git diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index c5cc4989..195b672 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -117,6 +117,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.mutating_mutex = new $.Mutex(); this.on_change_list = []; this.save_list = []; + this.render_value_defs = []; this.reload_mutex = new $.Mutex(); this.__clicked_inside = false; this.__blur_timeout = null; @@ -147,6 +148,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.$el.off('.formBlur'); } this._super(); + if (this.$buttons) { + this.$buttons.remove(); + } }, load_form: function(data) { var self = this; @@ -686,6 +690,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } else if (mode === "create") { mode = "edit"; } + this.render_value_defs = []; this.set({actual_mode: mode}); }, check_actual_mode: function(source, options) { @@ -719,8 +724,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } } }, - on_button_save: function() { + on_button_save: function(e) { var self = this; + $(e.target).attr("disabled", true); return this.save().done(function(result) { self.trigger("save", result); self.reload().then(function() { @@ -730,15 +736,20 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM parent.menu.do_reload_needaction(); } }); + }).always(function(){ + $(e.target).attr("disabled", false); }); }, on_button_cancel: function(event) { + var self = this; if (this.can_be_discarded()) { if (this.get('actual_mode') === 'create') { this.trigger('history_back'); } else { this.to_view_mode(); - this.trigger('load_record', this.datarecord); + $.when.apply(null, this.render_value_defs).then(function(){ + self.trigger('load_record', self.datarecord); + }); } } this.trigger('on_button_cancel'); @@ -959,9 +970,12 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM context: { 'bin_size': true, 'future_display_name': true - } + }, + check_access_rule: true }).then(function(r) { self.trigger('load_record', r); + }).fail(function (){ + self.do_action('history_back'); }); } }); @@ -1969,8 +1983,10 @@ instance.web.form.WidgetButton = instance.web.form.FormWidget.extend({ return this.view.do_execute_action( _.extend({}, this.node.attrs, {context: context}), - this.view.dataset, this.view.datarecord.id, function () { - self.view.recursive_reload(); + this.view.dataset, this.view.datarecord.id, function (reason) { + if (!_.isObject(reason)) { + self.view.recursive_reload(); + } }); }, check_disable: function() { @@ -2236,7 +2252,10 @@ instance.web.form.ReinitializeWidgetMixin = { instance.web.form.ReinitializeFieldMixin = _.extend({}, instance.web.form.ReinitializeWidgetMixin, { reinitialize: function() { instance.web.form.ReinitializeWidgetMixin.reinitialize.call(this); - this.render_value(); + var res = this.render_value(); + if (this.view && this.view.render_value_defs){ + this.view.render_value_defs.push(res); + } }, }); @@ -2419,6 +2438,7 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({ type_of_date: "datetime", events: { 'change .oe_datepicker_master': 'change_datetime', + 'keypress .oe_datepicker_master': 'change_datetime', }, init: function(parent) { this._super(parent); @@ -2537,8 +2557,8 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({ format_client: function(v) { return instance.web.format_value(v, {"widget": this.type_of_date}); }, - change_datetime: function() { - if (this.is_valid_()) { + change_datetime: function(e) { + if ((e.type !== "keypress" || e.which === 13) && this.is_valid_()) { this.set_value_from_ui_(); this.trigger("datetime_changed"); } @@ -2596,7 +2616,9 @@ instance.web.form.FieldDatetime = instance.web.form.AbstractField.extend(instanc }, set_dimensions: function (height, width) { this._super(height, width); - this.datewidget.$input.css('height', height); + if (!this.get("effective_readonly")) { + this.datewidget.$input.css('height', height); + } } }); @@ -2709,7 +2731,7 @@ instance.web.form.FieldTextHtml = instance.web.form.AbstractField.extend(instanc if (! this.get("effective_readonly")) { self._updating_editor = false; this.$textarea = this.$el.find('textarea'); - var width = ((this.node.attrs || {}).editor_width || '100%'); + var width = ((this.node.attrs || {}).editor_width || 'calc(100% - 4px)'); var height = ((this.node.attrs || {}).editor_height || 250); this.$textarea.cleditor({ width: width, // width not including margins, borders or padding @@ -3070,6 +3092,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc this.floating = false; this.current_display = null; this.is_started = false; + this.ignore_focusout = false; }, reinit_value: function(val) { this.internal_set_value(val); @@ -3151,7 +3174,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc self.display_value = {}; self.render_value(); self.focus(); - self.view.do_onchange(self); + self.trigger('changed_value'); }); }); @@ -3195,6 +3218,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc var ed_delay = 200; var ed_duration = 15000; var anyoneLoosesFocus = function (e) { + if (self.ignore_focusout) { return; } var used = false; if (self.floating) { if (self.last_search.length > 0) { @@ -3387,11 +3411,17 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc _search_create_popup: function() { this.no_ed = true; this.ed_def.reject(); - return instance.web.form.CompletionFieldMixin._search_create_popup.apply(this, arguments); + this.ignore_focusout = true; + this.reinit_value(false); + var res = instance.web.form.CompletionFieldMixin._search_create_popup.apply(this, arguments); + this.ignore_focusout = false; + this.no_ed = false; + return res; }, set_dimensions: function (height, width) { this._super(height, width); - this.$input.css('height', height); + if (!this.get("effective_readonly") && this.$input) + this.$input.css('height', height); } }); @@ -3487,7 +3517,6 @@ var commands = { }; instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ multi_selection: false, - disable_utility_classes: true, init: function(field_manager, node) { this._super(field_manager, node); lazy_build_o2m_kanban_view(); @@ -3757,6 +3786,9 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ } return $.when(false); }, + is_false: function() { + return this.dataset.ids.length == 0; + }, is_syntax_valid: function() { if (! this.viewmanager || ! this.viewmanager.views[this.viewmanager.active_view]) return true; @@ -3824,6 +3856,10 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({ instance.web.form.One2ManyDataSet = instance.web.BufferedDataSet.extend({ get_context: function() { this.context = this.o2m.build_context(); + var self = this; + _.each(arguments, function(context) { + self.context.add(context); + }); return this.context; } }); @@ -3854,28 +3890,24 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ this.o2m.trigger_on_change(); }, is_valid: function () { - var editor = this.editor; - var form = editor.form; - // If no edition is pending, the listview can not be invalid (?) - if (!editor.record) { - return true - } - // If the form has not been modified, the view can only be valid - // NB: is_dirty will also be set on defaults/onchanges/whatever? - // oe_form_dirty seems to only be set on actual user actions - if (!form.$el.is('.oe_form_dirty')) { + var self = this; + if (!this.fields_view || !this.editable()){ return true; } - this.o2m._dirty_flag = true; - - // Otherwise validate internal form - return _(form.fields).chain() - .invoke(function () { - this._check_css_flags(); - return this.is_valid(); - }) - .all(_.identity) - .value(); + var r; + return _.every(this.records.records, function(record){ + r = record; + _.each(self.editor.form.fields, function(field){ + field._inhibit_on_change_flag = true; + field.set_value(r.attributes[field.name]); + field._inhibit_on_change_flag = false; + }); + return _.every(self.editor.form.fields, function(field){ + field.process_modifiers(); + field._check_css_flags(); + return field.is_valid(); + }); + }); }, do_add_record: function () { if (this.editable()) { @@ -3945,7 +3977,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ else return $.when(); }).done(function () { - if (!self.o2m.options.reload_on_button) { + var ds = self.o2m.dataset; + var cached_records = _.any([ds.to_create, ds.to_delete, ds.to_write], function(value) { + return value.length; + }); + if (!self.o2m.options.reload_on_button && !cached_records) { self.handle_button(name, id, callback); }else { self.handle_button(name, id, function(){ @@ -4239,7 +4275,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in } }; if (! values || values.length > 0) { - this._display_orderer.add(dataset.name_get(values)).done(handle_names); + return this._display_orderer.add(dataset.name_get(values)).done(handle_names); } else { handle_names([]); } @@ -4261,7 +4297,6 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in */ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, { multi_selection: false, - disable_utility_classes: true, init: function(field_manager, node) { this._super(field_manager, node); this.is_loaded = $.Deferred(); @@ -4353,7 +4388,8 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in pop.select_element( this.model, { - title: _t("Add: ") + this.m2m_field.string + title: _t("Add: ") + this.m2m_field.string, + no_create: this.m2m_field.options.no_create, }, new instance.web.CompoundDomain(this.m2m_field.build_domain(), ["!", ["id", "in", this.m2m_field.dataset.ids]]), this.m2m_field.build_context() @@ -5170,6 +5206,20 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ this._super.apply(this, arguments); this.render_value(); this.set_filename(''); + }, + set_value: function(value_){ + var changed = value_ !== this.get_value(); + this._super.apply(this, arguments); + // By default, on binary images read, the server returns the binary size + // This is possible that two images have the exact same size + // Therefore we trigger the change in case the image value hasn't changed + // So the image is re-rendered correctly + if (!changed){ + this.trigger("change:value", this, { + oldValue: value_, + newValue: value_ + }); + } } }); @@ -5179,7 +5229,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ * Options on attribute ; "blockui" {Boolean} block the UI or not * during the file is uploading */ -instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractField.extend({ +instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, { template: "FieldBinaryFileUploader", init: function(field_manager, node) { this._super(field_manager, node); @@ -5192,8 +5242,7 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie this.fileupload_id = _.uniqueId('oe_fileupload_temp'); $(window).on(this.fileupload_id, _.bind(this.on_file_loaded, this)); }, - start: function() { - this._super(this); + initialize_content: function() { this.$el.on('change', 'input.oe_form_binary_file', this.on_file_change ); }, set_value: function(value_) { @@ -5465,7 +5514,12 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ on_click_stage: function (ev) { var self = this; var $li = $(ev.currentTarget); - var val = parseInt($li.data("id")); + if (this.field.type == "many2one") { + var val = parseInt($li.data("id")); + } + else { + var val = $li.data("id"); + } if (val != self.get('value')) { this.view.recursive_save().done(function() { var change = {};