diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index bb9fcaa0dbd..9ea84a3501f 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -20,7 +20,6 @@ This module provides the core of the OpenERP Web Client. "static/lib/datejs/sugarpak.js", "static/lib/datejs/extras.js", "static/lib/jquery/jquery.js", - "static/lib/jquery.MD5/jquery.md5.js", "static/lib/jquery.form/jquery.form.js", "static/lib/jquery.validate/jquery.validate.js", "static/lib/jquery.ba-bbq/jquery.ba-bbq.js", @@ -66,6 +65,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/jquery.tipsy/tipsy.css", "static/lib/jquery.textext/jquery.textext.css", "static/lib/fontawesome/css/font-awesome.css", + "static/lib/bootstrap/css/bootstrap.css", "static/src/css/base.css", "static/src/css/data_export.css", "static/lib/cleditor/jquery.cleditor.css", @@ -89,5 +89,4 @@ This module provides the core of the OpenERP Web Client. "static/test/list-editable.js", "static/test/mutex.js" ], - 'bootstrap': True, } diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 41bb6ccfca7..8f7c5d4f70d 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -3,6 +3,7 @@ import ast import base64 import csv +import functools import glob import itertools import logging @@ -35,7 +36,9 @@ from openerp.tools.translate import _ from openerp.tools import config from openerp import http -from openerp.http import request +from openerp.http import request, serialize_exception as _serialize_exception + +_logger = logging.getLogger(__name__) #---------------------------------------------------------- # OpenERP Web helpers @@ -89,6 +92,22 @@ db_list = http.db_list db_monodb = http.db_monodb +def serialize_exception(f): + @functools.wraps(f) + def wrap(*args, **kwargs): + try: + return f(*args, **kwargs) + except Exception, e: + _logger.exception("An exception occured during an http request") + se = _serialize_exception(e) + error = { + 'code': 200, + 'message': "OpenERP Server Error", + 'data': se + } + return werkzeug.exceptions.InternalServerError(simplejson.dumps(error)) + return wrap + def redirect_with_hash(url, code=303): if request.httprequest.user_agent.browser in ('msie', 'safari'): # Most IE and Safari versions decided not to preserve location.hash upon @@ -542,14 +561,14 @@ class Home(http.Controller): def redirect(db): query = dict(urlparse.parse_qsl(request.httprequest.query_string, keep_blank_values=True)) - query.update({'db': db}) + query['db'] = db redirect = request.httprequest.path + '?' + urllib.urlencode(query) return redirect_with_hash(redirect) if db is None and guessed_db is not None: return redirect(guessed_db) - if db is not None and db != guessed_db: + if db is not None and db != request.session.db: request.session.logout() request.session.db = db guessed_db = db @@ -1220,6 +1239,7 @@ class Binary(http.Controller): return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', image), 'rb').read() @http.route('/web/binary/saveas', type='http', auth="user") + @serialize_exception def saveas(self, model, field, id=None, filename_field=None, **kw): """ Download link for files stored as binary fields. @@ -1253,6 +1273,7 @@ class Binary(http.Controller): ('Content-Disposition', content_disposition(filename))]) @http.route('/web/binary/saveas_ajax', type='http', auth="user") + @serialize_exception def saveas_ajax(self, data, token): jdata = simplejson.loads(data) model = jdata['model'] @@ -1286,6 +1307,7 @@ class Binary(http.Controller): cookies={'fileToken': token}) @http.route('/web/binary/upload', type='http', auth="user") + @serialize_exception def upload(self, callback, ufile): # TODO: might be useful to have a configuration flag for max-length file uploads out = """ - - - - - - \ No newline at end of file diff --git a/addons/web/static/lib/jquery.MD5/tests/tests.js b/addons/web/static/lib/jquery.MD5/tests/tests.js deleted file mode 100644 index ab70f2f991b..00000000000 --- a/addons/web/static/lib/jquery.MD5/tests/tests.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * jQuery MD5 Plugin Tests 1.1 - * https://github.com/blueimp/jQuery-MD5 - * - * Copyright 2010, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * http://creativecommons.org/licenses/MIT/ - */ - -/*global jQuery, module, test, strictEqual */ - -(function ($) { - 'use strict'; - - module('Hex-encoded MD5'); - - test('Creating hex-encoded MD5 hash of an ASCII value', function () { - strictEqual($.md5('value'), '2063c1608d6e0baf80249c42e2be5804'); - }); - - test('Creating hex-encoded MD5 hash of an UTF-8 value', function () { - strictEqual($.md5('日本'), '4dbed2e657457884e67137d3514119b3'); - }); - - module('Hex-encoded HMAC-MD5'); - - test('Creating hex-encoded HMAC-MD5 hash of an ASCII value and key', function () { - strictEqual($.md5('value', 'key'), '01433efd5f16327ea4b31144572c67f6'); - }); - - test('Creating hex-encoded HMAC-MD5 hash of an UTF-8 value and key', function () { - strictEqual($.md5('日本', '日本'), 'c78b8c7357926981cc04740bd3e9d015'); - }); - - module('Raw MD5'); - - test('Creating raw MD5 hash of an ASCII value', function () { - strictEqual($.md5('value', null, true), ' c\xc1`\x8dn\x0b\xaf\x80$\x9cB\xe2\xbeX\x04'); - }); - - test('Creating raw MD5 hash of an UTF-8 value', function () { - strictEqual($.md5('日本', null, true), 'M\xbe\xd2\xe6WEx\x84\xe6q7\xd3QA\x19\xb3'); - }); - - module('Raw HMAC-MD5'); - - test('Creating raw HMAC-MD5 hash of an ASCII value and key', function () { - strictEqual($.md5('value', 'key', true), '\x01C>\xfd_\x162~\xa4\xb3\x11DW,g\xf6'); - }); - - test('Creating raw HMAC-MD5 hash of an UTF-8 value and key', function () { - strictEqual($.md5('日本', '日本', true), '\xc7\x8b\x8csW\x92i\x81\xcc\x04t\x0b\xd3\xe9\xd0\x15'); - }); - -}(typeof jQuery === 'function' ? jQuery : this)); \ No newline at end of file diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index a9b4934e4da..010585ee4a0 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -111,6 +111,8 @@ } .openerp h4 { margin: 4px 0; + font-weight: bold; + font-size: inherit; } .openerp a.button:link, .openerp a.button:visited, .openerp button, .openerp input[type='submit'], .openerp .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button { display: inline-block; @@ -199,6 +201,7 @@ } .openerp.ui-dialog { display: none; + height: auto !important; padding: 6px; background-color: rgba(60, 60, 60, 0.7); border: 1px solid; @@ -241,6 +244,7 @@ } .openerp.ui-dialog .ui-dialog-content { background: white; + width: auto !important; } .openerp.ui-dialog .ui-dialog-buttonpane { border-top: 1px solid #e0e0e0; @@ -529,6 +533,15 @@ .openerp .oe_grey { color: #aaaaaa; } +.openerp .oe_error_detail hr { + display: block; + -webkit-margin-before: 0.5em; + -webkit-margin-after: 0.5em; + -webkit-margin-start: auto; + -webkit-margin-end: auto; + border-style: inset; + border-width: 1px; +} .openerp .oe_tag { border: 1px solid #afafb6; font-size: 11px; @@ -680,6 +693,9 @@ .openerp .oe_notebook_page { padding: 0; } +.openerp .oe_notebook_page > label:not([for]) { + font-weight: normal !important; +} .openerp div.ui-tabs { padding: 3px 0px 3px 0px; } @@ -976,7 +992,7 @@ } .openerp .oe_login .oe_login_footer a { color: #eeeeee; - margin: 0 8px; + margin: 0 6px; } .openerp .oe_login .oe_login_footer a:hover { text-decoration: underline; @@ -1022,19 +1038,7 @@ .openerp .oe_content_full_screen .oe_topbar, .openerp .oe_content_full_screen .oe_leftbar { display: none; } -.openerp .oe_topbar { - width: 100%; - height: 32px; - background-color: #414141; - 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); - background-image: -ms-linear-gradient(top, #646060, #262626); - background-image: -o-linear-gradient(top, #646060, #262626); - background-image: linear-gradient(to bottom, #646060, #262626); -} -.openerp .oe_topbar .oe_topbar_anonymous_login { +.openerp .navbar .oe_topbar_anonymous_login { background-color: #dc5f59; color: #eeeeee; background-color: #be4343; @@ -1045,11 +1049,11 @@ background-image: -o-linear-gradient(top, #fc8787, maroon); background-image: linear-gradient(to bottom, #fc8787, maroon); } -.openerp .oe_topbar .oe_topbar_anonymous_login a { +.openerp .navbar .oe_topbar_anonymous_login a { display: block; padding: 5px 10px 7px; line-height: 20px; - height: 20px; + height: 30px; text-decoration: none; color: white; background: transparent; @@ -1059,7 +1063,7 @@ -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } -.openerp .oe_topbar .oe_topbar_anonymous_login a:hover { +.openerp .navbar .oe_topbar_anonymous_login a:hover { background: rgba(0, 0, 0, 0.1); color: white; text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2); @@ -1067,9 +1071,9 @@ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset; } -.openerp .oe_topbar .oe_topbar_item { +.openerp .navbar .oe_topbar_item { display: block; - padding: 5px 10px 7px; + padding: 5px 10px 26px; line-height: 20px; height: 20px; text-decoration: none; @@ -1082,7 +1086,7 @@ -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } -.openerp .oe_topbar .oe_topbar_item:hover { +.openerp .navbar .oe_topbar_item:hover { background: rgba(0, 0, 0, 0.2); text-shadow: black 0px 0px 3px; color: white; @@ -1090,7 +1094,7 @@ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; } -.openerp .oe_topbar .oe_topbar_avatar { +.openerp .navbar .oe_topbar_avatar { width: 24px; height: 24px; margin: -2px 2px 0 0; @@ -1098,13 +1102,13 @@ -webkit-border-radius: 3px; border-radius: 3px; } -.openerp .oe_topbar .oe_topbar_avatar { +.openerp .navbar .oe_topbar_avatar { vertical-align: top; } -.openerp .oe_topbar .oe_dropdown_arrow:after { +.openerp .navbar .oe_dropdown_arrow:after { border-top: 4px solid white; } -.openerp .oe_topbar .oe_dropdown_menu { +.openerp .navbar .dropdown_menu { top: 32px; background: #333333; background: rgba(37, 37, 37, 0.9); @@ -1119,14 +1123,14 @@ -moz-background-clip: padding-box; background-clip: padding-box; } -.openerp .oe_topbar .oe_dropdown_menu li { +.openerp .navbar .dropdown_menu li { float: none; padding: 3px 12px; } -.openerp .oe_topbar .oe_dropdown_menu li a { +.openerp .navbar .dropdown_menu li a { color: #eeeeee; } -.openerp .oe_topbar .oe_dropdown_menu li:hover { +.openerp .navbar .dropdown_menu li:hover { background-color: #212121; background-image: -webkit-gradient(linear, left top, left bottom, from(#292929), to(#191919)); background-image: -webkit-linear-gradient(top, #292929, #191919); @@ -1138,21 +1142,21 @@ -webkit-box-shadow: none; box-shadow: none; } -.openerp .oe_topbar .oe_topbar_name { +.openerp .navbar .oe_topbar_name { max-width: 150px; - overflow: hidden; display: inline-block; - max-height: 100%; + height: 15px; text-overflow: ellipsis; white-space: nowrap; + overflow: hidden; } -.openerp .oe_menu { +.openerp .navbar-nav { float: left; padding: 0; margin: 0; font-size: 13px; } -.openerp .oe_menu > li { +.openerp .navbar-nav > li { list-style-type: none; padding: 0; margin: 0; @@ -1160,13 +1164,13 @@ display: block; color: #eeeeee; } -.openerp .oe_menu > li > a { +.openerp .navbar-nav > li > a { display: block; - padding: 5px 10px 7px; + padding: 5px 10px 26px !important; line-height: 20px; height: 20px; text-decoration: none; - color: #eeeeee; + color: #eeeeee !important; vertical-align: top; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -webkit-transition: all 0.2s ease-out; @@ -1175,7 +1179,7 @@ -o-transition: all 0.2s ease-out; transition: all 0.2s ease-out; } -.openerp .oe_menu > li > a:hover { +.openerp .navbar-nav > li > a:hover { background: rgba(0, 0, 0, 0.2); text-shadow: black 0px 0px 3px; color: white; @@ -1183,7 +1187,7 @@ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; } -.openerp .oe_menu > li > .oe_active { +.openerp .navbar-nav > li > .active { background: rgba(0, 0, 0, 0.3); text-shadow: black 0px 0px 3px; -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset; @@ -1214,7 +1218,7 @@ width: 220px; background: #f0eeee; border-right: 1px solid #afafb6; - text-shadow: 0 1px 1px white; + text-shadow: none; padding-bottom: 16px; } .openerp a.oe_logo { @@ -1266,37 +1270,9 @@ color: #7c7bad; } .openerp .oe_secondary_submenu { - padding: 2px 0 8px 0; - margin: 0; -} -.openerp .oe_secondary_submenu li { - position: relative; - margin: 0; - padding: 1px 0 1px 20px !important; - list-style-type: none; -} -.openerp .oe_secondary_submenu li a { - display: block; - color: #4c4c4c; - padding: 2px 4px 2px 0; -} -.openerp .oe_secondary_submenu li .oe_menu_label { - position: absolute; - top: 1px; - right: 1px; - font-size: 10px; - background: #7c7bad; - color: white; - padding: 2px 4px; - margin: 1px 6px 0 0; - border: 1px solid lightgrey; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); - -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); + margin-bottom: 10px !important; + line-height: 1.1em; + margin-top: 3px; } .openerp .oe_secondary_submenu .oe_menu_text { white-space: nowrap; @@ -1304,15 +1280,9 @@ display: inline-block; text-overflow: ellipsis; max-width: 85%; + margin-top: 1px; } -.openerp .oe_secondary_submenu .oe_menu_counter { - float: right; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - margin: 1px; - padding: 1px 4px; - border: none; -} -.openerp .oe_secondary_submenu .oe_menu_counter:hover { +.openerp .oe_secondary_submenu .badge:hover { cursor: pointer; -webkit-transform: scale(1.1); -moz-transform: scale(1.1); @@ -1320,33 +1290,6 @@ -o-transform: scale(1.1); transform: scale(1.1); } -.openerp .oe_secondary_submenu .oe_active { - 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); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2); - background: #7c7bad; -} -.openerp .oe_secondary_submenu .oe_active a { - color: white; -} -.openerp .oe_secondary_submenu .oe_active .oe_menu_label { - background: #eeeeee; - color: #7c7bad; - text-shadow: 0 1px 1px white; - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); -} -.openerp .oe_secondary_submenu .oe_active .oe_menu_counter { - background: #eeeeee; - color: #7c7bad; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.2); -} .openerp .oe_secondary_submenu .oe_menu_toggler:before { width: 0; height: 0; @@ -1371,9 +1314,6 @@ 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; } @@ -1440,6 +1380,7 @@ .openerp .oe_application .oe_breadcrumb_title > * { display: inline-block; overflow: hidden; + font-weight: bold; } .openerp .oe_view_manager { display: table; @@ -1482,6 +1423,7 @@ font-size: 18px; margin: 0; float: left; + line-height: 30px; } .openerp .oe_view_manager table.oe_view_manager_header h2 a { color: #7c7bad; @@ -1652,9 +1594,12 @@ .openerp .oe_view_manager_inline > .oe_view_manager_header, .openerp .oe_view_manager_inlineview > .oe_view_manager_header { display: none; } -.openerp .oe_popup_form > .oe_formview > .oe_form_pager { +.openerp .oe_popup_form .oe_formview .oe_form_pager { display: none !important; } +.openerp .oe_popup_form table label { + font-weight: normal; +} .openerp .oe_popup_list_pager { float: right; } @@ -1680,6 +1625,16 @@ font-size: 12px; line-height: 18px; } +.openerp .oe_searchview input:not([type]), .openerp .oe_searchview input[type="text"], .openerp .oe_searchview input[type="number"] { + width: 156px; + height: 22px; +} +.openerp .oe_searchview input[type="checkbox"] { + margin: 3px 3px 3px 4px; +} +.openerp .oe_searchview select { + margin: 2px 4px 2px 0; +} .openerp .oe_searchview.oe_focused { border-color: #a6a6fe; -moz-box-shadow: 0 1px 2px #a6a6fe inset; @@ -1904,6 +1859,7 @@ box-sizing: border-box; display: table-cell; width: 50%; + padding-left: 2px; } .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_section ul { margin: 0 8px 8px; @@ -1939,7 +1895,7 @@ line-height: 18px; } .openerp .oe_searchview .oe_searchview_drawer form button { - margin: 0 0 8px 0; + margin: 0 0 8px -3px; } .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom { padding: 0 8px 8px 8px; @@ -1967,6 +1923,9 @@ top: 0; right: 5px; } +.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom label { + font-weight: normal; +} .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_dashboard form { display: none; margin-top: 2px; @@ -1994,6 +1953,7 @@ } .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or { visibility: hidden; + margin-left: -14px; } .openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or { opacity: 0.5; @@ -2185,6 +2145,12 @@ background: url(/web/static/src/img/form_sheetbg.png); border-bottom: 1px solid #dddddd; } +.openerp .oe_application .oe_form_sheetbg .oe_subtotal_footer label { + font-weight: bold; +} +.openerp .oe_application .oe_form_sheetbg table label { + font-weight: normal; +} .openerp .oe_application .oe_form_sheet { border: 1px solid #c8c8d3; -moz-box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); @@ -2273,7 +2239,7 @@ padding: 2px 11px 2px 0px !important; } .openerp .oe_form .oe_subtotal_footer label.oe_form_label_help { - font-weight: normal; + font-weight: normal !important; } .openerp .oe_form .oe_form_box_info { background: #ffee99; @@ -2305,7 +2271,8 @@ .openerp .oe_form td.oe_form_group_cell_label label { line-height: 18px; display: block; - min-width: 140px; + min-width: 150px; + font-weight: bold !important; } .openerp .oe_form td.oe_form_group_cell + .oe_form_group_cell { padding: 2px 0 2px 8px; @@ -2318,13 +2285,12 @@ padding-left: 20px; } .openerp .oe_form .oe_form_label_help[for], .openerp .oe_form .oe_form_label[for] { - font-weight: bold; white-space: nowrap; padding-right: 8px; } .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; @@ -2402,6 +2368,18 @@ height: inherit !important; font-size: inherit; } +.openerp .oe_form .oe_title h1, .openerp .oe_form h1 { + font-weight: bold; + font-size: 2em; +} +.openerp .oe_form h2 { + font-size: 1.5em; +} +.openerp .oe_form label { + font-weight: bold; + margin-bottom: 0px; + display: inline; +} .openerp .oe_form .oe_form_field { width: 100%; display: inline-block; @@ -2539,6 +2517,9 @@ margin: 0; padding: 0; } +.openerp .oe_form .oe_form_field_binary { + display: inline-block; +} .openerp .oe_form .oe_form_field_image { padding: 0; position: relative; @@ -2570,13 +2551,14 @@ display: inline-block; clear: both; width: 100%; + margin-bottom: -15px; } .openerp .oe_fileupload .oe_add { float: left; position: relative; width: 100%; left: 2px; - top: 7px; + margin: 9px 0; overflow: hidden; } .openerp .oe_fileupload .oe_add button { @@ -2588,9 +2570,6 @@ } .openerp .oe_fileupload .oe_add button.oe_attach { width: 24px; - overflow: hidden; - width: 24px; - overflow: hidden; background: transparent; color: #7c7bad; box-shadow: none; @@ -2639,6 +2618,9 @@ .openerp .oe_fileupload .oe_attachments .oe_attachment:nth-child(even) { background: #f4f5fa; } +.openerp .oe_form_field_many2one { + display: inline-block; +} .openerp .oe_form_field_many2one td:first-child { position: relative; } @@ -2701,9 +2683,13 @@ padding-left: 24px; margin: 0; position: relative; + line-height: normal; + font-size: 100%; + font-weight: normal; } .openerp ul.oe_form_status li > .arrow, .openerp ul.oe_form_status_clickable li > .arrow { width: 17px; + height: 30px; display: inline-block; vertical-align: top; overflow: hidden; @@ -3201,9 +3187,6 @@ .openerp .oe_form_field_many2one .oe_m2o_cm_button { line-height: 18px; } - .openerp .oe_secondary_submenu { - line-height: 14px; - } .openerp .oe_webclient .oe_star_on, .openerp .oe_webclient .oe_star_off { top: 0px; } @@ -3451,6 +3434,151 @@ div.ui-widget-overlay { overflow: hidden !important; } } + +.nav li > a { + padding: 3px 4px 2px 18px; + color: #4c4c4c; +} +.nav nav-pills.nav-stacked > li > ul { + padding-left: 16px; +} + +.nav-pills > li.active > a, a.list-group-item.active > a { + background-color: #7c7bad; + color: white; + border-radius: 0; +} +.nav-pills > li.active a:hover, .nav-pills > li.active a:focus, a.list-group-item.active a:hover, a.list-group-item.active a:focus { + background-color: #7c7bad; +} +.nav-pills > li.active .badge, a.list-group-item.active .badge { + background-color: white; + color: #7c7bad; + text-shadow: none; +} + +.badge { + font-weight: normal; + font-size: 11px; + background-color: #7c7bad; +} + +button, body { + line-height: normal; +} + +h1, h2 { + font-weight: bold; +} + +h3 { + font-size: 1.17em; + font-weight: bold; +} + +p { + display: block; + -webkit-margin-before: 1em; + -webkit-margin-after: 1em; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} + +pre { + background-color: white; + border: none; + padding: 10px 0 3px 0; +} + +.jqstooltip { + height: auto !important; + width: auto !important; +} + +h5 { + font-weight: bold; + font-size: smaller; +} + +.oe_form .oe_subtype label, .oe_subtype label { + font-weight: normal; +} + +.oe_msg_subtype_check { + margin: 3px 3px 0 !important; +} + +.oe_view_manager_new .oe_form_nosheet { + margin-top: 8px; +} +.oe_view_manager_new .oe_form_nosheet .oe_form_label { + font-weight: normal; +} + +.navbar { + min-height: 32px; + margin-bottom: 0px; + border: none; + z-index: 1; + background-color: #414141; + 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); + background-image: -ms-linear-gradient(top, #646060, #262626); + background-image: -o-linear-gradient(top, #646060, #262626); + background-image: linear-gradient(to bottom, #646060, #262626); +} + +.navbar-default .navbar-nav li a:hover, .navbar-default .navbar-nav li a:focus { + background: rgba(0, 0, 0, 0.3); +} +.navbar-default .navbar-nav .open > a, .navbar-default .navbar-nav a:hover, .navbar-default .navbar-nav a:focus { + background: rgba(0, 0, 0, 0.3) !important; +} +.navbar-default .navbar-nav .dropdown > a .caret { + border-top-color: #777777 !important; + border-bottom-color: #777777 !important; +} + +.navbar-nav li a { + padding: 4px 32px 4px 12px; +} + +.dropdown-menu { + font-size: 13px; + padding: 4px 0; + background: #333333 !important; + background: rgba(37, 37, 37, 0.9) !important; + border-color: #999999; + border-color: rgba(0, 0, 0, 0.2); + background-color: #414141; + text-shadow: none; + 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); + background-image: -ms-linear-gradient(top, #646060, #262626); + background-image: -o-linear-gradient(top, #646060, #262626); + background-image: linear-gradient(to bottom, #646060, #262626); + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +.dropdown-menu li a, .dropdown-menu li a:hover, .dropdown-menu li a:focus { + color: #eeeeee; +} + +.ui-icon { + width: 18px; + height: 18px; +} + +input[type="radio"], input[type="checkbox"] { + margin-right: 4px; + margin-left: 4px; +} + .blockUI.blockOverlay { background-color: black; opacity: 0.6; diff --git a/addons/web/static/src/css/base.sass b/addons/web/static/src/css/base.sass index 57d2a855512..e9a51370192 100644 --- a/addons/web/static/src/css/base.sass +++ b/addons/web/static/src/css/base.sass @@ -204,6 +204,8 @@ $sheet-padding: 16px vertical-align: middle h4 margin: 4px 0 + font-weight: bold + font-size: inherit // }}} // Button style {{{ a.button:link, a.button:visited, button, input[type='submit'], .ui-dialog-buttonpane .ui-dialog-buttonset .ui-button @@ -263,6 +265,7 @@ $sheet-padding: 16px // Modal box &.ui-dialog display: none + height: auto !important padding: 6px //overflow: hidden background-color: rgba(60,60,60,0.7) @@ -287,6 +290,7 @@ $sheet-padding: 16px border: none .ui-dialog-content background: white + width: auto !important .ui-dialog-buttonpane border-top: 1px solid #e0e0e0 background: #f5f7f9 @@ -467,7 +471,16 @@ $sheet-padding: 16px max-width: 650px .oe_grey color: #aaa - + // Added for generic error message and customize bootstrap3
,
+ .oe_error_detail + hr + display: block + -webkit-margin-before: 0.5em + -webkit-margin-after: 0.5em + -webkit-margin-start: auto + -webkit-margin-end: auto + border-style: inset + border-width: 1px // }}} // Tags (for many2many tags, among others) {{{ @@ -589,6 +602,10 @@ $sheet-padding: 16px cursor: default .oe_notebook_page padding: 0 + //Customize label weight according bootstrap3 + > label:not([for]) + font-weight: normal !important + // End of customize div.ui-tabs padding: 3px 0px 3px 0px .ui-tabs-hide @@ -811,7 +828,7 @@ $sheet-padding: 16px text-align: center a color: #eee - margin: 0 8px + margin: 0 6px &:hover text-decoration: underline span @@ -854,11 +871,7 @@ $sheet-padding: 16px // }}} // Top Menu {{{ - .oe_topbar - width: 100% - height: 32px - background-color: #414141 - @include vertical-gradient(#646060, #262626) + .navbar .oe_topbar_anonymous_login background-color: #dc5f59 color: #eeeeee @@ -867,7 +880,7 @@ $sheet-padding: 16px display: block padding: 5px 10px 7px line-height: 20px - height: 20px + height: 30px text-decoration: none color: white background: transparent @@ -879,7 +892,7 @@ $sheet-padding: 16px @include box-shadow(0 1px 2px rgba(0,0,0,0.2) inset) .oe_topbar_item display: block - padding: 5px 10px 7px + padding: 5px 10px 26px line-height: 20px height: 20px text-decoration: none @@ -902,7 +915,7 @@ $sheet-padding: 16px vertical-align: top .oe_dropdown_arrow:after border-top: 4px solid white - .oe_dropdown_menu + .dropdown_menu top: 32px background: #333 background: rgba(37,37,37,0.9) @@ -922,17 +935,17 @@ $sheet-padding: 16px @include box-shadow(none) .oe_topbar_name max-width: 150px - overflow: hidden display: inline-block - max-height: 100% + height: 15px // Customize to manage caret when topbar_name is over sized. text-overflow: ellipsis white-space: nowrap + overflow: hidden // Customize to bring ellipsis when topbar_name is over sized. // oe menu is the list of the buttons on the left side of the bar. // So why aren't the buttons oe_topbar_items ? This sad state of affairs // is a leftover from an uncomplete refactoring when the left and top menu // were merged. You are welcome to refactor and clean this up - .oe_menu + .navbar-nav float: left padding: 0 margin: 0 @@ -946,11 +959,11 @@ $sheet-padding: 16px color: #eeeeee > a display: block - padding: 5px 10px 7px + padding: 5px 10px 26px !important line-height: 20px height: 20px text-decoration: none - color: #eee + color: #eee !important vertical-align: top text-shadow: 0 1px 1px rgba(0,0,0,0.2) @include transition(all 0.2s ease-out) @@ -959,7 +972,7 @@ $sheet-padding: 16px text-shadow: black 0px 0px 3px color: white @include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset) - > .oe_active + > .active background: rgba(0,0,0,0.30) text-shadow: black 0px 0px 3px @include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset) @@ -987,7 +1000,7 @@ $sheet-padding: 16px width: 220px background: #f0eeee border-right: 1px solid $tag-border - text-shadow: 0 1px 1px white + text-shadow: none padding-bottom: 16px a.oe_logo position: relative @@ -1030,62 +1043,20 @@ $sheet-padding: 16px margin-left: 8px color: $link-color .oe_secondary_submenu - padding: 2px 0 8px 0 - margin: 0 - li - position: relative - margin: 0 - padding: 1px 0 1px 20px !important - list-style-type: none - a - display: block - color: #4c4c4c - padding: 2px 4px 2px 0 - .oe_menu_label - position: absolute - top: 1px - right: 1px - font-size: 10px - background: $link-color - color: white - padding: 2px 4px - margin: 1px 6px 0 0 - border: 1px solid lightGray - 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)) + margin-bottom: 10px !important + line-height: 1.1em + margin-top: 3px .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) - margin: 1px - padding: 1px 4px - border: none + margin-top: 1px + .badge &:hover cursor: pointer @include transform(scale(1.1)) - .oe_active - border-top: 1px solid lightGray - border-bottom: 1px solid #dedede - text-shadow: 0 1px 1px rgba(0,0,0,0.2) - @include box-shadow((inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2))) - background: $link-color - a - color: white - .oe_menu_label - background: #eee - color: $link-color - text-shadow: 0 1px 1px white - @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.2)) - .oe_menu_counter - background: #eee - color: $link-color - @include box-shadow(inset 0 1px 2px rgba(0, 0, 0, 0.2)) .oe_menu_toggler:before width: 0 height: 0 @@ -1107,11 +1078,8 @@ $sheet-padding: 16px 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 {{{ .oe_about @@ -1157,6 +1125,7 @@ $sheet-padding: 16px .oe_breadcrumb_title > * display: inline-block overflow: hidden + font-weight: bold // }}} // ViewManager common {{{ .oe_view_manager @@ -1195,6 +1164,7 @@ $sheet-padding: 16px font-size: 18px margin: 0 float: left + line-height: 30px a color: $link-color .oe_dropdown_menu @@ -1323,8 +1293,13 @@ $sheet-padding: 16px display: none // }}} // FormPopup {{{ - .oe_popup_form > .oe_formview > .oe_form_pager - display: none !important + .oe_popup_form + .oe_formview .oe_form_pager + display: none !important + // Customize label weight for popup wizard appear from another wizard according bootstrap3 + table label + font-weight: normal + // End of customize .oe_popup_list_pager float: right // }}} @@ -1345,6 +1320,15 @@ $sheet-padding: 16px height: 14px font-size: 12px line-height: 18px + //Customize searchview input, select + input:not([type]), input[type="text"], input[type="number"] + width: 156px + height: 22px + input[type="checkbox"] + margin: 3px 3px 3px 4px + select + margin: 2px 4px 2px 0 + //End of customize &.oe_focused border-color: $tag-border-selected @include box-shadow(0 1px 2px $tag-border-selected inset) @@ -1509,6 +1493,7 @@ $sheet-padding: 16px @include box-sizing(border) display: table-cell width: 50% + padding-left: 2px // Managed padding-left according bootstrap3 ul margin: 0 8px 8px padding: 0 @@ -1538,7 +1523,7 @@ $sheet-padding: 16px margin: 4px 0 line-height: 18px button - margin: 0 0 8px 0 + margin: 0 0 8px -3px // Managed margin-left according bootstrap3 .oe_searchview_custom padding: 0 8px 8px 8px div @@ -1558,6 +1543,10 @@ $sheet-padding: 16px position: absolute top: 0 right: 5px + //Customize for searchview label + label + font-weight: normal + //End of Customize .oe_searchview_dashboard form display: none @@ -1583,9 +1572,10 @@ $sheet-padding: 16px white-space: nowrap &:first-child .searchview_extended_prop_or visibility: hidden + margin-left: -14px .searchview_extended_prop_or opacity: 0.5 - margin-left: -14px + margin-left: -14px //Customize 'or' in searchview .oe_opened h4:before content: "▾ " @@ -1732,6 +1722,12 @@ $sheet-padding: 16px .oe_form_sheetbg background: url(/web/static/src/img/form_sheetbg.png) border-bottom: 1px solid #ddd + // Customize font weight according bootstrap3 + .oe_subtotal_footer label + font-weight: bold + table label + font-weight: normal + // End of customize .oe_form_sheet border: 1px solid #c8c8d3 //$tag-border @include box-shadow(0 4px 20px rgba(0,0,0,0.15)) @@ -1799,7 +1795,7 @@ $sheet-padding: 16px font-weight: bold !important padding: 2px 11px 2px 0px !important label.oe_form_label_help - font-weight: normal + font-weight: normal !important .oe_form_box_info background: #fe9 border-bottom: 1px solid #cb6 @@ -1826,7 +1822,8 @@ $sheet-padding: 16px label line-height: 18px display: block - min-width: 140px + min-width: 150px + font-weight: bold !important td.oe_form_group_cell + .oe_form_group_cell padding: 2px 0 2px 8px .oe_form_group @@ -1838,7 +1835,6 @@ $sheet-padding: 16px // FormView.label {{{ .oe_form .oe_form_label_help[for], .oe_form_label[for] - font-weight: bold white-space: nowrap padding-right: 8px span @@ -1907,6 +1903,17 @@ $sheet-padding: 16px input height: inherit !important font-size: inherit + // Customize for formview + .oe_title h1, h1 + font-weight: bold + font-size: 2em + h2 + font-size: 1.5em + label + font-weight: bold + margin-bottom: 0px + display: inline + // End of customize .oe_form_field width: 100% display: inline-block @@ -2022,6 +2029,8 @@ $sheet-padding: 16px margin: 0 padding: 0 .oe_form + .oe_form_field_binary + display: inline-block .oe_form_field_image padding: 0 position: relative @@ -2045,12 +2054,13 @@ $sheet-padding: 16px display: inline-block clear: both width: 100% + margin-bottom: -15px .oe_add float: left position: relative width: 100% left: +2px - top: +7px + margin: 9px 0 /* Customize margin according bootstrap3 */ overflow: hidden button display: inline @@ -2060,9 +2070,6 @@ $sheet-padding: 16px vertical-align: middle button.oe_attach width: 24px - overflow: hidden - width: 24px - overflow: hidden background: transparent color: #7C7BAD box-shadow: none @@ -2104,6 +2111,7 @@ $sheet-padding: 16px // }}} // FormView.many2one {{{ .oe_form_field_many2one + display: inline-block td:first-child position: relative span.oe_m2o_drop_down_button @@ -2152,8 +2160,14 @@ $sheet-padding: 16px padding-left: 24px margin: 0 position: relative + // Customize for statusbar label + line-height: normal + font-size: 100% + font-weight: normal + // End of customize > .arrow width: 17px + height: 30px display: inline-block vertical-align: top overflow: hidden @@ -2522,8 +2536,6 @@ $sheet-padding: 16px top: -1px .oe_form_field_many2one .oe_m2o_cm_button line-height: 18px - .oe_secondary_submenu - line-height: 14px .oe_webclient .oe_star_on, .oe_star_off top: 0px @@ -2728,6 +2740,121 @@ div.ui-widget-overlay overflow: hidden !important // }}} +// Customize bootstrap3 for leftbar +.nav + li > a + padding: 3px 4px 2px 18px + color: #4c4c4c + nav-pills.nav-stacked > li > ul + padding-left: 16px +.nav-pills > li.active,a.list-group-item.active + > a + background-color: #7c7bad + color: white + border-radius: 0 + a:hover,a:focus + background-color: #7c7bad + .badge + background-color: white + color: #7c7bad + text-shadow: none +.badge + font-weight: normal + font-size: 11px + background-color: #7c7bad +// End of customize + +// Customize for global tags +button, body + line-height: normal +h1,h2 + font-weight: bold +h3 + font-size: 1.17em + font-weight: bold +p + display: block + -webkit-margin-before: 1em + -webkit-margin-after: 1em + -webkit-margin-start: 0px + -webkit-margin-end: 0px +pre + background-color: #FFFFFF + border: none + padding: 10px 0 3px 0 +// End of customize + +// Customize for kanban tooltip +.jqstooltip + height: auto !important + width: auto !important +// End of kanban tooltip + +// Customize for chatter +h5 + font-weight: bold + font-size: smaller +.oe_form .oe_subtype label, .oe_subtype label + font-weight: normal +.oe_msg_subtype_check + margin: 3px 3px 0 !important +// End of customize + +// Minimized unused white space and label weight for wizard popup +.oe_view_manager_new .oe_form_nosheet + margin-top: 8px + .oe_form_label + font-weight: normal +// End of customize + +// navbar hack {{{ +.navbar + min-height: 32px + margin-bottom: 0px + border: none + z-index: 1 + background-color: #414141 + @include vertical-gradient(#646060, #262626) +.navbar-default + .navbar-nav + li + a:hover,a:focus + background: rgba(0, 0, 0, 0.3) + .open > a,a:hover,a:focus + background: rgba(0, 0, 0, 0.3) !important + .dropdown > a .caret + border-top-color: #777 !important + border-bottom-color: #777 !important +.navbar-nav + li + a + padding: 4px 32px 4px 12px +.dropdown-menu + font-size: 13px + padding: 4px 0 + background: #333333 !important + background: rgba(37, 37, 37, 0.9) !important + border-color: #999999 + border-color: rgba(0, 0, 0, 0.2) + background-color: #414141 + text-shadow: none + @include vertical-gradient(#646060, #262626) + @include radius(3px) + li + a,a:hover,a:focus + color: #eeeeee +// End hack }}} + +// Hack for ui icon {{{ +.ui-icon + width: 18px + height: 18px +// End hack}}} + +input[type="radio"], input[type="checkbox"] + margin-right: 4px + margin-left: 4px + .blockUI.blockOverlay background-color: black opacity: 0.6000000238418579 diff --git a/addons/web/static/src/css/data_export.css b/addons/web/static/src/css/data_export.css index 3fa24265b45..b9b885cd8e9 100644 --- a/addons/web/static/src/css/data_export.css +++ b/addons/web/static/src/css/data_export.css @@ -1,6 +1,11 @@ .openerp .oe_export { width: 100%; } +/* Customize according bootstrap3 */ +.openerp .oe_export label { + font-weight: normal; +} +/* End of customize */ .openerp .oe_export_row tr{ background-color: #FFFFFF; font-size: 0.8em; diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 56559e9edb9..abbd4767361 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -442,10 +442,10 @@ instance.web.DatabaseManager = instance.web.Widget.extend({ self.$el.html(QWeb.render("DatabaseManager", { widget : self })); $('.oe_user_menu_placeholder').append(QWeb.render("DatabaseManager.user_menu",{ widget : self })); $('.oe_secondary_menus_container').append(QWeb.render("DatabaseManager.menu",{ widget : self })); - $('ul.oe_secondary_submenu > li:first').addClass('oe_active'); + $('ul.oe_secondary_submenu > li:first').addClass('active'); $('ul.oe_secondary_submenu > li').bind('click', function (event) { var menuitem = $(this); - menuitem.addClass('oe_active').siblings().removeClass('oe_active'); + menuitem.addClass('active').siblings().removeClass('active'); var form_id =menuitem.find('a').attr('href'); $(form_id).show().siblings().hide(); event.preventDefault(); @@ -969,7 +969,7 @@ instance.web.Menu = instance.web.Widget.extend({ this.needaction_data = data; _.each(this.needaction_data, function (item, menu_id) { var $item = self.$secondary_menus.find('a[data-menu="' + menu_id + '"]'); - $item.find('.oe_menu_counter').remove(); + $item.find('.badge').remove(); if (item.needaction_counter && item.needaction_counter > 0) { $item.append(QWeb.render("Menu.needaction_counter", { widget : item })); } @@ -982,8 +982,8 @@ instance.web.Menu = instance.web.Widget.extend({ reflow: function() { var self = this; this.$el.height('auto').show(); - var $more_container = this.$('.oe_menu_more_container').hide(); - var $more = this.$('.oe_menu_more'); + var $more_container = this.$('#menu_more_container').hide(); + var $more = this.$('#menu_more'); $more.children('li').insertBefore($more_container); var $toplevel_items = this.$el.children('li').not($more_container).hide(); $toplevel_items.each(function() { @@ -1026,8 +1026,8 @@ instance.web.Menu = instance.web.Widget.extend({ } // Activate current main menu - this.$el.find('.oe_active').removeClass('oe_active'); - $main_menu.addClass('oe_active'); + this.$el.find('.active').removeClass('active'); + $main_menu.addClass('active'); // Show current sub menu this.$secondary_menus.find('.oe_secondary_menu').hide(); @@ -1037,13 +1037,13 @@ instance.web.Menu = instance.web.Widget.extend({ this.$secondary_menus.parent('.oe_leftbar').toggle(!!$sub_menu.children().length); // Activate current menu item and show parents - this.$secondary_menus.find('.oe_active').removeClass('oe_active'); + this.$secondary_menus.find('.active').removeClass('active'); if ($main_menu !== $clicked_menu) { $clicked_menu.parents().show(); if ($clicked_menu.is('.oe_menu_toggler')) { $clicked_menu.toggleClass('oe_menu_opened').siblings('.oe_secondary_submenu:first').toggle(); } else { - $clicked_menu.parent().addClass('oe_active'); + $clicked_menu.parent().addClass('active'); } } }, @@ -1129,7 +1129,7 @@ instance.web.Menu = instance.web.Widget.extend({ }, on_menu_click: function(ev) { ev.preventDefault(); - var needaction = $(ev.target).is('div.oe_menu_counter'); + var needaction = $(ev.target).is('div#menu_counter'); this.menu_click($(ev.currentTarget).data('menu'), needaction); }, }); @@ -1143,7 +1143,7 @@ instance.web.UserMenu = instance.web.Widget.extend({ start: function() { var self = this; this._super.apply(this, arguments); - this.$el.on('click', '.oe_dropdown_menu li a[data-menu]', function(ev) { + this.$el.on('click', '.dropdown-menu li a[data-menu]', function(ev) { ev.preventDefault(); var f = self['on_menu_' + $(this).data('menu')]; if (f) { @@ -1304,7 +1304,7 @@ instance.web.Client = instance.web.Widget.extend({ self.action_manager.appendTo(self.$('.oe_application')); }, toggle_bars: function(value) { - this.$('tr:has(td.oe_topbar),.oe_leftbar').toggle(value); + this.$('tr:has(td.navbar),.oe_leftbar').toggle(value); }, has_uncommitted_changes: function() { return false; diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index d62c04b0ecb..81e029f5f87 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -561,8 +561,8 @@ instance.web.TranslationDataBase.include({ }); /** Custom jQuery plugins */ +$.browser = $.browser || {}; if(navigator.appVersion.indexOf("MSIE") !== -1) { - $.browser = $.browser || {}; $.browser.msie = 1; } $.fn.getAttributes = function() { diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index fcfcfb08f8e..c3ef682bfcc 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -71,7 +71,10 @@ my.SearchQuery = B.Collection.extend({ }, add: function (values, options) { options = options || {}; - if (!(values instanceof Array)) { + + if (!values) { + values = []; + } else if (!(values instanceof Array)) { values = [values]; } @@ -87,6 +90,10 @@ my.SearchQuery = B.Collection.extend({ } B.Collection.prototype.add.call(this, model, options); }, this); + // warning: in backbone 1.0+ add is supposed to return the added models, + // but here toggle may delegate to add and return its value directly. + // return value of neither seems actually used but should be tested + // before change, probably return this; }, toggle: function (value, options) { diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 8b985695860..683cdebbbf4 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -5552,23 +5552,23 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ var self = this; var selection_unfolded = []; var selection_folded = []; + var fold_field = this.options.fold_field; var calculation = _.bind(function() { if (this.field.type == "many2one") { - /* :deprecated: fold feature will probably be removed */ - // return self.get_distant_fields().then(function(fields) { - self.distant_fields = {}; - return new instance.web.DataSetSearch(self, self.field.relation, self.build_context(), self.get("evaluated_selection_domain")) - .read_slice(_.union(_.keys(self.distant_fields), ['id']), {}).then(function (records) { - var ids = _.pluck(records, 'id'); - return self.dataset.name_get(ids).then(function (records_name) { - _.each(records, function (record) { - var name = _.find(records_name, function (val) {return val[0] == record.id;})[1]; - if (record.fold && record.id != self.get('value')) { - selection_folded.push([record.id, name]); - } else { - selection_unfolded.push([record.id, name]); - } + return self.get_distant_fields().then(function (fields) { + return new instance.web.DataSetSearch(self, self.field.relation, self.build_context(), self.get("evaluated_selection_domain")) + .read_slice(_.union(_.keys(self.distant_fields), ['id']), {}).then(function (records) { + var ids = _.pluck(records, 'id'); + return self.dataset.name_get(ids).then(function (records_name) { + _.each(records, function (record) { + var name = _.find(records_name, function (val) {return val[0] == record.id;})[1]; + if (fold_field && record[fold_field] && record.id != self.get('value')) { + selection_folded.push([record.id, name]); + } else { + selection_unfolded.push([record.id, name]); + } + }); }); }); }); @@ -5598,10 +5598,13 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ */ get_distant_fields: function() { var self = this; + if (! this.options.fold_field) { + this.distant_fields = {} + } if (this.distant_fields) { return $.when(this.distant_fields); } - return new instance.web.Model(self.field.relation).call("fields_get", [["fold"]]).then(function(fields) { + return new instance.web.Model(self.field.relation).call("fields_get", [[this.options.fold_field]]).then(function(fields) { self.distant_fields = fields; return fields; }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 60a344467c0..ae7a4f279b0 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -320,7 +320,7 @@
Database Management
-