diff options
| author | Christophe Simonis <chs@odoo.com> | 2014-09-05 15:28:22 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2014-09-05 15:28:22 +0200 |
| commit | 31bf30d2d0eb78baaa36360b99fe58bf7cd4c9e7 (patch) | |
| tree | d7be61ecd6bb4c8b5552e39b03e2a64eebbbf323 /addons/web/static/src/js/view_form.js | |
| parent | afba9e8817c458640ae446ac7aaaab79be4fe1e9 (diff) | |
| parent | ed1c173971968eaa96693cb4e1547efa6e6c34e0 (diff) | |
[MERGE] forward port of branch 8.0 up to ed1c173
Diffstat (limited to 'addons/web/static/src/js/view_form.js')
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 137 |
1 files changed, 87 insertions, 50 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 93ebc8b8167..5f5fb401d8e 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -103,6 +103,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.fields_order = []; this.datarecord = {}; this._onchange_specs = {}; + this.onchanges_defs = []; this.default_focus_field = null; this.default_focus_button = null; this.fields_registry = instance.web.form.widgets; @@ -508,7 +509,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM def = self.alive(new instance.web.Model(self.dataset.model).call( "onchange", [ids, values, trigger_field_name, onchange_specs, context])); } - return def.then(function(response) { + var onchange_def = def.then(function(response) { if (widget && widget.field['change_default']) { var fieldname = widget.name; var value_; @@ -544,6 +545,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM }).then(function(response) { return self.on_processed_onchange(response); }); + this.onchanges_defs.push(onchange_def); + return onchange_def; } catch(e) { console.error(e); instance.webclient.crashmanager.show_message(e); @@ -643,6 +646,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM * if the current record is not yet saved. It will then stay in create mode. */ to_edit_mode: function() { + this.onchanges_defs = []; this._actualize_mode("edit"); }, /** @@ -792,12 +796,14 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var self = this; var save_obj = {prepend_on_create: prepend_on_create, ret: null}; this.save_list.push(save_obj); - return this._process_operations().then(function() { - if (save_obj.error) - return $.Deferred().reject(); - return $.when.apply($, save_obj.ret); - }).done(function() { - self.$el.removeClass('oe_form_dirty'); + return $.when.apply($, self.onchanges_defs).then(function(){ + return self._process_operations().then(function() { + if (save_obj.error) + return $.Deferred().reject(); + return $.when.apply($, save_obj.ret); + }).done(function() { + self.$el.removeClass('oe_form_dirty'); + }); }); }, _process_save: function(save_obj) { @@ -2337,26 +2343,31 @@ instance.web.form.KanbanSelection = instance.web.form.FieldChar.extend({ }, render_value: function() { var self = this; - this.record_id = self.view.datarecord.id; - this.states = self.prepare_dropdown_selection();; + this.record_id = this.view.datarecord.id; + this.states = this.prepare_dropdown_selection();; this.$el.html(QWeb.render("KanbanSelection", {'widget': self})); - this.$el.find('.oe_legend').click(self.do_action.bind(self)); + this.$el.find('li').on('click', this.set_kanban_selection.bind(this)); }, - do_action: function(e) { + /* setting the value: in view mode, perform an asynchronous call and reload + the form view; in edit mode, use set_value to save the new value that will + be written when saving the record. */ + set_kanban_selection: function (ev) { var self = this; - var li = $(e.target).closest( "li" ); + var li = $(ev.target).closest('li'); if (li.length) { - var value = {}; - value[self.name] = String(li.data('value')); - self.record_id = self.view.datarecord.id; - if (self.record_id) { - return self.view.dataset._model.call('write', [[self.record_id], value, self.view.dataset.get_context()]).done(self.reload_record.bind(self)); - } else { - return self.view.on_button_save().done(function(result) { - if (result) { - self.view.dataset._model.call('write', [[result], value, self.view.dataset.get_context()]).done(self.reload_record.bind(self)); - } - }); + var value = String(li.data('value')); + if (this.view.get('actual_mode') == 'view') { + var write_values = {} + write_values[self.name] = value; + return this.view.dataset._model.call( + 'write', [ + [self.record_id], + write_values, + self.view.dataset.get_context() + ]).done(self.reload_record.bind(self)); + } + else { + return this.set_value(value); } } }, @@ -2388,27 +2399,34 @@ instance.web.form.Priority = instance.web.form.FieldChar.extend({ }, render_value: function() { var self = this; - this.record_id = self.view.datarecord.id; - this.priorities = self.prepare_priority(); + this.record_id = this.view.datarecord.id; + this.priorities = this.prepare_priority(); this.$el.html(QWeb.render("Priority", {'widget': this})); - this.$el.find('.oe_legend').click(self.do_action.bind(self)); + this.$el.find('li').on('click', this.set_priority.bind(this)); }, - do_action: function(e) { + /* setting the value: in view mode, perform an asynchronous call and reload + the form view; in edit mode, use set_value to save the new value that will + be written when saving the record. */ + set_priority: function (ev) { var self = this; - var li = $(e.target).closest( "li" ); + var li = $(ev.target).closest('li'); if (li.length) { - var value = {}; - value[self.name] = String(li.data('value')); - if (self.record_id) { - return self.view.dataset._model.call('write', [[self.record_id], value, self.view.dataset.get_context()]).done(self.reload_record.bind(self)); - } else { - return self.view.on_button_save().done(function(result) { - if (result) { - self.view.dataset._model.call('write', [[result], value, self.view.dataset.get_context()]).done(self.reload_record.bind(self)); - } - }); + var value = String(li.data('value')); + if (this.view.get('actual_mode') == 'view') { + var write_values = {} + write_values[self.name] = value; + return this.view.dataset._model.call( + 'write', [ + [self.record_id], + write_values, + self.view.dataset.get_context() + ]).done(self.reload_record.bind(self)); + } + else { + return this.set_value(value); } } + }, reload_record: function() { this.view.reload(); @@ -2515,14 +2533,10 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta this._super.apply(this, arguments); this.on("change:effective_readonly", this, function () { this.display_field(); - this.render_value(); }); this.display_field(); return this._super(); }, - render_value: function() { - this.$('button.select_records').css('visibility', this.get('effective_readonly') ? 'hidden': ''); - }, set_value: function(value_) { var self = this; this.set('value', value_ || false); @@ -2537,7 +2551,12 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta var ds = new instance.web.DataSetStatic(self, model, self.build_context()); ds.call('search_count', [domain]).then(function (results) { $('.oe_domain_count', self.$el).text(results + ' records selected'); - $('button span', self.$el).text(' Change selection'); + if (self.get('effective_readonly')) { + $('button span', self.$el).text(' See selection'); + } + else { + $('button span', self.$el).text(' Change selection'); + } }); } else { $('.oe_domain_count', this.$el).text('0 record selected'); @@ -2551,8 +2570,12 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta var model = this.options.model || this.field_manager.get_field_value(this.options.model_field); this.pop = new instance.web.form.SelectCreatePopup(this); this.pop.select_element( - model, {title: 'Select records...'}, - [], this.build_context()); + model, { + title: this.get('effective_readonly') ? 'Selected records' : 'Select records...', + readonly: this.get('effective_readonly'), + disable_multiple_selection: this.get('effective_readonly'), + no_create: this.get('effective_readonly'), + }, [], this.build_context()); this.pop.on("elements_selected", self, function(element_ids) { if (this.pop.$('input.oe_list_record_selector').prop('checked')) { var search_data = this.pop.searchview.build_search_data(); @@ -2834,7 +2857,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 || 'auto'); var height = ((this.node.attrs || {}).editor_height || 250); this.$textarea.cleditor({ width: width, // width not including margins, borders or padding @@ -3300,7 +3323,7 @@ instance.web.form.CompletionFieldMixin = { }); } // create... - if (!(self.options && self.options.no_create)){ + if (!(self.options && (self.options.no_create || self.options.no_create_edit))){ values.push({ label: _t("Create and Edit..."), action: function() { @@ -3575,7 +3598,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc } self.floating = false; } - if (used && self.get("value") === false && ! self.no_ed && (self.options.no_create === false || self.options.no_create === undefined)) { + if (used && self.get("value") === false && ! self.no_ed && ! (self.options && (self.options.no_create || self.options.no_quick_create))) { self.ed_def.reject(); self.uned_def.reject(); self.ed_def = $.Deferred(); @@ -3604,10 +3627,10 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc focusout: anyoneLoosesFocus, focus: function () { self.trigger('focused'); }, autocompleteopen: function () { ignore_blur = true; }, - autocompleteclose: function () { ignore_blur = false; }, + autocompleteclose: function () { setTimeout(function() {ignore_blur = false;},0); }, blur: function () { // autocomplete open - if (ignore_blur) { return; } + if (ignore_blur) { $(this).focus(); return; } if (_(self.getChildren()).any(function (child) { return child instanceof instance.web.form.AbstractFormPopup; })) { return; } @@ -5663,6 +5686,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_ + }); + } } }); |
