summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorJiten (OpenERP) <jra@tinyerp.com>2012-02-09 11:32:16 +0530
committerJiten (OpenERP) <jra@tinyerp.com>2012-02-09 11:32:16 +0530
commitf5e2fe1ff02f37088bce73b39fdf7328e568aa1a (patch)
treeafdf585c2ed8600b314637f89e7a6bc0bbdd6823 /addons/web/static/src
parenta9aaad2257ae9b61729757007ef59db41f8521f4 (diff)
parent98bd34a2eb74d5226279795014c178c08aec4ee6 (diff)
[Merge] Merge from openerp-web.
bzr revid: jra@tinyerp.com-20120209060216-7srqio91yxlu7yi0
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/css/base.css15
-rw-r--r--addons/web/static/src/js/chrome.js25
-rw-r--r--addons/web/static/src/js/core.js94
-rw-r--r--addons/web/static/src/js/data.js70
-rw-r--r--addons/web/static/src/js/formats.js16
-rw-r--r--addons/web/static/src/js/view_form.js93
-rw-r--r--addons/web/static/src/js/view_list.js1
-rw-r--r--addons/web/static/src/js/view_list_editable.js2
-rw-r--r--addons/web/static/src/js/view_page.js2
-rw-r--r--addons/web/static/src/xml/base.xml16
10 files changed, 247 insertions, 87 deletions
diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 926f930e521..c7c79c5c6ea 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -1235,6 +1235,8 @@ label.error {
.openerp label.oe_label_help, .openerp label.oe_label,
+.openerp .oe_form_paragraph,
+.openerp .oe_form_field_statusbar,
.openerp .oe_forms input[type="text"],
.openerp .oe_forms input[type="password"],
.openerp .oe_forms input[type="file"],
@@ -1305,12 +1307,23 @@ label.error {
white-space: normal;
}
+.openerp .oe_forms .oe_form_paragraph.oe_multilines {
+ white-space: pre;
+}
+
.openerp .oe_form_field_one2many .oe-actions h3.oe_view_title,
.openerp .oe_form_field_one2many_list .oe-actions h3.oe_view_title{
display: inline;
margin: 0 0.5em 0 0;
}
+.openerp .oe_forms .oe-listview th.oe-sortable .ui-icon,
+.openerp .oe_forms .oe-listview th.oe-sortable .ui-icon {
+ height: 100%;
+ margin-top: -9px;
+}
+
+
/* Uneditable Form View */
.openerp .oe_form_readonly {
@@ -1891,7 +1904,7 @@ label.error {
text-align: left;
border-bottom: 1px solid #CFCCCC;
}
-.oe-number{
+.openerp .oe-treeview-table .oe-number {
text-align: right !important;
}
.treeview-tr span, .treeview-td span {
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index ae40c1affe7..9fda4752a36 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -141,12 +141,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog#
});
openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({
- init: function() {
- this._super();
- openerp.connection.on_rpc_error.add(this.on_rpc_error);
- },
on_rpc_error: function(error) {
- this.error = error;
if (error.data.fault_code) {
var split = ("" + error.data.fault_code).split('\n')[0].split(' -- ');
if (split.length > 1) {
@@ -195,7 +190,7 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({
};
}
var dialog = new openerp.web.Dialog(this, {
- title: "OpenERP " + _.str.capitalize(this.error.type),
+ title: "OpenERP " + _.str.capitalize(error.type),
width: '80%',
height: '50%',
min_width: '800px',
@@ -247,8 +242,8 @@ openerp.web.Loading = openerp.web.OldWidget.extend(/** @lends openerp.web.Loadin
this.count += increment;
if (this.count > 0) {
- //this.$element.html(QWeb.render("Loading", {}));
- $(".loading",this.$element).html("Loading ("+this.count+")");
+ $(".loading",this.$element).text(_.str.sprintf(
+ _t("Loading (%d)"), this.count));
$(".loading",this.$element).show();
this.widget_parent.$element.addClass('loading');
} else {
@@ -1084,9 +1079,10 @@ openerp.web.WebClient = openerp.web.OldWidget.extend(/** @lends openerp.web.WebC
self.action_manager = new openerp.web.ActionManager(self);
self.action_manager.appendTo($("#oe_app"));
self.bind_hashchange();
+ var version_label = _t("OpenERP - Unsupported/Community Version");
if (!self.session.openerp_entreprise) {
- self.$element.find('.oe_footer_powered').append('<span> - <a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank">Unsupported/Community Version</a></span>');
- document.title = _t("OpenERP - Unsupported/Community Version");
+ self.$element.find('.oe_footer_powered').append(_.str.sprintf('<span> - <a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank">%s</a></span>', version_label));
+ document.title = version_label;
}
});
},
@@ -1112,8 +1108,17 @@ openerp.web.WebClient = openerp.web.OldWidget.extend(/** @lends openerp.web.WebC
self.menu.start();
},
show_common: function() {
+ var self = this;
if (!this.crashmanager) {
this.crashmanager = new openerp.web.CrashManager();
+ openerp.connection.on_rpc_error.add(this.crashmanager.on_rpc_error);
+ window.onerror = function (message, file, line) {
+ self.crashmanager.on_traceback({
+ type: _t("Client Error"),
+ message: message,
+ data: {debug: file + ':' + line}
+ });
+ }
}
this.notification = new openerp.web.Notification(this);
this.notification.appendTo(this.$element);
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js
index 500cf58d05f..3c5f1ee1e75 100644
--- a/addons/web/static/src/js/core.js
+++ b/addons/web/static/src/js/core.js
@@ -254,6 +254,7 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
* @param {Object} mapping a mapping of keys to object-paths
*/
init: function (mapping) {
+ this.parent = null;
this.map = mapping || {};
},
/**
@@ -269,6 +270,9 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
get_object: function (key, silent_error) {
var path_string = this.map[key];
if (path_string === undefined) {
+ if (this.parent) {
+ return this.parent.get_object(key, silent_error);
+ }
if (silent_error) { return void 'nooo'; }
throw new openerp.web.KeyNotFound(key);
}
@@ -287,6 +291,21 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
return object_match;
},
/**
+ * Checks if the registry contains an object mapping for this key.
+ *
+ * @param {String} key key to look for
+ */
+ contains: function (key) {
+ if (key === undefined) { return false; }
+ if (key in this.map) {
+ return true
+ }
+ if (this.parent) {
+ return this.parent.contains(key);
+ }
+ return false;
+ },
+ /**
* Tries a number of keys, and returns the first object matching one of
* the keys.
*
@@ -299,7 +318,7 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
get_any: function (keys) {
for (var i=0; i<keys.length; ++i) {
var key = keys[i];
- if (key === undefined || !(key in this.map)) {
+ if (!this.contains(key)) {
continue;
}
@@ -324,11 +343,22 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
* Creates and returns a copy of the current mapping, with the provided
* mapping argument added in (replacing existing keys if needed)
*
+ * Parent and child remain linked, a new key in the parent (which is not
+ * overwritten by the child) will appear in the child.
+ *
* @param {Object} [mapping={}] a mapping of keys to object-paths
*/
+ extend: function (mapping) {
+ var child = new openerp.web.Registry(mapping);
+ child.parent = this;
+ return child;
+ },
+ /**
+ * @deprecated use Registry#extend
+ */
clone: function (mapping) {
- return new openerp.web.Registry(
- _.extend({}, this.map, mapping || {}));
+ console.warn('Registry#clone is deprecated, use Registry#extend');
+ return this.extend(mapping);
}
});
@@ -393,7 +423,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
this.qweb_mutex = new $.Mutex();
},
bind: function(origin) {
- var window_origin = location.protocol+"//"+location.host;
+ var window_origin = location.protocol+"//"+location.host, self=this;
this.origin = origin ? _.str.rtrim(origin,'/') : window_origin;
this.prefix = this.origin;
this.server = this.origin; // keep chs happy
@@ -405,8 +435,11 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
this.user_context= {};
this.db = false;
this.openerp_entreprise = false;
- this.module_list = [];
- this.module_loaded = {"web": true};
+ this.module_list = openerp._modules.slice();
+ this.module_loaded = {};
+ _(this.module_list).each(function (mod) {
+ self.module_loaded[mod] = true;
+ });
this.context = {};
this.shortcuts = [];
this.active_id = null;
@@ -694,10 +727,11 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
load_modules: function(no_session_valid_signal) {
var self = this;
return this.rpc('/web/session/modules', {}).pipe(function(result) {
- var lang = self.user_context.lang;
- var params = { mods: ["web"].concat(result), lang: lang};
+ var lang = self.user_context.lang,
+ all_modules = _.uniq(self.module_list.concat(result));
+ var params = { mods: all_modules, lang: lang};
var to_load = _.difference(result, self.module_list).join(',');
- self.module_list = result;
+ self.module_list = all_modules;
return $.when(
self.rpc('/web/webclient/csslist', {mods: to_load}, self.do_load_css),
self.rpc('/web/webclient/qweblist', {mods: to_load}).pipe(self.do_load_qweb),
@@ -1174,9 +1208,7 @@ openerp.web.TranslationDataBase = openerp.web.Class.extend(/** @lends openerp.we
add_module_translation: function(mod) {
var self = this;
_.each(mod.messages, function(message) {
- if (self.db[message.id] === undefined) {
- self.db[message.id] = message.string;
- }
+ self.db[message.id] = message.string;
});
},
build_translation_function: function() {
@@ -1223,18 +1255,34 @@ openerp.web.qweb.default_dict = {
'_' : _,
'_t' : openerp.web._t
};
-openerp.web.qweb.format_text_node = function (s) {
- // Note that 'this' is the Qweb Node of the text
- var translation = this.node.parentNode.attributes['t-translation'];
- if (translation && translation.value === 'off') {
- return s;
- }
- var ts = _.str.trim(s);
- if (ts.length === 0) {
- return s;
+openerp.web.qweb.preprocess_node = function() {
+ // Note that 'this' is the Qweb Node
+ switch (this.node.nodeType) {
+ case 3:
+ case 4:
+ // Text and CDATAs
+ var translation = this.node.parentNode.attributes['t-translation'];
+ if (translation && translation.value === 'off') {
+ return;
+ }
+ var ts = _.str.trim(this.node.data);
+ if (ts.length === 0) {
+ return;
+ }
+ var tr = openerp.web._t(ts);
+ if (tr !== ts) {
+ this.node.data = tr;
+ }
+ break;
+ case 1:
+ // Element
+ var attr, attrs = ['label', 'title', 'alt'];
+ while (attr = attrs.pop()) {
+ if (this.attributes[attr]) {
+ this.attributes[attr] = openerp.web._t(this.attributes[attr]);
+ }
+ }
}
- var tr = openerp.web._t(ts);
- return tr === ts ? s : tr;
};
/** Jquery extentions */
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index b596b1eb250..01962f829e6 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -248,6 +248,7 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data
this.model = model;
this.context = context || {};
this.index = null;
+ this._sort = [];
},
previous: function () {
this.index -= 1;
@@ -496,6 +497,31 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data
return new openerp.web.CompoundContext(this.context, request_context);
}
return this.context;
+ },
+ /**
+ * Reads or changes sort criteria on the dataset.
+ *
+ * If not provided with any argument, serializes the sort criteria to
+ * an SQL-like form usable by OpenERP's ORM.
+ *
+ * If given a field, will set that field as first sorting criteria or,
+ * if the field is already the first sorting criteria, will reverse it.
+ *
+ * @param {String} [field] field to sort on, reverses it (toggle from ASC to DESC) if already the main sort criteria
+ * @param {Boolean} [force_reverse=false] forces inserting the field as DESC
+ * @returns {String|undefined}
+ */
+ sort: function (field, force_reverse) {
+ if (!field) {
+ return openerp.web.serialize_sort(this._sort);
+ }
+ var reverse = force_reverse || (this._sort[0] === field);
+ this._sort.splice.apply(
+ this._sort, [0, this._sort.length].concat(
+ _.without(this._sort, field, '-' + field)));
+
+ this._sort.unshift((reverse ? '-' : '') + field);
+ return undefined;
}
});
openerp.web.DataSetStatic = openerp.web.DataSet.extend({
@@ -541,7 +567,6 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D
init: function(parent, model, context, domain) {
this._super(parent, model, context);
this.domain = domain || [];
- this._sort = [];
this.offset = 0;
// subset records[offset:offset+limit]
// is it necessary ?
@@ -583,31 +608,6 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D
}
return this.domain;
},
- /**
- * Reads or changes sort criteria on the dataset.
- *
- * If not provided with any argument, serializes the sort criteria to
- * an SQL-like form usable by OpenERP's ORM.
- *
- * If given a field, will set that field as first sorting criteria or,
- * if the field is already the first sorting criteria, will reverse it.
- *
- * @param {String} [field] field to sort on, reverses it (toggle from ASC to DESC) if already the main sort criteria
- * @param {Boolean} [force_reverse=false] forces inserting the field as DESC
- * @returns {String|undefined}
- */
- sort: function (field, force_reverse) {
- if (!field) {
- return openerp.web.serialize_sort(this._sort);
- }
- var reverse = force_reverse || (this._sort[0] === field);
- this._sort.splice.apply(
- this._sort, [0, this._sort.length].concat(
- _.without(this._sort, field, '-' + field)));
-
- this._sort.unshift((reverse ? '-' : '') + field);
- return undefined;
- },
unlink: function(ids, callback, error_callback) {
var self = this;
return this._super(ids, function(result) {
@@ -722,6 +722,24 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({
throw "Record not correctly loaded";
}
}
+ var sort_fields = self._sort,
+ compare = function (v1, v2) {
+ return (v1 < v2) ? -1
+ : (v1 > v2) ? 1
+ : 0;
+ };
+ records.sort(function (a, b) {
+ return _.reduce(sort_fields, function (acc, field) {
+ if (acc) { return acc; }
+
+ var sign = 1;
+ if (field[0] === '-') {
+ sign = -1;
+ field = field.slice(1);
+ }
+ return sign * compare(a[field], b[field]);
+ }, 0);
+ });
completion.resolve(records);
};
if(to_get.length > 0) {
diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js
index eb7d6c335ac..e8970b65f52 100644
--- a/addons/web/static/src/js/formats.js
+++ b/addons/web/static/src/js/formats.js
@@ -101,7 +101,12 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) {
formatted[0] = openerp.web.insert_thousand_seps(formatted[0]);
return formatted.join(l10n.decimal_point);
case 'float_time':
- return _.str.sprintf("%02d:%02d",
+ var pattern = '%02d:%02d';
+ if (value < 0) {
+ value = Math.abs(value);
+ pattern = '-' + pattern;
+ }
+ return _.str.sprintf(pattern,
Math.floor(value),
Math.round((value % 1) * 60));
case 'many2one':
@@ -171,12 +176,17 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) {
throw new Error(value + " is not a correct float");
return parsed;
case 'float_time':
+ var factor = 1;
+ if (value[0] === '-') {
+ value = value.slice(1);
+ factor = -1;
+ }
var float_time_pair = value.split(":");
if (float_time_pair.length != 2)
- return openerp.web.parse_value(value, {type: "float"});
+ return factor * openerp.web.parse_value(value, {type: "float"});
var hours = openerp.web.parse_value(float_time_pair[0], {type: "integer"});
var minutes = openerp.web.parse_value(float_time_pair[1], {type: "integer"});
- return hours + (minutes / 60);
+ return factor * (hours + (minutes / 60));
case 'progressbar':
return openerp.web.parse_value(value, {type: "float"});
case 'datetime':
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 4010bab1f94..de7b1667871 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -310,7 +310,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
var self = this;
return this.on_change_mutex.exec(function() {
try {
+ var response = {}, can_process_onchange = $.Deferred();
processed = processed || [];
+ processed.push(widget.name);
var on_change = widget.node.attrs.on_change;
if (on_change) {
var change_spec = self.parse_on_change(on_change, widget);
@@ -319,18 +321,60 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
url: '/web/dataset/onchange',
async: false
};
- return self.rpc(ajax, {
+ can_process_onchange = self.rpc(ajax, {
model: self.dataset.model,
method: change_spec.method,
args: [(self.datarecord.id == null ? [] : [self.datarecord.id])].concat(change_spec.args),
context_id: change_spec.context_index == undefined ? null : change_spec.context_index + 1
- }).pipe(function(response) {
- return self.on_processed_onchange(response, processed);
+ }).then(function(r) {
+ _.extend(response, r);
});
} else {
console.warn("Wrong on_change format", on_change);
}
}
+ // fail if onchange failed
+ if (can_process_onchange.isRejected()) {
+ return can_process_onchange;
+ }
+
+ if (widget.field['change_default']) {
+ var fieldname = widget.name, 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_on_change_value();
+ }
+ var condition = fieldname + '=' + value;
+
+ if (value) {
+ can_process_onchange = self.rpc({
+ url: '/web/dataset/call',
+ async: false
+ }, {
+ model: 'ir.values',
+ method: 'get_defaults',
+ args: [self.model, condition]
+ }).then(function (results) {
+ if (!results.length) { return; }
+ 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];
+ }
+ });
+ }
+ }
+ if (can_process_onchange.isRejected()) {
+ return can_process_onchange;
+ }
+
+ return self.on_processed_onchange(response, processed);
} catch(e) {
console.error(e);
return $.Deferred().reject();
@@ -347,11 +391,10 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
// If field is not defined in the view, just ignore it
if (field) {
var value = result.value[f];
- processed.push(field.name);
if (field.get_value() != value) {
field.set_value(value);
field.dirty = true;
- if (_.indexOf(processed, field.name) < 0) {
+ if (!_.contains(processed, field.name)) {
this.do_onchange(field, processed);
}
}
@@ -689,13 +732,17 @@ openerp.web.form.compute_domain = function(expr, fields) {
stack.push(!top);
continue;
default:
- throw new Error('Unknown domain operator ' + ex);
+ throw new Error(_.str.sprintf(
+ _t("Unknown operator %s in domain %s"),
+ ex, JSON.stringify(expr)));
}
}
var field = fields[ex[0]];
if (!field) {
- throw new Error("Domain references unknown field : " + ex[0]);
+ throw new Error(_.str.sprintf(
+ _t("Unknown field %s in domain %s"),
+ ex[0], JSON.stringify(expr)));
}
var field_value = field.get_value ? fields[ex[0]].get_value() : fields[ex[0]].value;
var op = ex[1];
@@ -731,7 +778,9 @@ openerp.web.form.compute_domain = function(expr, fields) {
stack.push(!_(val).contains(field_value));
break;
default:
- console.warn("Unsupported operator in modifiers :", op);
+ console.warn(
+ _t("Unsupported operator %s in domain %s"),
+ op, JSON.stringify(expr));
}
}
return _.all(stack, _.identity);
@@ -1148,6 +1197,11 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({
this._super(view, node);
+ if (this.node.tag == 'label' && !this.string && this.node.children.length) {
+ this.string = this.node.children[0];
+ this.align = 'left';
+ }
+
if (this.node.tag == 'label' && (this.align === 'left' || this.node.attrs.colspan || (this.string && this.string.length > 32))) {
this.template = "WidgetParagraph";
this.colspan = parseInt(this.node.attrs.colspan || 1, 10);
@@ -1156,6 +1210,8 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({
if (isNaN(parseFloat(this.node.attrs.align))) {
this.align = 'left';
}
+
+ this.multilines = this.string && _.str.lines(this.string).length > 1;
} else {
this.colspan = 1;
this.width = '1%';
@@ -2174,7 +2230,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({
this.viewmanager = new openerp.web.ViewManager(this, this.dataset, views, {});
this.viewmanager.template = 'One2Many.viewmanager';
- this.viewmanager.registry = openerp.web.views.clone({
+ this.viewmanager.registry = openerp.web.views.extend({
list: 'openerp.web.form.One2ManyListView',
form: 'openerp.web.form.One2ManyFormView',
page: 'openerp.web.PageView'
@@ -2691,7 +2747,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope
contexts, groupbys);
self.initial_ids = undefined;
} else {
- self.do_search(domains.concat([self.domain]), contexts, groupbys);
+ self.do_search(domains.concat([self.domain]), contexts.concat(self.context), groupbys);
}
});
this.searchview.on_loaded.add_last(function () {
@@ -3048,10 +3104,19 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
on_file_uploaded_and_valid: function(size, name, content_type, file_base64) {
},
on_save_as: function() {
- var url = '/web/binary/saveas?session_id=' + this.session.session_id + '&model=' +
- this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name +
- '&filename_field=' + (this.node.attrs.filename || '') + '&t=' + (new Date().getTime());
- window.open(url);
+ $.blockUI();
+ this.session.get_file({
+ url: '/web/binary/saveas_ajax',
+ data: {data: JSON.stringify({
+ model: this.view.dataset.model,
+ id: (this.view.datarecord.id || ''),
+ field: this.name,
+ filename_field: (this.node.attrs.filename || ''),
+ context: this.view.dataset.get_context()
+ })},
+ complete: $.unblockUI,
+ error: openerp.webclient.crashmanager.on_rpc_error
+ });
},
on_clear: function() {
if (this.value !== false) {
diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js
index f9d307e811b..7fd4d20fba5 100644
--- a/addons/web/static/src/js/view_list.js
+++ b/addons/web/static/src/js/view_list.js
@@ -451,6 +451,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView#
*/
reload_content: function () {
var self = this;
+ self.$element.find('.all-record-selector').prop('checked', false);
this.records.reset();
var reloaded = $.Deferred();
this.$element.find('.oe-listview-content').append(
diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js
index 4f6a1531c7a..3eae086539b 100644
--- a/addons/web/static/src/js/view_list_editable.js
+++ b/addons/web/static/src/js/view_list_editable.js
@@ -386,7 +386,7 @@ openerp.web.list_editable = function (openerp) {
template: 'ListView.row.frame'
});
var form_widgets = openerp.web.form.widgets;
- openerp.web.list.form.widgets = form_widgets.clone({
+ openerp.web.list.form.widgets = form_widgets.extend({
'frame': 'openerp.web.list.form.WidgetFrame'
});
// All form widgets inherit a problematic behavior from
diff --git a/addons/web/static/src/js/view_page.js b/addons/web/static/src/js/view_page.js
index d5c37419764..8a8148f8cae 100644
--- a/addons/web/static/src/js/view_page.js
+++ b/addons/web/static/src/js/view_page.js
@@ -242,7 +242,7 @@ openerp.web.page = function (openerp) {
}
}
});
- openerp.web.page.readonly = openerp.web.form.widgets.clone({
+ openerp.web.page.readonly = openerp.web.form.widgets.extend({
'frame': 'openerp.web.page.WidgetFrameReadonly',
'char': 'openerp.web.page.FieldCharReadonly',
'id': 'openerp.web.page.FieldCharReadonly',
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 972656dfa17..4f935a2e42d 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -3,7 +3,7 @@
-->
<templates id="template" xml:space="preserve">
<t t-name="Notification">
- <div class="oe_notification">
+ <div class="oe_notification" t-translation="off">
<div id="oe_notification_default">
<a class="ui-notify-cross ui-notify-close" href="#">x</a>
<h1>#{title}</h1>
@@ -385,12 +385,12 @@
</t>
<t t-name="Menu.secondary">
<div t-attf-class="oe_toggle_secondary_menu">
- <span class="oe_menu_fold" title="Fold menu">&amp;laquo;</span>
- <span class="oe_menu_unfold" title="Unfold menu">&amp;raquo;</span>
+ <span class="oe_menu_fold" title="Fold menu"><t t-raw="'&amp;laquo;'"/></span>
+ <span class="oe_menu_unfold" title="Unfold menu"><t t-raw="'&amp;raquo;'"/></span>
</div>
<div t-foreach="widget.data.data.children" t-as="menu" style="display: none" class="oe_secondary_menu" t-att-data-menu-parent="menu.id">
<t t-foreach="menu.children" t-as="menu">
- <t t-set="classname">oe_secondary_menu_item</t>
+ <t t-set="classname" t-translation="off">oe_secondary_menu_item</t>
<t t-set="level" t-value="0"/>
<t t-call="Menu.secondary.children"/>
</t>
@@ -405,7 +405,7 @@
</a>
<div t-attf-class="oe_secondary_submenu" t-if="menu.children.length" t-att-style="menu_first and level == 1 ? undefined : 'display: none'">
<t t-foreach="menu.children" t-as="menu">
- <t t-set="classname">oe_secondary_submenu_item</t>
+ <t t-set="classname" t-translation="off">oe_secondary_submenu_item</t>
<t t-call="Menu.secondary.children"/>
</t>
</div>
@@ -422,7 +422,7 @@
<div class="oe_vm_switch">
<t t-if="views.length != 1" t-foreach="views" t-as="view">
- <button type="button" t-attf-class="oe_vm_switch_#{view.view_type}" t-att-data-view-type="view.view_type" t-att-title="view.view_type">
+ <button type="button" t-attf-class="oe_vm_switch_#{view.view_type}" t-att-data-view-type="view.view_type" t-att-title="view.label || view.view_type">
<span><t t-esc="view.label || view.view_type"/></span>
</button>
</t>
@@ -929,7 +929,7 @@
</ul>
</t>
<t t-name="WidgetParagraph">
- <p t-attf-class="oe_form_paragraph oe_align_#{widget.align}"><t t-esc="widget.string"/></p>
+ <p t-attf-class="oe_form_paragraph oe_align_#{widget.align} #{widget.multilines ? 'oe_multilines' : ''}"><t t-esc="widget.string"/></p>
</t>
<t t-name="FieldChar">
<input t-att-type="widget.password ? 'password' : 'text'" size="1"
@@ -1604,7 +1604,7 @@
<tr class="oe_export_row">
<t t-foreach="(field.id).split('/')" t-as="level" >
<t t-if="(field.id).split('/')[0] != level">
- <td width="18">&amp;nbsp;</td>
+ <td width="18" t-translation="off">&amp;nbsp;</td>
</t>
</t>
<td valign="top" align="left" style="cursor: pointer;" width="18">