diff options
| author | Christophe Simonis <chs@odoo.com> | 2014-12-02 16:18:08 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2014-12-02 16:18:08 +0100 |
| commit | 1d3f8eba879f02da7fc0bb46c9801029eccbc8c8 (patch) | |
| tree | 10ef917de1be8ef9755cba4f3c9ac951af176b18 /addons/web/static/src | |
| parent | 7878b2fd0cb42827b71bd00a1fd8199e73269fe4 (diff) | |
| parent | 591e329bb0efe4997677a0bee2e6f3b558e35df8 (diff) | |
[MERGE] forward port of branch 8.0 up to 591e329
Diffstat (limited to 'addons/web/static/src')
| -rw-r--r-- | addons/web/static/src/css/base.css | 2 | ||||
| -rw-r--r-- | addons/web/static/src/css/base.sass | 2 | ||||
| -rw-r--r-- | addons/web/static/src/js/chrome.js | 3 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 18 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 96 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 7 |
6 files changed, 72 insertions, 56 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index ae2bd2882da..67c2b4026b6 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1699,7 +1699,7 @@ border-right: none; } .openerp .oe_form .oe_subtotal_footer .oe_subtotal_footer_separator { - width: 108px; + min-width: 108px; border-top: 1px solid #cacaca; margin-top: 4px; padding-top: 4px; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 2e6e28b6dbf..2ada1c8d883 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -1424,7 +1424,7 @@ $sheet-padding: 16px td.oe_form_group_cell_label border-right: none .oe_subtotal_footer_separator - width: 108px + min-width: 108px border-top: 1px solid #cacaca margin-top: 4px padding-top: 4px diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 88da348ee17..c39e5bd4bc5 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1304,7 +1304,8 @@ instance.web.WebClient = instance.web.Client.extend({ } }, update_logo: function() { - var img = this.session.url('/web/binary/company_logo'); + var company = this.session.company_id; + var img = this.session.url('/web/binary/company_logo' + (company ? '?company=' + company : '')); this.$('.oe_logo img').attr('src', '').attr('src', img); this.$('.oe_logo_edit').toggleClass('oe_logo_edit_admin', this.session.uid === 1); }, diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 148f46677f5..3ae52df31bc 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -684,6 +684,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea }, childFocused: function () { this.$el.addClass('active'); + this.view_id = this.view_id || data.view_id; }, childBlurred: function () { this.$el.val('').removeClass('active').trigger('blur'); @@ -1390,7 +1391,10 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ var values = facet.values; if (_.isEmpty(this.attrs.context) && values.length === 1) { var c = {}; - c['default_' + this.attrs.name] = values.at(0).get('value'); + var v = values.at(0); + if (v.get('operator') !== 'ilike') { + c['default_' + this.attrs.name] = v.get('value'); + } return c; } return this._super(facet); @@ -2126,6 +2130,14 @@ instance.web.search.AutoComplete = instance.web.Widget.extend({ ev.preventDefault(); return; } + // ENTER is caugth at KeyUp rather than KeyDown to avoid firing + // before all regular keystrokes have been processed + if (ev.which === $.ui.keyCode.ENTER) { + if (self.current_result && self.get_search_string().length) { + self.select_item(ev); + } + return; + } if (!self.searching) { self.searching = true; return; @@ -2140,8 +2152,10 @@ instance.web.search.AutoComplete = instance.web.Widget.extend({ }); this.$input.on('keydown', function (ev) { switch (ev.which) { + // TAB and direction keys are handled at KeyDown because KeyUp + // is not guaranteed to fire. + // See e.g. https://github.com/aef-/jquery.masterblaster/issues/13 case $.ui.keyCode.TAB: - case $.ui.keyCode.ENTER: if (self.current_result && self.get_search_string().length) { self.select_item(ev); } diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a5ab2027939..9cf7d0a847f 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -101,7 +101,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this.fields_order = []; this.datarecord = {}; this._onchange_specs = {}; - this.onchanges_defs = []; + this.onchanges_mutex = new $.Mutex(); this.default_focus_field = null; this.default_focus_button = null; this.fields_registry = instance.web.form.widgets; @@ -508,44 +508,45 @@ 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])); } - var onchange_def = def.then(function(response) { - if (widget && widget.field['change_default']) { - var fieldname = widget.name; - var value_; - if (response.value && (fieldname in response.value)) { - // Use value from onchange if onchange executed - value_ = response.value[fieldname]; - } else { - // otherwise get form value for field - value_ = self.fields[fieldname].get_value(); - } - var condition = fieldname + '=' + value_; - - if (value_) { - return self.alive(new instance.web.Model('ir.values').call( - 'get_defaults', [self.model, condition] - )).then(function (results) { - if (!results.length) { + this.onchanges_mutex.exec(function(){ + return def.then(function(response) { + if (widget && widget.field['change_default']) { + var fieldname = widget.name; + var value_; + if (response.value && (fieldname in response.value)) { + // Use value from onchange if onchange executed + value_ = response.value[fieldname]; + } else { + // otherwise get form value for field + value_ = self.fields[fieldname].get_value(); + } + var condition = fieldname + '=' + value_; + + if (value_) { + return self.alive(new instance.web.Model('ir.values').call( + 'get_defaults', [self.model, condition] + )).then(function (results) { + if (!results.length) { + return response; + } + if (!response.value) { + response.value = {}; + } + for(var i=0; i<results.length; ++i) { + // [whatever, key, value] + var triplet = results[i]; + response.value[triplet[1]] = triplet[2]; + } return response; - } - if (!response.value) { - response.value = {}; - } - for(var i=0; i<results.length; ++i) { - // [whatever, key, value] - var triplet = results[i]; - response.value[triplet[1]] = triplet[2]; - } - return response; - }); + }); + } } - } - return response; - }).then(function(response) { - return self.on_processed_onchange(response); + return response; + }).then(function(response) { + return self.on_processed_onchange(response); + }); }); - this.onchanges_defs.push(onchange_def); - return onchange_def; + return this.onchanges_mutex.def; } catch(e) { console.error(e); instance.webclient.crashmanager.show_message(e); @@ -586,21 +587,18 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM var self = this; return this.mutating_mutex.exec(function() { function iterate() { - var start = $.Deferred(); - start.resolve(); - start = _.reduce(self.onchanges_defs, function(memo, d){ - return memo.then(function(){ - return d; - }, function(){ - return d; - }); - }, start); - var defs = [start]; + + var mutex = new $.Mutex(); _.each(self.fields, function(field) { - defs.push(field.commit_value()); + self.onchanges_mutex.def.then(function(){ + mutex.exec(function(){ + return field.commit_value(); + }); + }); }); + var args = _.toArray(arguments); - return $.when.apply($, defs).then(function() { + return $.when.apply(null, [mutex.def, self.onchanges_mutex.def]).then(function() { var save_obj = self.save_list.pop(); if (save_obj) { return self._process_save(save_obj).then(function() { @@ -654,7 +652,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.onchanges_mutex = new $.Mutex(); this._actualize_mode("edit"); }, /** diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index c520d4d2012..31dee2927d2 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -535,6 +535,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi }, reload_record: function (record) { var self = this; + var fields = this.fields_view.fields; return this.dataset.read_ids( [record.get('id')], _.pluck(_(this.columns).filter(function (r) { @@ -547,8 +548,10 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi self.records.remove(record); return; } - _(_.keys(values)).each(function(key){ - record.set(key, values[key], {silent: true}); + _.each(values, function (value, key) { + if (fields[key] && fields[key].type === 'many2many') + record.set(key + '__display', false, {silent: true}); + record.set(key, value, {silent: true}); }); record.trigger('change', record); }); |
