merge upstream
bzr revid: chs@openerp.com-20121010092351-h1c696eajfv1xfsn
This commit is contained in:
commit
f500b17988
|
@ -1,6 +1,13 @@
|
|||
OpenERP Web
|
||||
-----------
|
||||
|
||||
The OpenERP Web Client supports the following web browsers:
|
||||
|
||||
* Internet Explorer 9+
|
||||
* Google Chrome 22+
|
||||
* Firefox 13+
|
||||
* Any browser using the latest version of Chrome Frame
|
||||
|
||||
To build the documentation use:
|
||||
|
||||
$ make doc
|
||||
|
|
|
@ -227,6 +227,8 @@ def module_installed_bypass_session(dbname):
|
|||
return sorted_modules
|
||||
|
||||
def module_boot(req):
|
||||
return [m for m in req.config.server_wide_modules if m in openerpweb.addons_manifest]
|
||||
# TODO the following will be enabled once we separate the module code and translation loading
|
||||
serverside = []
|
||||
dbside = []
|
||||
for i in req.config.server_wide_modules:
|
||||
|
@ -531,6 +533,20 @@ def parse_context(context, session):
|
|||
except ValueError:
|
||||
return common.nonliterals.Context(session, context)
|
||||
|
||||
|
||||
def _local_web_translations(trans_file):
|
||||
messages = []
|
||||
try:
|
||||
with open(trans_file) as t_file:
|
||||
po = babel.messages.pofile.read_po(t_file)
|
||||
except Exception:
|
||||
return
|
||||
for x in po:
|
||||
if x.id and x.string and "openerp-web" in x.auto_comments:
|
||||
messages.append({'id': x.id, 'string': x.string})
|
||||
return messages
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# OpenERP Web web Controllers
|
||||
#----------------------------------------------------------
|
||||
|
@ -552,7 +568,27 @@ html_template = """<!DOCTYPE html>
|
|||
});
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
<body>
|
||||
<!--[if lte IE 8]>
|
||||
<script type="text/javascript"
|
||||
src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
|
||||
<script>
|
||||
var test = function() {
|
||||
CFInstall.check({
|
||||
mode: "overlay"
|
||||
});
|
||||
};
|
||||
if (window.localStorage && false) {
|
||||
if (! localStorage.getItem("hasShownGFramePopup")) {
|
||||
test();
|
||||
localStorage.setItem("hasShownGFramePopup", true);
|
||||
}
|
||||
} else {
|
||||
test();
|
||||
}
|
||||
</script>
|
||||
<![endif]-->
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
|
@ -576,6 +612,7 @@ class Home(openerpweb.Controller):
|
|||
def login(self, req, db, login, key):
|
||||
return login_and_redirect(req, db, login, key)
|
||||
|
||||
|
||||
class WebClient(openerpweb.Controller):
|
||||
_cp_path = "/web/webclient"
|
||||
|
||||
|
@ -658,41 +695,53 @@ class WebClient(openerpweb.Controller):
|
|||
last_modified, checksum)
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def translations(self, req, mods, lang):
|
||||
lang_model = req.session.model('res.lang')
|
||||
ids = lang_model.search([("code", "=", lang)])
|
||||
if ids:
|
||||
lang_obj = lang_model.read(ids[0], ["direction", "date_format", "time_format",
|
||||
"grouping", "decimal_point", "thousands_sep"])
|
||||
else:
|
||||
lang_obj = None
|
||||
def bootstrap_translations(self, req, mods):
|
||||
""" Load local translations from *.po files, as a temporary solution
|
||||
until we have established a valid session. This is meant only
|
||||
for translating the login page and db management chrome, using
|
||||
the browser's language. """
|
||||
lang = req.httprequest.accept_languages.best or 'en'
|
||||
# For performance reasons we only load a single translation, so for
|
||||
# sub-languages (that should only be partially translated) we load the
|
||||
# main language PO instead - that should be enough for the login screen.
|
||||
if '-' in lang: # RFC2616 uses '-' separators for sublanguages
|
||||
lang = lang.split('-')[0]
|
||||
|
||||
if "_" in lang:
|
||||
separator = "_"
|
||||
else:
|
||||
separator = "@"
|
||||
langs = lang.split(separator)
|
||||
langs = [separator.join(langs[:x]) for x in range(1, len(langs) + 1)]
|
||||
|
||||
transs = {}
|
||||
translations_per_module = {}
|
||||
for addon_name in mods:
|
||||
transl = {"messages":[]}
|
||||
transs[addon_name] = transl
|
||||
addons_path = openerpweb.addons_manifest[addon_name]['addons_path']
|
||||
for l in langs:
|
||||
f_name = os.path.join(addons_path, addon_name, "i18n", l + ".po")
|
||||
if not os.path.exists(f_name):
|
||||
continue
|
||||
try:
|
||||
with open(f_name) as t_file:
|
||||
po = babel.messages.pofile.read_po(t_file)
|
||||
except Exception:
|
||||
continue
|
||||
for x in po:
|
||||
if x.id and x.string and "openerp-web" in x.auto_comments:
|
||||
transl["messages"].append({'id': x.id, 'string': x.string})
|
||||
return {"modules": transs,
|
||||
"lang_parameters": lang_obj}
|
||||
f_name = os.path.join(addons_path, addon_name, "i18n", lang + ".po")
|
||||
if not os.path.exists(f_name):
|
||||
continue
|
||||
translations_per_module[addon_name] = {'messages': _local_web_translations(f_name)}
|
||||
|
||||
return {"modules": translations_per_module,
|
||||
"lang_parameters": None}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def translations(self, req, mods, lang):
|
||||
res_lang = req.session.model('res.lang')
|
||||
ids = res_lang.search([("code", "=", lang)])
|
||||
lang_params = None
|
||||
if ids:
|
||||
lang_params = res_lang.read(ids[0], ["direction", "date_format", "time_format",
|
||||
"grouping", "decimal_point", "thousands_sep"])
|
||||
|
||||
# Regional languages (ll_CC) must inherit/override their parent lang (ll), but this is
|
||||
# done server-side when the language is loaded, so we only need to load the user's lang.
|
||||
ir_translation = req.session.model('ir.translation')
|
||||
translations_per_module = {}
|
||||
messages = ir_translation.search_read([('module','in',mods),('lang','=',lang),
|
||||
('comments','like','openerp-web'),('value','!=',False),
|
||||
('value','!=','')],
|
||||
['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'],
|
||||
'string': m['value']} \
|
||||
for m in msg_group)
|
||||
return {"modules": translations_per_module,
|
||||
"lang_parameters": lang_params}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def version_info(self, req):
|
||||
|
@ -767,7 +816,7 @@ class Database(openerpweb.Controller):
|
|||
{'fileToken': int(token)}
|
||||
)
|
||||
except xmlrpclib.Fault, e:
|
||||
return simplejson.dumps([[],[{'error': e.faultCode, 'title': 'backup Database'}]])
|
||||
return simplejson.dumps([[],[{'error': e.faultCode, 'title': 'backup Database'}]])
|
||||
|
||||
@openerpweb.httprequest
|
||||
def restore(self, req, db_file, restore_pwd, new_db):
|
||||
|
@ -1178,8 +1227,8 @@ class DataSet(openerpweb.Controller):
|
|||
def call_button(self, req, model, method, args, domain_id=None, context_id=None):
|
||||
action = self.call_common(req, model, method, args, domain_id, context_id)
|
||||
if isinstance(action, dict) and action.get('type') != '':
|
||||
return {'result': clean_action(req, action)}
|
||||
return {'result': False}
|
||||
return clean_action(req, action)
|
||||
return False
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def exec_workflow(self, req, model, id, signal):
|
||||
|
@ -1565,13 +1614,6 @@ class Binary(openerpweb.Controller):
|
|||
class Action(openerpweb.Controller):
|
||||
_cp_path = "/web/action"
|
||||
|
||||
# For most actions, the type attribute and the model name are the same, but
|
||||
# there are exceptions. This dict is used to remap action type attributes
|
||||
# to the "real" model name when they differ.
|
||||
action_mapping = {
|
||||
"ir.actions.act_url": "ir.actions.url",
|
||||
}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def load(self, req, action_id, do_not_eval=False):
|
||||
Actions = req.session.model('ir.actions.actions')
|
||||
|
@ -1595,11 +1637,10 @@ class Action(openerpweb.Controller):
|
|||
if action_type == 'ir.actions.report.xml':
|
||||
ctx.update({'bin_size': True})
|
||||
ctx.update(context)
|
||||
action_model = self.action_mapping.get(action_type, action_type)
|
||||
action = req.session.model(action_model).read([action_id], False, ctx)
|
||||
action = req.session.model(action_type).read([action_id], False, ctx)
|
||||
if action:
|
||||
value = clean_action(req, action[0], do_not_eval)
|
||||
return {'result': value}
|
||||
return value
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def run(self, req, action_id):
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"Language: es\n"
|
||||
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -15,8 +15,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web/static/src/js/chrome.js:176
|
||||
|
|
|
@ -68,10 +68,13 @@
|
|||
background-color: #f0f0f0;
|
||||
}
|
||||
.openerp thead th {
|
||||
border-right: 1px dotted #afafb6;
|
||||
border-left: 1px solid #dfdfdf;
|
||||
}
|
||||
.openerp thead th:last-child {
|
||||
border-right: none;
|
||||
.openerp thead th:first-child {
|
||||
border-left: none;
|
||||
}
|
||||
.openerp thead th.null {
|
||||
border-left: none;
|
||||
}
|
||||
.openerp th, .openerp td {
|
||||
padding: 0;
|
||||
|
@ -515,6 +518,12 @@
|
|||
.openerp .oe_webclient .oe_star_on {
|
||||
color: gold;
|
||||
}
|
||||
.openerp p.oe_grey {
|
||||
max-width: 650px;
|
||||
}
|
||||
.openerp .oe_grey {
|
||||
color: #aaaaaa;
|
||||
}
|
||||
.openerp .oe_tag {
|
||||
border: 1px solid #afafb6;
|
||||
font-size: 11px;
|
||||
|
@ -1081,9 +1090,8 @@
|
|||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
|
||||
}
|
||||
.openerp .oe_menu > li > .oe_active {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
text-shadow: black 0px 0px 3px;
|
||||
font-weight: bold;
|
||||
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) inset;
|
||||
-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;
|
||||
|
@ -1843,6 +1851,13 @@
|
|||
margin: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced li:first-child .searchview_extended_prop_or {
|
||||
visibility: hidden;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_searchview_advanced .searchview_extended_prop_or {
|
||||
opacity: 0.5;
|
||||
margin-left: -14px;
|
||||
}
|
||||
.openerp .oe_searchview .oe_searchview_drawer .oe_opened h4:before {
|
||||
content: "▾ ";
|
||||
position: relative;
|
||||
|
@ -2028,49 +2043,47 @@
|
|||
display: inline-block;
|
||||
float: right;
|
||||
}
|
||||
.openerp .oe_form header .oe_form_button {
|
||||
.openerp .oe_form header .oe_button {
|
||||
margin: 3px 2px 1px;
|
||||
}
|
||||
.openerp .oe_form header .oe_button:first-child {
|
||||
margin-left: 6px;
|
||||
}
|
||||
.openerp .oe_form header .oe_tags {
|
||||
margin: 5px 0 0 5px;
|
||||
width: 400px;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.openerp .oe_form div.oe_chatter {
|
||||
.openerp .oe_form header .oe_tags div.oe_chatter {
|
||||
min-width: 650px;
|
||||
max-width: 860px;
|
||||
margin: 0 auto;
|
||||
padding: 16px 0 48px;
|
||||
}
|
||||
.openerp .oe_form .oe_grey {
|
||||
color: #aaaaaa;
|
||||
max-width: 650px;
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
.openerp .oe_form div.oe_form_configuration p, .openerp .oe_form div.oe_form_configuration ul, .openerp .oe_form div.oe_form_configuration ol {
|
||||
.openerp .oe_form header .oe_tags div.oe_form_configuration p, .openerp .oe_form header .oe_tags div.oe_form_configuration ul, .openerp .oe_form header .oe_tags div.oe_form_configuration ol {
|
||||
color: #aaaaaa;
|
||||
max-width: 650px;
|
||||
}
|
||||
.openerp .oe_form div.oe_form_configuration label {
|
||||
.openerp .oe_form header .oe_tags div.oe_form_configuration label {
|
||||
min-width: 150px;
|
||||
}
|
||||
.openerp .oe_form div.oe_form_configuration .oe_form_group_cell_label {
|
||||
.openerp .oe_form header .oe_tags div.oe_form_configuration .oe_form_group_cell_label {
|
||||
padding: 1px 0;
|
||||
}
|
||||
.openerp .oe_form div.oe_form_configuration .oe_form_group_cell div div {
|
||||
.openerp .oe_form header .oe_tags div.oe_form_configuration .oe_form_group_cell div div {
|
||||
padding: 1px 0;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer {
|
||||
width: 1% !important;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer td.oe_form_group_cell {
|
||||
text-align: right;
|
||||
padding: 0 !important;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer td.oe_form_group_cell_label {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer td.oe_form_group_cell_label {
|
||||
border-right: none;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer .oe_subtotal_footer_separator {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer .oe_subtotal_footer_separator {
|
||||
width: 108px;
|
||||
border-top: 1px solid #cacaca;
|
||||
margin-top: 4px;
|
||||
|
@ -2078,14 +2091,14 @@
|
|||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label:after {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer label:after {
|
||||
content: ":";
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label.oe_subtotal_footer_separator {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer label.oe_subtotal_footer_separator {
|
||||
font-weight: bold !important;
|
||||
padding: 2px 11px 2px 0px !important;
|
||||
}
|
||||
.openerp .oe_form .oe_subtotal_footer label.oe_form_label_help {
|
||||
.openerp .oe_form header .oe_tags .oe_subtotal_footer label.oe_form_label_help {
|
||||
font-weight: normal;
|
||||
}
|
||||
.openerp .oe_form .oe_form_button {
|
||||
|
@ -2206,16 +2219,12 @@
|
|||
min-width: 60px;
|
||||
color: #1f1f1f;
|
||||
}
|
||||
.openerp .oe_form textarea {
|
||||
height: 32px;
|
||||
}
|
||||
.openerp .oe_form input[readonly], .openerp .oe_form select[readonly], .openerp .oe_form textarea[readonly], .openerp .oe_form input[disabled], .openerp .oe_form select[disabled] {
|
||||
background: #e5e5e5 !important;
|
||||
color: #666666;
|
||||
}
|
||||
.openerp .oe_form textarea[disabled] {
|
||||
border: none;
|
||||
border-left: 8px solid #eeeeee;
|
||||
padding-left: 8px;
|
||||
-moz-box-shadow: none;
|
||||
-webkit-box-shadow: none;
|
||||
|
@ -2224,6 +2233,9 @@
|
|||
-webkit-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
.openerp .oe_form textarea.oe_inline[disabled] {
|
||||
border-left: 8px solid #eeeeee;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_url button img {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
@ -2241,7 +2253,7 @@
|
|||
.openerp .oe_form .oe_datepicker_root {
|
||||
display: inline-block;
|
||||
}
|
||||
.openerp .oe_form .oe_form_required input, .openerp .oe_form .oe_form_required select, .openerp .oe_form .oe_form_required textarea {
|
||||
.openerp .oe_form .oe_form_required input:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required select:not([disabled]):not([readonly]), .openerp .oe_form .oe_form_required textarea:not([disabled]):not([readonly]) {
|
||||
background-color: #d2d2ff !important;
|
||||
}
|
||||
.openerp .oe_form .oe_form_invalid input, .openerp .oe_form .oe_form_invalid select, .openerp .oe_form .oe_form_invalid textarea {
|
||||
|
@ -2279,7 +2291,7 @@
|
|||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.openerp .oe_form .oe_form_field_html {
|
||||
.openerp .oe_form .oe_form_embedded_html {
|
||||
position: relative;
|
||||
width: 600px;
|
||||
margin-left: 130px;
|
||||
|
@ -2287,16 +2299,16 @@
|
|||
margin-bottom: 32px;
|
||||
text-align: justify;
|
||||
}
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_integer {
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_integer input {
|
||||
width: 6em !important;
|
||||
}
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_float {
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_float input {
|
||||
width: 7em !important;
|
||||
}
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_date {
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_date input {
|
||||
width: 7.5em !important;
|
||||
}
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_datetime {
|
||||
.openerp .oe_form_editable .oe_form .oe_form_field_datetime input {
|
||||
width: 11.5em !important;
|
||||
}
|
||||
.openerp .oe_hidden_input_file {
|
||||
|
|
|
@ -180,9 +180,11 @@ $sheet-max-width: 860px
|
|||
font-weight: bold
|
||||
background-color: #f0f0f0
|
||||
th
|
||||
border-right: 1px dotted $tag-border
|
||||
&:last-child
|
||||
border-right: none
|
||||
border-left: 1px solid #dfdfdf
|
||||
&:first-child
|
||||
border-left: none
|
||||
&.null
|
||||
border-left: none
|
||||
th, td
|
||||
padding: 0
|
||||
text-align: left
|
||||
|
@ -450,7 +452,13 @@ $sheet-max-width: 860px
|
|||
text-decoration: none
|
||||
.oe_star_on
|
||||
color: gold
|
||||
p.oe_grey
|
||||
max-width: 650px
|
||||
.oe_grey
|
||||
color: #aaa
|
||||
|
||||
// }}}
|
||||
|
||||
// Tags (for many2many tags, among others) {{{
|
||||
.oe_tag
|
||||
border: 1px solid $tag-border
|
||||
|
@ -809,7 +817,7 @@ $sheet-max-width: 860px
|
|||
vertical-align: top
|
||||
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
|
||||
@include transition(all 0.2s ease-out)
|
||||
&:hover,
|
||||
&:hover
|
||||
background: rgba(0,0,0,0.2)
|
||||
text-shadow: black 0px 0px 3px
|
||||
color: white
|
||||
|
@ -869,15 +877,14 @@ $sheet-max-width: 860px
|
|||
vertical-align: top
|
||||
text-shadow: 0 1px 1px rgba(0,0,0,0.2)
|
||||
@include transition(all 0.2s ease-out)
|
||||
&:hover,
|
||||
&:hover
|
||||
background: rgba(0,0,0,0.2)
|
||||
text-shadow: black 0px 0px 3px
|
||||
color: white
|
||||
@include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset)
|
||||
> .oe_active
|
||||
background: rgba(0,0,0,0.2)
|
||||
background: rgba(0,0,0,0.30)
|
||||
text-shadow: black 0px 0px 3px
|
||||
font-weight: bold
|
||||
@include box-shadow(0 1px 2px rgba(0,0,0,0.4) inset)
|
||||
|
||||
.oe_user_menu
|
||||
|
@ -1466,6 +1473,11 @@ $sheet-max-width: 860px
|
|||
list-style: none
|
||||
margin: 0
|
||||
white-space: nowrap
|
||||
&:first-child .searchview_extended_prop_or
|
||||
visibility: hidden
|
||||
.searchview_extended_prop_or
|
||||
opacity: 0.5
|
||||
margin-left: -14px
|
||||
.oe_opened
|
||||
h4:before
|
||||
content: "▾ "
|
||||
|
@ -1593,33 +1605,32 @@ $sheet-max-width: 860px
|
|||
.oe_notebook_page
|
||||
padding: 0 16px
|
||||
// }}}
|
||||
// FormView.header {{{
|
||||
.oe_form header
|
||||
position: relative
|
||||
border-bottom: 1px solid #cacaca
|
||||
padding-left: 2px
|
||||
@include vertical-gradient(#fcfcfc, #dedede)
|
||||
> span
|
||||
margin-left: 4px
|
||||
ul
|
||||
display: inline-block
|
||||
float: right
|
||||
.oe_button,
|
||||
margin: 3px 2px 1px
|
||||
&:first-child
|
||||
margin-left: 6px
|
||||
// }}}
|
||||
// FormView.custom tags and classes {{{
|
||||
.oe_form
|
||||
header
|
||||
position: relative
|
||||
border-bottom: 1px solid #cacaca
|
||||
padding-left: 2px
|
||||
@include vertical-gradient(#fcfcfc, #dedede)
|
||||
> span
|
||||
margin-left: 4px
|
||||
ul
|
||||
display: inline-block
|
||||
float: right
|
||||
.oe_form_button
|
||||
margin: 3px 2px 1px
|
||||
.oe_tags
|
||||
margin: 5px 0 0 5px
|
||||
width: 400px
|
||||
padding-bottom: 0
|
||||
.oe_form header .oe_tags
|
||||
margin: 5px 0 0 5px
|
||||
width: 400px
|
||||
padding-bottom: 0
|
||||
div.oe_chatter
|
||||
min-width: 650px
|
||||
max-width: $sheet-max-width
|
||||
margin: 0 auto
|
||||
padding: 16px 0 48px
|
||||
.oe_grey
|
||||
color: #aaa
|
||||
max-width: 650px
|
||||
margin: 0 0 10px 0
|
||||
div.oe_form_configuration
|
||||
p, ul, ol
|
||||
color: #aaa
|
||||
|
@ -1750,17 +1761,16 @@ $sheet-max-width: 860px
|
|||
background: white
|
||||
min-width: 60px
|
||||
color: #1f1f1f
|
||||
textarea
|
||||
height: 32px
|
||||
input[readonly], select[readonly], textarea[readonly], input[disabled], select[disabled]
|
||||
background: #E5E5E5 !important
|
||||
color: #666
|
||||
textarea[disabled]
|
||||
border: none
|
||||
border-left: 8px solid #eee
|
||||
padding-left: 8px
|
||||
@include box-shadow(none)
|
||||
@include radius(0px)
|
||||
textarea.oe_inline[disabled]
|
||||
border-left: 8px solid #eee
|
||||
.oe_form_field_url button img
|
||||
vertical-align: top
|
||||
.oe_form_field_date,
|
||||
|
@ -1773,8 +1783,8 @@ $sheet-max-width: 860px
|
|||
display: none
|
||||
.oe_datepicker_root
|
||||
display: inline-block
|
||||
.oe_form_required
|
||||
input, select, textarea
|
||||
.oe_form_required
|
||||
input:not([disabled]):not([readonly]), select:not([disabled]):not([readonly]), textarea:not([disabled]):not([readonly])
|
||||
background-color: #D2D2FF !important
|
||||
.oe_form_invalid
|
||||
input, select, textarea
|
||||
|
@ -1805,7 +1815,7 @@ $sheet-max-width: 860px
|
|||
> div
|
||||
position: relative
|
||||
overflow: hidden
|
||||
.oe_form_field_html
|
||||
.oe_form_embedded_html
|
||||
position: relative
|
||||
width: 600px
|
||||
margin-left: 130px
|
||||
|
@ -1815,13 +1825,13 @@ $sheet-max-width: 860px
|
|||
|
||||
.oe_form_editable
|
||||
.oe_form
|
||||
.oe_form_field_integer
|
||||
.oe_form_field_integer input
|
||||
width: 6em !important
|
||||
.oe_form_field_float
|
||||
.oe_form_field_float input
|
||||
width: 7em !important
|
||||
.oe_form_field_date
|
||||
.oe_form_field_date input
|
||||
width: 7.5em !important
|
||||
.oe_form_field_datetime
|
||||
.oe_form_field_datetime input
|
||||
width: 11.5em !important
|
||||
// }}}
|
||||
// FormView.fields_binary {{{
|
||||
|
|
|
@ -146,8 +146,8 @@ instance.web.Dialog = instance.web.Widget.extend({
|
|||
this.$buttons = $('<div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" />');
|
||||
this.$el.dialog("widget").append(this.$buttons);
|
||||
}
|
||||
var res = this.start();
|
||||
this.dialog_inited = true;
|
||||
var res = this.start();
|
||||
return res;
|
||||
},
|
||||
close: function() {
|
||||
|
@ -392,7 +392,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
|
|||
do_create: function(form) {
|
||||
var self = this;
|
||||
var fields = $(form).serializeArray();
|
||||
self.rpc("/web/database/create", {'fields': fields}, function(result) {
|
||||
self.rpc("/web/database/create", {'fields': fields}).then(function(result) {
|
||||
var form_obj = self.to_object(fields);
|
||||
var client_action = {
|
||||
type: 'ir.actions.client',
|
||||
|
@ -418,7 +418,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
|
|||
if (!db || !confirm("Do you really want to delete the database: " + db + " ?")) {
|
||||
return;
|
||||
}
|
||||
self.rpc("/web/database/drop", {'fields': fields}, function(result) {
|
||||
self.rpc("/web/database/drop", {'fields': fields}).then(function(result) {
|
||||
if (result.error) {
|
||||
self.display_error(result);
|
||||
return;
|
||||
|
@ -481,7 +481,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
|
|||
var self = this;
|
||||
self.rpc("/web/database/change_password", {
|
||||
'fields': $(form).serializeArray()
|
||||
}, function(result) {
|
||||
}).then(function(result) {
|
||||
if (result.error) {
|
||||
self.display_error(result);
|
||||
return;
|
||||
|
@ -614,39 +614,32 @@ instance.web.client_actions.add("login", "instance.web.Login");
|
|||
* Client action to reload the whole interface.
|
||||
* If params has an entry 'menu_id', it opens the given menu entry.
|
||||
*/
|
||||
instance.web.Reload = instance.web.Widget.extend({
|
||||
init: function(parent, params) {
|
||||
this._super(parent);
|
||||
this.menu_id = (params && params.menu_id) || false;
|
||||
},
|
||||
start: function() {
|
||||
var l = window.location;
|
||||
instance.web.Reload = function(parent, params) {
|
||||
var menu_id = (params && params.menu_id) || false;
|
||||
var l = window.location;
|
||||
|
||||
var sobj = $.deparam(l.search.substr(1));
|
||||
sobj.ts = new Date().getTime();
|
||||
var search = '?' + $.param(sobj);
|
||||
var sobj = $.deparam(l.search.substr(1));
|
||||
sobj.ts = new Date().getTime();
|
||||
var search = '?' + $.param(sobj);
|
||||
|
||||
var hash = l.hash;
|
||||
if (this.menu_id) {
|
||||
hash = "#menu_id=" + this.menu_id;
|
||||
}
|
||||
var url = l.protocol + "//" + l.host + l.pathname + search + hash;
|
||||
window.location = url;
|
||||
var hash = l.hash;
|
||||
if (menu_id) {
|
||||
hash = "#menu_id=" + menu_id;
|
||||
}
|
||||
});
|
||||
var url = l.protocol + "//" + l.host + l.pathname + search + hash;
|
||||
window.location = url;
|
||||
};
|
||||
instance.web.client_actions.add("reload", "instance.web.Reload");
|
||||
|
||||
/**
|
||||
* Client action to go back in breadcrumb history.
|
||||
* If can't go back in history stack, will go back to home.
|
||||
*/
|
||||
instance.web.HistoryBack = instance.web.Widget.extend({
|
||||
init: function(parent, params) {
|
||||
if (!parent.history_back()) {
|
||||
window.location = '/' + (window.location.search || '');
|
||||
}
|
||||
instance.web.HistoryBack = function(parent, params) {
|
||||
if (!parent.history_back()) {
|
||||
window.location = '/' + (window.location.search || '');
|
||||
}
|
||||
});
|
||||
};
|
||||
instance.web.client_actions.add("history_back", "instance.web.HistoryBack");
|
||||
|
||||
/**
|
||||
|
@ -667,7 +660,7 @@ instance.web.ChangePassword = instance.web.Widget.extend({
|
|||
submitHandler: function (form) {
|
||||
self.rpc("/web/session/change_password",{
|
||||
'fields': $(form).serializeArray()
|
||||
}, function(result) {
|
||||
}).then(function(result) {
|
||||
if (result.error) {
|
||||
self.display_error(result);
|
||||
return;
|
||||
|
@ -893,8 +886,8 @@ instance.web.UserMenu = instance.web.Widget.extend({
|
|||
var self = this;
|
||||
if (!this.getParent().has_uncommitted_changes()) {
|
||||
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }, function(result) {
|
||||
result.result.res_id = instance.session.uid;
|
||||
self.getParent().action_manager.do_action(result.result);
|
||||
result.res_id = instance.session.uid;
|
||||
self.getParent().action_manager.do_action(result);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
@ -1128,7 +1121,7 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
var self = this;
|
||||
return this.rpc("/web/action/load", { action_id: options.action_id })
|
||||
.pipe(function (result) {
|
||||
var action = result.result;
|
||||
var action = result;
|
||||
if (options.needaction) {
|
||||
action.context.search_default_needaction_pending = true;
|
||||
}
|
||||
|
@ -1137,15 +1130,6 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
});
|
||||
});
|
||||
},
|
||||
do_action: function(action) {
|
||||
var self = this;
|
||||
// TODO replace by client action menuclick
|
||||
if(action.menu_id) {
|
||||
this.do_reload().then(function () {
|
||||
self.menu.menu_click(action.menu_id);
|
||||
});
|
||||
}
|
||||
},
|
||||
set_content_full_screen: function(fullscreen) {
|
||||
if (fullscreen) {
|
||||
$(".oe_webclient", this.$el).addClass("oe_content_full_screen");
|
||||
|
@ -1185,7 +1169,7 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
|
|||
return;
|
||||
}
|
||||
return self.rpc("/web/action/load", { action_id: self.action_id }, function(result) {
|
||||
var action = result.result;
|
||||
var action = result;
|
||||
action.flags = _.extend({
|
||||
//views_switcher : false,
|
||||
search_view : false,
|
||||
|
|
|
@ -820,9 +820,10 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
|
|||
* the action manager can be found amongst the ancestors of the current widget.
|
||||
* If that's not the case this method will simply return `false`.
|
||||
*/
|
||||
do_action: function(action, on_finished) {
|
||||
if (this.getParent()) {
|
||||
return this.getParent().do_action(action, on_finished);
|
||||
do_action: function() {
|
||||
var parent = this.getParent();
|
||||
if (parent) {
|
||||
return parent.do_action.apply(parent, arguments);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
@ -841,7 +842,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, {
|
|||
rpc: function(url, data, success, error) {
|
||||
var def = $.Deferred().then(success, error);
|
||||
var self = this;
|
||||
instance.session.rpc(url, data). then(function() {
|
||||
instance.session.rpc(url, data).then(function() {
|
||||
if (!self.isDestroyed())
|
||||
def.resolve.apply(def, arguments);
|
||||
}, function() {
|
||||
|
@ -1299,7 +1300,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
|
|||
* @param {Function} error_callback function to execute on RPC call failure
|
||||
* @returns {jQuery.Deferred} jquery-provided ajax deferred
|
||||
*/
|
||||
rpc: function(url, params, success_callback, error_callback) {
|
||||
rpc: function(url, params) {
|
||||
var self = this;
|
||||
// url can be an $.ajax option object
|
||||
if (_.isString(url)) {
|
||||
|
@ -1316,8 +1317,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
|
|||
};
|
||||
var deferred = $.Deferred();
|
||||
this.trigger('request', url, payload);
|
||||
var aborter = params.aborter;
|
||||
delete params.aborter;
|
||||
var request = this.rpc_function(url, payload).then(
|
||||
function (response, textStatus, jqXHR) {
|
||||
self.trigger('response', response);
|
||||
|
@ -1341,16 +1340,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
|
|||
};
|
||||
deferred.reject(error, $.Event());
|
||||
});
|
||||
if (aborter) {
|
||||
aborter.abort_last = function () {
|
||||
if (!(request.isResolved() || request.isRejected())) {
|
||||
deferred.fail(function (error, event) {
|
||||
event.preventDefault();
|
||||
});
|
||||
request.abort();
|
||||
}
|
||||
};
|
||||
}
|
||||
// Allow deferred user to disable on_rpc_error in fail
|
||||
deferred.fail(function() {
|
||||
deferred.fail(function(error, event) {
|
||||
|
@ -1358,7 +1347,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({
|
|||
self.on_rpc_error(error, event);
|
||||
}
|
||||
});
|
||||
}).then(success_callback, error_callback).promise();
|
||||
});
|
||||
return deferred;
|
||||
},
|
||||
/**
|
||||
|
|
|
@ -19,9 +19,9 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
|
|||
this.name = instance._session_id;
|
||||
this.qweb_mutex = new $.Mutex();
|
||||
},
|
||||
rpc: function(url, params, success_callback, error_callback) {
|
||||
rpc: function(url, params) {
|
||||
params.session_id = this.session_id;
|
||||
return this._super(url, params, success_callback, error_callback);
|
||||
return this._super(url, params);
|
||||
},
|
||||
/**
|
||||
* Setup a sessionm
|
||||
|
@ -57,7 +57,12 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
|
|||
if(self.session_is_valid()) {
|
||||
return deferred.pipe(function() { return self.load_modules(); });
|
||||
}
|
||||
return deferred;
|
||||
return $.when(
|
||||
deferred,
|
||||
self.rpc('/web/webclient/bootstrap_translations', {mods: instance._modules}).pipe(function(trans) {
|
||||
instance.web._t.database.set_bundle(trans);
|
||||
})
|
||||
);
|
||||
});
|
||||
},
|
||||
/**
|
||||
|
@ -537,13 +542,9 @@ instance.web.qweb.preprocess_node = function() {
|
|||
if (translation && translation.value === 'off') {
|
||||
return;
|
||||
}
|
||||
var ts = _.str.trim(this.node.data);
|
||||
if (ts.length === 0) {
|
||||
return;
|
||||
}
|
||||
var tr = instance.web._t(ts);
|
||||
if (tr !== ts) {
|
||||
this.node.data = tr;
|
||||
var match = /^(\s*)(.+?)(\s*)$/.exec(this.node.data);
|
||||
if (match) {
|
||||
this.node.data = match[1] + instance.web._t(match[2]) + match[3];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
|
@ -600,8 +601,7 @@ var messages_by_seconds = function() {
|
|||
[120, _t("Don't leave yet,<br />it's still loading...")],
|
||||
[300, _t("You may not believe it,<br />but the application is actually loading...")],
|
||||
[420, _t("Take a minute to get a coffee,<br />because it's loading...")],
|
||||
[600, _t("It's loading...<br />By the way, did you tried the kitten mode?")],
|
||||
[3600, _t("Maybe you should consider pressing F5...")],
|
||||
[3600, _t("Maybe you should consider reloading the application by pressing F5...")],
|
||||
];
|
||||
};
|
||||
|
||||
|
|
|
@ -349,85 +349,6 @@ instance.web.Model = instance.web.Class.extend({
|
|||
},
|
||||
});
|
||||
|
||||
instance.web.Traverser = instance.web.Class.extend({
|
||||
/**
|
||||
* @constructs instance.web.Traverser
|
||||
* @extends instance.web.Class
|
||||
*
|
||||
* @param {instance.web.Model} model instance this traverser is bound to
|
||||
*/
|
||||
init: function (model) {
|
||||
this._model = model;
|
||||
this._index = 0;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets and sets the current index
|
||||
*
|
||||
* @param {Number} [idx]
|
||||
* @returns {Number} current index
|
||||
*/
|
||||
index: function (idx) {
|
||||
if (idx) { this._index = idx; }
|
||||
return this._index;
|
||||
},
|
||||
/**
|
||||
* Returns the model this traverser is currently bound to
|
||||
*
|
||||
* @returns {openerp.web.Model}
|
||||
*/
|
||||
model: function () {
|
||||
return this._model;
|
||||
},
|
||||
/**
|
||||
* Fetches the size of the backing model's match
|
||||
*
|
||||
* @returns {Deferred<Number>} deferred count
|
||||
*/
|
||||
size: function () {
|
||||
return this._model.query().count();
|
||||
},
|
||||
|
||||
/**
|
||||
* Record at the current index for the collection, fails if there is no
|
||||
* record at the current index.
|
||||
*
|
||||
* @returns {Deferred<>}
|
||||
*/
|
||||
current: function (fields) {
|
||||
return this._model.query(fields).first().pipe(function (record) {
|
||||
if (record == null) {
|
||||
return $.Deferred()
|
||||
.reject('No record at index' + this._index)
|
||||
.promise();
|
||||
}
|
||||
return record;
|
||||
});
|
||||
},
|
||||
next: function (fields) {
|
||||
var self = this;
|
||||
this._index++;
|
||||
return this.size().pipe(function (s) {
|
||||
if (self._index >= s) {
|
||||
self._index = 0;
|
||||
}
|
||||
return self.current(fields);
|
||||
});
|
||||
},
|
||||
previous: function (fields) {
|
||||
var self = this;
|
||||
this._index--;
|
||||
if (this._index < 0) {
|
||||
return this.size().pipe(function (s) {
|
||||
self._index = s-1;
|
||||
return self.current(fields);
|
||||
});
|
||||
}
|
||||
return this.current(fields);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
instance.web.DataGroup = instance.web.CallbackEnabled.extend({
|
||||
/**
|
||||
* Management interface between views and grouped collections of OpenERP
|
||||
|
@ -513,8 +434,7 @@ instance.web.StaticDataGroup = instance.web.DataGroup.extend({
|
|||
|
||||
instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
||||
/**
|
||||
* DateaManagement interface between views and the collection of selected
|
||||
* OpenERP records (represents the view's state?)
|
||||
* Collection of OpenERP records, used to share records and the current selection between views.
|
||||
*
|
||||
* @constructs instance.web.DataSet
|
||||
* @extends instance.web.CallbackEnabled
|
||||
|
@ -631,13 +551,10 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
* Creates a new record in db
|
||||
*
|
||||
* @param {Object} data field values to set on the new record
|
||||
* @param {Function} callback function called with operation result
|
||||
* @param {Function} error_callback function called in case of creation error
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
create: function(data) {
|
||||
return this._model.call('create', [data], {context: this._model.context()})
|
||||
.pipe(function (r) { return {result: r}; });
|
||||
return this._model.call('create', [data], {context: this._model.context()});
|
||||
},
|
||||
/**
|
||||
* Saves the provided data in an existing db record
|
||||
|
@ -648,19 +565,14 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
* @param {Function} error_callback function called in case of write error
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
write: function (id, data, options, callback, error_callback) {
|
||||
write: function (id, data, options) {
|
||||
options = options || {};
|
||||
return this._model.call('write',
|
||||
[[id], data], {context: this._model.context(options.context)})
|
||||
.pipe(function (r) { return {result: r}})
|
||||
.then(callback, error_callback);
|
||||
return this._model.call('write', [[id], data], {context: this._model.context(options.context)});
|
||||
},
|
||||
/**
|
||||
* Deletes an existing record from the database
|
||||
*
|
||||
* @param {Number|String} ids identifier of the record to delete
|
||||
* @param {Function} callback function called with operation result
|
||||
* @param {Function} error_callback function called in case of deletion error
|
||||
*/
|
||||
unlink: function(ids) {
|
||||
return this._model.call('unlink', [ids], {context: this._model.context()});
|
||||
|
@ -674,36 +586,14 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
* @param {Function} error_callback
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
call: function (method, args, callback, error_callback) {
|
||||
return this._model.call(method, args).then(callback, error_callback);
|
||||
},
|
||||
/**
|
||||
* Calls an arbitrary method, with more crazy
|
||||
*
|
||||
* @param {String} method
|
||||
* @param {Array} [args]
|
||||
* @param {Number} [domain_index] index of a domain to evaluate in the args array
|
||||
* @param {Number} [context_index] index of a context to evaluate in the args array
|
||||
* @param {Function} callback
|
||||
* @param {Function} error_callback
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
call_and_eval: function (method, args, domain_index, context_index) {
|
||||
return instance.session.rpc('/web/dataset/call', {
|
||||
model: this.model,
|
||||
method: method,
|
||||
domain_id: domain_index == undefined ? null : domain_index,
|
||||
context_id: context_index == undefined ? null : context_index,
|
||||
args: args || []
|
||||
});
|
||||
call: function (method, args) {
|
||||
return this._model.call(method, args);
|
||||
},
|
||||
/**
|
||||
* Calls a button method, usually returning some sort of action
|
||||
*
|
||||
* @param {String} method
|
||||
* @param {Array} [args]
|
||||
* @param {Function} callback
|
||||
* @param {Function} error_callback
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
call_button: function (method, args) {
|
||||
|
@ -713,7 +603,6 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
* Fetches the "readable name" for records, based on intrinsic rules
|
||||
*
|
||||
* @param {Array} ids
|
||||
* @param {Function} callback
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
name_get: function(ids) {
|
||||
|
@ -739,7 +628,6 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
},
|
||||
/**
|
||||
* @param name
|
||||
* @param callback
|
||||
*/
|
||||
name_create: function(name) {
|
||||
return this._model.call('name_create', [name], {context: this._model.context()});
|
||||
|
@ -799,6 +687,7 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend({
|
|||
});
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.DataSetStatic = instance.web.DataSet.extend({
|
||||
init: function(parent, model, context, ids) {
|
||||
this._super(parent, model, context);
|
||||
|
@ -829,6 +718,7 @@ instance.web.DataSetStatic = instance.web.DataSet.extend({
|
|||
this.set_ids(_.without.apply(null, [this.ids].concat(ids)));
|
||||
}
|
||||
});
|
||||
|
||||
instance.web.DataSetSearch = instance.web.DataSet.extend({
|
||||
/**
|
||||
* @constructs instance.web.DataSetSearch
|
||||
|
@ -897,6 +787,7 @@ instance.web.DataSetSearch = instance.web.DataSet.extend({
|
|||
return this._super();
|
||||
}
|
||||
});
|
||||
|
||||
instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
|
||||
virtual_id_prefix: "one2many_v_id_",
|
||||
debug_mode: true,
|
||||
|
@ -916,9 +807,9 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
|
|||
defaults: this.last_default_get};
|
||||
this.to_create.push(_.extend(_.clone(cached), {values: _.clone(cached.values)}));
|
||||
this.cache.push(cached);
|
||||
return $.Deferred().resolve({result: cached.id}).promise();
|
||||
return $.Deferred().resolve(cached.id).promise();
|
||||
},
|
||||
write: function (id, data, options, callback) {
|
||||
write: function (id, data, options) {
|
||||
var self = this;
|
||||
var record = _.detect(this.to_create, function(x) {return x.id === id;});
|
||||
record = record || _.detect(this.to_write, function(x) {return x.id === id;});
|
||||
|
@ -944,9 +835,7 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
|
|||
$.extend(cached.values, record.values);
|
||||
if (dirty)
|
||||
this.on_change();
|
||||
var to_return = $.Deferred().then(callback);
|
||||
to_return.resolve({result: true});
|
||||
return to_return.promise();
|
||||
return $.Deferred().resolve(true).promise();
|
||||
},
|
||||
unlink: function(ids, callback, error_callback) {
|
||||
var self = this;
|
||||
|
@ -970,7 +859,8 @@ instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({
|
|||
this.cache = [];
|
||||
this.delete_all = false;
|
||||
},
|
||||
on_change: function() {},
|
||||
on_change: function() {
|
||||
},
|
||||
read_ids: function (ids, fields, options) {
|
||||
var self = this;
|
||||
var to_get = [];
|
||||
|
@ -1092,9 +982,9 @@ instance.web.ProxyDataSet = instance.web.DataSetSearch.extend({
|
|||
return this._super.apply(this, arguments);
|
||||
}
|
||||
},
|
||||
write: function (id, data, options, callback, error_callback) {
|
||||
write: function (id, data, options) {
|
||||
if (this.write_function) {
|
||||
return this.write_function(id, data, options, this._super).then(callback, error_callback);
|
||||
return this.write_function(id, data, options, this._super);
|
||||
} else {
|
||||
return this._super.apply(this, arguments);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,15 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
template: 'ExportTreeView',
|
||||
dialog_title: {toString: function () { return _t("Export Data"); }},
|
||||
init: function(parent, dataset) {
|
||||
this._super(parent);
|
||||
var self = this;
|
||||
options = {
|
||||
buttons : [
|
||||
{text: _t("Close"), click: function() { self.close(); }},
|
||||
{text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
|
||||
],
|
||||
close: function(event, ui){ self.close();}
|
||||
}
|
||||
this._super(parent, options);
|
||||
this.records = {};
|
||||
this.dataset = dataset;
|
||||
this.exports = new instance.web.DataSetSearch(
|
||||
|
@ -14,13 +22,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
start: function() {
|
||||
var self = this;
|
||||
this._super.apply(this, arguments);
|
||||
this.open({
|
||||
buttons : [
|
||||
{text: _t("Close"), click: function() { self.close(); }},
|
||||
{text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
|
||||
],
|
||||
close: function(event, ui){ self.close();}
|
||||
});
|
||||
this.open();
|
||||
self.$el.removeClass('ui-dialog-content ui-widget-content');
|
||||
self.$el.find('#add_field').click(function() {
|
||||
if ($('#field-tree-structure tr.ui-selected')) {
|
||||
|
@ -49,7 +51,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
self.rpc("/web/export/get_fields", {
|
||||
model: self.dataset.model,
|
||||
import_compat: Boolean(import_comp)
|
||||
}, function (records) {
|
||||
}).then(function (records) {
|
||||
got_fields.resolve();
|
||||
self.on_show_data(records);
|
||||
});
|
||||
|
@ -57,7 +59,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
|
||||
return $.when(
|
||||
got_fields,
|
||||
this.rpc('/web/export/formats', {}, this.do_setup_export_formats),
|
||||
this.rpc('/web/export/formats', {}).then(this.do_setup_export_formats),
|
||||
this.show_exports_list());
|
||||
},
|
||||
do_setup_export_formats: function (formats) {
|
||||
|
@ -91,7 +93,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
self.$el.find('#fields_list option').remove();
|
||||
var export_id = self.$el.find('#saved_export_list option:selected').val();
|
||||
if (export_id) {
|
||||
self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field);
|
||||
self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id)}).then(self.do_load_export_field);
|
||||
}
|
||||
});
|
||||
self.$el.find('#delete_export_list').click(function() {
|
||||
|
@ -181,7 +183,7 @@ instance.web.DataExport = instance.web.Dialog.extend({
|
|||
import_compat: Boolean(import_comp),
|
||||
parent_field_type : record['field_type'],
|
||||
exclude: exclude_fields
|
||||
}, function(results) {
|
||||
}).then(function(results) {
|
||||
record.loaded = true;
|
||||
self.on_show_data(results, record.id);
|
||||
});
|
||||
|
|
|
@ -1494,7 +1494,7 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({
|
|||
return $.when(facet_from(this, value));
|
||||
}
|
||||
assert(value.length <= 1,
|
||||
_("M2O search fields do not currently handle multiple default values"));
|
||||
_t("M2O search fields do not currently handle multiple default values"));
|
||||
// there are many cases of {search_default_$m2ofield: [id]}, need
|
||||
// to handle this as if it were a single value.
|
||||
value = value[0];
|
||||
|
@ -1578,7 +1578,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({
|
|||
|
||||
$filter.unbind('click').click(function () {
|
||||
self.view.query.reset([{
|
||||
category: _("Custom Filter"),
|
||||
category: _t("Custom Filter"),
|
||||
icon: 'M',
|
||||
field: {
|
||||
get_context: function () { return filter.context; },
|
||||
|
@ -1693,7 +1693,7 @@ instance.web.search.Advanced = instance.web.search.Input.extend({
|
|||
});
|
||||
return $.when(
|
||||
this._super(),
|
||||
this.rpc("/web/searchview/fields_get", {model: this.view.model}, function(data) {
|
||||
this.rpc("/web/searchview/fields_get", {model: this.view.model}).then(function(data) {
|
||||
self.fields = _.extend({
|
||||
id: { string: 'ID', type: 'id' }
|
||||
}, data.fields);
|
||||
|
|
|
@ -30,7 +30,7 @@ instance.web.form.FieldManagerMixin = {
|
|||
/**
|
||||
* Must return the asked field as in fields_get.
|
||||
*/
|
||||
get_field: function(field_name) {},
|
||||
get_field_desc: function(field_name) {},
|
||||
/**
|
||||
* Returns the current value of a field present in the view. See the get_value() method
|
||||
* method in FieldInterface for further information.
|
||||
|
@ -44,6 +44,21 @@ instance.web.form.FieldManagerMixin = {
|
|||
@return (Deferred) Is resolved after all the values are setted.
|
||||
*/
|
||||
set_values: function(values) {},
|
||||
/**
|
||||
Computes an OpenERP domain.
|
||||
|
||||
@param (list) expression An OpenERP domain.
|
||||
@return (boolean) The computed value of the domain.
|
||||
*/
|
||||
compute_domain: function(expression) {},
|
||||
/**
|
||||
Builds an evaluation context for the resolution of the fields' contexts. Please note
|
||||
the field are only supposed to use this context to evualuate their own, they should not
|
||||
extend it.
|
||||
|
||||
@return (CompoundContext) An OpenERP context.
|
||||
*/
|
||||
build_eval_context: function() {},
|
||||
};
|
||||
|
||||
instance.web.views.add('form', 'instance.web.FormView');
|
||||
|
@ -831,10 +846,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
}
|
||||
if (form_invalid) {
|
||||
self.set({'display_invalid_fields': true});
|
||||
for (var g in self.fields) {
|
||||
if (!self.fields.hasOwnProperty(g)) { continue; }
|
||||
self.fields[g]._check_css_flags();
|
||||
}
|
||||
first_invalid_field.focus();
|
||||
self.on_invalid();
|
||||
return $.Deferred().reject();
|
||||
|
@ -881,7 +892,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
* @param {Object} r result of the write function.
|
||||
*/
|
||||
on_saved: function(r) {
|
||||
if (!r.result) {
|
||||
if (!r) {
|
||||
// should not happen in the server, but may happen for internal purpose
|
||||
return $.Deferred().reject();
|
||||
} else {
|
||||
|
@ -904,11 +915,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
* at the beginning of the dataset instead of the end
|
||||
*/
|
||||
on_created: function(r, prepend_on_create) {
|
||||
if (!r.result) {
|
||||
if (!r) {
|
||||
// should not happen in the server, but may happen for internal purpose
|
||||
return $.Deferred().reject();
|
||||
} else {
|
||||
this.datarecord.id = r.result;
|
||||
this.datarecord.id = r;
|
||||
if (!prepend_on_create) {
|
||||
this.dataset.alter_ids(this.dataset.ids.concat([this.datarecord.id]));
|
||||
this.dataset.index = this.dataset.ids.length - 1;
|
||||
|
@ -1085,7 +1096,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
|
||||
field.on('focused', null, this.proxy('widgetFocused'))
|
||||
.on('blurred', null, this.proxy('widgetBlurred'));
|
||||
if (this.get_field(name).translate) {
|
||||
if (this.get_field_desc(name).translate) {
|
||||
this.translatable_fields.push(field);
|
||||
}
|
||||
field.on('changed_value', this, function() {
|
||||
|
@ -1103,12 +1114,34 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
}
|
||||
});
|
||||
},
|
||||
get_field: function(field_name) {
|
||||
get_field_desc: function(field_name) {
|
||||
return this.fields_view.fields[field_name];
|
||||
},
|
||||
get_field_value: function(field_name) {
|
||||
return this.fields[field_name].get_value();
|
||||
},
|
||||
compute_domain: function(expression) {
|
||||
return instance.web.form.compute_domain(expression, this.fields);
|
||||
},
|
||||
_build_view_fields_values: function(blacklist) {
|
||||
var a_dataset = this.dataset;
|
||||
var fields_values = this.get_fields_values(blacklist);
|
||||
var active_id = a_dataset.ids[a_dataset.index];
|
||||
_.extend(fields_values, {
|
||||
active_id: active_id || false,
|
||||
active_ids: active_id ? [active_id] : [],
|
||||
active_model: a_dataset.model,
|
||||
parent: {}
|
||||
});
|
||||
if (a_dataset.parent_view) {
|
||||
fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
|
||||
}
|
||||
return fields_values;
|
||||
},
|
||||
build_eval_context: function(blacklist) {
|
||||
var a_dataset = this.dataset;
|
||||
return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
|
@ -1175,7 +1208,7 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
|
|||
|
||||
this.$form.appendTo(this.$target);
|
||||
|
||||
_.each(this.fields_to_init, function($elem) {
|
||||
var ws = _.map(this.fields_to_init, function($elem) {
|
||||
var name = $elem.attr("name");
|
||||
if (!self.fvg.fields[name]) {
|
||||
throw new Error("Field '" + name + "' specified in view could not be found.");
|
||||
|
@ -1191,7 +1224,10 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
|
|||
}
|
||||
self.alter_field(w);
|
||||
self.view.register_field(w, $elem.attr("name"));
|
||||
w.replace($elem);
|
||||
return [w, $elem];
|
||||
});
|
||||
_.each(ws, function(w) {
|
||||
w[0].replace(w[1]);
|
||||
});
|
||||
_.each(this.tags_to_init, function($elem) {
|
||||
var tag_name = $elem[0].tagName.toLowerCase();
|
||||
|
@ -1528,6 +1564,52 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt
|
|||
},
|
||||
});
|
||||
|
||||
/**
|
||||
Welcome.
|
||||
|
||||
If you read this documentation, it probably means that you were asked to use a form view widget outside of
|
||||
a form view. Before going further, you must understand that those fields were never really created for
|
||||
that usage. Don't think that this class will hold the answer to all your problems, at best it will allow
|
||||
you to hack the system with more style.
|
||||
*/
|
||||
instance.web.form.DefaultFieldManager = instance.web.Widget.extend({
|
||||
init: function(parent, eval_context) {
|
||||
this._super(parent);
|
||||
this.field_descs = {};
|
||||
this.eval_context = eval_context || {};
|
||||
this.set({
|
||||
display_invalid_fields: false,
|
||||
actual_mode: 'create',
|
||||
});
|
||||
},
|
||||
get_field_desc: function(field_name) {
|
||||
if (this.field_descs[field_name] === undefined) {
|
||||
this.field_descs[field_name] = {
|
||||
string: field_name,
|
||||
};
|
||||
}
|
||||
return this.field_descs[field_name];
|
||||
},
|
||||
extend_field_desc: function(fields) {
|
||||
var self = this;
|
||||
_.each(fields, function(v, k) {
|
||||
_.extend(self.get_field_desc(k), v);
|
||||
});
|
||||
},
|
||||
get_field_value: function(field_name) {
|
||||
return false;
|
||||
},
|
||||
set_values: function(values) {
|
||||
// nothing
|
||||
},
|
||||
compute_domain: function(expression) {
|
||||
return instance.web.form.compute_domain(expression, {});
|
||||
},
|
||||
build_eval_context: function() {
|
||||
return new instance.web.CompoundContext(this.eval_context);
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.form.FormDialog = instance.web.Dialog.extend({
|
||||
init: function(parent, options, view_id, dataset) {
|
||||
this._super(parent, options);
|
||||
|
@ -1641,9 +1723,7 @@ instance.web.form.InvisibilityChangerMixin = {
|
|||
this._ic_invisible_modifier = invisible_domain;
|
||||
this._ic_field_manager.on("view_content_has_changed", this, function() {
|
||||
var result = self._ic_invisible_modifier === undefined ? false :
|
||||
instance.web.form.compute_domain(
|
||||
self._ic_invisible_modifier,
|
||||
self._ic_field_manager.fields);
|
||||
self._ic_field_manager.compute_domain(self._ic_invisible_modifier);
|
||||
self.set({"invisible": result});
|
||||
});
|
||||
this.set({invisible: this._ic_invisible_modifier === true, force_invisible: false});
|
||||
|
@ -1694,19 +1774,22 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
*/
|
||||
init: function(field_manager, node) {
|
||||
this._super(field_manager);
|
||||
this.view = field_manager;
|
||||
this.field_manager = field_manager;
|
||||
if (this.field_manager instanceof instance.web.FormView)
|
||||
this.view = this.field_manager;
|
||||
this.node = node;
|
||||
this.modifiers = JSON.parse(this.node.attrs.modifiers || '{}');
|
||||
instance.web.form.InvisibilityChangerMixin.init.call(this, this.field_manager, this.modifiers.invisible);
|
||||
|
||||
this.field_manager.on("view_content_has_changed", this, this.process_modifiers);
|
||||
|
||||
this.set({required: this.modifiers['required'] === true});
|
||||
this.set({
|
||||
required: false,
|
||||
readonly: false,
|
||||
});
|
||||
// some events to make the property "effective_readonly" sync automatically with "readonly" and
|
||||
// "mode" on field_manager
|
||||
var self = this;
|
||||
this.set({"readonly": this.modifiers['readonly'] === true});
|
||||
var test_effective_readonly = function() {
|
||||
self.set({"effective_readonly": self.get("readonly") || self.field_manager.get("actual_mode") === "view"});
|
||||
};
|
||||
|
@ -1715,6 +1798,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
test_effective_readonly.call(this);
|
||||
},
|
||||
renderElement: function() {
|
||||
this.process_modifiers();
|
||||
this._super();
|
||||
this.$el.addClass(this.node.attrs["class"] || "");
|
||||
},
|
||||
|
@ -1737,12 +1821,11 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
});
|
||||
},
|
||||
process_modifiers: function() {
|
||||
var compute_domain = instance.web.form.compute_domain;
|
||||
var to_set = {};
|
||||
for (var a in this.modifiers) {
|
||||
if (!this.modifiers.hasOwnProperty(a)) { continue; }
|
||||
if (!_.include(["invisible"], a)) {
|
||||
var val = compute_domain(this.modifiers[a], this.view.fields);
|
||||
var val = this.field_manager.compute_domain(this.modifiers[a]);
|
||||
to_set[a] = val;
|
||||
}
|
||||
}
|
||||
|
@ -1771,25 +1854,6 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
}, options || {});
|
||||
$(trigger).tipsy(options);
|
||||
},
|
||||
_build_view_fields_values: function(blacklist) {
|
||||
var a_dataset = this.view.dataset;
|
||||
var fields_values = this.view.get_fields_values(blacklist);
|
||||
var active_id = a_dataset.ids[a_dataset.index];
|
||||
_.extend(fields_values, {
|
||||
active_id: active_id || false,
|
||||
active_ids: active_id ? [active_id] : [],
|
||||
active_model: a_dataset.model,
|
||||
parent: {}
|
||||
});
|
||||
if (a_dataset.parent_view) {
|
||||
fields_values.parent = a_dataset.parent_view.get_fields_values([a_dataset.child_name]);
|
||||
}
|
||||
return fields_values;
|
||||
},
|
||||
_build_eval_context: function(blacklist) {
|
||||
var a_dataset = this.view.dataset;
|
||||
return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist));
|
||||
},
|
||||
/**
|
||||
* Builds a new context usable for operations related to fields by merging
|
||||
* the fields'context with the action's context.
|
||||
|
@ -1802,7 +1866,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
}
|
||||
|
||||
if (v_context.__ref || true) { //TODO: remove true
|
||||
var fields_values = this._build_eval_context(blacklist);
|
||||
var fields_values = this.field_manager.build_eval_context(blacklist);
|
||||
v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values);
|
||||
}
|
||||
return v_context;
|
||||
|
@ -1813,7 +1877,7 @@ instance.web.form.FormWidget = instance.web.Widget.extend(instance.web.form.Invi
|
|||
// if there is a domain on the node, overrides the model's domain
|
||||
var final_domain = n_domain !== null ? n_domain : f_domain;
|
||||
if (!(final_domain instanceof Array) || true) { //TODO: remove true
|
||||
var fields_values = this._build_eval_context();
|
||||
var fields_values = this.field_manager.build_eval_context();
|
||||
final_domain = new instance.web.CompoundDomain(final_domain).set_eval_context(fields_values);
|
||||
}
|
||||
return final_domain;
|
||||
|
@ -2001,10 +2065,14 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
|
|||
var self = this
|
||||
this._super(field_manager, node);
|
||||
this.name = this.node.attrs.name;
|
||||
this.field = this.field_manager.get_field(this.name);
|
||||
this.field = this.field_manager.get_field_desc(this.name);
|
||||
this.widget = this.node.attrs.widget;
|
||||
this.string = this.node.attrs.string || this.field.string || this.name;
|
||||
this.options = JSON.parse(this.node.attrs.options || '{}');
|
||||
try {
|
||||
this.options = JSON.parse(this.node.attrs.options || '{}');
|
||||
} catch (e) {
|
||||
throw new Error(_.str.sprintf(_t("Widget options for field '%s' are not valid JSON."), this.name));
|
||||
}
|
||||
this.set({'value': false});
|
||||
|
||||
this.on("change:value", this, function() {
|
||||
|
@ -2015,11 +2083,11 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
|
|||
renderElement: function() {
|
||||
var self = this;
|
||||
this._super();
|
||||
if (this.field.translate) {
|
||||
if (this.field.translate && this.view) {
|
||||
this.$el.addClass('oe_form_field_translatable');
|
||||
this.$el.find('.oe_field_translate').click(this.on_translate);
|
||||
}
|
||||
this.$label = this.view.$el.find('label[for=' + this.id_for_label + ']');
|
||||
this.$label = this.view ? this.view.$el.find('label[for=' + this.id_for_label + ']') : $();
|
||||
if (instance.session.debug) {
|
||||
this.do_attach_tooltip(this, this.$label[0] || this.$el);
|
||||
this.$label.off('dblclick').on('dblclick', function() {
|
||||
|
@ -2034,6 +2102,8 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
|
|||
this._set_required();
|
||||
}
|
||||
this._check_visibility();
|
||||
this.field_manager.off("change:display_invalid_fields", this, this._check_css_flags);
|
||||
this.field_manager.on("change:display_invalid_fields", this, this._check_css_flags);
|
||||
this._check_css_flags();
|
||||
},
|
||||
/**
|
||||
|
@ -2081,7 +2151,7 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
|
|||
var self = this;
|
||||
var trans = new instance.web.DataSet(this, 'ir.translation');
|
||||
return trans.call_button('translate_fields', [this.view.dataset.model, this.view.datarecord.id, this.name, this.view.dataset.get_context()]).then(function(r) {
|
||||
self.do_action(r.result);
|
||||
self.do_action(r);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
@ -2099,11 +2169,12 @@ instance.web.form.ReinitializeWidgetMixin = {
|
|||
this.initialize_field();
|
||||
},
|
||||
initialize_field: function() {
|
||||
this.on("change:effective_readonly", this, function() {
|
||||
this.destroy_content();
|
||||
this.renderElement();
|
||||
this.initialize_content();
|
||||
});
|
||||
this.on("change:effective_readonly", this, this.reinitialize);
|
||||
this.initialize_content();
|
||||
},
|
||||
reinitialize: function() {
|
||||
this.destroy_content();
|
||||
this.renderElement();
|
||||
this.initialize_content();
|
||||
},
|
||||
/**
|
||||
|
@ -2124,9 +2195,10 @@ instance.web.form.ReinitializeWidgetMixin = {
|
|||
instance.web.form.ReinitializeFieldMixin = _.extend({}, instance.web.form.ReinitializeWidgetMixin, {
|
||||
initialize_field: function() {
|
||||
instance.web.form.ReinitializeWidgetMixin.initialize_field.call(this);
|
||||
this.on("change:effective_readonly", this, function() {
|
||||
this.render_value();
|
||||
});
|
||||
this.render_value();
|
||||
},
|
||||
reinitialize: function() {
|
||||
instance.web.form.ReinitializeWidgetMixin.reinitialize.call(this);
|
||||
this.render_value();
|
||||
},
|
||||
/**
|
||||
|
@ -2146,7 +2218,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
var self = this;
|
||||
var $input = this.$el.find('input');
|
||||
$input.change(function() {
|
||||
self.set({'value': instance.web.parse_value($input.val(), self)});
|
||||
self.set({'value': self.parse_value($input.val())});
|
||||
});
|
||||
this.setupFocus($input);
|
||||
},
|
||||
|
@ -2155,20 +2227,20 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
this.render_value();
|
||||
},
|
||||
render_value: function() {
|
||||
var show_value = instance.web.format_value(this.get('value'), this, '');
|
||||
var show_value = this.format_value(this.get('value'), '');
|
||||
if (!this.get("effective_readonly")) {
|
||||
this.$el.find('input').val(show_value);
|
||||
} else {
|
||||
if (this.password) {
|
||||
show_value = new Array(show_value.length + 1).join('*');
|
||||
}
|
||||
this.$el.text(show_value);
|
||||
this.$(".oe_form_char_content").text(show_value);
|
||||
}
|
||||
},
|
||||
is_syntax_valid: function() {
|
||||
if (!this.get("effective_readonly")) {
|
||||
try {
|
||||
var value_ = instance.web.parse_value(this.$el.find('input').val(), this, '');
|
||||
var value_ = this.parse_value(this.$el.find('input').val(), '');
|
||||
return true;
|
||||
} catch(e) {
|
||||
return false;
|
||||
|
@ -2176,6 +2248,12 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
|
|||
}
|
||||
return true;
|
||||
},
|
||||
parse_value: function(val, def) {
|
||||
return instance.web.parse_value(val, this, def);
|
||||
},
|
||||
format_value: function(val, def) {
|
||||
return instance.web.format_value(val, this, def);
|
||||
},
|
||||
is_false: function() {
|
||||
return this.get('value') === '' || this._super();
|
||||
},
|
||||
|
@ -2884,7 +2962,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
self.focus();
|
||||
return;
|
||||
}
|
||||
var pop = new instance.web.form.FormOpenPopup(self.view);
|
||||
var pop = new instance.web.form.FormOpenPopup(self);
|
||||
pop.show_element(
|
||||
self.field.relation,
|
||||
self.get("value"),
|
||||
|
@ -2893,7 +2971,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
|
|||
title: _t("Open: ") + self.string
|
||||
}
|
||||
);
|
||||
pop.on_write_completed.add_last(function() {
|
||||
pop.on('on_write_complete', self, function(){
|
||||
self.display_value = {};
|
||||
self.render_value();
|
||||
self.focus();
|
||||
|
@ -3479,12 +3557,12 @@ instance.web.form.One2ManyViewManager = instance.web.ViewManager.extend({
|
|||
}
|
||||
var self = this;
|
||||
var id = self.o2m.dataset.index !== null ? self.o2m.dataset.ids[self.o2m.dataset.index] : null;
|
||||
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
|
||||
var pop = new instance.web.form.FormOpenPopup(this);
|
||||
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
|
||||
title: _t("Open: ") + self.o2m.string,
|
||||
create_function: function(data) {
|
||||
return self.o2m.dataset.create(data).then(function(r) {
|
||||
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
|
||||
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
|
||||
self.o2m.dataset.on_change();
|
||||
});
|
||||
},
|
||||
|
@ -3574,7 +3652,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
|
|||
alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined,
|
||||
create_function: function(data, callback, error_callback) {
|
||||
return self.o2m.dataset.create(data).then(function(r) {
|
||||
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result]));
|
||||
self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r]));
|
||||
self.o2m.dataset.on_change();
|
||||
}).then(callback, error_callback);
|
||||
},
|
||||
|
@ -3595,11 +3673,11 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
|
|||
},
|
||||
do_activate_record: function(index, id) {
|
||||
var self = this;
|
||||
var pop = new instance.web.form.FormOpenPopup(self.o2m.view);
|
||||
var pop = new instance.web.form.FormOpenPopup(self);
|
||||
pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), {
|
||||
title: _t("Open: ") + self.o2m.string,
|
||||
write_function: function(id, data) {
|
||||
return self.o2m.dataset.write(id, data, {}, function(r) {
|
||||
return self.o2m.dataset.write(id, data, {}).then(function() {
|
||||
self.o2m.reload_current_view();
|
||||
});
|
||||
},
|
||||
|
@ -3623,7 +3701,10 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
|
|||
var parent_form = this.o2m.view;
|
||||
var self = this;
|
||||
this.ensure_saved().pipe(function () {
|
||||
return parent_form.do_save();
|
||||
if (parent_form)
|
||||
return parent_form.do_save();
|
||||
else
|
||||
return $.when();
|
||||
}).then(function () {
|
||||
self.handle_button(name, id, callback);
|
||||
});
|
||||
|
@ -3879,7 +3960,7 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
|
|||
},
|
||||
render_value: function() {
|
||||
var self = this;
|
||||
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context());
|
||||
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
|
||||
var values = self.get("value")
|
||||
var handle_names = function(data) {
|
||||
var indexed = {};
|
||||
|
@ -3914,6 +3995,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
|
|||
disable_utility_classes: true,
|
||||
init: function(field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
this.set({"value": []});
|
||||
this.is_loaded = $.Deferred();
|
||||
this.initial_is_loaded = this.is_loaded;
|
||||
this.is_setted = $.Deferred();
|
||||
|
@ -4038,9 +4120,7 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
|
|||
title: _t("Open: ") + this.m2m_field.string,
|
||||
readonly: this.getParent().get("effective_readonly")
|
||||
});
|
||||
pop.on_write_completed.add_last(function() {
|
||||
self.reload_content();
|
||||
});
|
||||
pop.on('on_write_complete', self, self.reload_content);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -4149,7 +4229,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
|
|||
});
|
||||
} else {
|
||||
var id = self.dataset.ids[self.dataset.index];
|
||||
var pop = new instance.web.form.FormOpenPopup(self.view);
|
||||
var pop = new instance.web.form.FormOpenPopup(this);
|
||||
pop.show_element(self.field.relation, id, self.build_context(), {
|
||||
title: _t("Open: ") + self.string,
|
||||
write_function: function(id, data, options) {
|
||||
|
@ -4282,12 +4362,14 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
|
|||
this.dataset.create_function = function(data, sup) {
|
||||
var fct = self.options.create_function || sup;
|
||||
return fct.call(this, data).then(function(r) {
|
||||
self.created_elements.push(r.result);
|
||||
self.created_elements.push(r);
|
||||
});
|
||||
};
|
||||
this.dataset.write_function = function(id, data, options, sup) {
|
||||
var fct = self.options.write_function || sup;
|
||||
return fct.call(this, id, data, options).then(self.on_write_completed);
|
||||
return fct.call(this, id, data, options).then(function() {
|
||||
self.trigger('on_write_complete');
|
||||
});
|
||||
};
|
||||
this.dataset.parent_view = this.options.parent_view;
|
||||
this.dataset.child_name = this.options.child_name;
|
||||
|
@ -4307,7 +4389,6 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
|
|||
this.$buttonpane = dialog.$el.dialog("widget").find(".ui-dialog-buttonpane").html("");
|
||||
this.start();
|
||||
},
|
||||
on_write_completed: function() {},
|
||||
setup_form_view: function() {
|
||||
var self = this;
|
||||
if (this.row_id) {
|
||||
|
@ -4417,7 +4498,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
|
|||
self.rpc('/web/session/eval_domain_and_context', {
|
||||
domains: [],
|
||||
contexts: [this.context]
|
||||
}, function (results) {
|
||||
}).then(function (results) {
|
||||
var search_defaults = {};
|
||||
_.each(results.context, function (value_, key) {
|
||||
var match = /^search_default_(.*)$/.exec(key);
|
||||
|
@ -4485,7 +4566,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
|
|||
domains: domains || [],
|
||||
contexts: contexts || [],
|
||||
group_by_seq: groupbys || []
|
||||
}, function (results) {
|
||||
}).then(function (results) {
|
||||
self.view_list.do_search(results.domain, results.context, results.group_by);
|
||||
});
|
||||
},
|
||||
|
@ -4540,22 +4621,28 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
|
|||
}
|
||||
},
|
||||
destroy_content: function() {
|
||||
if (this.selection) {
|
||||
this.selection.destroy();
|
||||
this.selection = undefined;
|
||||
}
|
||||
if (this.m2o) {
|
||||
this.m2o.destroy();
|
||||
this.m2o = undefined;
|
||||
if (this.fm) {
|
||||
this.fm.destroy();
|
||||
}
|
||||
},
|
||||
initialize_content: function() {
|
||||
var self = this;
|
||||
this.selection = new instance.web.form.FieldSelection(this, { attrs: {
|
||||
var fm = new instance.web.form.DefaultFieldManager(this);
|
||||
this.fm = fm;
|
||||
fm.extend_field_desc({
|
||||
"selection": {
|
||||
selection: this.field_manager.get_field_desc(this.name).selection,
|
||||
type: "selection",
|
||||
},
|
||||
"m2o": {
|
||||
relation: null,
|
||||
type: "many2one",
|
||||
},
|
||||
});
|
||||
this.selection = new instance.web.form.FieldSelection(fm, { attrs: {
|
||||
name: 'selection',
|
||||
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
|
||||
}});
|
||||
this.selection.view = this.view;
|
||||
this.selection.on("change:value", this, this.on_selection_changed);
|
||||
this.selection.setElement(this.$(".oe_form_view_reference_selection"));
|
||||
this.selection.renderElement();
|
||||
|
@ -4564,11 +4651,10 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
|
|||
.on('focused', null, function () {self.trigger('focused')})
|
||||
.on('blurred', null, function () {self.trigger('blurred')});
|
||||
|
||||
this.m2o = new instance.web.form.FieldMany2One(this, { attrs: {
|
||||
this.m2o = new instance.web.form.FieldMany2One(fm, { attrs: {
|
||||
name: 'm2o',
|
||||
modifiers: JSON.stringify({readonly: this.get('effective_readonly')}),
|
||||
}});
|
||||
this.m2o.view = this.view;
|
||||
this.m2o.on("change:value", this, this.data_changed);
|
||||
this.m2o.setElement(this.$(".oe_form_view_reference_m2o"));
|
||||
this.m2o.renderElement();
|
||||
|
@ -4608,20 +4694,6 @@ instance.web.form.FieldReference = instance.web.form.AbstractField.extend(instan
|
|||
this.set({'value': false});
|
||||
}
|
||||
},
|
||||
get_field: function(name) {
|
||||
if (name === "selection") {
|
||||
return {
|
||||
selection: this.view.fields_view.fields[this.name].selection,
|
||||
type: "selection",
|
||||
};
|
||||
} else if (name === "m2o") {
|
||||
return {
|
||||
relation: null,
|
||||
type: "many2one",
|
||||
};
|
||||
}
|
||||
throw Exception("Should not happen");
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
|
||||
|
@ -4709,9 +4781,10 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
|
|||
},
|
||||
set_filename: function(value) {
|
||||
var filename = this.node.attrs.filename;
|
||||
if (this.view.fields[filename]) {
|
||||
this.view.fields[filename].set_value(value);
|
||||
this.view.fields[filename].on_ui_change();
|
||||
if (filename) {
|
||||
var tmp = {};
|
||||
tmp[filename] = value;
|
||||
this.field_manager.set_values(tmp);
|
||||
}
|
||||
},
|
||||
on_clear: function() {
|
||||
|
@ -4753,7 +4826,9 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
|
|||
} else {
|
||||
this.$el.find('a').show(!!this.get('value'));
|
||||
if (this.get('value')) {
|
||||
var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || '');
|
||||
var show_value = _t("Download")
|
||||
if (this.view)
|
||||
show_value += " " + (this.view.datarecord[this.node.attrs.filename] || '');
|
||||
this.$el.find('a').text(show_value);
|
||||
}
|
||||
}
|
||||
|
@ -4765,12 +4840,6 @@ instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({
|
|||
this.$el.find('input').eq(0).val(show_value);
|
||||
this.set_filename(name);
|
||||
},
|
||||
set_filename: function(value_) {
|
||||
var filename = this.node.attrs.filename;
|
||||
if (this.view.fields[filename]) {
|
||||
this.view.fields[filename].set({value: value_});
|
||||
}
|
||||
},
|
||||
on_clear: function() {
|
||||
this._super.apply(this, arguments);
|
||||
this.$el.find('input').eq(0).val('');
|
||||
|
@ -4819,10 +4888,12 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
|
|||
this.set({'value': file_base64});
|
||||
this.binary_value = true;
|
||||
this.render_value();
|
||||
this.set_filename(name);
|
||||
},
|
||||
on_clear: function() {
|
||||
this._super.apply(this, arguments);
|
||||
this.render_value();
|
||||
this.set_filename('');
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -4930,6 +5001,44 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
|
|||
},
|
||||
});
|
||||
|
||||
instance.web.form.FieldMonetary = instance.web.form.FieldFloat.extend({
|
||||
template: "FieldMonetary",
|
||||
init: function() {
|
||||
this._super.apply(this, arguments);
|
||||
this.set({"currency": false});
|
||||
if (this.options.currency_field) {
|
||||
this.field_manager.on("field_changed:" + this.options.currency_field, this, function() {
|
||||
this.set({"currency": this.field_manager.get_field_value(this.options.currency_field)});
|
||||
});
|
||||
}
|
||||
this.on("change:currency", this, this.get_currency_info);
|
||||
this.get_currency_info();
|
||||
this.ci_dm = new instance.web.DropMisordered();
|
||||
},
|
||||
start: function() {
|
||||
var tmp = this._super();
|
||||
this.on("change:currency_info", this, this.reinitialize);
|
||||
return tmp;
|
||||
},
|
||||
get_currency_info: function() {
|
||||
var self = this;
|
||||
if (this.get("currency") === false) {
|
||||
this.set({"currency_info": null});
|
||||
return;
|
||||
}
|
||||
return this.ci_dm.add(new instance.web.Model("res.currency").query(["symbol", "position"])
|
||||
.filter([["id", "=", self.get("currency")]]).first()).pipe(function(res) {
|
||||
self.set({"currency_info": res});
|
||||
});
|
||||
},
|
||||
parse_value: function(val, def) {
|
||||
return instance.web.parse_value(val, {type: "float"}, def);
|
||||
},
|
||||
format_value: function(val, def) {
|
||||
return instance.web.format_value(val, {type: "float"}, def);
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Registry of form fields, called by :js:`instance.web.FormView`.
|
||||
*
|
||||
|
@ -4960,7 +5069,8 @@ instance.web.form.widgets = new instance.web.Registry({
|
|||
'progressbar': 'instance.web.form.FieldProgressBar',
|
||||
'image': 'instance.web.form.FieldBinaryImage',
|
||||
'binary': 'instance.web.form.FieldBinaryFile',
|
||||
'statusbar': 'instance.web.form.FieldStatus'
|
||||
'statusbar': 'instance.web.form.FieldStatus',
|
||||
'monetary': 'instance.web.form.FieldMonetary',
|
||||
});
|
||||
|
||||
/**
|
||||
|
|
|
@ -482,7 +482,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
|
|||
view_type: "tree",
|
||||
context: this.dataset.get_context(context),
|
||||
toolbar: !!this.options.$sidebar
|
||||
}, callback);
|
||||
}).then(callback);
|
||||
}
|
||||
},
|
||||
/**
|
||||
|
|
|
@ -45,7 +45,7 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
|
|||
view_type: "tree",
|
||||
toolbar: this.view_manager ? !!this.view_manager.sidebar : false,
|
||||
context: this.dataset.get_context()
|
||||
}, this.on_loaded);
|
||||
}).then(this.on_loaded);
|
||||
},
|
||||
/**
|
||||
* Returns the list of fields needed to correctly read objects.
|
||||
|
|
|
@ -99,6 +99,10 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
this.select_breadcrumb(index, subindex);
|
||||
},
|
||||
select_breadcrumb: function(index, subindex) {
|
||||
var next_item = this.breadcrumbs[index + 1];
|
||||
if (next_item && next_item.on_reverse_breadcrumb) {
|
||||
next_item.on_reverse_breadcrumb(this.breadcrumbs[index].widget);
|
||||
}
|
||||
for (var i = this.breadcrumbs.length - 1; i >= 0; i--) {
|
||||
if (i > index) {
|
||||
if (this.remove_breadcrumb(i) === false) {
|
||||
|
@ -220,14 +224,14 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}
|
||||
});
|
||||
},
|
||||
do_action: function(action, on_close, clear_breadcrumbs) {
|
||||
do_action: function(action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
|
||||
if (_.isString(action) && instance.web.client_actions.contains(action)) {
|
||||
var action_client = { type: "ir.actions.client", tag: action };
|
||||
return this.do_action(action_client, on_close, clear_breadcrumbs);
|
||||
return this.do_action(action_client, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
} else if (_.isNumber(action) || _.isString(action)) {
|
||||
var self = this;
|
||||
return self.rpc("/web/action/load", { action_id: action }).pipe(function(result) {
|
||||
return self.do_action(result.result, on_close, clear_breadcrumbs);
|
||||
return self.do_action(result, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
});
|
||||
}
|
||||
if (!action.type) {
|
||||
|
@ -249,77 +253,94 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
console.error("Action manager can't handle action of type " + action.type, action);
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
return this[type](action, on_close, clear_breadcrumbs);
|
||||
return this[type](action, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
},
|
||||
null_action: function() {
|
||||
this.dialog_stop();
|
||||
this.clear_breadcrumbs();
|
||||
},
|
||||
ir_actions_common: function(action, on_close, clear_breadcrumbs) {
|
||||
var self = this, klass, widget, post_process;
|
||||
if (this.inner_widget && (action.type === 'ir.actions.client' || action.target !== 'new')) {
|
||||
/**
|
||||
*
|
||||
* @param {Object} executor
|
||||
* @param {Object} executor.action original action
|
||||
* @param {Function<instance.web.Widget>} executor.widget function used to fetch the widget instance
|
||||
* @param {String} executor.klass CSS class to add on the dialog root, if action.target=new
|
||||
* @param {Function<instance.web.Widget, undefined>} executor.post_process cleanup called after a widget has been added as inner_widget
|
||||
* @param on_close
|
||||
* @param clear_breadcrumbs
|
||||
* @return {*}
|
||||
*/
|
||||
ir_actions_common: function(executor, on_close, clear_breadcrumbs) {
|
||||
if (this.inner_widget && executor.action.target !== 'new') {
|
||||
if (this.getParent().has_uncommitted_changes()) {
|
||||
return $.Deferred().reject();
|
||||
} else if (clear_breadcrumbs) {
|
||||
this.clear_breadcrumbs();
|
||||
}
|
||||
}
|
||||
if (action.type === 'ir.actions.client') {
|
||||
var ClientWidget = instance.web.client_actions.get_object(action.tag);
|
||||
widget = new ClientWidget(this, action.params);
|
||||
klass = 'oe_act_client';
|
||||
post_process = function() {
|
||||
self.push_breadcrumb({
|
||||
widget: widget,
|
||||
title: action.name
|
||||
});
|
||||
if (action.tag !== 'reload') {
|
||||
self.do_push_state({});
|
||||
}
|
||||
};
|
||||
} else {
|
||||
widget = new instance.web.ViewManagerAction(this, action);
|
||||
klass = 'oe_act_window';
|
||||
post_process = widget.proxy('add_breadcrumb');
|
||||
}
|
||||
if (action.target === 'new') {
|
||||
var widget = executor.widget();
|
||||
if (executor.action.target === 'new') {
|
||||
if (this.dialog === null) {
|
||||
// These buttons will be overwrited by <footer> if any
|
||||
this.dialog = new instance.web.Dialog(this, {
|
||||
buttons: { "Close": function() { $(this).dialog("close"); }},
|
||||
dialogClass: klass
|
||||
dialogClass: executor.klass
|
||||
});
|
||||
if(on_close)
|
||||
this.dialog.on_close.add(on_close);
|
||||
} else {
|
||||
this.dialog_widget.destroy();
|
||||
}
|
||||
this.dialog.dialog_title = action.name;
|
||||
this.dialog.dialog_title = executor.action.name;
|
||||
this.dialog_widget = widget;
|
||||
this.dialog_widget.appendTo(this.dialog.$el);
|
||||
var initialized = this.dialog_widget.appendTo(this.dialog.$el);
|
||||
this.dialog.open();
|
||||
return initialized;
|
||||
} else {
|
||||
this.dialog_stop();
|
||||
this.inner_action = action;
|
||||
this.inner_action = executor.action;
|
||||
this.inner_widget = widget;
|
||||
post_process();
|
||||
this.inner_widget.appendTo(this.$el);
|
||||
executor.post_process(widget);
|
||||
return this.inner_widget.appendTo(this.$el);
|
||||
}
|
||||
},
|
||||
ir_actions_act_window: function (action, on_close, clear_breadcrumbs) {
|
||||
ir_actions_act_window: function (action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
|
||||
var self = this;
|
||||
if (action.target !== 'new') {
|
||||
if(action.menu_id) {
|
||||
this.dialog_stop();
|
||||
return this.getParent().do_action(action, function () {
|
||||
instance.webclient.menu.open_menu(action.menu_id);
|
||||
}, clear_breadcrumbs);
|
||||
}
|
||||
}
|
||||
return this.ir_actions_common(action, on_close, clear_breadcrumbs);
|
||||
|
||||
return this.ir_actions_common({
|
||||
widget: function () { return new instance.web.ViewManagerAction(self, action); },
|
||||
action: action,
|
||||
klass: 'oe_act_window',
|
||||
post_process: function (widget) { widget.add_breadcrumb(on_reverse_breadcrumb); }
|
||||
}, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
},
|
||||
ir_actions_client: function (action, on_close, clear_breadcrumbs) {
|
||||
return this.ir_actions_common(action, on_close, clear_breadcrumbs);
|
||||
ir_actions_client: function (action, on_close, clear_breadcrumbs, on_reverse_breadcrumb) {
|
||||
var self = this;
|
||||
var ClientWidget = instance.web.client_actions.get_object(action.tag);
|
||||
|
||||
if (!(ClientWidget.prototype instanceof instance.web.Widget)) {
|
||||
var next;
|
||||
if (next = ClientWidget(this, action.params)) {
|
||||
return this.do_action(next, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
}
|
||||
return $.when();
|
||||
}
|
||||
|
||||
return this.ir_actions_common({
|
||||
widget: function () { return new ClientWidget(self, action.params); },
|
||||
action: action,
|
||||
klass: 'oe_act_client',
|
||||
post_process: function(widget) {
|
||||
self.push_breadcrumb({
|
||||
widget: widget,
|
||||
title: action.name,
|
||||
on_reverse_breadcrumb: on_reverse_breadcrumb,
|
||||
});
|
||||
if (action.tag !== 'reload') {
|
||||
self.do_push_state({});
|
||||
}
|
||||
}
|
||||
}, on_close, clear_breadcrumbs, on_reverse_breadcrumb);
|
||||
},
|
||||
ir_actions_act_window_close: function (action, on_closed) {
|
||||
if (!this.dialog && on_closed) {
|
||||
|
@ -327,13 +348,13 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}
|
||||
this.dialog_stop();
|
||||
},
|
||||
ir_actions_server: function (action, on_closed, clear_breadcrumbs) {
|
||||
ir_actions_server: function (action, on_closed, clear_breadcrumbs, on_reverse_breadcrumb) {
|
||||
var self = this;
|
||||
this.rpc('/web/action/run', {
|
||||
action_id: action.id,
|
||||
context: action.context || {}
|
||||
}).then(function (action) {
|
||||
self.do_action(action, on_closed, clear_breadcrumbs)
|
||||
self.do_action(action, on_closed, clear_breadcrumbs, on_reverse_breadcrumb)
|
||||
});
|
||||
},
|
||||
ir_actions_report_xml: function(action, on_closed) {
|
||||
|
@ -528,7 +549,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
set_title: function(title) {
|
||||
this.$el.find('.oe_view_title_text:first').text(title);
|
||||
},
|
||||
add_breadcrumb: function() {
|
||||
add_breadcrumb: function(on_reverse_breadcrumb) {
|
||||
var self = this;
|
||||
var views = [this.active_view || this.views_src[0].view_type];
|
||||
this.on_mode_switch.add(function(mode) {
|
||||
|
@ -573,7 +594,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
titles.pop();
|
||||
}
|
||||
return titles;
|
||||
}
|
||||
},
|
||||
on_reverse_breadcrumb: on_reverse_breadcrumb,
|
||||
});
|
||||
},
|
||||
/**
|
||||
|
@ -632,7 +654,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
domains: [this.action.domain || []].concat(domains || []),
|
||||
contexts: [action_context].concat(contexts || []),
|
||||
group_by_seq: groupbys || []
|
||||
}, function (results) {
|
||||
}).then(function (results) {
|
||||
self.dataset._model = new instance.web.Model(
|
||||
self.dataset.model, results.context, results.domain);
|
||||
var groupby = results.group_by.length
|
||||
|
@ -791,13 +813,11 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
|
|||
});
|
||||
break;
|
||||
case 'fields':
|
||||
this.dataset.call_and_eval(
|
||||
'fields_get', [false, {}], null, 1).then(function (fields) {
|
||||
this.dataset.call('fields_get', [false, {}]).then(function (fields) {
|
||||
var $root = $('<dl>');
|
||||
_(fields).each(function (attributes, name) {
|
||||
$root.append($('<dt>').append($('<h4>').text(name)));
|
||||
var $attrs = $('<dl>').appendTo(
|
||||
$('<dd>').appendTo($root));
|
||||
var $attrs = $('<dl>').appendTo($('<dd>').appendTo($root));
|
||||
_(attributes).each(function (def, name) {
|
||||
if (def instanceof Object) {
|
||||
def = JSON.stringify(def);
|
||||
|
@ -1038,12 +1058,12 @@ instance.web.Sidebar = instance.web.Widget.extend({
|
|||
self.rpc("/web/action/load", {
|
||||
action_id: item.action.id,
|
||||
context: additional_context
|
||||
}, function(result) {
|
||||
result.result.context = _.extend(result.result.context || {},
|
||||
}).then(function(result) {
|
||||
result.context = _.extend(result.context || {},
|
||||
additional_context);
|
||||
result.result.flags = result.result.flags || {};
|
||||
result.result.flags.new_window = true;
|
||||
self.do_action(result.result, function () {
|
||||
result.flags = result.flags || {};
|
||||
result.flags.new_window = true;
|
||||
self.do_action(result, function () {
|
||||
// reload view
|
||||
self.getParent().reload();
|
||||
});
|
||||
|
@ -1174,7 +1194,7 @@ instance.web.View = instance.web.Widget.extend({
|
|||
var context = new instance.web.CompoundContext(dataset.get_context(), action_data.context || {});
|
||||
|
||||
var handler = function (r) {
|
||||
var action = r.result;
|
||||
var action = r;
|
||||
if (action && action.constructor == Object) {
|
||||
var ncontext = new instance.web.CompoundContext(context);
|
||||
if (record_id) {
|
||||
|
@ -1201,7 +1221,7 @@ instance.web.View = instance.web.Widget.extend({
|
|||
};
|
||||
|
||||
if (action_data.special) {
|
||||
return handler({result: {"type":"ir.actions.act_window_close"}});
|
||||
return handler({"type":"ir.actions.act_window_close"});
|
||||
} else if (action_data.type=="object") {
|
||||
var args = [[record_id]], additional_args = [];
|
||||
if (action_data.args) {
|
||||
|
@ -1217,7 +1237,7 @@ instance.web.View = instance.web.Widget.extend({
|
|||
args.push(context);
|
||||
return dataset.call_button(action_data.name, args).then(handler);
|
||||
} else if (action_data.type=="action") {
|
||||
return this.rpc('/web/action/load', { action_id: action_data.name, context: context, do_not_eval: true}, handler);
|
||||
return this.rpc('/web/action/load', { action_id: action_data.name, context: context, do_not_eval: true}).then(handler);
|
||||
} else {
|
||||
return dataset.exec_workflow(record_id, action_data.name).then(handler);
|
||||
}
|
||||
|
|
|
@ -407,7 +407,7 @@
|
|||
<a class="oe_logo" href="#"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
|
||||
<div class="oe_secondary_menus_container"/>
|
||||
<div class="oe_footer">
|
||||
Powered by <a href="http://www.openerp.com" target="_blank"><span>Open</span>ERP</a>
|
||||
Powered by <a href="http://www.openerp.com" target="_blank"><span>OpenERP</span></a>
|
||||
</div>
|
||||
</td>
|
||||
<td class="oe_application">
|
||||
|
@ -916,7 +916,7 @@
|
|||
</t>
|
||||
<t t-name="FieldChar">
|
||||
<span t-att-class="'oe_form_field '+widget.widget_class" t-att-style="widget.node.attrs.style">
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<input t-att-type="widget.password ? 'password' : 'text'"
|
||||
t-att-id="widget.id_for_label"
|
||||
t-att-tabindex="widget.node.attrs.tabindex"
|
||||
|
@ -925,6 +925,9 @@
|
|||
t-att-maxlength="widget.field.size"
|
||||
/><img class="oe_field_translate oe_input_icon" t-if="widget.field.translate" t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"' width="16" height="16" border="0"/>
|
||||
</t>
|
||||
<t t-if="widget.get('effective_readonly')">
|
||||
<span class="oe_form_char_content"></span>
|
||||
</t>
|
||||
</span>
|
||||
</t>
|
||||
<t t-name="FieldEmail">
|
||||
|
@ -1122,7 +1125,7 @@
|
|||
<td>
|
||||
<t t-call="HiddenInputFile">
|
||||
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
|
||||
<t t-set="fileupload_style">width: 83px;</t>
|
||||
<t t-set="fileupload_style" t-translation="off">width: 83px;</t>
|
||||
<button class="oe_button oe_field_button" type="button">
|
||||
<img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
|
||||
<span>Select</span>
|
||||
|
@ -1485,6 +1488,7 @@
|
|||
</div>
|
||||
<t t-name="SearchView.extended_search.proposition">
|
||||
<li>
|
||||
<span class="searchview_extended_prop_or">or</span>
|
||||
<select class="searchview_extended_prop_field">
|
||||
<t t-foreach="widget.attrs.fields" t-as="field">
|
||||
<option t-att="{'selected': field === widget.attrs.selected ? 'selected' : null}"
|
||||
|
@ -1716,4 +1720,16 @@
|
|||
<button class="oe_form_m2o_sc_button oe_button">Add All Info...</button>
|
||||
<button class="oe_form_m2o_cancel_button oe_button">Cancel</button>
|
||||
</t>
|
||||
<t t-name="FieldMonetary" t-extend="FieldChar">
|
||||
<t t-jquery="t:first" t-operation="before">
|
||||
<t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'before'">
|
||||
<t t-esc="widget.get('currency_info').symbol"/>
|
||||
</t>
|
||||
</t>
|
||||
<t t-jquery="t:last" t-operation="after">
|
||||
<t t-if="widget.get('currency_info') and widget.get('currency_info').position === 'after'">
|
||||
<t t-esc="widget.get('currency_info').symbol"/>
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
</templates>
|
||||
|
|
|
@ -82,14 +82,14 @@ $(document).ready(function () {
|
|||
});
|
||||
t.test('call', function (openerp) {
|
||||
var ds = new openerp.web.DataSet({session: openerp.session}, 'mod');
|
||||
t.expect(ds.call('frob', ['a', 'b', 42]), function (r) {
|
||||
t.expect(ds.call('frob', ['a', 'b', 42]).then(function (r) {
|
||||
strictEqual(r.method, 'frob');
|
||||
|
||||
strictEqual(r.args.length, 3);
|
||||
deepEqual(r.args, ['a', 'b', 42]);
|
||||
|
||||
ok(_.isEmpty(r.kwargs));
|
||||
});
|
||||
}));
|
||||
});
|
||||
t.test('name_get').then(function (openerp) {
|
||||
var ds = new openerp.web.DataSet({session: openerp.session}, 'mod');
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -15,8 +15,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"Language: es\n"
|
||||
|
||||
#. openerp-web
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
# Persian translation for openerp-web
|
||||
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
|
||||
# This file is distributed under the same license as the openerp-web package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openerp-web\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2012-07-02 09:06+0200\n"
|
||||
"PO-Revision-Date: 2012-10-03 10:24+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Persian <fa@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
msgid "Calendar"
|
||||
msgstr "تقویم"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:70
|
||||
msgid "Filter"
|
||||
msgstr "فیلتر"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:144
|
||||
msgid "Today"
|
||||
msgstr "امروز"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:145
|
||||
msgid "Day"
|
||||
msgstr "روز"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:146
|
||||
msgid "Week"
|
||||
msgstr "هفته"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:147
|
||||
msgid "Month"
|
||||
msgstr "ماه"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:148
|
||||
msgid "New event"
|
||||
msgstr "رویداد جدید"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:149
|
||||
msgid "Save"
|
||||
msgstr "ذخیره"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:150
|
||||
msgid "Cancel"
|
||||
msgstr "لغو کردن"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:151
|
||||
msgid "Details"
|
||||
msgstr "جزئیات "
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:152
|
||||
msgid "Edit"
|
||||
msgstr "ویرایش"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:153
|
||||
msgid "Delete"
|
||||
msgstr "حذف"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:155
|
||||
msgid "Event will be deleted permanently, are you sure?"
|
||||
msgstr "رویداد حذف خواهد شد. آیا مطمئن هستید؟"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:156
|
||||
#: addons/web_calendar/static/src/js/calendar.js:169
|
||||
msgid "Description"
|
||||
msgstr "توضیحات"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:157
|
||||
msgid "Time period"
|
||||
msgstr "بازه زمانی"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:158
|
||||
msgid "Full day"
|
||||
msgstr "تمام روز"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:161
|
||||
msgid "Do you want to edit the whole set of repeated events?"
|
||||
msgstr "آیا میخواهید مجموعه کامل رویدادهای تکراری را ویرایش کنید؟"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:162
|
||||
msgid "Repeat event"
|
||||
msgstr "تکرار رویداد"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:163
|
||||
msgid "Disabled"
|
||||
msgstr "غیرفعال"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:164
|
||||
msgid "Enabled"
|
||||
msgstr "فعال"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:167
|
||||
#: addons/web_calendar/static/src/js/calendar.js:175
|
||||
msgid "Agenda"
|
||||
msgstr "دستور کار"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:168
|
||||
msgid "Date"
|
||||
msgstr "تاریخ"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:172
|
||||
msgid "Year"
|
||||
msgstr "سال"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/xml/web_calendar.xml:5
|
||||
#: addons/web_calendar/static/src/xml/web_calendar.xml:6
|
||||
msgid " "
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Navigator"
|
||||
#~ msgstr "هدایتگر"
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-28 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16043)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-03 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. openerp-web
|
||||
#: addons/web_calendar/static/src/js/calendar.js:11
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue