diff --git a/addons/web/__init__.py b/addons/web/__init__.py index b09c8c213bc..36dead8ab74 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -1,7 +1,6 @@ import common import controllers import logging -import optparse _logger = logging.getLogger(__name__) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index 17ccfb63d8a..434edf5e3a7 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -328,6 +328,7 @@ def session_context(request, storage_path, session_cookie='sessionid'): # Remove all OpenERPSession instances with no uid, they're generated # either by login process or by HTTP requests without an OpenERP # session id, and are generally noise + removed_sessions = [] for key, value in request.session.items(): if (isinstance(value, session.OpenERPSession) and not value._uid @@ -335,6 +336,7 @@ def session_context(request, storage_path, session_cookie='sessionid'): and value._creation_time + (60*5) < time.time() # FIXME do not use a fixed value ): _logger.debug('remove session %s', key) + removed_sessions.append(key) del request.session[key] with session_lock: @@ -364,7 +366,7 @@ def session_context(request, storage_path, session_cookie='sessionid'): # add missing keys for k, v in in_store.iteritems(): - if k not in request.session: + if k not in request.session and k not in removed_sessions: request.session[k] = v session_store.save(request.session) diff --git a/addons/web/common/nonliterals.py b/addons/web/common/nonliterals.py index f6e81894a4c..0f5248edf33 100644 --- a/addons/web/common/nonliterals.py +++ b/addons/web/common/nonliterals.py @@ -8,7 +8,7 @@ import binascii import hashlib import simplejson.encoder -__all__ = ['Domain', 'Context', 'NonLiteralEncoder, non_literal_decoder', 'CompoundDomain', 'CompoundContext'] +__all__ = ['Domain', 'Context', 'NonLiteralEncoder', 'non_literal_decoder', 'CompoundDomain', 'CompoundContext'] #: 48 bits should be sufficient to have almost no chance of collision #: with a million hashes, according to hg@67081329d49a diff --git a/addons/web/common/xml2json.py b/addons/web/common/xml2json.py index 1f2e74691b9..df3aad67fa5 100644 --- a/addons/web/common/xml2json.py +++ b/addons/web/common/xml2json.py @@ -4,35 +4,23 @@ # # URL: http://code.google.com/p/xml2json-direct/ -class Xml2Json(object): - @staticmethod - def convert_to_json(s): - return simplejson.dumps( - Xml2Json.convert_to_structure(s), sort_keys=True, indent=4) - - @staticmethod - def convert_to_structure(s): - root = ElementTree.fromstring(s) - return Xml2Json.convert_element(root) - - @staticmethod - def convert_element(el, preserve_whitespaces=False): - res = {} - if el.tag[0] == "{": - ns, name = el.tag.rsplit("}", 1) - res["tag"] = name - res["namespace"] = ns[1:] - else: - res["tag"] = el.tag - res["attrs"] = {} - for k, v in el.items(): - res["attrs"][k] = v - kids = [] - if el.text and (preserve_whitespaces or el.text.strip() != ''): - kids.append(el.text) - for kid in el: - kids.append(Xml2Json.convert_element(kid, preserve_whitespaces)) - if kid.tail and (preserve_whitespaces or kid.tail.strip() != ''): - kids.append(kid.tail) - res["children"] = kids - return res +def from_elementtree(el, preserve_whitespaces=False): + res = {} + if el.tag[0] == "{": + ns, name = el.tag.rsplit("}", 1) + res["tag"] = name + res["namespace"] = ns[1:] + else: + res["tag"] = el.tag + res["attrs"] = {} + for k, v in el.items(): + res["attrs"][k] = v + kids = [] + if el.text and (preserve_whitespaces or el.text.strip() != ''): + kids.append(el.text) + for kid in el: + kids.append(from_elementtree(kid, preserve_whitespaces)) + if kid.tail and (preserve_whitespaces or kid.tail.strip() != ''): + kids.append(kid.tail) + res["children"] = kids + return res diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 3a23556794a..a514cafb6c8 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -99,7 +99,7 @@ html_template = """ }); - + """ @@ -207,7 +207,7 @@ class WebClient(openerpweb.Controller): 'js': js, 'css': css, 'modules': simplejson.dumps(self.server_wide_modules(req)), - 'init': 'new s.web.WebClient().replace($("body"));', + 'init': 'new s.web.WebClient().start();', } return r @@ -933,7 +933,7 @@ class View(openerpweb.Controller): xml = self.transform_view(arch, session, evaluation_context) else: xml = ElementTree.fromstring(arch) - fvg['arch'] = common.xml2json.Xml2Json.convert_element(xml, preserve_whitespaces) + fvg['arch'] = common.xml2json.from_elementtree(xml, preserve_whitespaces) for field in fvg['fields'].itervalues(): if field.get('views'): diff --git a/addons/web/po/pt_BR.po b/addons/web/po/pt_BR.po index 4be0c66826c..eb3e427a769 100644 --- a/addons/web/po/pt_BR.po +++ b/addons/web/po/pt_BR.po @@ -8,15 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-12-20 18:48+0100\n" -"PO-Revision-Date: 2012-01-15 02:47+0000\n" -"Last-Translator: Renato Lima - http://www.akretion.com " -"\n" +"PO-Revision-Date: 2012-01-16 13:38+0000\n" +"Last-Translator: Rafael Sales \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-01-16 05:27+0000\n" -"X-Generator: Launchpad (build 14664)\n" +"X-Launchpad-Export-Date: 2012-01-17 05:08+0000\n" +"X-Generator: Launchpad (build 14676)\n" #: addons/web/static/src/js/chrome.js:162 #: addons/web/static/src/js/chrome.js:175 @@ -626,7 +625,7 @@ msgstr "Visão de Depuração#" #: addons/web/static/src/xml/base.xml:0 msgid "- Fields View Get" -msgstr "" +msgstr "- Fields View Get" #: addons/web/static/src/xml/base.xml:0 msgid "- Edit" @@ -786,7 +785,7 @@ msgstr "Botão" #: addons/web/static/src/xml/base.xml:0 msgid "(no string)" -msgstr "" +msgstr "(sem string)" #: addons/web/static/src/xml/base.xml:0 msgid "Special:" @@ -875,6 +874,10 @@ msgid "" " You can export all data or only the fields that can be " "reimported after modification." msgstr "" +"Este assistente irá exportar todos os dados que corresponda aos critérios de " +"pesquisa atual em um arquivo CSV.\n" +" Você pode exportar todos os dados ou apenas os campos que podem " +"ser reimportados após a modificação." #: addons/web/static/src/xml/base.xml:0 msgid "Export Type:" @@ -945,6 +948,10 @@ msgid "" "Select a .CSV file to import. If you need a sample of file to import,\n" " you should use the export tool with the \"Import Compatible\" option." msgstr "" +"Selecionar um arquivo .CSV para importar. Se você precisar de uma amostra do " +"arquivo para importação,\n" +" você deve usar a ferramenta de exportação com a opção \"Importação " +"Compatível\"." #: addons/web/static/src/xml/base.xml:0 msgid "CSV File:" @@ -1039,6 +1046,13 @@ msgid "" "supply chain,\n" " project management, production, services, CRM, etc..." msgstr "" +"é um sistema de software livre de escala empresarial que é projetado para " +"aumentar\n" +" produtividade e lucro através da integração de dados. Ele se " +"conecta, melhora e\n" +" gerencia os processos de negócio em áreas como vendas, " +"finanças, supply chain,\n" +" gerenciamento de projetos, produção, serviços, CRM, etc .." #: addons/web/static/src/xml/base.xml:0 msgid "" @@ -1051,6 +1065,14 @@ msgid "" " production system and migration to a new version to be " "straightforward." msgstr "" +"É um sistema independente de plataforma, onde pode ser instalado em " +"ambientes Windows, Mac OS X,\n" +" e várias distribuições Linux ou baseadas em Unix. Sua " +"arquitetura permite que\n" +" novas funcionalidades sejam criadas rapidamente, e modificações " +"possam ser realizadas em um\n" +" sistema de produção e sua migração para uma nova versão de " +"forma simples." #: addons/web/static/src/xml/base.xml:0 msgid "" diff --git a/addons/web/static/lib/jquery.tipTip/jquery.tipTip.fme.patch b/addons/web/static/lib/jquery.tipTip/jquery.tipTip.fme.patch deleted file mode 100644 index 1a62870a6b0..00000000000 --- a/addons/web/static/lib/jquery.tipTip/jquery.tipTip.fme.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- jquery.tipTip_old.js 2011-12-01 14:15:35.000000000 +0100 -+++ jquery.tipTip.js 2011-12-07 12:32:32.000000000 +0100 -@@ -20,6 +20,9 @@ - */ - - (function($){ -+ $.tipTipClear = function() { -+ $("#tiptip_holder").remove(); -+ } - $.fn.tipTip = function(options) { - var defaults = { - activation: "hover", -@@ -31,7 +34,7 @@ - fadeIn: 200, - fadeOut: 200, - attribute: "title", -- content: false, // HTML or String to fill TipTIp with -+ content: false, // HTML String or function to fill TipTIp with - enter: function(){}, - exit: function(){} - }; -@@ -51,12 +54,7 @@ - - return this.each(function(){ - var org_elem = $(this); -- if(opts.content){ -- var org_title = opts.content; -- } else { -- var org_title = org_elem.attr(opts.attribute); -- } -- if(org_title != ""){ -+ if(opts.content || org_elem.attr(opts.attribute)){ - if(!opts.content){ - org_elem.removeAttr(opts.attribute); //remove original Attribute - } -@@ -99,6 +97,8 @@ - - function active_tiptip(){ - opts.enter.call(this); -+ var org_title = typeof opts.content === 'function' ? opts.content.call(org_elem, opts) : opts.content; -+ org_title = org_title || org_elem.attr(opts.attribute); - tiptip_content.html(org_title); - tiptip_holder.hide().removeAttr("class").css("margin","0"); - tiptip_arrow.removeAttr("style"); -@@ -177,7 +177,12 @@ - tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); - - if (timeout){ clearTimeout(timeout); } -- timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); -+ timeout = setTimeout(function() { -+ tiptip_holder.stop(true,true); -+ if ($.contains(document.documentElement, org_elem[0])) { -+ tiptip_holder.fadeIn(opts.fadeIn); -+ } -+ }, opts.delay); - } - - function deactive_tiptip(){ diff --git a/addons/web/static/lib/jquery.tipTip/jquery.tipTip.js b/addons/web/static/lib/jquery.tipTip/jquery.tipTip.js index 522df828003..ff8cc1b0ba6 100644 --- a/addons/web/static/lib/jquery.tipTip/jquery.tipTip.js +++ b/addons/web/static/lib/jquery.tipTip/jquery.tipTip.js @@ -1,196 +1,325 @@ - /* - * TipTip - * Copyright 2010 Drew Wilson - * www.drewwilson.com - * code.drewwilson.com/entry/tiptip-jquery-plugin - * - * Version 1.3 - Updated: Mar. 23, 2010 - * - * This Plug-In will create a custom tooltip to replace the default - * browser tooltip. It is extremely lightweight and very smart in - * that it detects the edges of the browser window and will make sure - * the tooltip stays within the current window size. As a result the - * tooltip will adjust itself to be displayed above, below, to the left - * or to the right depending on what is necessary to stay within the - * browser window. It is completely customizable as well via CSS. - * - * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ +/* +* TipTip +* Copyright 2010 Drew Wilson +* www.drewwilson.com +* code.drewwilson.com/entry/tiptip-jquery-plugin +* +* Version 1.3 - Updated: Mar. 23, 2010 +* +* This Plug-In will create a custom tooltip to replace the default +* browser tooltip. It is extremely lightweight and very smart in +* that it detects the edges of the browser window and will make sure +* the tooltip stays within the current window size. As a result the +* tooltip will adjust itself to be displayed above, below, to the left +* or to the right depending on what is necessary to stay within the +* browser window. It is completely customizable as well via CSS. +* +* This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: +* http://www.opensource.org/licenses/mit-license.php +* http://www.gnu.org/licenses/gpl.html +*/ -(function($){ - $.tipTipClear = function() { - $("#tiptip_holder").remove(); +(function ($) { + $.fn.tipTip = function (options) { + + var defaults = { + activation: 'hover', // How to show (and hide) the tooltip. Can be: hover, focus, click and manual. + keepAlive: false, // When true the tooltip won't disapper when the mouse moves away from the element. Instead it will be hidden when it leaves the tooltip. + maxWidth: '200px', // The max-width to set on the tooltip. You may also use the option cssClass to set this. + edgeOffset: 0, // The offset between the tooltip arrow edge and the element that has the tooltip. + defaultPosition: 'bottom', // The position of the tooltip. Can be: top, right, bottom and left. + delay: 400, // The delay in msec to show a tooltip. + fadeIn: 200, // The length in msec of the fade in. + fadeOut: 200, // The length in msec of the fade out. + attribute: 'title', // The attribute to fetch the tooltip text if the option content is false. + content: false, // HTML or String or Function (that returns HTML or String) to fill TipTIp with + enter: function () { }, // Callback function before a tooltip is shown. + afterEnter: function () { }, // Callback function after a tooltip is shown. + exit: function () { }, // Callback function before a tooltip is hidden. + afterExit: function () { }, // Callback function after a tooltip is hidden. + cssClass: '', // CSS class that will be applied on the tooltip before showing only for this instance of tooltip. + detectTextDir: true // When false auto-detection for right-to-left text will be disable (When true affects a bit the performance). + }; + + // Setup tip tip elements and render them to the DOM + if ($('#tiptip_holder').length <= 0) { + var tiptip_inner_arrow = $('
', { id: 'tiptip_arrow_inner' }), + tiptip_arrow = $('
', { id: 'tiptip_arrow' }).append(tiptip_inner_arrow), + tiptip_content = $('
', { id: 'tiptip_content' }), + tiptip_holder = $('
', { id: 'tiptip_holder' }).append(tiptip_arrow).append(tiptip_content); + $('body').append(tiptip_holder); + } else { + var tiptip_holder = $('#tiptip_holder'), + tiptip_content = $('#tiptip_content'), + tiptip_arrow = $('#tiptip_arrow'); + } + + return this.each(function () { + var org_elem = $(this), + data = org_elem.data('tipTip'), + opts = data && data.options || $.extend({}, defaults, options), + callback_data = { + holder: tiptip_holder, + content: tiptip_content, + arrow: tiptip_arrow, + options: opts + }; + + if (data) { + switch (options) { + case 'show': + activate(); + break; + case 'hide': + deactivate(); + break; + case 'destroy': + org_elem.unbind('.tipTip').removeData('tipTip'); + break; + case 'position': + position_tiptip(); + } + } else { + var timeout = false; + + org_elem.data('tipTip', { options: opts }); + + if (opts.activation == 'hover') { + org_elem.bind('mouseenter.tipTip', function () { + activate(); + }).bind('mouseleave.tipTip', function () { + if (!opts.keepAlive) { + deactivate(); + } else { + tiptip_holder.one('mouseleave.tipTip', function () { + deactivate(); + }); + } + }); + } else if (opts.activation == 'focus') { + org_elem.bind('focus.tipTip', function () { + activate(); + }).bind('blur.tipTip', function () { + deactivate(); + }); + } else if (opts.activation == 'click') { + org_elem.bind('click.tipTip', function (e) { + e.preventDefault(); + activate(); + return false; + }).bind('mouseleave.tipTip', function () { + if (!opts.keepAlive) { + deactivate(); + } else { + tiptip_holder.one('mouseleave.tipTip', function () { + deactivate(); + }); + } + }); + } else if (opts.activation == 'manual') { + // Nothing to register actually. We decide when to show or hide. + } + } + + function activate() { + if (opts.enter.call(org_elem, callback_data) === false) { + return; + } + + // Get the text and append it in the tiptip_content. + var org_title; + if (opts.content) { + org_title = $.isFunction(opts.content) ? opts.content.call(org_elem, callback_data) : opts.content; + } else { + org_title = opts.content = org_elem.attr(opts.attribute); + org_elem.removeAttr(opts.attribute); //remove original Attribute + } + if (!org_title) { + return; // don't show tip when no content. + } + + tiptip_content.html(org_title); + tiptip_holder.hide().removeAttr('class').css({ 'max-width': opts.maxWidth }); + if (opts.cssClass) { + tiptip_holder.addClass(opts.cssClass); + } + + // Calculate the position of the tooltip. + position_tiptip(); + + // Show the tooltip. + if (timeout) { + clearTimeout(timeout); + } + + timeout = setTimeout(function () { + tiptip_holder.stop(true, true).fadeIn(opts.fadeIn); + }, opts.delay); + + $(window).bind('resize.tipTip scroll.tipTip', position_tiptip); + + // Ensure clicking on anything makes tipTip deactivate + $(document).unbind("click.tipTip dblclick.tipTip").bind("click.tiptip dblclick.tiptip", deactivate); + + + org_elem.addClass('tiptip_visible'); // Add marker class to easily find the target element with visible tooltip. It will be remove later on deactivate(). + + opts.afterEnter.call(org_elem, callback_data); + } + + function deactivate() { + if (opts.exit.call(org_elem, callback_data) === false) { + return; + } + + if (timeout) { + clearTimeout(timeout); + } + + tiptip_holder.fadeOut(opts.fadeOut); + + $(window).unbind('resize.tipTip scroll.tipTip'); + $(document).unbind("click.tipTip").unbind("dblclick.tipTip"); + + org_elem.removeClass('tiptip_visible'); + + opts.afterExit.call(org_elem, callback_data); + } + + function position_tiptip() { + var org_offset = org_elem.offset(), + org_top = org_offset.top, + org_left = org_offset.left, + org_width = org_elem.outerWidth(), + org_height = org_elem.outerHeight(), + tip_top, + tip_left, + tip_width = tiptip_holder.outerWidth(), + tip_height = tiptip_holder.outerHeight(), + tip_class, + tip_classes = { top: 'tip_top', bottom: 'tip_bottom', left: 'tip_left', right: 'tip_right' }, + arrow_top, + arrow_left, + arrow_width = 12, // tiptip_arrow.outerHeight() and tiptip_arrow.outerWidth() don't work because they need the element to be visible. + arrow_height = 12, + win = $(window), + win_top = win.scrollTop(), + win_left = win.scrollLeft(), + win_width = win.width(), + win_height = win.height(), + is_rtl = opts.detectTextDir && isRtlText(tiptip_content.text()); + + function moveTop() { + tip_class = tip_classes.top; + tip_top = org_top - tip_height - opts.edgeOffset - (arrow_height / 2); + tip_left = org_left + ((org_width - tip_width) / 2); + } + + function moveBottom() { + tip_class = tip_classes.bottom; + tip_top = org_top + org_height + opts.edgeOffset + (arrow_height / 2); + tip_left = org_left + ((org_width - tip_width) / 2); + } + + function moveLeft() { + tip_class = tip_classes.left; + tip_top = org_top + ((org_height - tip_height) / 2); + tip_left = org_left - tip_width - opts.edgeOffset - (arrow_width / 2); + } + + function moveRight() { + tip_class = tip_classes.right; + tip_top = org_top + ((org_height - tip_height) / 2); + tip_left = org_left + org_width + opts.edgeOffset + (arrow_width / 2); + } + + // Calculate the position of the tooltip. + if (opts.defaultPosition == 'bottom') { + moveBottom(); + } else if (opts.defaultPosition == 'top') { + moveTop(); + } else if (opts.defaultPosition == 'left' && !is_rtl) { + moveLeft(); + } else if (opts.defaultPosition == 'left' && is_rtl) { + moveRight(); + } else if (opts.defaultPosition == 'right' && !is_rtl) { + moveRight(); + } else if (opts.defaultPosition == 'right' && is_rtl) { + moveLeft(); + } else { + moveBottom(); + } + + // Flip the tooltip if off the window's viewport. (left <-> right and top <-> bottom). + if (tip_class == tip_classes.left && !is_rtl && tip_left < win_left) { + moveRight(); + } else if (tip_class == tip_classes.left && is_rtl && tip_left - tip_width < win_left) { + moveRight(); + } else if (tip_class == tip_classes.right && !is_rtl && tip_left > win_left + win_width) { + moveLeft(); + } else if (tip_class == tip_classes.right && is_rtl && tip_left + tip_width > win_left + win_width) { + moveLeft(); + } else if (tip_class == tip_classes.top && tip_top < win_top) { + moveBottom(); + } else if (tip_class == tip_classes.bottom && tip_top > win_top + win_height) { + moveTop(); + } + + // Fix the vertical position if the tooltip is off the top or bottom sides of the window's viewport. + if (tip_class == tip_classes.left || tip_class == tip_classes.right) { // If positioned left or right check if the tooltip is off the top or bottom window's viewport. + if (tip_top + tip_height > win_height + win_top) { // If the bottom edge of the tooltip is off the bottom side of the window's viewport. + tip_top = org_top + org_height > win_height + win_top ? org_top + org_height - tip_height : win_height + win_top - tip_height; // Make 'bottom edge of the tooltip' == 'bottom side of the window's viewport'. + } else if (tip_top < win_top) { // If the top edge of the tooltip if off the top side of the window's viewport. + tip_top = org_top < win_top ? org_top : win_top; // Make 'top edge of the tooltip' == 'top side of the window's viewport'. + } + } + + // Fix the horizontal position if the tooltip is off the right or left sides of the window's viewport. + if (tip_class == tip_classes.top || tip_class == tip_classes.bottom) { + if (tip_left + tip_width > win_width + win_left) { // If the right edge of the tooltip is off the right side of the window's viewport. + tip_left = org_left + org_width > win_width + win_left ? org_left + org_width - tip_width : win_width + win_left - tip_width; // Make 'right edge of the tooltip' == 'right side of the window's viewport'. + } else if (tip_left < win_left) { // If the left edge of the tooltip if off the left side of the window's viewport. + tip_left = org_left < win_left ? org_left : win_left; // Make 'left edge of the tooltip' == 'left side of the window's viewport'. + } + } + + // Apply the new position. + tiptip_holder + .css({ left: Math.round(tip_left), top: Math.round(tip_top) }) + .removeClass(tip_classes.top) + .removeClass(tip_classes.bottom) + .removeClass(tip_classes.left) + .removeClass(tip_classes.right) + .addClass(tip_class); + + // Position the arrow + if (tip_class == tip_classes.top) { + arrow_top = tip_height; // Position the arrow vertically on the top of the tooltip. + arrow_left = org_left - tip_left + ((org_width - arrow_width) / 2); // Center the arrow horizontally on the center of the target element. + } else if (tip_class == tip_classes.bottom) { + arrow_top = -arrow_height; // Position the arrow vertically on the bottom of the tooltip. + arrow_left = org_left - tip_left + ((org_width - arrow_width) / 2); // Center the arrow horizontally on the center of the target element. + } else if (tip_class == tip_classes.left) { + arrow_top = org_top - tip_top + ((org_height - arrow_height) / 2); // Center the arrow vertically on the center of the target element. + arrow_left = tip_width; // Position the arrow vertically on the left of the tooltip. + } else if (tip_class == tip_classes.right) { + arrow_top = org_top - tip_top + ((org_height - arrow_height) / 2); // Center the arrow vertically on the center of the target element. + arrow_left = -arrow_width; // Position the arrow vertically on the right of the tooltip. + } + + tiptip_arrow + .css({ left: Math.round(arrow_left), top: Math.round(arrow_top) }); + } + }); } - $.fn.tipTip = function(options) { - var defaults = { - activation: "hover", - keepAlive: false, - maxWidth: "200px", - edgeOffset: 3, - defaultPosition: "bottom", - delay: 400, - fadeIn: 200, - fadeOut: 200, - attribute: "title", - content: false, // HTML String or function to fill TipTIp with - enter: function(){}, - exit: function(){} - }; - var opts = $.extend(defaults, options); - - // Setup tip tip elements and render them to the DOM - if($("#tiptip_holder").length <= 0){ - var tiptip_holder = $('
'); - var tiptip_content = $('
'); - var tiptip_arrow = $('
'); - $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
'))); - } else { - var tiptip_holder = $("#tiptip_holder"); - var tiptip_content = $("#tiptip_content"); - var tiptip_arrow = $("#tiptip_arrow"); - } - - return this.each(function(){ - var org_elem = $(this); - if(opts.content || org_elem.attr(opts.attribute)){ - if(!opts.content){ - org_elem.removeAttr(opts.attribute); //remove original Attribute - } - var timeout = false; - - if(opts.activation == "hover"){ - org_elem.hover(function(){ - active_tiptip(); - }, function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } else if(opts.activation == "focus"){ - org_elem.focus(function(){ - active_tiptip(); - }).blur(function(){ - deactive_tiptip(); - }); - } else if(opts.activation == "click"){ - org_elem.click(function(){ - active_tiptip(); - return false; - }).hover(function(){},function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } - - function active_tiptip(){ - opts.enter.call(this); - var org_title = typeof opts.content === 'function' ? opts.content.call(org_elem, opts) : opts.content; - org_title = org_title || org_elem.attr(opts.attribute); - tiptip_content.html(org_title); - tiptip_holder.hide().removeAttr("class").css("margin","0"); - tiptip_arrow.removeAttr("style"); - - var top = parseInt(org_elem.offset()['top']); - var left = parseInt(org_elem.offset()['left']); - var org_width = parseInt(org_elem.outerWidth()); - var org_height = parseInt(org_elem.outerHeight()); - var tip_w = tiptip_holder.outerWidth(); - var tip_h = tiptip_holder.outerHeight(); - var w_compare = Math.round((org_width - tip_w) / 2); - var h_compare = Math.round((org_height - tip_h) / 2); - var marg_left = Math.round(left + w_compare); - var marg_top = Math.round(top + org_height + opts.edgeOffset); - var t_class = ""; - var arrow_top = ""; - var arrow_left = Math.round(tip_w - 12) / 2; - if(opts.defaultPosition == "bottom"){ - t_class = "_bottom"; - } else if(opts.defaultPosition == "top"){ - t_class = "_top"; - } else if(opts.defaultPosition == "left"){ - t_class = "_left"; - } else if(opts.defaultPosition == "right"){ - t_class = "_right"; - } - - var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); - var left_compare = (tip_w + left) > parseInt($(window).width()); - - if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ - t_class = "_right"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = -12; - marg_left = Math.round(left + org_width + opts.edgeOffset); - marg_top = Math.round(top + h_compare); - } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ - t_class = "_left"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = Math.round(tip_w); - marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); - marg_top = Math.round(top + h_compare); - } + var ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF', + rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC', + rtlDirCheckRe = new RegExp('^[^' + ltrChars + ']*[' + rtlChars + ']'); + + function isRtlText(text) { + return rtlDirCheckRe.test(text); + }; + +})(jQuery); - var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); - var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; - - if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_top"; - } else { - t_class = t_class+"_top"; - } - arrow_top = tip_h; - marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); - } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_bottom"; - } else { - t_class = t_class+"_bottom"; - } - arrow_top = -12; - marg_top = Math.round(top + org_height + opts.edgeOffset); - } - - if(t_class == "_right_top" || t_class == "_left_top"){ - marg_top = marg_top + 5; - } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ - marg_top = marg_top - 5; - } - if(t_class == "_left_top" || t_class == "_left_bottom"){ - marg_left = marg_left + 5; - } - tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); - tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); - - if (timeout){ clearTimeout(timeout); } - timeout = setTimeout(function() { - tiptip_holder.stop(true,true); - if ($.contains(document.documentElement, org_elem[0])) { - tiptip_holder.fadeIn(opts.fadeIn); - } - }, opts.delay); - } - - function deactive_tiptip(){ - opts.exit.call(this); - if (timeout){ clearTimeout(timeout); } - tiptip_holder.fadeOut(opts.fadeOut); - } - } - }); - } -})(jQuery); diff --git a/addons/web/static/lib/jquery.tipTip/jquery.tipTip_old.js b/addons/web/static/lib/jquery.tipTip/jquery.tipTip_old.js deleted file mode 100644 index d2b460d1261..00000000000 --- a/addons/web/static/lib/jquery.tipTip/jquery.tipTip_old.js +++ /dev/null @@ -1,191 +0,0 @@ - /* - * TipTip - * Copyright 2010 Drew Wilson - * www.drewwilson.com - * code.drewwilson.com/entry/tiptip-jquery-plugin - * - * Version 1.3 - Updated: Mar. 23, 2010 - * - * This Plug-In will create a custom tooltip to replace the default - * browser tooltip. It is extremely lightweight and very smart in - * that it detects the edges of the browser window and will make sure - * the tooltip stays within the current window size. As a result the - * tooltip will adjust itself to be displayed above, below, to the left - * or to the right depending on what is necessary to stay within the - * browser window. It is completely customizable as well via CSS. - * - * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -(function($){ - $.fn.tipTip = function(options) { - var defaults = { - activation: "hover", - keepAlive: false, - maxWidth: "200px", - edgeOffset: 3, - defaultPosition: "bottom", - delay: 400, - fadeIn: 200, - fadeOut: 200, - attribute: "title", - content: false, // HTML or String to fill TipTIp with - enter: function(){}, - exit: function(){} - }; - var opts = $.extend(defaults, options); - - // Setup tip tip elements and render them to the DOM - if($("#tiptip_holder").length <= 0){ - var tiptip_holder = $('
'); - var tiptip_content = $('
'); - var tiptip_arrow = $('
'); - $("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('
'))); - } else { - var tiptip_holder = $("#tiptip_holder"); - var tiptip_content = $("#tiptip_content"); - var tiptip_arrow = $("#tiptip_arrow"); - } - - return this.each(function(){ - var org_elem = $(this); - if(opts.content){ - var org_title = opts.content; - } else { - var org_title = org_elem.attr(opts.attribute); - } - if(org_title != ""){ - if(!opts.content){ - org_elem.removeAttr(opts.attribute); //remove original Attribute - } - var timeout = false; - - if(opts.activation == "hover"){ - org_elem.hover(function(){ - active_tiptip(); - }, function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } else if(opts.activation == "focus"){ - org_elem.focus(function(){ - active_tiptip(); - }).blur(function(){ - deactive_tiptip(); - }); - } else if(opts.activation == "click"){ - org_elem.click(function(){ - active_tiptip(); - return false; - }).hover(function(){},function(){ - if(!opts.keepAlive){ - deactive_tiptip(); - } - }); - if(opts.keepAlive){ - tiptip_holder.hover(function(){}, function(){ - deactive_tiptip(); - }); - } - } - - function active_tiptip(){ - opts.enter.call(this); - tiptip_content.html(org_title); - tiptip_holder.hide().removeAttr("class").css("margin","0"); - tiptip_arrow.removeAttr("style"); - - var top = parseInt(org_elem.offset()['top']); - var left = parseInt(org_elem.offset()['left']); - var org_width = parseInt(org_elem.outerWidth()); - var org_height = parseInt(org_elem.outerHeight()); - var tip_w = tiptip_holder.outerWidth(); - var tip_h = tiptip_holder.outerHeight(); - var w_compare = Math.round((org_width - tip_w) / 2); - var h_compare = Math.round((org_height - tip_h) / 2); - var marg_left = Math.round(left + w_compare); - var marg_top = Math.round(top + org_height + opts.edgeOffset); - var t_class = ""; - var arrow_top = ""; - var arrow_left = Math.round(tip_w - 12) / 2; - - if(opts.defaultPosition == "bottom"){ - t_class = "_bottom"; - } else if(opts.defaultPosition == "top"){ - t_class = "_top"; - } else if(opts.defaultPosition == "left"){ - t_class = "_left"; - } else if(opts.defaultPosition == "right"){ - t_class = "_right"; - } - - var right_compare = (w_compare + left) < parseInt($(window).scrollLeft()); - var left_compare = (tip_w + left) > parseInt($(window).width()); - - if((right_compare && w_compare < 0) || (t_class == "_right" && !left_compare) || (t_class == "_left" && left < (tip_w + opts.edgeOffset + 5))){ - t_class = "_right"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = -12; - marg_left = Math.round(left + org_width + opts.edgeOffset); - marg_top = Math.round(top + h_compare); - } else if((left_compare && w_compare < 0) || (t_class == "_left" && !right_compare)){ - t_class = "_left"; - arrow_top = Math.round(tip_h - 13) / 2; - arrow_left = Math.round(tip_w); - marg_left = Math.round(left - (tip_w + opts.edgeOffset + 5)); - marg_top = Math.round(top + h_compare); - } - - var top_compare = (top + org_height + opts.edgeOffset + tip_h + 8) > parseInt($(window).height() + $(window).scrollTop()); - var bottom_compare = ((top + org_height) - (opts.edgeOffset + tip_h + 8)) < 0; - - if(top_compare || (t_class == "_bottom" && top_compare) || (t_class == "_top" && !bottom_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_top"; - } else { - t_class = t_class+"_top"; - } - arrow_top = tip_h; - marg_top = Math.round(top - (tip_h + 5 + opts.edgeOffset)); - } else if(bottom_compare | (t_class == "_top" && bottom_compare) || (t_class == "_bottom" && !top_compare)){ - if(t_class == "_top" || t_class == "_bottom"){ - t_class = "_bottom"; - } else { - t_class = t_class+"_bottom"; - } - arrow_top = -12; - marg_top = Math.round(top + org_height + opts.edgeOffset); - } - - if(t_class == "_right_top" || t_class == "_left_top"){ - marg_top = marg_top + 5; - } else if(t_class == "_right_bottom" || t_class == "_left_bottom"){ - marg_top = marg_top - 5; - } - if(t_class == "_left_top" || t_class == "_left_bottom"){ - marg_left = marg_left + 5; - } - tiptip_arrow.css({"margin-left": arrow_left+"px", "margin-top": arrow_top+"px"}); - tiptip_holder.css({"margin-left": marg_left+"px", "margin-top": marg_top+"px"}).attr("class","tip"+t_class); - - if (timeout){ clearTimeout(timeout); } - timeout = setTimeout(function(){ tiptip_holder.stop(true,true).fadeIn(opts.fadeIn); }, opts.delay); - } - - function deactive_tiptip(){ - opts.exit.call(this); - if (timeout){ clearTimeout(timeout); } - tiptip_holder.fadeOut(opts.fadeOut); - } - } - }); - } -})(jQuery); diff --git a/addons/web/static/lib/jquery.tipTip/tipTip.css b/addons/web/static/lib/jquery.tipTip/tipTip.css index 4fb95d37691..dc41b650615 100644 --- a/addons/web/static/lib/jquery.tipTip/tipTip.css +++ b/addons/web/static/lib/jquery.tipTip/tipTip.css @@ -13,15 +13,15 @@ } #tiptip_holder.tip_bottom { - padding-top: 5px; + padding-bottom: 5px; } #tiptip_holder.tip_right { - padding-left: 5px; + padding-right: 5px; } #tiptip_holder.tip_left { - padding-right: 5px; + padding-left: 5px; } #tiptip_content { @@ -110,4 +110,25 @@ #tiptip_holder.tip_top #tiptip_arrow_inner { border-top-color: rgba(20,20,20,0.92); } +} + +/* Alternative theme for TipTip */ +#tiptip_holder.alt.tip_top #tiptip_arrow_inner { + border-top-color: #444444; +} + +#tiptip_holder.alt.tip_bottom #tiptip_arrow_inner { + border-bottom-color: #444444; +} + +#tiptip_holder.alt.tip_right #tiptip_arrow_inner { + border-right-color: #444444; +} + +#tiptip_holder.alt.tip_left #tiptip_arrow_inner { + border-left-color: #444444; +} + +#tiptip_holder.alt #tiptip_content { + background-color: #444444; border: 1px solid White; border-radius: 3px; box-shadow: 0 0 3px #555555; color: #FFFFFF; font-size: 11px; padding: 4px 8px; text-shadow: 0 0 1px Black; } \ No newline at end of file diff --git a/addons/web/static/lib/qweb/qweb-benchmark.html b/addons/web/static/lib/qweb/qweb-benchmark.html index 0cc67e7e54f..4f7fb56ac1f 100644 --- a/addons/web/static/lib/qweb/qweb-benchmark.html +++ b/addons/web/static/lib/qweb/qweb-benchmark.html @@ -5,11 +5,25 @@