[MERGE] Sync with trunk
bzr revid: tde@openerp.com-20130522105445-3h3sl8chnfhkrdxs bzr revid: tde@openerp.com-20130612121620-qwc9vlva27d195lp bzr revid: tde@openerp.com-20130619125106-fy9jjgsyb3fg04fn bzr revid: tde@openerp.com-20130621094755-t3h5y2s8p838b7u3
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
'name': 'Web',
|
||||
'category': 'Hidden',
|
||||
'version': '7.0.1.0',
|
||||
'version': '1.0',
|
||||
'description':
|
||||
"""
|
||||
OpenERP Web core module.
|
||||
|
@ -9,10 +9,11 @@ OpenERP Web core module.
|
|||
|
||||
This module provides the core of the OpenERP Web Client.
|
||||
""",
|
||||
'depends': [],
|
||||
'depends': ['base'],
|
||||
'auto_install': True,
|
||||
'post_load': 'wsgi_postload',
|
||||
'js' : [
|
||||
"static/src/fixbind.js",
|
||||
"static/lib/datejs/globalization/en-US.js",
|
||||
"static/lib/datejs/core.js",
|
||||
"static/lib/datejs/parser.js",
|
||||
|
@ -76,6 +77,7 @@ This module provides the core of the OpenERP Web Client.
|
|||
"static/test/class.js",
|
||||
"static/test/registry.js",
|
||||
"static/test/form.js",
|
||||
"static/test/data.js",
|
||||
"static/test/list-utils.js",
|
||||
"static/test/formats.js",
|
||||
"static/test/rpc.js",
|
||||
|
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.4 KiB |
|
@ -34,6 +34,9 @@ import openerp
|
|||
|
||||
import session
|
||||
|
||||
import inspect
|
||||
import functools
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
#----------------------------------------------------------
|
||||
|
@ -118,6 +121,13 @@ class WebRequest(object):
|
|||
# we use _ as seprator where RFC2616 uses '-'
|
||||
self.lang = lang.replace('-', '_')
|
||||
|
||||
@contextlib.contextmanager
|
||||
def registry_cr(self):
|
||||
dbname = self.session._db or openerp.addons.web.controllers.main.db_monodb(self)
|
||||
registry = openerp.modules.registry.RegistryManager.get(dbname.lower())
|
||||
with registry.cursor() as cr:
|
||||
yield (registry, cr)
|
||||
|
||||
def reject_nonliteral(dct):
|
||||
if '__ref' in dct:
|
||||
raise ValueError(
|
||||
|
@ -197,10 +207,10 @@ class JsonRequest(WebRequest):
|
|||
else:
|
||||
self.jsonrequest = simplejson.loads(request, object_hook=reject_nonliteral)
|
||||
self.init(self.jsonrequest.get("params", {}))
|
||||
if _logger.isEnabledFor(logging.DEBUG):
|
||||
_logger.debug("--> %s.%s\n%s", method.im_class.__name__, method.__name__, pprint.pformat(self.jsonrequest))
|
||||
#if _logger.isEnabledFor(logging.DEBUG):
|
||||
# _logger.debug("--> %s.%s\n%s", method.im_class.__name__, method.__name__, pprint.pformat(self.jsonrequest))
|
||||
response['id'] = self.jsonrequest.get('id')
|
||||
response["result"] = method(self, **self.params)
|
||||
response["result"] = method(**self.params)
|
||||
except session.AuthenticationError, e:
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
|
@ -292,9 +302,11 @@ class HttpRequest(WebRequest):
|
|||
akw[key] = value
|
||||
else:
|
||||
akw[key] = type(value)
|
||||
_logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw)
|
||||
#_logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw)
|
||||
try:
|
||||
r = method(self, **self.params)
|
||||
r = method(**self.params)
|
||||
except werkzeug.exceptions.HTTPException, e:
|
||||
r = e
|
||||
except Exception, e:
|
||||
_logger.exception("An exception occured during an http request")
|
||||
se = serialize_exception(e)
|
||||
|
@ -304,11 +316,13 @@ class HttpRequest(WebRequest):
|
|||
'data': se
|
||||
}
|
||||
r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps(error)))
|
||||
if self.debug or 1:
|
||||
if isinstance(r, (werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException)):
|
||||
_logger.debug('<-- %s', r)
|
||||
else:
|
||||
_logger.debug("<-- size: %s", len(r))
|
||||
else:
|
||||
if not r:
|
||||
r = werkzeug.wrappers.Response(status=204) # no content
|
||||
if isinstance(r, (werkzeug.wrappers.BaseResponse, werkzeug.exceptions.HTTPException)):
|
||||
_logger.debug('<-- %s', r)
|
||||
else:
|
||||
_logger.debug("<-- size: %s", len(r))
|
||||
return r
|
||||
|
||||
def make_response(self, data, headers=None, cookies=None):
|
||||
|
@ -349,6 +363,23 @@ def httprequest(f):
|
|||
f.exposed = 'http'
|
||||
return f
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Local storage of requests
|
||||
#----------------------------------------------------------
|
||||
from werkzeug.local import LocalStack
|
||||
|
||||
_request_stack = LocalStack()
|
||||
|
||||
def set_request(request):
|
||||
class with_obj(object):
|
||||
def __enter__(self):
|
||||
_request_stack.push(request)
|
||||
def __exit__(self, *args):
|
||||
_request_stack.pop()
|
||||
return with_obj()
|
||||
|
||||
request = _request_stack()
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Controller registration with a metaclass
|
||||
#----------------------------------------------------------
|
||||
|
@ -363,6 +394,19 @@ controllers_path = {}
|
|||
class ControllerType(type):
|
||||
def __init__(cls, name, bases, attrs):
|
||||
super(ControllerType, cls).__init__(name, bases, attrs)
|
||||
|
||||
# create wrappers for old-style methods with req as first argument
|
||||
cls._methods_wrapper = {}
|
||||
for k, v in attrs.items():
|
||||
if inspect.isfunction(v):
|
||||
spec = inspect.getargspec(v)
|
||||
first_arg = spec.args[1] if len(spec.args) >= 2 else None
|
||||
if first_arg in ["req", "request"]:
|
||||
def build_new(nv):
|
||||
return lambda self, *args, **kwargs: nv(self, request, *args, **kwargs)
|
||||
cls._methods_wrapper[k] = build_new(v)
|
||||
|
||||
# store the controller in the controllers list
|
||||
name_class = ("%s.%s" % (cls.__module__, cls.__name__), cls)
|
||||
controllers_class.append(name_class)
|
||||
path = attrs.get('_cp_path')
|
||||
|
@ -380,6 +424,12 @@ class Controller(object):
|
|||
|
||||
return object.__new__(cls)
|
||||
|
||||
def get_wrapped_method(self, name):
|
||||
if name in self.__class__._methods_wrapper:
|
||||
return functools.partial(self.__class__._methods_wrapper[name], self)
|
||||
else:
|
||||
return getattr(self, name)
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Session context manager
|
||||
#----------------------------------------------------------
|
||||
|
@ -487,9 +537,13 @@ class DisableCacheMiddleware(object):
|
|||
|
||||
def session_path():
|
||||
try:
|
||||
username = getpass.getuser()
|
||||
except Exception:
|
||||
username = "unknown"
|
||||
import pwd
|
||||
username = pwd.getpwuid(os.geteuid()).pw_name
|
||||
except ImportError:
|
||||
try:
|
||||
username = getpass.getuser()
|
||||
except Exception:
|
||||
username = "unknown"
|
||||
path = os.path.join(tempfile.gettempdir(), "oe-sessions-" + username)
|
||||
try:
|
||||
os.mkdir(path, 0700)
|
||||
|
@ -608,12 +662,21 @@ class Root(object):
|
|||
method = getattr(c, method_name, None)
|
||||
if method:
|
||||
exposed = getattr(method, 'exposed', False)
|
||||
method = c.get_wrapped_method(method_name)
|
||||
if exposed == 'json':
|
||||
_logger.debug("Dispatch json to %s %s %s", ps, c, method_name)
|
||||
return lambda request: JsonRequest(request).dispatch(method)
|
||||
def fct(_request):
|
||||
_req = JsonRequest(_request)
|
||||
with set_request(_req):
|
||||
return request.dispatch(method)
|
||||
return fct
|
||||
elif exposed == 'http':
|
||||
_logger.debug("Dispatch http to %s %s %s", ps, c, method_name)
|
||||
return lambda request: HttpRequest(request).dispatch(method)
|
||||
def fct(_request):
|
||||
_req = HttpRequest(_request)
|
||||
with set_request(_req):
|
||||
return request.dispatch(method)
|
||||
return fct
|
||||
if method_name != "index":
|
||||
method_name = "index"
|
||||
continue
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#!/usr/bin/python
|
||||
import datetime
|
||||
import babel
|
||||
import dateutil.relativedelta
|
||||
|
|
|
@ -296,6 +296,11 @@
|
|||
// Bind the window resize event when the width or height is auto or %
|
||||
if (/auto|%/.test("" + options.width + options.height))
|
||||
$(window).resize(function() {
|
||||
//Forcefully blurred iframe contentWindow, chrome, IE, safari doesn't trigger blur on window resize and due to which text disappears
|
||||
var contentWindow = editor.$frame[0].contentWindow;
|
||||
if(!$.browser.mozilla && contentWindow){
|
||||
$(contentWindow).trigger('blur');
|
||||
}
|
||||
// CHM Note MonkeyPatch: if the DOM is not remove, refresh the cleditor
|
||||
if(editor.$main.parent().parent().size()) {
|
||||
refresh(editor);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* date.js // English (United States)
|
||||
* date-en-US.js // English (United States)
|
||||
* date-de-DE.js // Deutsch (Deutschland)
|
||||
* date-es-MX.js // français (France)
|
||||
* date-es-MX.js // français (France)
|
||||
*/
|
||||
|
||||
alert(
|
||||
|
@ -17,5 +17,5 @@ alert(
|
|||
" date.js // English (United States)\n" +
|
||||
" date-en-US.js // English (United States)\n" +
|
||||
" date-de-DE.js // Deutsch (Deutschland)\n" +
|
||||
" date-es-MX.js // français (France)\n"
|
||||
" date-es-MX.js // français (France)\n"
|
||||
);
|
Before Width: | Height: | Size: 180 B After Width: | Height: | Size: 87 B |
Before Width: | Height: | Size: 120 B After Width: | Height: | Size: 115 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 107 B |
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 106 B |
Before Width: | Height: | Size: 107 B After Width: | Height: | Size: 97 B |
Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 119 B |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 180 B After Width: | Height: | Size: 87 B |
Before Width: | Height: | Size: 178 B After Width: | Height: | Size: 87 B |
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 130 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 107 B |
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 106 B |
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 118 B |
Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 86 B |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 3.6 KiB |
|
@ -1,5 +1,5 @@
|
|||
repo: 076b192d0d8ab2b92d1dbcfa3da055382f30eaea
|
||||
node: 142c22b230636674a0cee6bc29e6975f0f1600a5
|
||||
node: 7ee0bc7b4e9138f485cdc9ec791961d8ef452f17
|
||||
branch: default
|
||||
latesttag: 0.7
|
||||
latesttagdistance: 9
|
||||
latesttagdistance: 11
|
||||
|
|
|
@ -273,7 +273,7 @@ var py = {};
|
|||
var Special = '[:;.,`@]';
|
||||
var Funny = group(Operator, Bracket, Special);
|
||||
|
||||
var ContStr = group("[uU]?'([^']*)'", '[uU]?"([^"]*)"');
|
||||
var ContStr = group("([uU])?'([^']*)'", '([uU])?"([^"]*)"');
|
||||
|
||||
var PseudoToken = Whitespace + group(Number, Funny, ContStr, Name);
|
||||
|
||||
|
@ -311,7 +311,8 @@ var py = {};
|
|||
} else if (string_pattern.test(token)) {
|
||||
var m = string_pattern.exec(token);
|
||||
tokens.push(create(symbols['(string)'], {
|
||||
value: (m[2] !== undefined ? m[2] : m[3])
|
||||
unicode: !!(m[2] || m[4]),
|
||||
value: (m[3] !== undefined ? m[3] : m[5])
|
||||
}));
|
||||
} else if (token in symbols) {
|
||||
var symbol;
|
||||
|
@ -393,13 +394,14 @@ var py = {};
|
|||
|
||||
switch(val.constructor) {
|
||||
case Object:
|
||||
var out = py.PY_call(py.object);
|
||||
for(var k in val) {
|
||||
if (val.hasOwnProperty(k)) {
|
||||
out[k] = val[k];
|
||||
// TODO: why py.object instead of py.dict?
|
||||
var o = py.PY_call(py.object);
|
||||
for (var prop in val) {
|
||||
if (val.hasOwnProperty(prop)) {
|
||||
o[prop] = val[prop];
|
||||
}
|
||||
}
|
||||
return out;
|
||||
return o;
|
||||
case Array:
|
||||
return py.list.fromJSON(val);
|
||||
}
|
||||
|
@ -521,7 +523,7 @@ var py = {};
|
|||
}
|
||||
};
|
||||
py.PY_getAttr = function (o, attr_name) {
|
||||
return PY_ensurepy(o.__getattribute__(attr_name),attr_name);
|
||||
return PY_ensurepy(o.__getattribute__(attr_name));
|
||||
};
|
||||
py.PY_str = function (o) {
|
||||
var v = o.__str__();
|
||||
|
@ -762,14 +764,7 @@ var py = {};
|
|||
|
||||
// Conversion
|
||||
toJSON: function () {
|
||||
var out = {};
|
||||
for(var k in this) {
|
||||
if (this.hasOwnProperty(k) && !/^__/.test(k)) {
|
||||
var val = this[k];
|
||||
out[k] = val.toJSON ? val.toJSON() : val;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
throw new Error(this.constructor.name + ' can not be converted to JSON');
|
||||
}
|
||||
});
|
||||
var NoneType = py.type('NoneType', null, {
|
||||
|
@ -998,7 +993,7 @@ var py = {};
|
|||
}
|
||||
var t = py.PY_call(py.tuple);
|
||||
for(var i=0; i<ar.length; ++i) {
|
||||
t._values.push(PY_ensurepy(ar[i],i));
|
||||
t._values.push(PY_ensurepy(ar[i]));
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
@ -1032,7 +1027,7 @@ var py = {};
|
|||
if (!d.hasOwnProperty(k)) { continue; }
|
||||
instance.__setitem__(
|
||||
py.str.fromJSON(k),
|
||||
PY_ensurepy(d[k],k));
|
||||
PY_ensurepy(d[k]));
|
||||
}
|
||||
return instance;
|
||||
},
|
||||
|
@ -1108,6 +1103,114 @@ var py = {};
|
|||
});
|
||||
|
||||
|
||||
/**
|
||||
* Implements the decoding of Python string literals (embedded in
|
||||
* JS strings) into actual JS strings. This includes the decoding
|
||||
* of escapes into their corresponding JS
|
||||
* characters/codepoints/whatever.
|
||||
*
|
||||
* The ``unicode`` flags notes whether the literal should be
|
||||
* decoded as a bytestring literal or a unicode literal, which
|
||||
* pretty much only impacts decoding (or not) of unicode escapes
|
||||
* at this point since bytestrings are not technically handled
|
||||
* (everything is decoded to JS "unicode" strings)
|
||||
*
|
||||
* Eventurally, ``str`` could eventually use typed arrays, that'd
|
||||
* be interesting...
|
||||
*/
|
||||
var PY_decode_string_literal = function (str, unicode) {
|
||||
var out = [], code;
|
||||
// Directly maps a single escape code to an output
|
||||
// character
|
||||
var direct_map = {
|
||||
'\\': '\\',
|
||||
'"': '"',
|
||||
"'": "'",
|
||||
'a': '\x07',
|
||||
'b': '\x08',
|
||||
'f': '\x0c',
|
||||
'n': '\n',
|
||||
'r': '\r',
|
||||
't': '\t',
|
||||
'v': '\v'
|
||||
};
|
||||
|
||||
for (var i=0; i<str.length; ++i) {
|
||||
if (str[i] !== '\\') {
|
||||
out.push(str[i]);
|
||||
continue;
|
||||
}
|
||||
var escape = str[i+1];
|
||||
if (escape in direct_map) {
|
||||
out.push(direct_map[escape]);
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (escape) {
|
||||
// Ignored
|
||||
case '\n': ++i; continue;
|
||||
// Character named name in the Unicode database (Unicode only)
|
||||
case 'N':
|
||||
if (!unicode) { break; }
|
||||
throw Error("SyntaxError: \\N{} escape not implemented");
|
||||
case 'u':
|
||||
if (!unicode) { break; }
|
||||
var uni = str.slice(i+2, i+6);
|
||||
if (!/[0-9a-f]{4}/i.test(uni)) {
|
||||
throw new Error([
|
||||
"SyntaxError: (unicode error) 'unicodeescape' codec",
|
||||
" can't decode bytes in position ",
|
||||
i, "-", i+4,
|
||||
": truncated \\uXXXX escape"
|
||||
].join(''));
|
||||
}
|
||||
code = parseInt(uni, 16);
|
||||
out.push(String.fromCharCode(code));
|
||||
// escape + 4 hex digits
|
||||
i += 5;
|
||||
continue;
|
||||
case 'U':
|
||||
if (!unicode) { break; }
|
||||
// TODO: String.fromCodePoint
|
||||
throw Error("SyntaxError: \\U escape not implemented");
|
||||
case 'x':
|
||||
// get 2 hex digits
|
||||
var hex = str.slice(i+2, i+4);
|
||||
if (!/[0-9a-f]{2}/i.test(hex)) {
|
||||
if (!unicode) {
|
||||
throw new Error('ValueError: invalid \\x escape');
|
||||
}
|
||||
throw new Error([
|
||||
"SyntaxError: (unicode error) 'unicodeescape'",
|
||||
" codec can't decode bytes in position ",
|
||||
i, '-', i+2,
|
||||
": truncated \\xXX escape"
|
||||
].join(''))
|
||||
}
|
||||
code = parseInt(hex, 16);
|
||||
out.push(String.fromCharCode(code));
|
||||
// skip escape + 2 hex digits
|
||||
i += 3;
|
||||
continue;
|
||||
default:
|
||||
// Check if octal
|
||||
if (!/[0-8]/.test(escape)) { break; }
|
||||
var r = /[0-8]{1,3}/g;
|
||||
r.lastIndex = i+1;
|
||||
var m = r.exec(str);
|
||||
var oct = m[0];
|
||||
code = parseInt(oct, 8);
|
||||
out.push(String.fromCharCode(code));
|
||||
// skip matchlength
|
||||
i += oct.length;
|
||||
continue;
|
||||
}
|
||||
out.push('\\');
|
||||
}
|
||||
|
||||
return out.join('');
|
||||
};
|
||||
// All binary operators with fallbacks, so they can be applied generically
|
||||
var PY_operators = {
|
||||
'==': ['eq', 'eq', function (a, b) { return a === b; }],
|
||||
|
@ -1217,7 +1320,8 @@ var py = {};
|
|||
}
|
||||
return PY_ensurepy(val, expr.value);
|
||||
case '(string)':
|
||||
return py.str.fromJSON(expr.value);
|
||||
return py.str.fromJSON(PY_decode_string_literal(
|
||||
expr.value, expr.unicode));
|
||||
case '(number)':
|
||||
return py.float.fromJSON(expr.value);
|
||||
case '(constant)':
|
||||
|
|
|
@ -579,6 +579,9 @@
|
|||
.openerp .oe_tags .text-wrap textarea {
|
||||
width: 100% !important;
|
||||
}
|
||||
.openerp .oe_tags .text-core {
|
||||
min-height: 22px;
|
||||
}
|
||||
.openerp .oe_tags .text-core .text-wrap .text-dropdown .text-list .text-suggestion em {
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
|
@ -688,7 +691,7 @@
|
|||
cursor: pointer;
|
||||
}
|
||||
.openerp .oe_dropdown_toggle {
|
||||
color: #4c4c4c;
|
||||
color: #2b2b2b;
|
||||
font-weight: normal;
|
||||
}
|
||||
.openerp .oe_dropdown_hover:hover .oe_dropdown_menu, .openerp .oe_dropdown_menu.oe_opened {
|
||||
|
@ -698,7 +701,6 @@
|
|||
display: none;
|
||||
position: absolute;
|
||||
top: 26px;
|
||||
left: 0;
|
||||
z-index: 3;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
@ -1475,6 +1477,9 @@
|
|||
margin: 0px auto;
|
||||
text-align: center;
|
||||
}
|
||||
.openerp .oe_view_manager table.oe_view_manager_header .oe_view_manager_sidebar .oe_dropdown_arrow:after {
|
||||
opacity: 0.9;
|
||||
}
|
||||
.openerp .oe_view_manager table.oe_view_manager_header td {
|
||||
line-height: 26px;
|
||||
}
|
||||
|
@ -1692,14 +1697,14 @@
|
|||
top: 0;
|
||||
right: 18px;
|
||||
width: 15px;
|
||||
height: 100%;
|
||||
height: 24px;
|
||||
background: url(../img/search_reset.gif) center center no-repeat;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_unfold_drawer {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
height: 24px;
|
||||
padding: 0 7px 0 4px;
|
||||
color: #cccccc;
|
||||
cursor: pointer;
|
||||
|
@ -1748,7 +1753,7 @@
|
|||
}
|
||||
.openerp .oe_searchview .oe_searchview_facets {
|
||||
min-height: 22px;
|
||||
margin-left: 15px;
|
||||
margin: 0 35px 0 15px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_facets * {
|
||||
vertical-align: top;
|
||||
|
@ -1756,7 +1761,6 @@
|
|||
line-height: 17px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_facets .oe_searchview_facet {
|
||||
height: 18px;
|
||||
margin: 1px 0;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
@ -1835,6 +1839,7 @@
|
|||
display: block;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer {
|
||||
cursor: default;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
margin-top: 4px;
|
||||
|
@ -1862,12 +1867,12 @@
|
|||
margin: 0;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer h3 {
|
||||
margin: 8px 4px 4px 12px;
|
||||
margin: 8px 4px 4px 0px;
|
||||
color: #7c7bad;
|
||||
font-size: 13px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer h4, .openerp .oe_searchview .oe_searchview_drawer h4 * {
|
||||
margin: 0;
|
||||
margin: 0 0 0 2px;
|
||||
cursor: pointer;
|
||||
font-weight: normal;
|
||||
display: inline-block;
|
||||
|
@ -1944,6 +1949,12 @@
|
|||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom {
|
||||
padding: 0 8px 8px 8px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom div {
|
||||
padding: 0;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom div h4 {
|
||||
margin: 0;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_custom form {
|
||||
display: none;
|
||||
}
|
||||
|
@ -1981,7 +1992,6 @@
|
|||
padding: 0;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
|
@ -2138,6 +2148,15 @@
|
|||
.openerp .oe_form_readonly .oe_form .oe_form_field_date {
|
||||
width: auto;
|
||||
}
|
||||
.openerp .oe_form_readonly .oe_form_field_boolean.boolean {
|
||||
position: relative;
|
||||
top: -20px;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
z-index: 10000;
|
||||
backgroundColor: "#fff";
|
||||
opacity: 0;
|
||||
}
|
||||
.openerp .oe_form_nosheet {
|
||||
margin: 16px;
|
||||
}
|
||||
|
@ -2376,6 +2395,9 @@
|
|||
.openerp .oe_form .oe_form_field_selection select {
|
||||
width: 100%;
|
||||
}
|
||||
.openerp .oe_form .oe_notebook_page .oe_form_field_text textarea {
|
||||
min-height: 96px;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_text.oe_inline, .openerp .oe_form .oe_form_field_text.oe_inline > textarea {
|
||||
width: 500px;
|
||||
}
|
||||
|
@ -2490,6 +2512,10 @@
|
|||
margin-bottom: 32px;
|
||||
text-align: justify;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_html .oe_input_icon {
|
||||
float: right;
|
||||
margin: 4px 7px;
|
||||
}
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_integer input {
|
||||
width: 6em;
|
||||
}
|
||||
|
@ -2978,7 +3004,6 @@
|
|||
position: relative;
|
||||
}
|
||||
.openerp .oe_list_content th.oe_sortable div:after {
|
||||
float: right;
|
||||
margin-right: 6px;
|
||||
content: "";
|
||||
margin-top: 7px;
|
||||
|
@ -2988,6 +3013,7 @@
|
|||
visibility: hidden;
|
||||
}
|
||||
.openerp .oe_list_content th.sortup div:after {
|
||||
float: right;
|
||||
visibility: visible;
|
||||
filter: alpha(opacity=60);
|
||||
opacity: 0.6;
|
||||
|
@ -2996,6 +3022,7 @@
|
|||
min-width: 70px;
|
||||
}
|
||||
.openerp .oe_list_content th.sortdown div:after {
|
||||
float: right;
|
||||
border-bottom: none;
|
||||
border-left: 4px solid transparent;
|
||||
border-right: 4px solid transparent;
|
||||
|
|
|
@ -511,9 +511,11 @@ $sheet-padding: 16px
|
|||
width: 100% !important
|
||||
textarea
|
||||
width: 100% !important
|
||||
.text-core .text-wrap .text-dropdown .text-list .text-suggestion em
|
||||
font-style: italic
|
||||
text-decoration: none
|
||||
.text-core
|
||||
min-height: 22px
|
||||
.text-wrap .text-dropdown .text-list .text-suggestion em
|
||||
font-style: italic
|
||||
text-decoration: none
|
||||
margin-bottom: 1px
|
||||
// }}}
|
||||
// Tooltips {{{
|
||||
|
@ -597,7 +599,7 @@ $sheet-padding: 16px
|
|||
position: relative
|
||||
cursor: pointer
|
||||
.oe_dropdown_toggle
|
||||
color: #4C4C4C
|
||||
color: #2B2B2B
|
||||
font-weight: normal
|
||||
.oe_dropdown_hover:hover .oe_dropdown_menu, .oe_dropdown_menu.oe_opened
|
||||
display: block
|
||||
|
@ -605,7 +607,6 @@ $sheet-padding: 16px
|
|||
display: none
|
||||
position: absolute
|
||||
top: 26px
|
||||
left: 0
|
||||
z-index: 3
|
||||
margin: 0
|
||||
padding: 0
|
||||
|
@ -1191,6 +1192,8 @@ $sheet-padding: 16px
|
|||
.oe_view_manager_sidebar
|
||||
margin: 0px auto
|
||||
text-align: center
|
||||
.oe_dropdown_arrow:after
|
||||
opacity: 0.9
|
||||
td
|
||||
line-height: 26px
|
||||
h2
|
||||
|
@ -1356,13 +1359,13 @@ $sheet-padding: 16px
|
|||
top: 0
|
||||
right: 18px
|
||||
width: 15px
|
||||
height: 100%
|
||||
height: 24px
|
||||
background: url(../img/search_reset.gif) center center no-repeat
|
||||
.oe_searchview_unfold_drawer
|
||||
position: absolute
|
||||
top: 0
|
||||
right: 0
|
||||
height: 100%
|
||||
height: 24px
|
||||
padding: 0 7px 0 4px
|
||||
color: #ccc
|
||||
cursor: pointer
|
||||
|
@ -1395,13 +1398,12 @@ $sheet-padding: 16px
|
|||
|
||||
.oe_searchview_facets
|
||||
min-height: 22px
|
||||
margin-left: 15px
|
||||
margin: 0 35px 0 15px
|
||||
*
|
||||
vertical-align: top
|
||||
display: inline-block
|
||||
line-height: 17px
|
||||
.oe_searchview_facet
|
||||
height: 18px
|
||||
margin: 1px 0
|
||||
font-size: 11px
|
||||
&:focus
|
||||
|
@ -1423,7 +1425,7 @@ $sheet-padding: 16px
|
|||
border-color: $tag-border-selected
|
||||
@include box-shadow(0 0 3px 1px $tag-border-selected)
|
||||
.oe_facet_values
|
||||
background: #f0f0fa
|
||||
background: $tag-bg-light
|
||||
@include radius(0 3px 3px 0)
|
||||
.oe_facet_category, .oe_facet_value
|
||||
height: 18px
|
||||
|
@ -1462,6 +1464,7 @@ $sheet-padding: 16px
|
|||
display: block
|
||||
|
||||
.oe_searchview_drawer
|
||||
cursor: default
|
||||
position: absolute
|
||||
z-index: 2
|
||||
// detach drawer from field slightly
|
||||
|
@ -1483,11 +1486,11 @@ $sheet-padding: 16px
|
|||
border-top: none
|
||||
margin: 0
|
||||
h3
|
||||
margin: 8px 4px 4px 12px
|
||||
margin: 8px 4px 4px 0px
|
||||
color: $section-title-color
|
||||
font-size: 13px
|
||||
h4, h4 *
|
||||
margin: 0
|
||||
margin: 0 0 0 2px
|
||||
cursor: pointer
|
||||
font-weight: normal
|
||||
display: inline-block
|
||||
|
@ -1543,6 +1546,10 @@ $sheet-padding: 16px
|
|||
margin: 0 0 8px 0
|
||||
.oe_searchview_custom
|
||||
padding: 0 8px 8px 8px
|
||||
div
|
||||
padding: 0
|
||||
h4
|
||||
margin: 0
|
||||
form
|
||||
display: none
|
||||
li
|
||||
|
@ -1575,7 +1582,6 @@ $sheet-padding: 16px
|
|||
list-style: none
|
||||
padding: 0
|
||||
li
|
||||
cursor: pointer
|
||||
position: relative
|
||||
list-style: none
|
||||
margin: 0
|
||||
|
@ -1695,6 +1701,15 @@ $sheet-padding: 16px
|
|||
display: none !important
|
||||
.oe_form .oe_form_field_date
|
||||
width: auto
|
||||
.oe_form_field_boolean.boolean
|
||||
position: relative
|
||||
top: -20px
|
||||
width: 14px
|
||||
height: 14px
|
||||
z-index: 10000
|
||||
// IE needs a color in order for the layer to respond to mouse events
|
||||
backgroundColor: "#fff"
|
||||
opacity: 0
|
||||
// Sheet and padding
|
||||
.oe_form_nosheet
|
||||
margin: 16px
|
||||
|
@ -1889,6 +1904,8 @@ $sheet-padding: 16px
|
|||
.oe_form_field_text textarea,
|
||||
.oe_form_field_selection select
|
||||
width: 100%
|
||||
.oe_notebook_page .oe_form_field_text textarea
|
||||
min-height: 96px
|
||||
.oe_form_field_text.oe_inline, .oe_form_field_text.oe_inline > textarea
|
||||
width: 500px
|
||||
h1, h2, h3, h4, h5, h6
|
||||
|
@ -1974,6 +1991,9 @@ $sheet-padding: 16px
|
|||
margin-top: 32px
|
||||
margin-bottom: 32px
|
||||
text-align: justify
|
||||
.oe_form_field_html .oe_input_icon
|
||||
float: right
|
||||
margin: 4px 7px
|
||||
|
||||
.oe_form_editable
|
||||
.oe_form
|
||||
|
@ -2357,7 +2377,6 @@ $sheet-padding: 16px
|
|||
th.oe_sortable div
|
||||
position: relative
|
||||
th.oe_sortable div:after
|
||||
float: right
|
||||
margin-right: 6px
|
||||
content: ""
|
||||
margin-top: 7px
|
||||
|
@ -2366,11 +2385,13 @@ $sheet-padding: 16px
|
|||
border-color: #000 transparent
|
||||
visibility: hidden
|
||||
th.sortup div:after
|
||||
float: right
|
||||
visibility: visible
|
||||
@include opacity(0.6)
|
||||
.oe_list_header_many2many_tags
|
||||
min-width: 70px
|
||||
th.sortdown div:after
|
||||
float: right
|
||||
border-bottom: none
|
||||
border-left: 4px solid transparent
|
||||
border-right: 4px solid transparent
|
||||
|
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 782 B |
Before Width: | Height: | Size: 395 B After Width: | Height: | Size: 337 B |
Before Width: | Height: | Size: 486 B After Width: | Height: | Size: 419 B |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.7 KiB |