summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2014-12-02 16:18:08 +0100
committerChristophe Simonis <chs@odoo.com>2014-12-02 16:18:08 +0100
commit1d3f8eba879f02da7fc0bb46c9801029eccbc8c8 (patch)
tree10ef917de1be8ef9755cba4f3c9ac951af176b18 /addons/web/static/src
parent7878b2fd0cb42827b71bd00a1fd8199e73269fe4 (diff)
parent591e329bb0efe4997677a0bee2e6f3b558e35df8 (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.css2
-rw-r--r--addons/web/static/src/css/base.sass2
-rw-r--r--addons/web/static/src/js/chrome.js3
-rw-r--r--addons/web/static/src/js/search.js18
-rw-r--r--addons/web/static/src/js/view_form.js96
-rw-r--r--addons/web/static/src/js/view_list.js7
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);
});