diff options
| author | Jiten (OpenERP) <jra@tinyerp.com> | 2012-02-09 11:32:16 +0530 |
|---|---|---|
| committer | Jiten (OpenERP) <jra@tinyerp.com> | 2012-02-09 11:32:16 +0530 |
| commit | f5e2fe1ff02f37088bce73b39fdf7328e568aa1a (patch) | |
| tree | afdf585c2ed8600b314637f89e7a6bc0bbdd6823 /addons/web/static/src | |
| parent | a9aaad2257ae9b61729757007ef59db41f8521f4 (diff) | |
| parent | 98bd34a2eb74d5226279795014c178c08aec4ee6 (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.css | 15 | ||||
| -rw-r--r-- | addons/web/static/src/js/chrome.js | 25 | ||||
| -rw-r--r-- | addons/web/static/src/js/core.js | 94 | ||||
| -rw-r--r-- | addons/web/static/src/js/data.js | 70 | ||||
| -rw-r--r-- | addons/web/static/src/js/formats.js | 16 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 93 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 1 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list_editable.js | 2 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_page.js | 2 | ||||
| -rw-r--r-- | addons/web/static/src/xml/base.xml | 16 |
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">&laquo;</span> - <span class="oe_menu_unfold" title="Unfold menu">&raquo;</span> + <span class="oe_menu_fold" title="Fold menu"><t t-raw="'&laquo;'"/></span> + <span class="oe_menu_unfold" title="Unfold menu"><t t-raw="'&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">&nbsp;</td> + <td width="18" t-translation="off">&nbsp;</td> </t> </t> <td valign="top" align="left" style="cursor: pointer;" width="18"> |
