Thibault Delavallée (OpenERP) has proposed merging 
lp:~openerp-dev/openerp-web/trunk-forward-7.0-tde into lp:openerp-web.

Requested reviews:
  OpenERP R&D Web Team (openerp-dev-web)

For more details, see:
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-forward-7.0-tde/+merge/142682

[MERGE] Forward porting of the 7.0 web branch inside trunk until rev 3697.
-- 
https://code.launchpad.net/~openerp-dev/openerp-web/trunk-forward-7.0-tde/+merge/142682
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openerp-web/trunk-forward-7.0-tde.
=== modified file 'addons/web/controllers/main.py'
--- addons/web/controllers/main.py	2012-12-19 15:45:05 +0000
+++ addons/web/controllers/main.py	2013-01-10 13:11:45 +0000
@@ -668,7 +668,7 @@
         messages = ir_translation.search_read([('module','in',mods),('lang','=',lang),
                                                ('comments','like','openerp-web'),('value','!=',False),
                                                ('value','!=','')],
-                                              ['module','src','value','lang'], order='module') 
+                                              ['module','src','value','lang'], order='module')
         for mod, msg_group in itertools.groupby(messages, key=operator.itemgetter('module')):
             translations_per_module.setdefault(mod,{'messages':[]})
             translations_per_module[mod]['messages'].extend({'id': m['src'],
@@ -797,9 +797,9 @@
         return {
             "session_id": req.session_id,
             "uid": req.session._uid,
-            "context": req.session.get_context() if req.session._uid else {},
+            "user_context": req.session.get_context() if req.session._uid else {},
             "db": req.session._db,
-            "login": req.session._login,
+            "username": req.session._login,
         }
 
     @openerpweb.jsonrequest
@@ -1072,7 +1072,7 @@
     @openerpweb.jsonrequest
     def call(self, req, model, method, args, domain_id=None, context_id=None):
         return self._call_kw(req, model, method, args, {})
-    
+
     @openerpweb.jsonrequest
     def call_kw(self, req, model, method, args, kwargs):
         return self._call_kw(req, model, method, args, kwargs)
@@ -1186,7 +1186,7 @@
                     if width > 500: width = 500
                     if height > 500: height = 500
                     image_base64 = openerp.tools.image_resize_image(base64_source=image_base64, size=(width, height), encoding='base64', filetype='PNG')
-            
+
             image_data = base64.b64decode(image_base64)
 
         except (TypeError, xmlrpclib.Fault):
@@ -1468,7 +1468,7 @@
         fields = self.fields_get(req, model)
         if ".id" in export_fields:
             fields['.id'] = fields.pop('id', {'string': 'ID'})
-            
+
         # To make fields retrieval more efficient, fetch all sub-fields of a
         # given field at the same time. Because the order in the export list is
         # arbitrary, this requires ordering all sub-fields of a given field

=== modified file 'addons/web/session.py'
--- addons/web/session.py	2012-12-17 10:01:27 +0000
+++ addons/web/session.py	2013-01-10 13:11:45 +0000
@@ -18,11 +18,14 @@
 class AuthenticationError(Exception):
     pass
 
+class SessionExpiredException(Exception):
+    pass
+
 class Service(object):
     def __init__(self, session, service_name):
         self.session = session
         self.service_name = service_name
-        
+
     def __getattr__(self, method):
         def proxy_method(*args):
             result = self.session.send(self.service_name, method, *args)
@@ -60,7 +63,7 @@
     in a web session.
 
     .. attribute:: context
-    
+
         The session context, a ``dict``. Can be reloaded by calling
         :meth:`openerpweb.openerpweb.OpenERPSession.get_context`
 
@@ -80,7 +83,7 @@
         self._suicide = False
         self.context = {}
         self.jsonp_requests = {}     # FIXME use a LRU
-        
+
     def send(self, service_name, method, *args):
         code_string = "warning -- %s\n\n%s"
         try:
@@ -112,7 +115,7 @@
     def authenticate(self, db, login, password, env=None):
         uid = self.proxy('common').authenticate(db, login, password, env)
         self.bind(db, uid, login, password)
-        
+
         if uid: self.get_context()
         return uid
 
@@ -152,6 +155,8 @@
         :type model: str
         :rtype: a model object
         """
+        if self._db == False:
+            raise SessionExpiredException("Session expired")
 
         return Model(self, model)
 

=== modified file 'addons/web/static/lib/cleditor/jquery.cleditor.js'
--- addons/web/static/lib/cleditor/jquery.cleditor.js	2012-10-29 14:35:27 +0000
+++ addons/web/static/lib/cleditor/jquery.cleditor.js	2013-01-10 13:11:45 +0000
@@ -52,7 +52,7 @@
       docCSSFile:   // CSS file used to style the document contained within the editor
                     "", 
       bodyStyle:    // style to assign to document body contained within the editor
-                    "margin:4px; font:10pt Arial,Verdana; cursor:text"
+                    "margin:4px; color:#4c4c4c; font-size:13px; font-family:\"Lucida Grande\",Helvetica,Verdana,Arial,sans-serif; cursor:text"
     },
 
     // Define all usable toolbar buttons - the init string property is 
@@ -894,7 +894,7 @@
 
       var $toolbar = editor.$toolbar,
           $group = $toolbar.children("div:last"),
-          wid = $main.width();
+          wid = /%/.test("" + options.width) ? options.width : $main.width();
 
       // Resize the toolbar
       var hgt = $group.offset().top + $group.outerHeight() - $toolbar.offset().top + 1;

=== modified file 'addons/web/static/lib/py.js/lib/py.js'
--- addons/web/static/lib/py.js/lib/py.js	2012-12-03 12:23:12 +0000
+++ addons/web/static/lib/py.js/lib/py.js	2013-01-10 13:11:45 +0000
@@ -521,7 +521,7 @@
         }
     };
     py.PY_getAttr = function (o, attr_name) {
-        return PY_ensurepy(o.__getattribute__(attr_name));
+        return PY_ensurepy(o.__getattribute__(attr_name),attr_name);
     };
     py.PY_str = function (o) {
         var v = o.__str__();
@@ -998,7 +998,7 @@
             }
             var t = py.PY_call(py.tuple);
             for(var i=0; i<ar.length; ++i) {
-                t._values.push(PY_ensurepy(ar[i]));
+                t._values.push(PY_ensurepy(ar[i],i));
             }
             return t;
         }
@@ -1032,7 +1032,7 @@
                 if (!d.hasOwnProperty(k)) { continue; }
                 instance.__setitem__(
                     py.str.fromJSON(k),
-                    PY_ensurepy(d[k]));
+                    PY_ensurepy(d[k],k));
             }
             return instance;
         },

=== modified file 'addons/web/static/src/css/base.css'
--- addons/web/static/src/css/base.css	2012-12-20 18:37:56 +0000
+++ addons/web/static/src/css/base.css	2013-01-10 13:11:45 +0000
@@ -1,4 +1,4 @@
-@charset "utf-8";
+@charset "UTF-8";
 @font-face {
   font-family: "mnmliconsRegular";
   src: url("/web/static/src/font/mnmliconsv21-webfont.eot") format("eot");
@@ -30,7 +30,7 @@
   text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
   /* http://www.quirksmode.org/dom/inputfile.html
    * http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image
-   */ */
+   */
 }
 .openerp.openerp_webclient_container {
   height: 100%;
@@ -81,7 +81,7 @@
 }
 .openerp .zebra tbody tr:nth-child(odd) td {
   background-color: #f0f0fa;
-  background-color: #f0f0fa;
+  background-color: #efeff8;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
   background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
   background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
@@ -90,7 +90,7 @@
   background-image: linear-gradient(to bottom, #f0f0fa, #eeeef6);
 }
 .openerp .zebra tbody tr:hover td {
-  background-color: #eeeeee;
+  background-color: #e6e6e6;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#dedede));
   background-image: -webkit-linear-gradient(top, #eeeeee, #dedede);
   background-image: -moz-linear-gradient(top, #eeeeee, #dedede);
@@ -120,7 +120,7 @@
   padding: 3px 12px;
   font-size: 13px;
   text-align: center;
-  background-color: #efefef;
+  background-color: #e3e3e3;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
   background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
   background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
@@ -138,7 +138,7 @@
   outline: none;
 }
 .openerp a.button:hover, .openerp button:hover, .openerp input[type='submit']:hover, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-hover {
-  background-color: #f6f6f6;
+  background-color: #ececec;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
   background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
   background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
@@ -151,7 +151,7 @@
 .openerp a.button:focus, .openerp button:focus, .openerp input[type='submit']:focus, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-focus {
   border: 1px solid #80bfff;
   background-position: 0;
-  background-color: #f6f6f6;
+  background-color: #ececec;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
   background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
   background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
@@ -163,7 +163,7 @@
   box-shadow: 0 0 3px #80bfff, 0 1px 1px rgba(255, 255, 255, 0.8) inset;
 }
 .openerp a.button:active, .openerp a.button.active, .openerp button:active, .openerp button.active, .openerp input[type='submit']:active, .openerp input[type='submit'].active, .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button.ui-state-active {
-  background-color: #e3e3e3;
+  background-color: #ececec;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
   background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
   background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
@@ -224,7 +224,7 @@
   -moz-border-radius: 2px 2px 0 0;
   -webkit-border-radius: 2px 2px 0 0;
   border-radius: 2px 2px 0 0;
-  background-color: #fcfcfc;
+  background-color: #ededed;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
   background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
   background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
@@ -307,7 +307,7 @@
   right: 0;
   bottom: 0;
   text-shadow: 0 1px 1px #999999;
-  background-color: #b41616;
+  background-color: #8a0e0e;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
   background-image: -webkit-linear-gradient(top, #b41616, #600606);
   background-image: -moz-linear-gradient(top, #b41616, #600606);
@@ -379,7 +379,7 @@
   background: #dc5f59;
 }
 .openerp button.oe_highlight {
-  background-color: #df3f3f;
+  background-color: #c02c2c;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#df3f3f), to(#a21a1a));
   background-image: -webkit-linear-gradient(top, #df3f3f, #a21a1a);
   background-image: -moz-linear-gradient(top, #df3f3f, #a21a1a);
@@ -391,7 +391,7 @@
   box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(155, 155, 155, 0.4) inset;
 }
 .openerp button.oe_highlight:hover {
-  background-color: #e25858;
+  background-color: #c63939;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#e25858), to(#ab1b1b));
   background-image: -webkit-linear-gradient(top, #e25858, #ab1b1b);
   background-image: -moz-linear-gradient(top, #e25858, #ab1b1b);
@@ -400,7 +400,7 @@
   background-image: linear-gradient(to bottom, #e25858, #ab1b1b);
 }
 .openerp button.oe_highlight:active {
-  background-color: #c52020;
+  background-color: #cb2121;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#c52020), to(#d22323));
   background-image: -webkit-linear-gradient(top, #c52020, #d22323);
   background-image: -moz-linear-gradient(top, #c52020, #d22323);
@@ -417,7 +417,7 @@
   font-weight: bold;
 }
 .openerp .oe_form_dirty button.oe_highlight_on_dirty {
-  background-color: #dc5f59;
+  background-color: #c74a44;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#dc5f59), to(#b33630));
   background-image: -webkit-linear-gradient(top, #dc5f59, #b33630);
   background-image: -moz-linear-gradient(top, #dc5f59, #b33630);
@@ -694,7 +694,7 @@
   padding: 2px 8px;
 }
 .openerp .oe_dropdown_menu > li:hover {
-  background-color: #f0f0fa;
+  background-color: #efeff8;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
   background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
   background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
@@ -748,7 +748,7 @@
   width: 200px;
 }
 .openerp .oe_sidebar .oe_dropdown_menu .oe_sidebar_add_attachment:hover {
-  background-color: #f0f0fa;
+  background-color: #efeff8;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
   background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
   background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
@@ -846,7 +846,7 @@
   border: 1px solid #222222;
   color: white;
   margin: 0;
-  background-color: #b92020;
+  background-color: #8c1313;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#b92020), to(#600606));
   background-image: -webkit-linear-gradient(top, #b92020, #600606);
   background-image: -moz-linear-gradient(top, #b92020, #600606);
@@ -903,7 +903,7 @@
   right: 0;
   bottom: 0;
   text-shadow: 0 1px 1px #999999;
-  background-color: #b41616;
+  background-color: #8a0e0e;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
   background-image: -webkit-linear-gradient(top, #b41616, #600606);
   background-image: -moz-linear-gradient(top, #b41616, #600606);
@@ -1000,7 +1000,7 @@
   width: 100%;
   height: 32px;
   background-color: #414141;
-  background-color: #646060;
+  background-color: #454343;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#646060), to(#262626));
   background-image: -webkit-linear-gradient(top, #646060, #262626);
   background-image: -moz-linear-gradient(top, #646060, #262626);
@@ -1011,7 +1011,7 @@
 .openerp .oe_topbar .oe_topbar_anonymous_login {
   background-color: #dc5f59;
   color: #eeeeee;
-  background-color: #fc8787;
+  background-color: #be4343;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fc8787), to(maroon));
   background-image: -webkit-linear-gradient(top, #fc8787, maroon);
   background-image: -moz-linear-gradient(top, #fc8787, maroon);
@@ -1101,7 +1101,7 @@
   color: #eeeeee;
 }
 .openerp .oe_topbar .oe_dropdown_menu li:hover {
-  background-color: #292929;
+  background-color: #212121;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919));
   background-image: -webkit-linear-gradient(top, #292929, #191919);
   background-image: -moz-linear-gradient(top, #292929, #191919);
@@ -1242,7 +1242,7 @@
 .openerp .oe_secondary_submenu {
   padding: 2px 0 8px 0;
   margin: 0;
-  width: 100%;
+  width: 220px;
   display: inline-block;
 }
 .openerp .oe_secondary_submenu li {
@@ -1265,7 +1265,7 @@
   color: white;
   padding: 2px 4px;
   margin: 1px 6px 0 0;
-  border: 1px solid lightGray;
+  border: 1px solid lightgrey;
   text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
   -moz-border-radius: 4px;
   -webkit-border-radius: 4px;
@@ -1274,6 +1274,13 @@
   -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
   box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2);
 }
+.openerp .oe_secondary_submenu .oe_menu_text {
+  white-space: nowrap;
+  overflow: hidden;
+  display: inline-block;
+  text-overflow: ellipsis;
+  max-width: 85%;
+}
 .openerp .oe_secondary_submenu .oe_menu_counter {
   float: right;
   text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
@@ -1290,7 +1297,7 @@
   transform: scale(1.1);
 }
 .openerp .oe_secondary_submenu .oe_active {
-  border-top: 1px solid lightGray;
+  border-top: 1px solid lightgrey;
   border-bottom: 1px solid #dedede;
   text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
   -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
@@ -1340,6 +1347,12 @@
   border-right: 4px solid transparent;
   border-top: 4px solid #4c4c4c;
 }
+.openerp .oe_secondary_submenu .oe_secondary_submenu {
+  margin-left: -20px;
+}
+.openerp .oe_secondary_submenu .oe_secondary_submenu li {
+  margin-left: 20px;
+}
 .openerp .oe_about {
   background-color: white;
   background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
@@ -1366,7 +1379,7 @@
   right: 0;
   bottom: 0;
   text-shadow: 0 1px 1px #999999;
-  background-color: #b41616;
+  background-color: #8a0e0e;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#b41616), to(#600606));
   background-image: -webkit-linear-gradient(top, #b41616, #600606);
   background-image: -moz-linear-gradient(top, #b41616, #600606);
@@ -1583,7 +1596,7 @@
 }
 .openerp .oe_view_manager_current > .oe_view_manager_header {
   border-bottom: 1px solid #cacaca;
-  background-color: #fcfcfc;
+  background-color: #ededed;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
   background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
   background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
@@ -2044,7 +2057,7 @@
   background: none;
 }
 .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight {
-  background-color: #efefef;
+  background-color: #e3e3e3;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#efefef), to(#d8d8d8));
   background-image: -webkit-linear-gradient(top, #efefef, #d8d8d8);
   background-image: -moz-linear-gradient(top, #efefef, #d8d8d8);
@@ -2056,7 +2069,7 @@
   box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 1px rgba(255, 255, 255, 0.8) inset;
 }
 .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:active {
-  background-color: #e3e3e3;
+  background-color: #ececec;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#e3e3e3), to(#f6f6f6));
   background-image: -webkit-linear-gradient(top, #e3e3e3, #f6f6f6);
   background-image: -moz-linear-gradient(top, #e3e3e3, #f6f6f6);
@@ -2068,7 +2081,7 @@
   box-shadow: none;
 }
 .openerp .oe_view_manager_current .oe_form_editable button.oe_highlight:hover {
-  background-color: #f6f6f6;
+  background-color: #ececec;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f6f6f6), to(#e3e3e3));
   background-image: -webkit-linear-gradient(top, #f6f6f6, #e3e3e3);
   background-image: -moz-linear-gradient(top, #f6f6f6, #e3e3e3);
@@ -2137,7 +2150,7 @@
   position: relative;
   border-bottom: 1px solid #cacaca;
   padding-left: 2px;
-  background-color: #fcfcfc;
+  background-color: #ededed;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
   background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
   background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
@@ -2240,7 +2253,7 @@
 }
 .openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
   font-size: 80%;
-  color: darkGreen;
+  color: darkgreen;
   vertical-align: top;
   position: relative;
   top: -4px;
@@ -2572,7 +2585,7 @@
   list-style-type: none;
   margin: 0 -18px 0 0;
   padding: 0;
-  background-color: #fcfcfc;
+  background-color: #ededed;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
   background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
   background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
@@ -2632,7 +2645,7 @@
   transform: rotate(45deg);
 }
 .openerp ul.oe_form_status li.oe_active, .openerp ul.oe_form_status_clickable li.oe_active {
-  background-color: #729fcf;
+  background-color: #5382b9;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#729fcf), to(#3465a4));
   background-image: -webkit-linear-gradient(top, #729fcf, #3465a4);
   background-image: -moz-linear-gradient(top, #729fcf, #3465a4);
@@ -2655,7 +2668,7 @@
   cursor: pointer;
 }
 .openerp ul.oe_form_status_clickable li:hover {
-  background-color: #e8e8e8;
+  background-color: #d9d9d9;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
   background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
   background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
@@ -2667,7 +2680,7 @@
   text-shadow: 0 -1px 1px #fcfcfc, 0 1px 1px #dedede;
 }
 .openerp ul.oe_form_status_clickable li:hover .arrow span {
-  background-color: #e8e8e8;
+  background-color: #d9d9d9;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#cacaca));
   background-image: -webkit-linear-gradient(top, #e8e8e8, #cacaca);
   background-image: -moz-linear-gradient(top, #e8e8e8, #cacaca);
@@ -2679,7 +2692,7 @@
   color: #7c7bad;
 }
 .openerp ul.oe_form_status_clickable li.oe_active:hover {
-  background-color: #4c85c2;
+  background-color: #3a699f;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#4c85c2), to(#284d7d));
   background-image: -webkit-linear-gradient(top, #4c85c2, #284d7d);
   background-image: -moz-linear-gradient(top, #4c85c2, #284d7d);
@@ -2835,7 +2848,7 @@
   padding: 1px 6px 3px;
 }
 .openerp .oe_list .oe_list_content .oe_group_header {
-  background-color: #fcfcfc;
+  background-color: #ededed;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#fcfcfc), to(#dedede));
   background-image: -webkit-linear-gradient(top, #fcfcfc, #dedede);
   background-image: -moz-linear-gradient(top, #fcfcfc, #dedede);
@@ -2872,8 +2885,8 @@
   position: relative;
 }
 .openerp .oe_list_content th.oe_sortable div:after {
-  position: absolute;
-  right: 6px;
+  float: right;
+  margin-right: 6px;
   content: "";
   margin-top: 7px;
   border-width: 0 4px 4px;
@@ -2932,7 +2945,7 @@
 }
 .openerp .oe_list_content > tbody > tr:nth-child(odd) {
   background-color: #f0f0fa;
-  background-color: #f0f0fa;
+  background-color: #efeff8;
   background-image: -webkit-gradient(linear, left top, left bottom, from(#f0f0fa), to(#eeeef6));
   background-image: -webkit-linear-gradient(top, #f0f0fa, #eeeef6);
   background-image: -moz-linear-gradient(top, #f0f0fa, #eeeef6);
@@ -3134,6 +3147,9 @@
 .openerp_ie .oe_form_field_boolean input {
   background: white;
 }
+.openerp_ie .db_option_table .oe_form_field_selection {
+  width: auto;
+}
 .openerp_ie input[type='checkbox'] {
   border: none;
   background: none;
@@ -3208,6 +3224,9 @@
 .openerp_ie .oe_topbar {
   filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#646060', endColorstr='#262626');
 }
+.openerp_ie .ui-state-error, .openerp_ie .ui-widget-content .ui-state-error, .openerp_ie .ui-widget-header .ui-state-error {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
 .openerp_ie .oe_popup_form {
   width: 99% !important;
 }
@@ -3291,7 +3310,6 @@
     overflow: hidden !important;
   }
 }
-
 .blockUI.blockOverlay {
   background-color: black;
   opacity: 0.6;

=== modified file 'addons/web/static/src/css/base.sass'
--- addons/web/static/src/css/base.sass	2012-12-20 18:37:56 +0000
+++ addons/web/static/src/css/base.sass	2013-01-10 13:11:45 +0000
@@ -42,7 +42,7 @@
     @include box-shadow(none)
 
 @mixin vertical-gradient($startColor: #555, $endColor: #333)
-    background-color: $startColor
+    background-color: mix($startColor, $endColor)
     background-image: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor)) /* Saf4+, Chrome */
     background-image: -webkit-linear-gradient(top, $startColor, $endColor) /* Chrome 10+, Saf5.1+, iOS 5+ */
     background-image:    -moz-linear-gradient(top, $startColor, $endColor) /* FF3.6 */
@@ -1009,7 +1009,7 @@
     .oe_secondary_submenu
         padding: 2px 0 8px 0
         margin: 0
-        width: 100%
+        width: 220px
         display: inline-block
         li
             position: relative
@@ -1033,6 +1033,12 @@
                 text-shadow: 0 1px 1px rgba(0,0,0,0.2)
                 @include radius(4px)
                 @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, 0.2))
+        .oe_menu_text
+            white-space: nowrap
+            overflow: hidden
+            display: inline-block
+            text-overflow: ellipsis
+            max-width: 85%
         .oe_menu_counter
             float: right
             text-shadow: 0 1px 1px rgba(0,0,0,0.2)
@@ -1080,6 +1086,10 @@
             border-left: 4px solid transparent
             border-right: 4px solid transparent
             border-top: 4px solid #4c4c4c
+        .oe_secondary_submenu
+            margin-left: -20px
+        .oe_secondary_submenu li
+            margin-left: 20px
 
     // }}}
     // About openerp {{{
@@ -2271,8 +2281,8 @@
         th.oe_sortable div
             position: relative
         th.oe_sortable div:after
-            position: absolute
-            right: 6px
+            float: right
+            margin-right: 6px
             content: ""
             margin-top: 7px
             border-width: 0 4px 4px
@@ -2474,6 +2484,8 @@
 .openerp_ie
     .oe_form_field_boolean input
         background: #fff
+    .db_option_table .oe_form_field_selection
+        width: auto
     input[type='checkbox']
         border: none
         background: none
@@ -2535,6 +2547,8 @@
             line-height: 1.7em
     .oe_topbar
         filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#646060', endColorstr='#262626')
+    .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error
+        filter: progid:DXImageTransform.Microsoft.gradient(enabled=false)
     .oe_popup_form
         width: 99% !important
     .oe_form_label

=== modified file 'addons/web/static/src/js/chrome.js'
--- addons/web/static/src/js/chrome.js	2012-12-19 09:55:50 +0000
+++ addons/web/static/src/js/chrome.js	2013-01-10 13:11:45 +0000
@@ -42,6 +42,16 @@
     }
 });
 
+instance.web.action_notify = function(element, action) {
+    element.do_notify(action.params.title, action.params.text, action.params.sticky);
+};
+instance.web.client_actions.add("action_notify", "instance.web.action_notify");
+
+instance.web.action_warn = function(element, action) {
+    element.do_warn(action.params.title, action.params.text, action.params.sticky);
+};
+instance.web.client_actions.add("action_warn", "instance.web.action_warn");
+
 /**
  * The very minimal function everything should call to create a dialog
  * in OpenERP Web Client.
@@ -237,6 +247,11 @@
         if (!this.active) {
             return;
         }
+        // yes, exception handling is shitty
+        if (error.code === 300 && error.data && error.data.type == "client_exception" && error.data.debug.match("SessionExpiredException")) {
+            this.show_warning({type: "Session Expired", data: { fault_code: "Your OpenERP session expired. Please refresh the current web page." }});
+            return;
+        }
         if (error.data.fault_code) {
             var split = ("" + error.data.fault_code).split('\n')[0].split(' -- ');
             if (split.length > 1) {
@@ -607,6 +622,9 @@
         if ($.deparam.querystring().db) {
             self.params.db = $.deparam.querystring().db;
         }
+        if ($.param.fragment().token) {
+            self.params.token = $.param.fragment().token;
+        }
         // used by dbmanager.do_create via internal client action
         if (self.params.db && self.params.login && self.params.password) {
             d = self.do_login(self.params.db, self.params.login, self.params.password);
@@ -1020,13 +1038,8 @@
                 if(res.company_id[0] > 1)
                     topbar_name = _.str.sprintf("%s (%s)", topbar_name, res.company_id[1]);
                 self.$el.find('.oe_topbar_name').text(topbar_name);
-                if(!instance.session.debug) {
-                    self.rpc("/web/database/get_list", {}).done( function(result) {
-                       if (result.length > 1) {
-                            topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.session.db);
-                       }
-                        self.$el.find('.oe_topbar_name').text(topbar_name);
-                    });
+                if (!instance.session.debug) {
+                    topbar_name = _.str.sprintf("%s (%s)", topbar_name, instance.session.db);
                 }
                 var avatar_src = self.session.url('/web/binary/image', {model:'res.users', field: 'image_small', id: self.session.uid});
                 $avatar.attr('src', avatar_src);

=== modified file 'addons/web/static/src/js/corelib.js'
--- addons/web/static/src/js/corelib.js	2012-11-30 10:36:51 +0000
+++ addons/web/static/src/js/corelib.js	2013-01-10 13:11:45 +0000
@@ -1,16 +1,16 @@
 /*
  * Copyright (c) 2012, OpenERP S.A.
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met: 
- * 
+ * modification, are permitted provided that the following conditions are met:
+ *
  * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer. 
+ *    list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
- *    and/or other materials provided with the distribution. 
- * 
+ *    and/or other materials provided with the distribution.
+ *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -243,7 +243,7 @@
 
 /**
  * Backbone's events. Do not ever use it directly, use EventDispatcherMixin instead.
- * 
+ *
  * This class just handle the dispatching of events, it is not meant to be extended,
  * nor used directly. All integration with parenting and automatic unregistration of
  * events is done in EventDispatcherMixin.
@@ -303,7 +303,7 @@
         });
         return lst;
     },
-    
+
     trigger : function(events) {
         var event, node, calls, tail, args, all, rest;
         if (!(calls = this._callbacks))
@@ -1043,7 +1043,7 @@
             id: payload.id,
             sid: this.httpsessionid,
         };
-        
+
         var set_sid = function (response, textStatus, jqXHR) {
             // If response give us the http session id, we store it for next requests...
             if (response.httpsessionid) {
@@ -1054,7 +1054,7 @@
         url.url = this.url(url.url, null);
         var ajax = _.extend({
             type: "GET",
-            dataType: 'jsonp', 
+            dataType: 'jsonp',
             jsonp: 'jsonp',
             cache: false,
             data: data

=== modified file 'addons/web/static/src/js/coresetup.js'
--- addons/web/static/src/js/coresetup.js	2012-12-19 15:12:17 +0000
+++ addons/web/static/src/js/coresetup.js	2013-01-10 13:11:45 +0000
@@ -49,7 +49,6 @@
         _(this.module_list).each(function (mod) {
             self.module_loaded[mod] = true;
         });
-        this.context = {};
         this.active_id = null;
         return this.session_init();
     },
@@ -67,7 +66,7 @@
                 return deferred.then(function() { return self.load_modules(); });
             }
             return $.when(
-                    deferred, 
+                    deferred,
                     self.rpc('/web/webclient/bootstrap_translations', {mods: instance._modules}).then(function(trans) {
                         instance.web._t.database.set_bundle(trans);
                     })
@@ -86,13 +85,7 @@
             // If immediately follows a login (triggered by trying to restore
             // an invalid session or no session at all), refresh session data
             // (should not change, but just in case...)
-            _.extend(self, {
-                session_id: result.session_id,
-                db: result.db,
-                username: result.login,
-                uid: result.uid,
-                user_context: result.context
-            });
+            _.extend(self, result);
         });
     },
     session_is_valid: function() {
@@ -109,14 +102,7 @@
             if (!result.uid) {
                 return $.Deferred().reject();
             }
-
-            _.extend(self, {
-                session_id: result.session_id,
-                db: result.db,
-                username: result.login,
-                uid: result.uid,
-                user_context: result.context
-            });
+            _.extend(self, result);
             if (!_volatile) {
                 self.set_cookie('session_id', self.session_id);
             }

=== modified file 'addons/web/static/src/js/view_form.js'
--- addons/web/static/src/js/view_form.js	2012-12-21 14:02:36 +0000
+++ addons/web/static/src/js/view_form.js	2013-01-10 13:11:45 +0000
@@ -842,11 +842,10 @@
                     save_deferral = self.dataset.create(values).then(function(r) {
                         return self.record_created(r, prepend_on_create);
                     }, null);
-                } else if (_.isEmpty(values) && ! self.force_dirty) {
+                } else if (_.isEmpty(values)) {
                     // Not dirty, noop save
                     save_deferral = $.Deferred().resolve({}).promise();
                 } else {
-                    self.force_dirty = false;
                     // Write save
                     save_deferral = self.dataset.write(self.datarecord.id, values, {}).then(function(r) {
                         return self.record_saved(r);
@@ -1935,7 +1934,6 @@
             }
         };
         if (!this.node.attrs.special) {
-            this.view.force_dirty = true;
             return this.view.recursive_save().then(exec_action);
         } else {
             return exec_action();
@@ -2632,7 +2630,7 @@
                             "| removeformat | bullets numbering | outdent " +
                             "indent | link unlink | source",
                 bodyStyle:  // style to assign to document body contained within the editor
-                            "margin:4px; font:12px monospace; cursor:text; color:#1F1F1F"
+                            "margin:4px; color:#4c4c4c; font-size:13px; font-family:\"Lucida Grande\",Helvetica,Verdana,Arial,sans-serif; cursor:text"
             });
             this.$cleditor = this.$textarea.cleditor()[0];
             this.$cleditor.change(function() {
@@ -4946,7 +4944,7 @@
             }
             this.$el.find('input').eq(0).val(show_value);
         } else {
-            this.$el.find('a').show(!!this.get('value'));
+            this.$el.find('a').toggle(!!this.get('value'));
             if (this.get('value')) {
                 var show_value = _t("Download")
                 if (this.view)

=== modified file 'addons/web/static/src/js/view_list.js'
--- addons/web/static/src/js/view_list.js	2012-12-20 15:07:16 +0000
+++ addons/web/static/src/js/view_list.js	2013-01-10 13:11:45 +0000
@@ -348,12 +348,27 @@
             this.sidebar.add_toolbar(this.fields_view.toolbar);
             this.sidebar.$el.hide();
         }
+        //Sort
+        if(this.dataset._sort.length){
+            if(this.dataset._sort[0].indexOf('-') == -1){
+                this.$el.find('th[data-id=' + this.dataset._sort[0] + ']').addClass("sortdown");
+            }else {
+                this.$el.find('th[data-id=' + this.dataset._sort[0].split('-')[1] + ']').addClass("sortup");
+            }
+        }
         this.trigger('list_view_loaded', data, this.grouped);
     },
     sort_by_column: function (e) {
         e.stopPropagation();
         var $column = $(e.currentTarget);
-        this.dataset.sort($column.data('id'));
+        var col_name = $column.data('id')
+        var field = this.fields_view.fields[col_name];
+        // test if the field is a function field with store=false, since it's impossible
+        // for the server to sort those fields we desactivate the feature
+        if (field && field.store === false) {
+            return false;
+        }
+        this.dataset.sort(col_name);
         if($column.hasClass("sortdown") || $column.hasClass("sortup"))  {
             $column.toggleClass("sortup sortdown");
         } else {

=== modified file 'addons/web/static/src/xml/base.xml'
--- addons/web/static/src/xml/base.xml	2012-12-21 11:36:57 +0000
+++ addons/web/static/src/xml/base.xml	2013-01-10 13:11:45 +0000
@@ -385,7 +385,9 @@
         t-att-data-menu="menu.id"
         t-att-data-action-model="menu.action ? menu.action.split(',')[0] : ''"
         t-att-data-action-id="menu.action ? menu.action.split(',')[1] : ''">
-        <t t-esc="menu.name"/>
+        <span class="oe_menu_text">
+            <t t-esc="menu.name"/>
+        </span>
     </a>
 </t>
 

=== modified file 'addons/web_gantt/static/src/js/gantt.js'
--- addons/web_gantt/static/src/js/gantt.js	2012-12-13 14:09:14 +0000
+++ addons/web_gantt/static/src/js/gantt.js	2013-01-10 13:11:45 +0000
@@ -136,7 +136,7 @@
                     });
                     return group;
                 } else {
-                    var group = new GanttTaskInfo(_.uniqueId("gantt_project_task_"), group_name, task_start, duration, 100);
+                    var group = new GanttTaskInfo(_.uniqueId("gantt_project_task_"), group_name, task_start, duration || 1, 100);
                     _.each(task_infos, function(el) {
                         group.addChildTask(el.task_info);
                     });
@@ -161,7 +161,7 @@
                 }
                 var duration = (task_stop.getTime() - task_start.getTime()) / (1000 * 60 * 60);
                 var id = _.uniqueId("gantt_task_");
-                var task_info = new GanttTaskInfo(id, task_name, task_start, ((duration / 24) * 8), 100);
+                var task_info = new GanttTaskInfo(id, task_name, task_start, ((duration / 24) * 8) || 1, 100);
                 task_info.internal_task = task;
                 task_ids[id] = task_info;
                 return {task_info: task_info, task_start: task_start, task_stop: task_stop};
@@ -195,6 +195,8 @@
             $(rendered).prependTo(td);
             $(".oe_gantt_button_create", this.$el).click(this.on_task_create);
         }
+        // Fix for IE to display the content of gantt view.
+        this.$el.find(".oe_gantt td:first > div, .oe_gantt td:eq(1) > div > div").css("overflow", "");
     },
     on_task_changed: function(task_obj) {
         var self = this;

=== modified file 'addons/web_kanban/static/src/css/kanban.css'
--- addons/web_kanban/static/src/css/kanban.css	2012-12-20 18:39:42 +0000
+++ addons/web_kanban/static/src/css/kanban.css	2013-01-10 13:11:45 +0000
@@ -5,6 +5,7 @@
 }
 .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_dummy_cell {
   background: url(/web/static/src/img/form_sheetbg.png);
+  width: 100%;
 }
 .openerp .oe_kanban_view .ui-sortable-placeholder {
   border: 1px solid rgba(0, 0, 0, 0.1);
@@ -32,7 +33,7 @@
   clear: both;
 }
 .openerp .oe_kanban_view .oe_kanban_content {
-  word-break: break-all;
+  word-wrap: break-word;
 }
 .openerp .oe_kanban_view .oe_kanban_content .oe_star_on, .openerp .oe_kanban_view .oe_kanban_content .oe_star_off {
   color: #cccccc;
@@ -77,13 +78,37 @@
   font-size: 13px;
 }
 .openerp .oe_kanban_view .oe_kanban_group_title {
+  position: relative;
   font-size: 16px;
   font-weight: bold;
   color: #333333;
   text-shadow: 0 1px 0 white;
+  margin-right: 30px;
+  width: 200px;
 }
-.openerp .oe_kanban_view .oe_kanban_group_title > span {
+.openerp .oe_kanban_view .oe_kanban_group_title .oe_kanban_group_title_text {
   margin-right: 4px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.openerp .oe_kanban_view .oe_kanban_group_title .oe_kanban_group_length {
+  position: absolute;
+  top: -1px;
+  right: -14px;
+  text-align: center;
+  float: right;
+}
+.openerp .oe_kanban_view .oe_kanban_header:hover .oe_kanban_group_length {
+  display: none;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column, .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header {
+  width: 185px;
+  min-width: 185px;
+}
+.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_column.oe_kanban_group_folded, .openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header.oe_kanban_group_folded {
+  width: auto;
+  min-width: 30px;
 }
 .openerp .oe_kanban_view .oe_kanban_column, .openerp .oe_kanban_view .oe_kanban_group_header {
   vertical-align: top;
@@ -102,9 +127,6 @@
   border-left: 1px solid #f0f8f8;
   border-right: 1px solid #b9b9b9;
 }
-.openerp .oe_kanban_view.oe_kanban_grouped .oe_kanban_group_header {
-  width: 1%;
-}
 .openerp .oe_kanban_view .oe_form .oe_kanban_column {
   padding: 0px;
   background: white;
@@ -165,7 +187,7 @@
   margin: 4px 0;
 }
 .openerp .oe_kanban_view .oe_kanban_no_group .oe_kanban_quick_create {
-  width: 200px;
+  width: 185px;
   padding: 10px;
 }
 .openerp .oe_kanban_view .oe_kanban_quick_create input {
@@ -432,6 +454,14 @@
   line-height: 12px;
   font-size: 22px;
 }
+.openerp .oe_kanban_view .oe_kanban_footer_left .oe_tags {
+  margin-right: 0;
+}
+.openerp .oe_kanban_view .oe_kanban_footer_left .oe_tags .oe_tag {
+  display: inline-block;
+  padding: 0 2px;
+  line-height: 14px;
+}
 .openerp .oe_kanban_view .oe_kanban_footer_left .oe_kanban_mail_new {
   line-height: 18px;
   background-color: #8a89ba;

=== modified file 'addons/web_kanban/static/src/css/kanban.sass'
--- addons/web_kanban/static/src/css/kanban.sass	2012-12-20 18:39:42 +0000
+++ addons/web_kanban/static/src/css/kanban.sass	2013-01-10 13:11:45 +0000
@@ -53,6 +53,7 @@
     height: inherit
     &.oe_kanban_grouped .oe_kanban_dummy_cell
         background: url(/web/static/src/img/form_sheetbg.png)
+        width: 100%
     .ui-sortable-placeholder
         border: 1px solid rgba(0,0,0,0.1)
         visibility: visible !important
@@ -69,7 +70,7 @@
     .oe_kanban_clear
         clear: both
     .oe_kanban_content
-        word-break: break-all
+        word-wrap: break-word
         .oe_star_on, .oe_star_off
             color: #ccc
             text-shadow: 0 0 2px black
@@ -105,12 +106,31 @@
             font-weight: normal
             font-size: 13px
     .oe_kanban_group_title
+        position: relative
         font-size: 16px
         font-weight: bold
         color: #333333
         text-shadow: 0 1px 0 white
-        > span
+        margin-right: 30px
+        width: 200px
+        .oe_kanban_group_title_text
             margin-right: 4px
+            white-space: nowrap
+            overflow: hidden
+            text-overflow: ellipsis
+        .oe_kanban_group_length
+          position: absolute
+          top: -1px
+          right: -14px
+          text-align: center
+          float: right
+    &.oe_kanban_grouped
+        .oe_kanban_column, .oe_kanban_group_header
+            width: 185px
+            min-width: 185px
+            &.oe_kanban_group_folded
+                width: auto
+                min-width: 30px
 
     .oe_kanban_column, .oe_kanban_group_header
         vertical-align: top
@@ -126,10 +146,6 @@
         background: #f0eeee
         border-left: 1px solid #f0f8f8
         border-right: 1px solid #b9b9b9
-    &.oe_kanban_grouped
-        .oe_kanban_group_header
-            width: 1%
-
     .oe_form
         .oe_kanban_column
             padding: 0px
@@ -182,7 +198,7 @@
     .oe_kanban_quick_create_buttons
         margin: 4px 0
     .oe_kanban_no_group .oe_kanban_quick_create
-        width: 200px
+        width: 185px
         padding: 10px
     .oe_kanban_quick_create input
         @include box-sizing(border-box)
@@ -233,8 +249,9 @@
         .oe_kanban_title
             font-weight: bold
             margin: 2px 4px
-    &.oe_kanban_grouped .oe_kanban_record
-        margin-bottom: 4px
+    &.oe_kanban_grouped
+        .oe_kanban_record
+            margin-bottom: 4px
     .oe_kanban_avatar_smallbox
         height: 40px
         width: 40px
@@ -381,6 +398,12 @@
             .oe_e
                 line-height: 12px
                 font-size: 22px
+        .oe_tags
+            margin-right: 0
+            .oe_tag
+                display: inline-block
+                padding: 0 2px
+                line-height: 14px
         .oe_kanban_mail_new
             line-height: 18px
             background-color: #8a89ba

=== modified file 'addons/web_kanban/static/src/js/kanban.js'
--- addons/web_kanban/static/src/js/kanban.js	2012-12-21 19:30:29 +0000
+++ addons/web_kanban/static/src/js/kanban.js	2013-01-10 13:11:45 +0000
@@ -235,7 +235,6 @@
             self.$el.toggleClass('oe_kanban_grouped_by_m2o', self.grouped_by_m2o);
             var grouping = new instance.web.Model(self.dataset.model, context, domain).query().group_by(self.group_by);
             $.when(grouping).done(function(groups) {
-                self.do_clear_groups();
                 if (groups) {
                     self.do_process_groups(groups);
                 } else {
@@ -248,6 +247,7 @@
         var self = this;
         this.$el.removeClass('oe_kanban_ungrouped').addClass('oe_kanban_grouped');
         this.add_group_mutex.exec(function() {
+            self.do_clear_groups();
             self.dataset.ids = [];
             if (!groups.length) {
                 self.no_result();
@@ -275,6 +275,7 @@
         this.$el.removeClass('oe_kanban_grouped').addClass('oe_kanban_ungrouped');
         this.add_group_mutex.exec(function() {
             var def = $.Deferred();
+            self.do_clear_groups();
             self.dataset.read_slice(self.fields_keys.concat(['__last_update']), { 'limit': self.limit }).done(function(records) {
                 var kgroup = new instance.web_kanban.KanbanGroup(self, records, null, self.dataset);
                 self.do_add_groups([kgroup]).done(function() {
@@ -322,7 +323,6 @@
     },
     on_groups_started: function() {
         var self = this;
-        this.compute_groups_width();
         if (this.group_by) {
             // Kanban cards drag'n'drop
             var $columns = this.$el.find('.oe_kanban_column .oe_kanban_column_cards');
@@ -420,27 +420,6 @@
             });
         }
     },
-    compute_groups_width: function() {
-        var unfolded = 0;
-        var self = this;
-        _.each(this.groups, function(group) {
-            unfolded += group.state.folded ? 0 : 1;
-            group.$el.children(':first').css('width', '');
-        });
-        _.each(this.groups, function(group) {
-            if (!group.state.folded) {
-                if (182*unfolded>=self.$el.width()) {
-                    group.$el.children(':first').css('width', "170px");
-                } else if (262*unfolded<self.$el.width()) {
-                    group.$el.children(':first').css('width', "250px");
-                } else {
-            // -12 because of padding 6 between cards
-            // -1 because of the border of the latest dummy column
-                    group.$el.children(':first').css('width', Math.floor((self.$el.width()-1)/unfolded)-12 + 'px');
-                }
-            }
-        });
-    },
 
     do_show: function() {
         if (this.$buttons) {
@@ -695,7 +674,6 @@
     },
     do_action_toggle_fold: function() {
         this.do_toggle_fold();
-        this.view.compute_groups_width();
     },
     do_action_edit: function() {
         var self = this;

=== modified file 'addons/web_kanban/static/src/xml/web_kanban.xml'
--- addons/web_kanban/static/src/xml/web_kanban.xml	2012-11-28 14:02:22 +0000
+++ addons/web_kanban/static/src/xml/web_kanban.xml	2013-01-10 13:11:45 +0000
@@ -46,10 +46,10 @@
                     </div>
                 <div class="oe_fold_column">
                     <div t-attf-class="oe_kanban_group_title #{widget.undefined_title ? 'oe_kanban_group_title_undefined' : ''}">
-                        <span><t t-esc="widget.title"/></span>
-                        <span class="oe_kanban_group_length oe_tag" style="position:relative; top:-2px;">
+                        <div class="oe_kanban_group_length oe_tag">
                             <t t-if="widget.group.get('length') &gt; 99"> 99+ </t><t t-if="widget.group.get('length') &lt;= 99"> <t t-esc="widget.group.get('length')"/> </t>
-                        </span>
+                        </div>
+                        <div class="oe_kanban_group_title_text" t-att-title="widget.title"><t t-esc="widget.title"/></div>
                     </div>
                     <ul class="oe_kanban_aggregates">
                         <li t-foreach="widget.aggregates" t-as="aggregate">

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : openerp-dev-gtk@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to