summaryrefslogtreecommitdiff
path: root/addons/web
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web')
-rw-r--r--addons/web/i18n/cs.po4
-rw-r--r--addons/web/i18n/es.po32
-rw-r--r--addons/web/i18n/it.po32
-rw-r--r--addons/web/i18n/ja.po16
-rw-r--r--addons/web/i18n/nb.po232
-rw-r--r--addons/web/i18n/pt_BR.po30
-rw-r--r--addons/web/i18n/web.pot986
-rw-r--r--addons/web/static/lib/py.js/lib/py.js12
-rw-r--r--addons/web/static/src/js/chrome/action_manager.js6
-rw-r--r--addons/web/static/src/js/chrome/action_manager_act_window.js6
-rw-r--r--addons/web/static/src/js/core/dialog.js6
-rw-r--r--addons/web/static/src/js/core/dom.js2
-rw-r--r--addons/web/static/src/js/tools/debug_manager.js4
-rw-r--r--addons/web/static/src/js/views/abstract_view.js2
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js38
-rw-r--r--addons/web/static/src/js/views/basic/basic_view.js15
-rw-r--r--addons/web/static/src/js/views/calendar/calendar_model.js15
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_controller.js9
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_model.js5
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_renderer.js2
-rw-r--r--addons/web/static/src/js/views/control_panel/control_panel_view.js2
-rw-r--r--addons/web/static/src/js/views/form/form_view.js18
-rw-r--r--addons/web/static/src/js/views/graph/graph_renderer.js9
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_column.js10
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_record.js6
-rw-r--r--addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js3
-rw-r--r--addons/web/static/src/js/views/list/list_view.js15
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_controller.js3
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_model.js33
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_renderer.js29
-rw-r--r--addons/web/static/src/js/views/pivot/pivot_view.js8
-rw-r--r--addons/web/static/src/js/widgets/attach_document.js5
-rw-r--r--addons/web/static/src/js/widgets/switch_company_menu.js2
-rw-r--r--addons/web/static/src/scss/bootstrap_overridden.scss4
-rw-r--r--addons/web/static/src/scss/kanban_view_mobile.scss3
-rw-r--r--addons/web/static/src/scss/layout_background.scss54
-rw-r--r--addons/web/static/src/scss/layout_boxed.scss67
-rw-r--r--addons/web/static/src/scss/layout_clean.scss32
-rw-r--r--addons/web/static/src/scss/primary_variables.scss3
-rw-r--r--addons/web/static/src/scss/report.scss15
-rw-r--r--addons/web/static/src/xml/base.xml26
-rw-r--r--addons/web/static/src/xml/kanban.xml4
-rw-r--r--addons/web/static/src/xml/menu.xml2
-rw-r--r--addons/web/static/tests/chrome/action_manager_tests.js193
-rw-r--r--addons/web/static/tests/core/py_utils_tests.js7
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js166
-rw-r--r--addons/web/static/tests/helpers/test_utils_create.js1
-rw-r--r--addons/web/static/tests/helpers/test_utils_dom.js17
-rw-r--r--addons/web/static/tests/tools/debug_manager_tests.js4
-rw-r--r--addons/web/static/tests/views/calendar_tests.js92
-rw-r--r--addons/web/static/tests/views/control_panel_tests.js62
-rw-r--r--addons/web/static/tests/views/form_tests.js72
-rw-r--r--addons/web/static/tests/views/graph_tests.js33
-rw-r--r--addons/web/static/tests/views/kanban_mobile_tests.js6
-rw-r--r--addons/web/static/tests/views/kanban_tests.js63
-rw-r--r--addons/web/static/tests/views/pivot_tests.js161
-rw-r--r--addons/web/static/tests/views/search_filters_menu_tests.js140
-rw-r--r--addons/web/static/tests/views/search_view_tests.js34
-rw-r--r--addons/web/views/report_templates.xml6
59 files changed, 1903 insertions, 961 deletions
diff --git a/addons/web/i18n/cs.po b/addons/web/i18n/cs.po
index d7a7df2f4e2..71f219b2bf7 100644
--- a/addons/web/i18n/cs.po
+++ b/addons/web/i18n/cs.po
@@ -262,7 +262,7 @@ msgstr "Přístup zamítnut"
#: code:addons/web/static/src/js/services/crash_manager.js:15
#, python-format
msgid "Access Error"
-msgstr ""
+msgstr "Chyba přístupu"
#. module: web
#. openerp-web
@@ -2817,7 +2817,7 @@ msgstr "Uložit"
#: code:addons/web/static/src/js/views/view_dialogs.js:137
#, python-format
msgid "Save & Close"
-msgstr ""
+msgstr "Uložit a zavřít"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/es.po b/addons/web/i18n/es.po
index 3380775f563..bee5737b4b9 100644
--- a/addons/web/i18n/es.po
+++ b/addons/web/i18n/es.po
@@ -3,40 +3,42 @@
# * web
#
# Translators:
-# Martin Trigaux, 2018
-# e2f <projects@e2f.com>, 2018
# ES R2 <e2fds74f5ds412@outlook.com>, 2018
# David Perez <david@closemarketing.es>, 2018
# Ana Juaristi <ajuaristio@gmail.com>, 2018
# Mateo Tibaquirá Palacios <nestormateo@gmail.com>, 2018
# Alejandro Santana <alejandrosantana@anubia.es>, 2018
# Odoo developer at Praxya.com <sergio.estada@gmail.com>, 2018
-# David Arnold <blaggacao@users.noreply.github.com>, 2018
# José Vicente <txusev@gmail.com>, 2018
-# Luis M. Ontalba <luis.martinez@tecnativa.com>, 2018
-# Luis M. Triana <luis.triana@jarsa.com.mx>, 2018
# David Casas <info@informaticacoslada.com>, 2018
-# Antonio Trueba, 2018
-# RGB Consulting <odoo@rgbconsulting.com>, 2018
-# e2f_EPV Translator <e2f_EPV@outlook.com>, 2018
# Kiko <kiko@comunitea.com>, 2018
-# Nicolás Broggi <rnbroggi@gmail.com>, 2018
# Gustavo Valverde, 2018
-# Albert Orellano <albert.orellano@megaterios.co>, 2018
+# e2f <projects@e2f.com>, 2018
# Cristian Salamea <ovnicraft@gmail.com>, 2018
# Pedro M. Baeza <pedro.baeza@gmail.com>, 2018
# Jesús Alan Ramos Rodríguez <alan.ramos@jarsa.com.mx>, 2018
+# David Arnold <blaggacao@users.noreply.github.com>, 2018
# Alejandro Die Sanchis <marketing@domatix.com>, 2018
+# Luis M. Ontalba <luis.martinez@tecnativa.com>, 2018
+# Luis M. Triana <luis.triana@jarsa.com.mx>, 2018
+# Antonio Trueba, 2018
+# RGB Consulting <odoo@rgbconsulting.com>, 2018
# Inigo Zuluaga <inigo_zuluaga@yahoo.es>, 2018
+# e2f_EPV Translator <e2f_EPV@outlook.com>, 2018
+# Albert Orellano <albert.orellano@megaterios.co>, 2018
+# Nicolás Broggi <rnbroggi@gmail.com>, 2018
# Rubi Navarro <ren@odoo.com>, 2018
# Cristopher Cravioto <ccr@odoo.com>, 2018
+# Martin Trigaux, 2018
+# Carlos Lopez <celm1990@hotmail.com>, 2018
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-08 06:49+0000\n"
-"PO-Revision-Date: 2018-10-08 06:49+0000\n"
-"Last-Translator: Cristopher Cravioto <ccr@odoo.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:33+0000\n"
+"Last-Translator: Carlos Lopez <celm1990@hotmail.com>, 2018\n"
"Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1819,21 +1821,21 @@ msgstr "Idiomas"
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:9
#, python-format
msgid "Last 30 Days"
-msgstr ""
+msgstr "Últimos 30 días"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:10
#, python-format
msgid "Last 365 Days"
-msgstr ""
+msgstr "Últimos 365 días"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:8
#, python-format
msgid "Last 7 Days"
-msgstr ""
+msgstr "Últimos 7 días"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout____last_update
diff --git a/addons/web/i18n/it.po b/addons/web/i18n/it.po
index 9d4853a2d0d..3a1ed8ca728 100644
--- a/addons/web/i18n/it.po
+++ b/addons/web/i18n/it.po
@@ -356,21 +356,21 @@ msgstr "Aggiungi gruppo personalizzato"
#: code:addons/web/static/src/xml/kanban.xml:49
#, python-format
msgid "Add a Column"
-msgstr "Aggiungi una colonna"
+msgstr "Aggiungi colonna"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1130
#, python-format
msgid "Add a condition"
-msgstr "Aggiungi una condizione"
+msgstr "Aggiungi condizione"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/list/list_editable_renderer.js:78
#, python-format
msgid "Add a line"
-msgstr "Aggiungi una riga"
+msgstr "Aggiungi riga"
#. module: web
#. openerp-web
@@ -2605,12 +2605,12 @@ msgstr "Preferenze"
#. module: web
#: model:ir.actions.report,name:web.action_report_externalpreview
msgid "Preview External Report"
-msgstr "Anteprima rendiconto esterno"
+msgstr "Anteprima resoconto esterno"
#. module: web
#: model:ir.actions.report,name:web.action_report_internalpreview
msgid "Preview Internal Report"
-msgstr "Anteprima rendiconto interno"
+msgstr "Anteprima resoconto interno"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout__image
@@ -2767,12 +2767,12 @@ msgstr "Rimuovere questo preferito dall'elenco"
#: code:addons/web/static/src/js/chrome/action_manager_report.js:112
#, python-format
msgid "Report"
-msgstr "Rendiconto"
+msgstr "Resoconto"
#. module: web
#: model:ir.model,name:web.model_report_layout
msgid "Report Layout"
-msgstr "Struttura rendiconto"
+msgstr "Struttura resoconto"
#. module: web
#. openerp-web
@@ -3206,8 +3206,7 @@ msgid ""
"The record has been modified, your changes will be discarded. Do you want to"
" proceed?"
msgstr ""
-"Il documento è stato modificato, verranno abbandonate le modifiche. "
-"Procedere?"
+"Il record è stato modificato, verranno abbandonate le modifiche. Procedere?"
#. module: web
#. openerp-web
@@ -3298,12 +3297,12 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.preview_externalreport
msgid "This is a sample of an external report."
-msgstr "Questo è un campione di un resoconto esterno."
+msgstr "Campione di resoconto esterno."
#. module: web
#: model_terms:ir.ui.view,arch_db:web.preview_internalreport
msgid "This is a sample of an internal report."
-msgstr "Questo è un campione di resoconto interno."
+msgstr "Campione di resoconto interno."
#. module: web
#. openerp-web
@@ -3407,7 +3406,7 @@ msgstr "Tipo:"
msgid ""
"Unable to find Wkhtmltopdf on this system. The report will be shown in html."
msgstr ""
-"Impossibile trovare wkhtmltopdf nel sistema. Il resoconto verrà mostrato in "
+"Impossibile trovare wkhtmltopdf nel sistema, il resoconto verrà mostrato in "
"html."
#. module: web
@@ -3492,7 +3491,7 @@ msgstr "Aggiornare i dati (compatibile con l'importazione)"
#: code:addons/web/static/src/js/fields/upgrade_fields.js:69
#, python-format
msgid "Upgrade now"
-msgstr "Aggiorna adesso"
+msgstr "Avanza adesso"
#. module: web
#. openerp-web
@@ -3506,7 +3505,7 @@ msgstr "Avanza a Enterprise"
#: code:addons/web/static/src/xml/base.xml:1571
#, python-format
msgid "Upgrade to future versions"
-msgstr "Aggiornamento a versioni future"
+msgstr "Avanzamento alle prossime versioni"
#. module: web
#. openerp-web
@@ -3709,7 +3708,7 @@ msgstr "Ieri"
#: code:addons/web/static/src/js/chrome/abstract_web_client.js:352
#, python-format
msgid "You are back online"
-msgstr "Nuovamente online"
+msgstr "Di nuovo in linea"
#. module: web
#. openerp-web
@@ -3758,6 +3757,9 @@ msgid ""
"to get a correct display of headers and footers as well as support for "
"table-breaking between pages."
msgstr ""
+"Per visualizzare correttamente le intestazioni e i piè di pagina e gestire "
+"le interruzioni tabella tra pagine è necessario aggiornare wkhtmltopdf alla "
+"versione 0.12.0 o superiore."
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/ja.po b/addons/web/i18n/ja.po
index 11915901fa5..6cfa0fe790a 100644
--- a/addons/web/i18n/ja.po
+++ b/addons/web/i18n/ja.po
@@ -637,7 +637,7 @@ msgstr "ベース"
#: code:addons/web/static/src/xml/base.xml:1143
#, python-format
msgid "Based On"
-msgstr ""
+msgstr "基準"
#. module: web
#. openerp-web
@@ -819,7 +819,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1185
#, python-format
msgid "Compare To"
-msgstr ""
+msgstr "比較対象"
#. module: web
#. openerp-web
@@ -1799,21 +1799,21 @@ msgstr "言語"
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:9
#, python-format
msgid "Last 30 Days"
-msgstr ""
+msgstr "過去30日"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:10
#, python-format
msgid "Last 365 Days"
-msgstr ""
+msgstr "過去365日"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:8
#, python-format
msgid "Last 7 Days"
-msgstr ""
+msgstr "過去7日"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout____last_update
@@ -2609,7 +2609,7 @@ msgstr ""
#: code:addons/web/static/src/xml/web_calendar.xml:75
#, python-format
msgid "Previous"
-msgstr ""
+msgstr "前"
#. module: web
#. openerp-web
@@ -2623,7 +2623,7 @@ msgstr "前期間"
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:25
#, python-format
msgid "Previous Year"
-msgstr ""
+msgstr "昨年"
#. module: web
#. openerp-web
@@ -3356,7 +3356,7 @@ msgstr ""
msgid ""
"Try to add some records, or make sure that there is no active filter in the "
"search bar."
-msgstr ""
+msgstr "レコードを追加するか、サーチバーのフィルタを調整してみてください。"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/nb.po b/addons/web/i18n/nb.po
index 2b9fd80db2d..e8aa2ea9d07 100644
--- a/addons/web/i18n/nb.po
+++ b/addons/web/i18n/nb.po
@@ -3,16 +3,18 @@
# * web
#
# Translators:
-# Martin Trigaux, 2018
# Eirik Halvorsen <eirik386@gmail.com>, 2018
# Jorunn D. Newth, 2018
+# Martin Trigaux, 2018
+# Marius Stedjan <marius@stedjan.com>, 2018
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-08 06:49+0000\n"
-"PO-Revision-Date: 2018-10-08 06:49+0000\n"
-"Last-Translator: Jorunn D. Newth, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:33+0000\n"
+"Last-Translator: Marius Stedjan <marius@stedjan.com>, 2018\n"
"Language-Team: Norwegian Bokmål (https://www.transifex.com/odoo/teams/41243/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -165,7 +167,7 @@ msgstr "'%s' er ikke et korrekt heltall"
#: code:addons/web/static/src/js/fields/field_utils.js:548
#, python-format
msgid "'%s' is not a correct monetary field"
-msgstr ""
+msgstr "'%s' er ikke et gyldig valutafelt"
#. module: web
#. openerp-web
@@ -186,7 +188,7 @@ msgstr "(Enterprise-utgave)"
#: code:addons/web/static/src/xml/base.xml:298
#, python-format
msgid "(change)"
-msgstr ""
+msgstr "(endre)"
#. module: web
#. openerp-web
@@ -194,7 +196,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:537
#, python-format
msgid "(count)"
-msgstr ""
+msgstr "(antall)"
#. module: web
#. openerp-web
@@ -225,6 +227,8 @@ msgid ""
"A popup window has been blocked. You may need to change your browser "
"settings to allow popup windows for this page."
msgstr ""
+"Et popup-vindu ble blokkert. Du må kanskje endre innstillinger i nettleseren"
+" din til å tillate popup-vinduer på dette nettstedet."
#. module: web
#. openerp-web
@@ -234,6 +238,9 @@ msgid ""
"A popup window with your report was blocked. You may need to change your "
"browser settings to allow popup windows for this page."
msgstr ""
+"Popup-vinduet med rapporten din ble blokkert. Du må kanskje endre "
+"innstillinger i nettleseren din til å tillate popup-vinduer på dette "
+"nettstedet."
#. module: web
#. openerp-web
@@ -247,7 +254,7 @@ msgstr "ALLE"
#: code:addons/web/static/src/xml/base.xml:633
#, python-format
msgid "ANY"
-msgstr ""
+msgstr "NOEN"
#. module: web
#. openerp-web
@@ -322,7 +329,7 @@ msgstr "Legg til"
#: code:addons/web/static/src/js/views/calendar/calendar_renderer.js:82
#, python-format
msgid "Add %s"
-msgstr ""
+msgstr "Legg til %s"
#. module: web
#. openerp-web
@@ -336,14 +343,14 @@ msgstr "Legg til tilpasset filter"
#: code:addons/web/static/src/xml/base.xml:1111
#, python-format
msgid "Add Custom Group"
-msgstr ""
+msgstr "Legg til tilpasset gruppe"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/kanban.xml:49
#, python-format
msgid "Add a Column"
-msgstr ""
+msgstr "Legg til kolonne"
#. module: web
#. openerp-web
@@ -357,21 +364,21 @@ msgstr "Legg til betingelse"
#: code:addons/web/static/src/js/views/list/list_editable_renderer.js:78
#, python-format
msgid "Add a line"
-msgstr ""
+msgstr "Legg til linje"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:616
#, python-format
msgid "Add branch"
-msgstr ""
+msgstr "Legg til gren"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/kanban.xml:48
#, python-format
msgid "Add column"
-msgstr ""
+msgstr "Legg til kolonne"
#. module: web
#. openerp-web
@@ -392,14 +399,14 @@ msgstr "Legg til ny verdi"
#: code:addons/web/static/src/xml/base.xml:615
#, python-format
msgid "Add node"
-msgstr ""
+msgstr "Legg til notat"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:701
#, python-format
msgid "Add tag"
-msgstr ""
+msgstr "Legg til tag"
#. module: web
#. openerp-web
@@ -497,6 +504,9 @@ msgid ""
"JavaScript file served from a different origin. (Opening your browser "
"console might give you a hint on the error.)"
msgstr ""
+"En ukjent CORS-feil oppstod. Denne feilen kommer sannsynligvis fra en "
+"ekstern JavaScript-fil fra en annen opprinnelse. (Om du åpner nettleser-"
+"konsollen, kan du sannsynligvis få et hint om feilen.)"
#. module: web
#. openerp-web
@@ -511,7 +521,7 @@ msgstr "Og mer"
#: code:addons/web/static/src/xml/base.xml:628
#, python-format
msgid "Any"
-msgstr ""
+msgstr "Noen"
#. module: web
#. openerp-web
@@ -535,7 +545,7 @@ msgstr "Arkiver"
#: code:addons/web/static/src/xml/kanban.xml:27
#, python-format
msgid "Archive All"
-msgstr ""
+msgstr "Arkiver alle"
#. module: web
#. openerp-web
@@ -551,13 +561,14 @@ msgstr "Arkivert"
msgid ""
"Are you sure that you want to archive all the records from this column?"
msgstr ""
+"Er du sikker på at du vil arkivere alle oppføringene i denne kolonnen?"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/list/list_controller.js:156
#, python-format
msgid "Are you sure that you want to archive all the selected records?"
-msgstr ""
+msgstr "Er du sikker på at du vil arkivere de valgte oppføringene?"
#. module: web
#. openerp-web
@@ -586,7 +597,7 @@ msgstr "Er du sikker på at du vil fjerne denne oppføringen?"
#: code:addons/web/static/src/xml/base.xml:1028
#, python-format
msgid "Attach"
-msgstr ""
+msgstr "Legg til vedlegg"
#. module: web
#. openerp-web
@@ -629,14 +640,14 @@ msgstr "Base"
#: code:addons/web/static/src/xml/base.xml:1143
#, python-format
msgid "Based On"
-msgstr ""
+msgstr "Basert på"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:250
#, python-format
msgid "Become Superuser"
-msgstr ""
+msgstr "Bli superbruker"
#. module: web
#: code:addons/web/controllers/main.py:1538
@@ -645,6 +656,8 @@ msgid ""
"Binary fields can not be exported to Excel unless their content is "
"base64-encoded. That does not seem to be the case for %s."
msgstr ""
+"Binærfelter kan ikke eksporteres til Excel med mindre de er base64-kodet. "
+"Det ser ikke ut til å være tilfellet for %s."
#. module: web
#. openerp-web
@@ -693,7 +706,7 @@ msgstr "Bytes, Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb"
#: code:addons/web/static/src/xml/base.xml:1222
#, python-format
msgid "CLEAR"
-msgstr ""
+msgstr "NULLSTILL"
#. module: web
#. openerp-web
@@ -736,7 +749,7 @@ msgstr "Kan ikke vise diagram med modus:"
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:414
#, python-format
msgid "Card color: %s"
-msgstr ""
+msgstr "Kortfarge: %s"
#. module: web
#. openerp-web
@@ -811,7 +824,7 @@ msgstr "Kolonnetittel"
#: code:addons/web/static/src/xml/base.xml:1185
#, python-format
msgid "Compare To"
-msgstr ""
+msgstr "Sammenlign med"
#. module: web
#. openerp-web
@@ -899,7 +912,7 @@ msgstr "Kopier hele feilmeldingen til utklippstavle"
#: code:addons/web/static/src/js/core/ajax.js:372
#, python-format
msgid "Could not connect to the server"
-msgstr ""
+msgstr "Kan ikke koble til Server"
#. module: web
#. openerp-web
@@ -994,7 +1007,7 @@ msgstr "Opprett:"
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:245
#, python-format
msgid "Create: %s"
-msgstr ""
+msgstr "Opprett: %s"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout__create_uid
@@ -1032,7 +1045,7 @@ msgstr "Opprettet av:"
#: code:addons/web/static/src/xml/base.xml:919
#, python-format
msgid "Current state"
-msgstr ""
+msgstr "Nåværende status"
#. module: web
#. openerp-web
@@ -1048,7 +1061,7 @@ msgstr "Tilpasset filter"
#: code:addons/web/static/src/xml/kanban.xml:88
#, python-format
msgid "Dark blue"
-msgstr ""
+msgstr "Mørk blå"
#. module: web
#. openerp-web
@@ -1057,7 +1070,7 @@ msgstr ""
#: code:addons/web/static/src/xml/kanban.xml:85
#, python-format
msgid "Dark purple"
-msgstr ""
+msgstr "Mørk lilla"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
@@ -1111,14 +1124,14 @@ msgstr "Slett"
#: code:addons/web/static/src/xml/base.xml:614
#, python-format
msgid "Delete node"
-msgstr ""
+msgstr "Slett node"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/list/list_editable_renderer.js:557
#, python-format
msgid "Delete row "
-msgstr ""
+msgstr "Slett rad"
#. module: web
#. openerp-web
@@ -1234,7 +1247,7 @@ msgstr "Last ned .xls-fil"
#: code:addons/web/static/src/xml/base.xml:1556
#, python-format
msgid "Dropdown menu"
-msgstr ""
+msgstr "Nedtrekksmeny"
#. module: web
#. openerp-web
@@ -1295,7 +1308,7 @@ msgstr "Rediger stadium"
#: code:addons/web/static/src/xml/base.xml:276
#, python-format
msgid "Edit View:"
-msgstr ""
+msgstr "Rediger visning:"
#. module: web
#. openerp-web
@@ -1334,7 +1347,7 @@ msgstr "Feil, passord ikke endret!"
#: code:addons/web/static/src/xml/kanban.xml:62
#, python-format
msgid "Esc to discard"
-msgstr ""
+msgstr "Klikk Esc for å forkaste"
#. module: web
#. openerp-web
@@ -1369,7 +1382,7 @@ msgstr "Utvid alle"
#: code:addons/web/static/src/xml/base.xml:1433
#, python-format
msgid "Expand parents"
-msgstr ""
+msgstr "Utvid overordnede"
#. module: web
#. openerp-web
@@ -1390,7 +1403,7 @@ msgstr "Eksporter data"
#: code:addons/web/static/src/xml/base.xml:1400
#, python-format
msgid "Export Format:"
-msgstr ""
+msgstr "Eksportformat:"
#. module: web
#. openerp-web
@@ -1413,14 +1426,14 @@ msgstr "Ekstern ID"
#: code:addons/web/static/src/xml/base.xml:826
#, python-format
msgid "External link"
-msgstr ""
+msgstr "Ekstern link"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1220
#, python-format
msgid "FILTER"
-msgstr ""
+msgstr "FILTER"
#. module: web
#. openerp-web
@@ -1534,7 +1547,7 @@ msgstr "Minimer"
#: code:addons/web/static/src/xml/base.xml:756
#, python-format
msgid "Followed by"
-msgstr ""
+msgstr "Følges av"
#. module: web
#. openerp-web
@@ -1561,7 +1574,7 @@ msgstr "Skjema"
#: code:addons/web/static/src/js/views/search/filters_menu.js:179
#, python-format
msgid "From %s To %s"
-msgstr ""
+msgstr "Fra %s til %s"
#. module: web
#. openerp-web
@@ -1570,7 +1583,7 @@ msgstr ""
#: code:addons/web/static/src/xml/kanban.xml:89
#, python-format
msgid "Fushia"
-msgstr ""
+msgstr "Fushia"
#. module: web
#. openerp-web
@@ -1591,7 +1604,7 @@ msgstr ""
#: code:addons/web/static/src/js/views/kanban/kanban_column_quick_create.js:189
#, python-format
msgid "Got it"
-msgstr ""
+msgstr "OK"
#. module: web
#. openerp-web
@@ -1628,56 +1641,56 @@ msgstr "Grupper etter: %s"
#. module: web
#: model:ir.model,name:web.model_ir_http
msgid "HTTP Routing"
-msgstr ""
+msgstr "HTTP-ruting"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:877
#, python-format
msgid "Hide in Kanban"
-msgstr ""
+msgstr "Gjem i kanban"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:432
#, python-format
msgid "Hit DOWN to navigate to the list below"
-msgstr ""
+msgstr "Klikk NED for å navigere til listen under"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:439
#, python-format
msgid "Hit ENTER to"
-msgstr ""
+msgstr "Klikk ENTER for å"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:431
#, python-format
msgid "Hit ENTER to CREATE"
-msgstr ""
+msgstr "Klikk ENTER for å OPPRETTE"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:423
#, python-format
msgid "Hit ENTER to SAVE"
-msgstr ""
+msgstr "Klikk ENTER for å LAGRE"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:424
#, python-format
msgid "Hit ESCAPE to DISCARD"
-msgstr ""
+msgstr "Klikk ESCAPE for å FORKASTE"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/colorpicker.xml:41
#, python-format
msgid "Hue"
-msgstr ""
+msgstr "Kulør"
#. module: web
#. openerp-web
@@ -1745,7 +1758,7 @@ msgstr "Ugyldig domene"
#: code:addons/web/static/src/xml/base.xml:737
#, python-format
msgid "Invalid field chain"
-msgstr ""
+msgstr "Ugyldig feltkjede"
#. module: web
#. openerp-web
@@ -1793,21 +1806,21 @@ msgstr "Språk"
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:9
#, python-format
msgid "Last 30 Days"
-msgstr ""
+msgstr "Siste 30 dager"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:10
#, python-format
msgid "Last 365 Days"
-msgstr ""
+msgstr "Siste 365 dager"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:8
#, python-format
msgid "Last 7 Days"
-msgstr ""
+msgstr "Siste 7 dager"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout____last_update
@@ -1880,14 +1893,14 @@ msgstr "Forlat utviklerverktøy"
#: code:addons/web/static/src/xml/kanban.xml:84
#, python-format
msgid "Light blue"
-msgstr ""
+msgstr "Lys blå"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/colorpicker.xml:49
#, python-format
msgid "Lightness %"
-msgstr ""
+msgstr "Lystetthet %"
#. module: web
#. openerp-web
@@ -1930,7 +1943,7 @@ msgstr "Laster inn (%d)"
#: code:addons/web/static/src/xml/base.xml:1466
#, python-format
msgid "Loading, please wait..."
-msgstr ""
+msgstr "Laster, vennligst vent..."
#. module: web
#. openerp-web
@@ -1950,7 +1963,7 @@ msgstr "Logg inn"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Log in as superuser"
-msgstr ""
+msgstr "Logg inn som superbruker"
#. module: web
#. openerp-web
@@ -1993,7 +2006,7 @@ msgstr "Epost:"
#: code:addons/web/static/src/xml/base.xml:271
#, python-format
msgid "Manage Attachments"
-msgstr ""
+msgstr "Administrer vedlegg"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login_layout
@@ -2013,7 +2026,7 @@ msgstr "Administrer filtre"
#: code:addons/web/static/src/xml/base.xml:639
#, python-format
msgid "Match"
-msgstr ""
+msgstr "Match"
#. module: web
#. openerp-web
@@ -2051,7 +2064,7 @@ msgstr "Mål"
#: code:addons/web/static/src/xml/kanban.xml:87
#, python-format
msgid "Medium blue"
-msgstr ""
+msgstr "Medium blå"
#. module: web
#. openerp-web
@@ -2196,7 +2209,7 @@ msgstr "Ingen oppdatering:"
#: code:addons/web/static/src/js/tools/debug_manager.js:359
#, python-format
msgid "No attachment available"
-msgstr ""
+msgstr "Ingen vedlegg tilgjengelig"
#. module: web
#. openerp-web
@@ -2204,7 +2217,7 @@ msgstr ""
#: code:addons/web/static/src/xml/kanban.xml:80
#, python-format
msgid "No color"
-msgstr ""
+msgstr "Ingen farge"
#. module: web
#. openerp-web
@@ -2255,7 +2268,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:927
#, python-format
msgid "Not active state, click to change it"
-msgstr ""
+msgstr "Ikke aktiv tilstand, klikk for å endre den"
#. module: web
#. openerp-web
@@ -2363,7 +2376,7 @@ msgstr "Ved endring:"
#: code:addons/web/static/src/js/fields/basic_fields.js:2283
#, python-format
msgid "Only Integer Value should be valid."
-msgstr ""
+msgstr "Kun heltall er gyldig verdi"
#. module: web
#: code:addons/web/controllers/main.py:502
@@ -2384,7 +2397,7 @@ msgstr "Bare deg"
#: code:addons/web/static/src/xml/colorpicker.xml:55
#, python-format
msgid "Opacity %"
-msgstr ""
+msgstr "Gjennomsiktighet %"
#. module: web
#. openerp-web
@@ -2405,7 +2418,7 @@ msgstr "Åpne utviklerverktøy"
#: code:addons/web/static/src/xml/base.xml:241
#, python-format
msgid "Open View"
-msgstr ""
+msgstr "Åpne Visning"
#. module: web
#. openerp-web
@@ -2452,7 +2465,7 @@ msgstr "Åpne: "
#: code:addons/web/static/src/xml/kanban.xml:82
#, python-format
msgid "Orange"
-msgstr ""
+msgstr "Oransje"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_background
@@ -2488,7 +2501,7 @@ msgstr "Telefon:"
#: code:addons/web/static/src/js/widgets/colorpicker.js:33
#, python-format
msgid "Pick a color"
-msgstr ""
+msgstr "Velg en farge"
#. module: web
#. openerp-web
@@ -2505,6 +2518,8 @@ msgid ""
"Pie chart cannot display all zero numbers.. Try to change your domain to "
"display positive results"
msgstr ""
+"Kakediagram kan ikke vise kun nullverdier. Forsøk å endre domenet for å vise"
+" positive resultater."
#. module: web
#. openerp-web
@@ -2529,7 +2544,7 @@ msgstr "Pivot"
#: code:addons/web/static/src/js/views/list/list_renderer.js:352
#, python-format
msgid "Please click on the \"save\" button first."
-msgstr ""
+msgstr "Klikk på 'Lagre'-knappen først."
#. module: web
#. openerp-web
@@ -2557,7 +2572,7 @@ msgstr "Velg hvilke felt som skal lagres i eksportlisten..."
#: code:addons/web/static/src/xml/base.xml:1525
#, python-format
msgid "Please update translations of :"
-msgstr ""
+msgstr "Oppdater oversettelse for:"
#. module: web
#. openerp-web
@@ -2592,12 +2607,12 @@ msgstr "Forhåndsvis intern rapport"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout__image
msgid "Preview image src"
-msgstr ""
+msgstr "Forhåndsvis bildelink"
#. module: web
#: model:ir.model.fields,field_description:web.field_report_layout__pdf
msgid "Preview pdf src"
-msgstr ""
+msgstr "Forhåndsvis pdf-link"
#. module: web
#. openerp-web
@@ -2650,12 +2665,12 @@ msgstr "Kvartal"
#: code:addons/web/static/src/xml/kanban.xml:32
#, python-format
msgid "Quick add"
-msgstr ""
+msgstr "Hurtigopprett"
#. module: web
#: model:ir.model,name:web.model_ir_qweb_field_image
msgid "Qweb Field Image"
-msgstr ""
+msgstr "Qweb Felt-bilde"
#. module: web
#. openerp-web
@@ -2679,7 +2694,7 @@ msgstr "Rød"
#: code:addons/web/static/src/xml/base.xml:249
#, python-format
msgid "Regenerate Assets Bundles"
-msgstr ""
+msgstr "Regenerer Ressursbunt"
#. module: web
#. openerp-web
@@ -2693,7 +2708,7 @@ msgstr "Relasjon ikke tillatt"
#: code:addons/web/static/src/xml/base.xml:771
#, python-format
msgid "Relation to follow"
-msgstr ""
+msgstr "Relasjon å følge"
#. module: web
#. openerp-web
@@ -2730,7 +2745,7 @@ msgstr "Fjern fra favoritter"
#: code:addons/web/static/src/xml/base.xml:696
#, python-format
msgid "Remove tag"
-msgstr ""
+msgstr "Fjern tag"
#. module: web
#. openerp-web
@@ -2749,14 +2764,14 @@ msgstr "Rapport"
#. module: web
#: model:ir.model,name:web.model_report_layout
msgid "Report Layout"
-msgstr ""
+msgstr "Rapportlayout"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/services/crash_manager.js:223
#, python-format
msgid "Request timeout"
-msgstr ""
+msgstr "Forespørsel timet ut"
#. module: web
#. openerp-web
@@ -2770,7 +2785,7 @@ msgstr "Gjenopprett"
#: code:addons/web/static/src/xml/base.xml:240
#, python-format
msgid "Run Click Everywhere Test"
-msgstr ""
+msgstr "Kjør Click Everywhere test"
#. module: web
#. openerp-web
@@ -2791,7 +2806,7 @@ msgstr "Kjør JS-tester"
#: code:addons/web/static/src/xml/base.xml:1226
#, python-format
msgid "SEE RESULT"
-msgstr ""
+msgstr "SE RESULTAT"
#. module: web
#. openerp-web
@@ -2800,14 +2815,14 @@ msgstr ""
#: code:addons/web/static/src/xml/kanban.xml:86
#, python-format
msgid "Salmon pink"
-msgstr ""
+msgstr "Lakserosa"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/colorpicker.xml:45
#, python-format
msgid "Saturation %"
-msgstr ""
+msgstr "Fargetetthet %"
#. module: web
#. openerp-web
@@ -2826,7 +2841,7 @@ msgstr "Lagre"
#: code:addons/web/static/src/js/views/view_dialogs.js:137
#, python-format
msgid "Save & Close"
-msgstr ""
+msgstr "Lagre og lukk"
#. module: web
#. openerp-web
@@ -2952,6 +2967,8 @@ msgid ""
"Select <i class=\"fa fa-database\" role=\"img\" aria-label=\"Database\" "
"title=\"Database\"/>"
msgstr ""
+"Velg <i class=\"fa fa-database\" role=\"img\" aria-label=\"Database\" "
+"title=\"Database\"/>"
#. module: web
#. openerp-web
@@ -3135,6 +3152,8 @@ msgid ""
"The field chain is not valid. Did you maybe use a non-existing field name or"
" followed a non-relational field?"
msgstr ""
+"Feltkjeden er ikke gyldig. Brukte du kanskje et ikkeeksisterende felt, eller"
+" fulgte et ikke-relasjonelt felt?"
#. module: web
#. openerp-web
@@ -3172,6 +3191,8 @@ msgid ""
"The operation was interrupted. This usually means that the current operation"
" is taking too much time."
msgstr ""
+"Operasjonen ble avbrutt. Dette betyr som regel at den nåværende operasjonen "
+"tar for mye tid."
#. module: web
#. openerp-web
@@ -3253,6 +3274,7 @@ msgstr "Dette år"
#, python-format
msgid "This date is on the future. Make sure it is what you expected."
msgstr ""
+"Dette datoen er i fremtiden. Vær sikker på at det er dette du forventet."
#. module: web
#. openerp-web
@@ -3294,7 +3316,7 @@ msgstr "Tidsspenn"
#: code:addons/web/static/src/xml/base.xml:1139
#, python-format
msgid "Time Ranges"
-msgstr ""
+msgstr "Tidsintervaller"
#. module: web
#. openerp-web
@@ -3305,6 +3327,9 @@ msgid ""
"one. The time in Odoo is displayed according to the timezone set on your "
"user's preferences."
msgstr ""
+"Tidssonefeil : Tidssonen i nettleseren din stemmer ikke med den valgte "
+"tidssonen. Tiden i Odoo vises i henhold til tidssonen du har satt i "
+"brukerens innstillinger."
#. module: web
#. openerp-web
@@ -3352,6 +3377,8 @@ msgid ""
"Try to add some records, or make sure\n"
" that there is at least one measure and no active filter in the search bar."
msgstr ""
+"Prøv å legge til oppføringer, eller forsikre deg om at\n"
+" det er minst en måleverdi, og ingen aktive filtre i søkefeltet."
#. module: web
#. openerp-web
@@ -3361,6 +3388,8 @@ msgid ""
"Try to add some records, or make sure that there is no active filter in the "
"search bar."
msgstr ""
+"Forsøk å legge til oppføringer, eller forsikre deg om at det ikke finnes "
+"aktive filtre i søkefeltet."
#. module: web
#. openerp-web
@@ -3382,7 +3411,7 @@ msgstr "Type:"
#, python-format
msgid ""
"Unable to find Wkhtmltopdf on this system. The report will be shown in html."
-msgstr ""
+msgstr "Kan ikke finne Wkhtmltopdf på systemet. Rapporten vil vises som html."
#. module: web
#. openerp-web
@@ -3396,7 +3425,7 @@ msgstr "Av-arkiver"
#: code:addons/web/static/src/xml/kanban.xml:28
#, python-format
msgid "Unarchive All"
-msgstr ""
+msgstr "Dearkiver alle"
#. module: web
#. openerp-web
@@ -3438,7 +3467,7 @@ msgstr "Ukjent type "
#: code:addons/web/static/src/js/views/list/list_editable_renderer.js:556
#, python-format
msgid "Unlink row "
-msgstr ""
+msgstr "Slett rad"
#. module: web
#. openerp-web
@@ -3459,7 +3488,7 @@ msgstr "Uten navn"
#: code:addons/web/static/src/xml/base.xml:1393
#, python-format
msgid "Update data (import-compatible export)"
-msgstr ""
+msgstr "Oppdater data (import-kompatibel eksport)"
#. module: web
#. openerp-web
@@ -3473,7 +3502,7 @@ msgstr "Oppgrader nå"
#: code:addons/web/static/src/xml/base.xml:1577
#, python-format
msgid "Upgrade to enterprise"
-msgstr ""
+msgstr "Oppgrader til enterprise"
#. module: web
#. openerp-web
@@ -3519,7 +3548,7 @@ msgstr "Bruk som standard"
#: code:addons/web/static/src/xml/base.xml:1387
#, python-format
msgid "Use data in a spreadsheet (export all data)"
-msgstr ""
+msgstr "Bruk data i et regneark (eksporter all data)"
#. module: web
#. openerp-web
@@ -3568,7 +3597,7 @@ msgstr "Advarsel"
#: code:addons/web/static/src/js/widgets/attach_document.js:87
#, python-format
msgid "Warning : You have to save first before attaching a file."
-msgstr ""
+msgstr "Advarsel : Du må lagre før du legger ved en fil."
#. module: web
#: model_terms:ir.ui.view,arch_db:web.benchmark_suite
@@ -3722,7 +3751,7 @@ msgstr ""
msgid ""
"You need to start Odoo with at least two workers to print a pdf version of "
"the reports."
-msgstr ""
+msgstr "Du må starte Odoo med minst to workers for å printe pdf-rapporter."
#. module: web
#. openerp-web
@@ -3733,6 +3762,9 @@ msgid ""
"to get a correct display of headers and footers as well as support for "
"table-breaking between pages."
msgstr ""
+"Du bør oppgradere versjonen av Wkhtmltopdf til minst 0.12.0 for å kunne få "
+"korrekt visning av topp- og bunntekst, samt for å få støtte for tabeller som"
+" går over flere sider."
#. module: web
#. openerp-web
@@ -3749,13 +3781,15 @@ msgid ""
"Your installation of Wkhtmltopdf seems to be broken. The report will be "
"shown in html."
msgstr ""
+"Din installasjon av Wkhtmltopdf ser ikke ut til å fungere. Rapporten blir "
+"vist som HTML."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:246
#, python-format
msgid "[No widget %s]"
-msgstr ""
+msgstr "[Ingen widget %s]"
#. module: web
#. openerp-web
@@ -3804,7 +3838,7 @@ msgstr "alle oppføringer"
#: code:addons/web/static/src/js/widgets/domain_selector.js:28
#, python-format
msgid "child of"
-msgstr ""
+msgstr "underordnet av"
#. module: web
#. openerp-web
@@ -3819,7 +3853,7 @@ msgstr "inneholder"
#: code:addons/web/static/src/js/widgets/domain_selector.js:24
#, python-format
msgid "does not contain"
-msgstr ""
+msgstr "inneholder ikke"
#. module: web
#. openerp-web
@@ -3912,7 +3946,7 @@ msgstr "er ikke"
#: code:addons/web/static/src/js/widgets/domain_selector.js:18
#, python-format
msgid "is not ="
-msgstr ""
+msgstr "er ikke ="
#. module: web
#. openerp-web
@@ -4047,7 +4081,7 @@ msgstr "eller"
#: code:addons/web/static/src/js/widgets/domain_selector.js:29
#, python-format
msgid "parent of"
-msgstr ""
+msgstr "overordnet av"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/pt_BR.po b/addons/web/i18n/pt_BR.po
index 1fd37f82ff9..adf20a58ea5 100644
--- a/addons/web/i18n/pt_BR.po
+++ b/addons/web/i18n/pt_BR.po
@@ -3,30 +3,32 @@
# * web
#
# Translators:
-# Rodrigo de Almeida Sottomaior Macedo <rmsolucoeseminformatic4@gmail.com>, 2018
-# danimaribeiro <danimaribeiro@gmail.com>, 2018
-# Martin Trigaux, 2018
-# Mateus Lopes <mateus1@gmail.com>, 2018
-# Luiz Carlos de Lima <luiz.carlos@akretion.com.br>, 2018
# Thiago MACÊDO <thiago95macedo@gmail.com>, 2018
-# falexandresilva <falexandresilva@gmail.com>, 2018
-# grazziano <gra.negocia@gmail.com>, 2018
# Marcos Abreu <marcoos.abreu@gmail.com>, 2018
-# Diego Bittencourt <diegomb86@gmail.com>, 2018
+# Luiz Carlos de Lima <luiz.carlos@akretion.com.br>, 2018
# Adriel Kotviski <kotviski@gmail.com>, 2018
-# Silmar <pinheirosilmar@gmail.com>, 2018
+# falexandresilva <falexandresilva@gmail.com>, 2018
+# Diego Bittencourt <diegomb86@gmail.com>, 2018
+# Rodrigo de Almeida Sottomaior Macedo <rmsolucoeseminformatic4@gmail.com>, 2018
+# danimaribeiro <danimaribeiro@gmail.com>, 2018
# André Augusto Firmino Cordeiro <a.cordeito@gmail.com>, 2018
+# Silmar <pinheirosilmar@gmail.com>, 2018
+# Martin Trigaux, 2018
# Luciano Giacomazzi <lucianogiacomazzi@gmail.com>, 2018
-# Maicon Grahl <maicongrahl@hotmail.com>, 2018
+# grazziano <gra.negocia@gmail.com>, 2018
# Franciele Neiva <franciele.neiva@br.ey.com>, 2018
+# Mateus Lopes <mateus1@gmail.com>, 2018
+# Maicon Grahl <maicongrahl@hotmail.com>, 2018
# Yannick Belot <yannickbh@gmail.com>, 2018
+# Rafael H L Moretti <rafael.moretti@gmail.com>, 2018
+#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-08 06:49+0000\n"
-"PO-Revision-Date: 2018-10-08 06:49+0000\n"
-"Last-Translator: Yannick Belot <yannickbh@gmail.com>, 2018\n"
+"PO-Revision-Date: 2018-08-24 09:33+0000\n"
+"Last-Translator: Rafael H L Moretti <rafael.moretti@gmail.com>, 2018\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/odoo/teams/41243/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1737,6 +1739,8 @@ msgid ""
"Invalid database name. Only alphanumerical characters, underscore, hyphen "
"and dot are allowed."
msgstr ""
+"Nome de base de dados inválido. Apenas caracteres alfanuméricos, subtraço, "
+"hífen e ponto são permitidos."
#. module: web
#. openerp-web
@@ -3821,7 +3825,7 @@ msgstr "contém"
#: code:addons/web/static/src/js/widgets/domain_selector.js:24
#, python-format
msgid "does not contain"
-msgstr ""
+msgstr "não contém"
#. module: web
#. openerp-web
diff --git a/addons/web/i18n/web.pot b/addons/web/i18n/web.pot
index 7ec1ef4cd69..a29b279af41 100644
--- a/addons/web/i18n/web.pot
+++ b/addons/web/i18n/web.pot
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server saas~12.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-10-08 06:49+0000\n"
-"PO-Revision-Date: 2018-10-08 06:49+0000\n"
+"POT-Creation-Date: 2018-12-24 10:58+0000\n"
+"PO-Revision-Date: 2018-12-24 10:58+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -24,15 +24,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:231
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:239
#, python-format
msgid " and "
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:580
-#: code:addons/web/static/src/js/views/search/search_view.js:226
+#: code:addons/web/static/src/js/views/control_panel/search/search_facet.js:44
#, python-format
msgid " or "
msgstr ""
@@ -40,29 +39,29 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/fields/field_utils.js:285
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:156
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:157
#, python-format
msgid " records"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:655
+#: code:addons/web/static/src/xml/base.xml:662
#, python-format
msgid "# Code editor"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:112
-#: code:addons/web/static/src/js/views/search/search_filters.js:354
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:111
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:362
#, python-format
msgid "%(field)s %(operator)s"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:113
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:112
#, python-format
msgid "%(field)s %(operator)s \"%(value)s\""
msgstr ""
@@ -146,7 +145,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/field_utils.js:602
+#: code:addons/web/static/src/js/fields/field_utils.js:618
#, python-format
msgid "'%s' is not a correct integer"
msgstr ""
@@ -167,22 +166,15 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:101
-#, python-format
-msgid "(Enterprise Edition)"
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:298
+#: code:addons/web/static/src/xml/base.xml:305
#, python-format
msgid "(change)"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:508
-#: code:addons/web/static/src/xml/base.xml:537
+#: code:addons/web/static/src/xml/base.xml:515
+#: code:addons/web/static/src/xml/base.xml:544
#, python-format
msgid "(count)"
msgstr ""
@@ -210,7 +202,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/action_manager.js:577
+#: code:addons/web/static/src/js/views/control_panel/search/add_new_favorite_menu.js:75
+#, python-format
+msgid "A name for your favorite is required."
+msgstr ""
+
+#. module: web
+#. openerp-web
+#: code:addons/web/static/src/js/chrome/action_manager.js:541
#, python-format
msgid "A popup window has been blocked. You may need to change your browser settings to allow popup windows for this page."
msgstr ""
@@ -224,14 +223,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:632
+#: code:addons/web/static/src/xml/base.xml:639
#, python-format
msgid "ALL"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:633
+#: code:addons/web/static/src/xml/base.xml:640
#, python-format
msgid "ANY"
msgstr ""
@@ -252,7 +251,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1568
+#: code:addons/web/static/src/xml/base.xml:1531
#, python-format
msgid "Access to all Enterprise Apps"
msgstr ""
@@ -273,31 +272,31 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2044
+#: code:addons/web/static/src/js/fields/basic_fields.js:2117
#, python-format
msgid "Activate"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:248
+#: code:addons/web/static/src/xml/base.xml:255
#, python-format
msgid "Activate Assets Debugging"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2043
-#: code:addons/web/static/src/js/fields/basic_fields.js:2047
-#: code:addons/web/static/src/js/fields/basic_fields.js:2051
+#: code:addons/web/static/src/js/fields/basic_fields.js:2116
+#: code:addons/web/static/src/js/fields/basic_fields.js:2120
+#: code:addons/web/static/src/js/fields/basic_fields.js:2124
#, python-format
msgid "Active"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/relational_fields.js:802
-#: code:addons/web/static/src/xml/base.xml:1411
+#: code:addons/web/static/src/js/fields/relational_fields.js:803
+#: code:addons/web/static/src/xml/base.xml:1374
#: code:addons/web/static/src/xml/kanban.xml:56
#: code:addons/web/static/src/xml/kanban.xml:73
#, python-format
@@ -306,21 +305,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/calendar/calendar_renderer.js:82
+#: code:addons/web/static/src/js/views/calendar/calendar_renderer.js:81
#, python-format
msgid "Add %s"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1126
+#: code:addons/web/static/src/xml/base.xml:1136
#, python-format
msgid "Add Custom Filter"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1111
+#: code:addons/web/static/src/xml/base.xml:1121
#, python-format
msgid "Add Custom Group"
msgstr ""
@@ -334,7 +333,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1130
+#: code:addons/web/static/src/xml/base.xml:1140
#, python-format
msgid "Add a condition"
msgstr ""
@@ -348,7 +347,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:616
+#: code:addons/web/static/src/xml/base.xml:623
#, python-format
msgid "Add branch"
msgstr ""
@@ -362,56 +361,56 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:640
+#: code:addons/web/static/src/xml/base.xml:647
#, python-format
msgid "Add filter"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:700
+#: code:addons/web/static/src/xml/base.xml:707
#, python-format
msgid "Add new value"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:615
+#: code:addons/web/static/src/xml/base.xml:622
#, python-format
msgid "Add node"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:701
+#: code:addons/web/static/src/xml/base.xml:708
#, python-format
msgid "Add tag"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1966
+#: code:addons/web/static/src/js/fields/basic_fields.js:2039
#, python-format
msgid "Add to Favorites"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:375
+#: code:addons/web/static/src/xml/base.xml:382
#, python-format
msgid "Add..."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/relational_fields.js:1574
+#: code:addons/web/static/src/js/fields/relational_fields.js:1589
#, python-format
msgid "Add: "
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1210
+#: code:addons/web/static/src/xml/base.xml:1219
#, python-format
msgid "Advanced Search..."
msgstr ""
@@ -425,8 +424,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:622
-#: code:addons/web/static/src/xml/base.xml:627
+#: code:addons/web/static/src/xml/base.xml:629
+#: code:addons/web/static/src/xml/base.xml:634
#, python-format
msgid "All"
msgstr ""
@@ -441,29 +440,29 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:494
+#: code:addons/web/static/src/xml/base.xml:501
#, python-format
msgid "All users"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:134
-#: code:addons/web/static/src/xml/menu.xml:137
-#: code:addons/web/static/src/xml/menu.xml:143
-#: code:addons/web/static/src/xml/menu.xml:146
-#: code:addons/web/static/src/xml/menu.xml:152
-#: code:addons/web/static/src/xml/menu.xml:155
-#: code:addons/web/static/src/xml/menu.xml:161
-#: code:addons/web/static/src/xml/menu.xml:164
-#: code:addons/web/static/src/xml/menu.xml:170
-#: code:addons/web/static/src/xml/menu.xml:173
-#: code:addons/web/static/src/xml/menu.xml:179
-#: code:addons/web/static/src/xml/menu.xml:182
-#: code:addons/web/static/src/xml/menu.xml:188
-#: code:addons/web/static/src/xml/menu.xml:191
-#: code:addons/web/static/src/xml/menu.xml:197
-#: code:addons/web/static/src/xml/menu.xml:200
+#: code:addons/web/static/src/xml/menu.xml:120
+#: code:addons/web/static/src/xml/menu.xml:123
+#: code:addons/web/static/src/xml/menu.xml:129
+#: code:addons/web/static/src/xml/menu.xml:132
+#: code:addons/web/static/src/xml/menu.xml:138
+#: code:addons/web/static/src/xml/menu.xml:141
+#: code:addons/web/static/src/xml/menu.xml:147
+#: code:addons/web/static/src/xml/menu.xml:150
+#: code:addons/web/static/src/xml/menu.xml:156
+#: code:addons/web/static/src/xml/menu.xml:159
+#: code:addons/web/static/src/xml/menu.xml:165
+#: code:addons/web/static/src/xml/menu.xml:168
+#: code:addons/web/static/src/xml/menu.xml:174
+#: code:addons/web/static/src/xml/menu.xml:177
+#: code:addons/web/static/src/xml/menu.xml:183
+#: code:addons/web/static/src/xml/menu.xml:186
#, python-format
msgid "Alt"
msgstr ""
@@ -477,39 +476,39 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:203
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:204
#, python-format
msgid "An unknown CORS error occured. The error probably originates from a JavaScript file served from a different origin. (Opening your browser console might give you a hint on the error.)"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1573
+#: code:addons/web/static/src/xml/base.xml:1536
#, python-format
msgid "And more"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:623
-#: code:addons/web/static/src/xml/base.xml:628
+#: code:addons/web/static/src/xml/base.xml:630
+#: code:addons/web/static/src/xml/base.xml:635
#, python-format
msgid "Any"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1120
-#: code:addons/web/static/src/xml/base.xml:1128
-#: code:addons/web/static/src/xml/base.xml:1203
+#: code:addons/web/static/src/xml/base.xml:1130
+#: code:addons/web/static/src/xml/base.xml:1138
+#: code:addons/web/static/src/xml/base.xml:1213
#, python-format
msgid "Apply"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2048
-#: code:addons/web/static/src/js/views/list/list_controller.js:154
+#: code:addons/web/static/src/js/fields/basic_fields.js:2121
+#: code:addons/web/static/src/js/views/list/list_controller.js:162
#, python-format
msgid "Archive"
msgstr ""
@@ -523,42 +522,42 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2047
+#: code:addons/web/static/src/js/fields/basic_fields.js:2120
#, python-format
msgid "Archived"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:372
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:374
#, python-format
msgid "Are you sure that you want to archive all the records from this column?"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/list/list_controller.js:156
+#: code:addons/web/static/src/js/views/list/list_controller.js:164
#, python-format
msgid "Are you sure that you want to archive all the selected records?"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:310
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:312
#, python-format
msgid "Are you sure that you want to remove this column ?"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:273
+#: code:addons/web/static/src/js/views/control_panel/search/favorite_menu.js:88
#, python-format
msgid "Are you sure that you want to remove this filter?"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/basic/basic_controller.js:308
+#: code:addons/web/static/src/js/views/basic/basic_controller.js:322
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:345
#, python-format
msgid "Are you sure you want to delete this record ?"
@@ -566,28 +565,28 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1028
+#: code:addons/web/static/src/xml/base.xml:1038
#, python-format
msgid "Attach"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:348
+#: code:addons/web/static/src/xml/base.xml:355
#, python-format
msgid "Attachment :"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1407
+#: code:addons/web/static/src/xml/base.xml:1370
#, python-format
msgid "Available fields"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1536
+#: code:addons/web/static/src/xml/base.xml:1499
#: code:addons/web/static/src/xml/kanban.xml:161
#: code:addons/web/static/src/xml/web_calendar.xml:53
#: code:addons/web/static/src/xml/web_calendar.xml:56
@@ -597,7 +596,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:515
+#: code:addons/web/static/src/xml/base.xml:522
#, python-format
msgid "Bar Chart"
msgstr ""
@@ -609,27 +608,27 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1143
+#: code:addons/web/static/src/xml/base.xml:1153
#, python-format
msgid "Based On"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:250
+#: code:addons/web/static/src/xml/base.xml:257
#, python-format
msgid "Become Superuser"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:1538
+#: code:addons/web/controllers/main.py:1509
#, python-format
msgid "Binary fields can not be exported to Excel unless their content is base64-encoded. That does not seem to be the case for %s."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:952
+#: code:addons/web/static/src/xml/base.xml:962
#, python-format
msgid "Binary file"
msgstr ""
@@ -643,7 +642,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1572
+#: code:addons/web/static/src/xml/base.xml:1535
#, python-format
msgid "Bugfixes guarantee"
msgstr ""
@@ -671,7 +670,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1222
+#: code:addons/web/static/src/xml/base.xml:1315
#, python-format
msgid "CLEAR"
msgstr ""
@@ -696,10 +695,10 @@ msgstr ""
#: code:addons/web/static/src/js/core/dialog.js:382
#: code:addons/web/static/src/js/fields/relational_fields.js:65
#: code:addons/web/static/src/js/fields/upgrade_fields.js:75
-#: code:addons/web/static/src/js/services/crash_manager.js:200
+#: code:addons/web/static/src/js/services/crash_manager.js:204
#: code:addons/web/static/src/js/views/calendar/calendar_quick_create.js:56
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:304
-#: code:addons/web/static/src/js/views/view_dialogs.js:397
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:306
+#: code:addons/web/static/src/js/views/view_dialogs.js:361
#: code:addons/web/static/src/xml/base.xml:179
#, python-format
msgid "Cancel"
@@ -707,7 +706,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:106
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:111
#, python-format
msgid "Cannot render chart with mode : "
msgstr ""
@@ -721,9 +720,9 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/controllers/main.py:819
-#: code:addons/web/controllers/main.py:821
-#: code:addons/web/controllers/main.py:833
+#: code:addons/web/controllers/main.py:809
+#: code:addons/web/controllers/main.py:811
+#: code:addons/web/controllers/main.py:823
#: code:addons/web/static/src/js/widgets/change_password.js:27
#: code:addons/web/static/src/xml/base.xml:178
#, python-format
@@ -746,36 +745,36 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:936
-#: code:addons/web/static/src/xml/base.xml:976
-#: code:addons/web/static/src/xml/base.xml:1007
+#: code:addons/web/static/src/xml/base.xml:946
+#: code:addons/web/static/src/xml/base.xml:986
+#: code:addons/web/static/src/xml/base.xml:1017
#, python-format
msgid "Clear"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:245
+#: code:addons/web/static/src/xml/base.xml:252
#, python-format
msgid "Clear Events"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2052
+#: code:addons/web/static/src/js/fields/basic_fields.js:2125
#: code:addons/web/static/src/js/tools/debug_manager.js:490
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:356
-#: code:addons/web/static/src/js/views/view_dialogs.js:123
+#: code:addons/web/static/src/js/views/view_dialogs.js:113
#: code:addons/web/static/src/js/widgets/data_export.js:212
#: code:addons/web/static/src/js/widgets/domain_selector_dialog.js:24
-#: code:addons/web/static/src/xml/base.xml:743
+#: code:addons/web/static/src/xml/base.xml:750
#, python-format
msgid "Close"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2051
+#: code:addons/web/static/src/js/fields/basic_fields.js:2124
#, python-format
msgid "Closed"
msgstr ""
@@ -789,14 +788,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1185
+#: code:addons/web/static/src/xml/base.xml:1195
#, python-format
msgid "Compare To"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:468
+#: code:addons/web/static/src/xml/base.xml:475
#, python-format
msgid "Condition:"
msgstr ""
@@ -818,14 +817,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:337
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:338
#, python-format
msgid "Connection lost"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:351
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:352
#, python-format
msgid "Connection restored"
msgstr ""
@@ -840,21 +839,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:137
-#: code:addons/web/static/src/xml/menu.xml:146
-#: code:addons/web/static/src/xml/menu.xml:155
-#: code:addons/web/static/src/xml/menu.xml:164
-#: code:addons/web/static/src/xml/menu.xml:173
-#: code:addons/web/static/src/xml/menu.xml:182
-#: code:addons/web/static/src/xml/menu.xml:191
-#: code:addons/web/static/src/xml/menu.xml:200
+#: code:addons/web/static/src/xml/menu.xml:123
+#: code:addons/web/static/src/xml/menu.xml:132
+#: code:addons/web/static/src/xml/menu.xml:141
+#: code:addons/web/static/src/xml/menu.xml:150
+#: code:addons/web/static/src/xml/menu.xml:159
+#: code:addons/web/static/src/xml/menu.xml:168
+#: code:addons/web/static/src/xml/menu.xml:177
+#: code:addons/web/static/src/xml/menu.xml:186
#, python-format
msgid "Control"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1305
+#: code:addons/web/static/src/js/fields/basic_fields.js:1347
#: code:addons/web/static/src/js/services/crash_manager.js:129
#, python-format
msgid "Copied !"
@@ -862,8 +861,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:956
-#: code:addons/web/static/src/xml/base.xml:961
+#: code:addons/web/static/src/xml/base.xml:966
+#: code:addons/web/static/src/xml/base.xml:971
#, python-format
msgid "Copy Text"
msgstr ""
@@ -884,26 +883,26 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1515
+#: code:addons/web/static/src/js/fields/basic_fields.js:1579
#, python-format
msgid "Could not display the selected image."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/core/utils.js:457
+#: code:addons/web/static/src/js/core/utils.js:450
#, python-format
msgid "Could not serialize XML"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_view.js:49
-#: code:addons/web/static/src/js/views/graph/graph_view.js:52
-#: code:addons/web/static/src/js/views/pivot/pivot_view.js:48
-#: code:addons/web/static/src/js/views/pivot/pivot_view.js:60
-#: code:addons/web/static/src/xml/base.xml:511
-#: code:addons/web/static/src/xml/base.xml:540
+#: code:addons/web/static/src/js/views/graph/graph_view.js:50
+#: code:addons/web/static/src/js/views/graph/graph_view.js:53
+#: code:addons/web/static/src/js/views/pivot/pivot_view.js:49
+#: code:addons/web/static/src/js/views/pivot/pivot_view.js:61
+#: code:addons/web/static/src/xml/base.xml:518
+#: code:addons/web/static/src/xml/base.xml:547
#, python-format
msgid "Count"
msgstr ""
@@ -913,17 +912,17 @@ msgstr ""
#: code:addons/web/static/src/js/fields/relational_fields.js:44
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:262
#: code:addons/web/static/src/js/views/calendar/calendar_quick_create.js:45
-#: code:addons/web/static/src/js/views/kanban/kanban_controller.js:403
-#: code:addons/web/static/src/js/views/view_dialogs.js:403
-#: code:addons/web/static/src/xml/base.xml:386
-#: code:addons/web/static/src/xml/base.xml:406
+#: code:addons/web/static/src/js/views/kanban/kanban_controller.js:408
+#: code:addons/web/static/src/js/views/view_dialogs.js:367
+#: code:addons/web/static/src/xml/base.xml:393
+#: code:addons/web/static/src/xml/base.xml:413
#, python-format
msgid "Create"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/form/form_controller.js:616
+#: code:addons/web/static/src/js/views/form/form_controller.js:628
#, python-format
msgid "Create "
msgstr ""
@@ -944,7 +943,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:159
+#: code:addons/web/static/src/xml/menu.xml:145
#, python-format
msgid "Create a new record"
msgstr ""
@@ -984,7 +983,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:353
+#: code:addons/web/static/src/xml/base.xml:360
#, python-format
msgid "Created by :"
msgstr ""
@@ -996,36 +995,29 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:307
+#: code:addons/web/static/src/xml/base.xml:314
#, python-format
msgid "Creation Date:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:303
+#: code:addons/web/static/src/xml/base.xml:310
#, python-format
msgid "Creation User:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:919
+#: code:addons/web/static/src/xml/base.xml:929
#, python-format
msgid "Current state"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:185
-#, python-format
-msgid "Custom Filter"
-msgstr ""
-
-#. module: web
-#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:29
-#: code:addons/web/static/src/xml/base.xml:867
+#: code:addons/web/static/src/xml/base.xml:877
#: code:addons/web/static/src/xml/kanban.xml:88
#, python-format
msgid "Dark blue"
@@ -1034,7 +1026,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:26
-#: code:addons/web/static/src/xml/base.xml:864
+#: code:addons/web/static/src/xml/base.xml:874
#: code:addons/web/static/src/xml/kanban.xml:85
#, python-format
msgid "Dark purple"
@@ -1047,14 +1039,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:107
-#, python-format
-msgid "Database expiration:"
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:558
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:30
+#: code:addons/web/static/src/xml/base.xml:565
#: code:addons/web/static/src/xml/web_calendar.xml:80
#, python-format
msgid "Day"
@@ -1062,14 +1048,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2044
+#: code:addons/web/static/src/js/fields/basic_fields.js:2117
#, python-format
msgid "Deactivate"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:451
+#: code:addons/web/static/src/xml/base.xml:458
#, python-format
msgid "Default:"
msgstr ""
@@ -1077,11 +1063,11 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:343
-#: code:addons/web/static/src/js/views/form/form_controller.js:178
-#: code:addons/web/static/src/js/views/list/list_controller.js:168
-#: code:addons/web/static/src/xml/base.xml:853
-#: code:addons/web/static/src/xml/base.xml:1330
-#: code:addons/web/static/src/xml/base.xml:1453
+#: code:addons/web/static/src/js/views/form/form_controller.js:186
+#: code:addons/web/static/src/js/views/list/list_controller.js:176
+#: code:addons/web/static/src/xml/base.xml:863
+#: code:addons/web/static/src/xml/base.xml:1267
+#: code:addons/web/static/src/xml/base.xml:1416
#: code:addons/web/static/src/xml/kanban.xml:24
#, python-format
msgid "Delete"
@@ -1089,7 +1075,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:614
+#: code:addons/web/static/src/xml/base.xml:621
#, python-format
msgid "Delete node"
msgstr ""
@@ -1103,32 +1089,32 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:364
+#: code:addons/web/static/src/xml/base.xml:371
#, python-format
msgid "Delete this attachment"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1049
+#: code:addons/web/static/src/xml/base.xml:1059
#, python-format
msgid "Delete this file"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:125
+#: code:addons/web/static/src/xml/menu.xml:111
#, python-format
msgid "Description"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:123
+#: code:addons/web/static/src/js/views/view_dialogs.js:113
#: code:addons/web/static/src/js/widgets/colorpicker.js:36
#: code:addons/web/static/src/js/widgets/domain_selector_dialog.js:31
-#: code:addons/web/static/src/xml/base.xml:393
-#: code:addons/web/static/src/xml/base.xml:416
+#: code:addons/web/static/src/xml/base.xml:400
+#: code:addons/web/static/src/xml/base.xml:423
#: code:addons/web/static/src/xml/kanban.xml:75
#: code:addons/web/static/src/xml/report.xml:18
#, python-format
@@ -1137,7 +1123,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:150
+#: code:addons/web/static/src/xml/menu.xml:136
#, python-format
msgid "Discard a record modification"
msgstr ""
@@ -1168,7 +1154,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1546
+#: code:addons/web/static/src/xml/base.xml:1509
#, python-format
msgid "Documentation"
msgstr ""
@@ -1176,7 +1162,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/widgets/domain_selector_dialog.js:36
-#: code:addons/web/static/src/xml/base.xml:601
+#: code:addons/web/static/src/xml/base.xml:608
#, python-format
msgid "Domain"
msgstr ""
@@ -1204,22 +1190,22 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:546
+#: code:addons/web/static/src/xml/base.xml:553
#, python-format
msgid "Download xls"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:587
-#: code:addons/web/static/src/xml/base.xml:1556
+#: code:addons/web/static/src/xml/base.xml:594
+#: code:addons/web/static/src/xml/base.xml:1519
#, python-format
msgid "Dropdown menu"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/form/form_controller.js:184
+#: code:addons/web/static/src/js/views/form/form_controller.js:192
#, python-format
msgid "Duplicate"
msgstr ""
@@ -1228,8 +1214,8 @@ msgstr ""
#. openerp-web
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:337
#: code:addons/web/static/src/js/views/calendar/calendar_quick_create.js:50
-#: code:addons/web/static/src/xml/base.xml:402
-#: code:addons/web/static/src/xml/base.xml:935
+#: code:addons/web/static/src/xml/base.xml:409
+#: code:addons/web/static/src/xml/base.xml:945
#: code:addons/web/static/src/xml/kanban.xml:74
#: code:addons/web/static/src/xml/report.xml:14
#, python-format
@@ -1238,30 +1224,30 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:256
+#: code:addons/web/static/src/xml/base.xml:263
#, python-format
msgid "Edit Action"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:323
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:325
#, python-format
msgid "Edit Column"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:608
+#: code:addons/web/static/src/xml/base.xml:286
#, python-format
-msgid "Edit Domain"
+msgid "Edit ControlPanelView"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:279
+#: code:addons/web/static/src/xml/base.xml:615
#, python-format
-msgid "Edit SearchView"
+msgid "Edit Domain"
msgstr ""
#. module: web
@@ -1273,14 +1259,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:276
+#: code:addons/web/static/src/xml/base.xml:283
#, python-format
msgid "Edit View:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:141
+#: code:addons/web/static/src/xml/menu.xml:127
#, python-format
msgid "Edit a record"
msgstr ""
@@ -1298,14 +1284,14 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/services/crash_manager.js:132
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:87
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:94
+#: code:addons/web/static/src/js/views/control_panel/search/add_new_favorite_menu.js:75
+#: code:addons/web/static/src/js/views/control_panel/search/add_new_favorite_menu.js:83
#, python-format
msgid "Error"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:823
+#: code:addons/web/controllers/main.py:813
#, python-format
msgid "Error, password not changed !"
msgstr ""
@@ -1340,21 +1326,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:545
+#: code:addons/web/static/src/xml/base.xml:552
#, python-format
msgid "Expand all"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1433
+#: code:addons/web/static/src/xml/base.xml:1396
#, python-format
msgid "Expand parents"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/list/list_controller.js:149
+#: code:addons/web/static/src/js/views/list/list_controller.js:157
#, python-format
msgid "Export"
msgstr ""
@@ -1368,7 +1354,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1400
+#: code:addons/web/static/src/xml/base.xml:1363
#, python-format
msgid "Export Format:"
msgstr ""
@@ -1382,8 +1368,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/controllers/main.py:1302
-#: code:addons/web/controllers/main.py:1305
+#: code:addons/web/controllers/main.py:1273
+#: code:addons/web/controllers/main.py:1276
#: code:addons/web/static/src/js/widgets/data_export.js:482
#, python-format
msgid "External ID"
@@ -1391,21 +1377,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:826
+#: code:addons/web/static/src/xml/base.xml:836
#, python-format
msgid "External link"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1220
+#: code:addons/web/static/src/xml/base.xml:1313
#, python-format
msgid "FILTER"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/action_manager_act_window.js:540
+#: code:addons/web/static/src/js/views/control_panel/control_panel_model.js:286
#, python-format
msgid "Failed to evaluate search criterions"
msgstr ""
@@ -1419,8 +1405,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1352
-#: code:addons/web/static/src/xml/base.xml:1353
+#: code:addons/web/static/src/js/views/control_panel/search/favorite_menu.js:22
#, python-format
msgid "Favorites"
msgstr ""
@@ -1435,70 +1420,56 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/tools/debug_manager.js:527
-#: code:addons/web/static/src/xml/base.xml:274
+#: code:addons/web/static/src/xml/base.xml:281
#, python-format
msgid "Fields View Get"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1419
+#: code:addons/web/static/src/xml/base.xml:1382
#, python-format
msgid "Fields to export"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1416
+#: code:addons/web/static/src/js/fields/basic_fields.js:1458
#, python-format
msgid "File Upload"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1396
+#: code:addons/web/static/src/js/fields/basic_fields.js:1438
#, python-format
msgid "File upload"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:578
-#, python-format
-msgid "Filter"
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:87
-#, python-format
-msgid "Filter name is required."
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:516
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:54
#, python-format
msgid "Filter on: %s"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:94
+#: code:addons/web/static/src/js/views/control_panel/search/add_new_favorite_menu.js:83
#, python-format
msgid "Filter with same name already exists."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/filters_menu.js:67
+#: code:addons/web/static/src/js/views/control_panel/search/filter_menu.js:41
#, python-format
msgid "Filters"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:544
+#: code:addons/web/static/src/xml/base.xml:551
#, python-format
msgid "Flip axis"
msgstr ""
@@ -1512,14 +1483,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:756
+#: code:addons/web/static/src/xml/base.xml:766
#, python-format
msgid "Followed by"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/pivot/pivot_controller.js:128
+#: code:addons/web/static/src/js/views/pivot/pivot_controller.js:130
#, python-format
msgid "For Excel compatibility, data cannot be exported if there are more than 256 columns.\n"
"\n"
@@ -1535,7 +1506,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/filters_menu.js:179
+#: code:addons/web/static/src/js/views/control_panel/search/filter_menu.js:141
#, python-format
msgid "From %s To %s"
msgstr ""
@@ -1543,7 +1514,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:30
-#: code:addons/web/static/src/xml/base.xml:868
+#: code:addons/web/static/src/xml/base.xml:878
#: code:addons/web/static/src/xml/kanban.xml:89
#, python-format
msgid "Fushia"
@@ -1551,7 +1522,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1565
+#: code:addons/web/static/src/xml/base.xml:1528
#, python-format
msgid "Get this feature and much more with Odoo Enterprise!"
msgstr ""
@@ -1580,7 +1551,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:31
-#: code:addons/web/static/src/xml/base.xml:869
+#: code:addons/web/static/src/xml/base.xml:879
#: code:addons/web/static/src/xml/colorpicker.xml:31
#: code:addons/web/static/src/xml/kanban.xml:90
#, python-format
@@ -1589,15 +1560,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/groupby_menu.js:88
-#: code:addons/web/static/src/js/views/search/search_inputs.js:780
+#: code:addons/web/static/src/js/views/control_panel/search/groupby_menu.js:66
#, python-format
msgid "Group By"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:754
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:58
#, python-format
msgid "Group by: %s"
msgstr ""
@@ -1609,42 +1579,42 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:877
+#: code:addons/web/static/src/xml/base.xml:887
#, python-format
msgid "Hide in Kanban"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:432
+#: code:addons/web/static/src/xml/base.xml:439
#, python-format
msgid "Hit DOWN to navigate to the list below"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:439
+#: code:addons/web/static/src/xml/base.xml:446
#, python-format
msgid "Hit ENTER to"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:431
+#: code:addons/web/static/src/xml/base.xml:438
#, python-format
msgid "Hit ENTER to CREATE"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:423
+#: code:addons/web/static/src/xml/base.xml:430
#, python-format
msgid "Hit ENTER to SAVE"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:424
+#: code:addons/web/static/src/xml/base.xml:431
#, python-format
msgid "Hit ESCAPE to DISCARD"
msgstr ""
@@ -1670,59 +1640,59 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:286
+#: code:addons/web/static/src/xml/base.xml:293
#, python-format
msgid "ID:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1515
-#: code:addons/web/static/src/js/fields/basic_fields.js:1835
+#: code:addons/web/static/src/js/fields/basic_fields.js:1579
+#: code:addons/web/static/src/js/fields/basic_fields.js:1905
#, python-format
msgid "Image"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2043
+#: code:addons/web/static/src/js/fields/basic_fields.js:2116
#, python-format
msgid "Inactive"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:258
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:273
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:263
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:278
#, python-format
msgid "Invalid data"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:717
-#: code:addons/web/controllers/main.py:731
+#: code:addons/web/controllers/main.py:707
+#: code:addons/web/controllers/main.py:721
#, python-format
msgid "Invalid database name. Only alphanumerical characters, underscore, hyphen and dot are allowed."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:606
+#: code:addons/web/static/src/xml/base.xml:613
#, python-format
msgid "Invalid domain"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/widgets/model_field_selector.js:405
-#: code:addons/web/static/src/xml/base.xml:737
+#: code:addons/web/static/src/js/widgets/model_field_selector.js:427
+#: code:addons/web/static/src/xml/base.xml:744
#, python-format
msgid "Invalid field chain"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:105
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:110
#, python-format
msgid "Invalid mode for chart"
msgstr ""
@@ -1756,28 +1726,28 @@ msgid "Keyboard Shortcuts"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:840
+#: code:addons/web/controllers/main.py:830
#, python-format
msgid "Languages"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:9
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:12
#, python-format
msgid "Last 30 Days"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:10
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:13
#, python-format
msgid "Last 365 Days"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:8
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:11
#, python-format
msgid "Last 7 Days"
msgstr ""
@@ -1789,14 +1759,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:18
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:21
#, python-format
msgid "Last Month"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:19
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:22
#, python-format
msgid "Last Quarter"
msgstr ""
@@ -1813,35 +1783,35 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:17
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:20
#, python-format
msgid "Last Week"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:20
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:23
#, python-format
msgid "Last Year"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:315
+#: code:addons/web/static/src/xml/base.xml:322
#, python-format
msgid "Latest Modification Date:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:311
+#: code:addons/web/static/src/xml/base.xml:318
#, python-format
msgid "Latest Modification by:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:251
+#: code:addons/web/static/src/xml/base.xml:258
#, python-format
msgid "Leave the Developer Tools"
msgstr ""
@@ -1849,7 +1819,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:25
-#: code:addons/web/static/src/xml/base.xml:863
+#: code:addons/web/static/src/xml/base.xml:873
#: code:addons/web/static/src/xml/kanban.xml:84
#, python-format
msgid "Light blue"
@@ -1864,7 +1834,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:516
+#: code:addons/web/static/src/xml/base.xml:523
#, python-format
msgid "Line Chart"
msgstr ""
@@ -1899,8 +1869,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1062
-#: code:addons/web/static/src/xml/base.xml:1466
+#: code:addons/web/static/src/xml/base.xml:1072
+#: code:addons/web/static/src/xml/base.xml:1429
#, python-format
msgid "Loading, please wait..."
msgstr ""
@@ -1910,7 +1880,7 @@ msgstr ""
#: code:addons/web/static/src/js/core/misc.js:13
#: code:addons/web/static/src/js/fields/relational_fields.js:144
#: code:addons/web/static/src/js/fields/relational_fields.js:230
-#: code:addons/web/static/src/xml/base.xml:1459
+#: code:addons/web/static/src/xml/base.xml:1422
#, python-format
msgid "Loading..."
msgstr ""
@@ -1927,7 +1897,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1551
+#: code:addons/web/static/src/xml/base.xml:1514
#, python-format
msgid "Log out"
msgstr ""
@@ -1943,14 +1913,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:461
-#, python-format
-msgid "M2O search fields do not currently handle multiple default values"
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:127
+#: code:addons/web/static/src/xml/menu.xml:113
#, python-format
msgid "Mac"
msgstr ""
@@ -1963,7 +1926,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/tools/debug_manager.js:364
-#: code:addons/web/static/src/xml/base.xml:271
+#: code:addons/web/static/src/xml/base.xml:278
#, python-format
msgid "Manage Attachments"
msgstr ""
@@ -1976,28 +1939,28 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/tools/debug_manager.js:300
-#: code:addons/web/static/src/xml/base.xml:259
+#: code:addons/web/static/src/xml/base.xml:266
#, python-format
msgid "Manage Filters"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:639
+#: code:addons/web/static/src/xml/base.xml:646
#, python-format
msgid "Match"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:646
+#: code:addons/web/static/src/xml/base.xml:653
#, python-format
msgid "Match records with"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:644
+#: code:addons/web/static/src/xml/base.xml:651
#, python-format
msgid "Match records with the following rule:"
msgstr ""
@@ -2011,8 +1974,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:503
-#: code:addons/web/static/src/xml/base.xml:532
+#: code:addons/web/static/src/xml/base.xml:510
+#: code:addons/web/static/src/xml/base.xml:539
#, python-format
msgid "Measures"
msgstr ""
@@ -2020,7 +1983,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:28
-#: code:addons/web/static/src/xml/base.xml:866
+#: code:addons/web/static/src/xml/base.xml:876
#: code:addons/web/static/src/xml/kanban.xml:87
#, python-format
msgid "Medium blue"
@@ -2049,14 +2012,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1570
+#: code:addons/web/static/src/xml/base.xml:1533
#, python-format
msgid "Mobile support"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:358
+#: code:addons/web/static/src/xml/base.xml:365
#, python-format
msgid "Modified by :"
msgstr ""
@@ -2071,7 +2034,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:560
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:32
+#: code:addons/web/static/src/xml/base.xml:567
#: code:addons/web/static/src/xml/web_calendar.xml:82
#, python-format
msgid "Month"
@@ -2079,50 +2043,50 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/form/form_renderer.js:401
-#: code:addons/web/static/src/xml/base.xml:903
+#: code:addons/web/static/src/js/views/form/form_renderer.js:411
+#: code:addons/web/static/src/xml/base.xml:913
#, python-format
msgid "More"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1415
+#: code:addons/web/static/src/xml/base.xml:1378
#, python-format
msgid "Move Down"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1414
+#: code:addons/web/static/src/xml/base.xml:1377
#, python-format
msgid "Move Up"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1550
+#: code:addons/web/static/src/xml/base.xml:1513
#, python-format
msgid "My Odoo.com account"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:634
+#: code:addons/web/static/src/xml/base.xml:641
#, python-format
msgid "NONE"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1470
+#: code:addons/web/static/src/xml/base.xml:1433
#, python-format
msgid "Name:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/basic/basic_model.js:686
+#: code:addons/web/static/src/js/views/basic/basic_model.js:671
#, python-format
msgid "New"
msgstr ""
@@ -2136,15 +2100,15 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1569
+#: code:addons/web/static/src/xml/base.xml:1532
#, python-format
msgid "New design"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1505
-#: code:addons/web/static/src/xml/base.xml:1506
+#: code:addons/web/static/src/xml/base.xml:1468
+#: code:addons/web/static/src/xml/base.xml:1469
#: code:addons/web/static/src/xml/web_calendar.xml:77
#, python-format
msgid "Next"
@@ -2152,14 +2116,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:338
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:296
#, python-format
msgid "No"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:294
+#: code:addons/web/static/src/xml/base.xml:301
#, python-format
msgid "No Update:"
msgstr ""
@@ -2181,9 +2145,9 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:111
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:307
-#: code:addons/web/static/src/xml/base.xml:575
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:116
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:312
+#: code:addons/web/static/src/xml/base.xml:582
#, python-format
msgid "No data to display"
msgstr ""
@@ -2211,21 +2175,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:624
+#: code:addons/web/static/src/xml/base.xml:631
#, python-format
msgid "None"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:923
+#: code:addons/web/static/src/xml/base.xml:933
#, python-format
msgid "Not active state"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:927
+#: code:addons/web/static/src/xml/base.xml:937
#, python-format
msgid "Not active state, click to change it"
msgstr ""
@@ -2241,7 +2205,6 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/core/dialog.js:59
-#: code:addons/web/static/src/xml/menu.xml:100
#, python-format
msgid "Odoo"
msgstr ""
@@ -2255,9 +2218,9 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:201
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:209
-#: code:addons/web/static/src/js/services/crash_manager.js:153
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:202
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:210
+#: code:addons/web/static/src/js/services/crash_manager.js:157
#, python-format
msgid "Odoo Client Error"
msgstr ""
@@ -2278,7 +2241,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/services/crash_manager.js:212
+#: code:addons/web/static/src/js/services/crash_manager.js:216
#, python-format
msgid "Odoo Session Expired"
msgstr ""
@@ -2286,14 +2249,14 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/services/crash_manager.js:105
-#: code:addons/web/static/src/js/services/crash_manager.js:194
+#: code:addons/web/static/src/js/services/crash_manager.js:198
#, python-format
msgid "Odoo Warning"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2060
+#: code:addons/web/static/src/js/fields/basic_fields.js:2133
#, python-format
msgid "Off"
msgstr ""
@@ -2304,8 +2267,8 @@ msgstr ""
#: code:addons/web/static/src/js/core/dialog.js:304
#: code:addons/web/static/src/js/core/dialog.js:323
#: code:addons/web/static/src/js/core/dialog.js:375
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:299
-#: code:addons/web/static/src/xml/base.xml:1443
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:301
+#: code:addons/web/static/src/xml/base.xml:1406
#, python-format
msgid "Ok"
msgstr ""
@@ -2319,7 +2282,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2059
+#: code:addons/web/static/src/js/fields/basic_fields.js:2132
#, python-format
msgid "On"
msgstr ""
@@ -2333,20 +2296,20 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2283
+#: code:addons/web/static/src/js/fields/basic_fields.js:2356
#, python-format
msgid "Only Integer Value should be valid."
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:502
+#: code:addons/web/controllers/main.py:492
#, python-format
msgid "Only employee can access this database. Please contact the administrator."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:487
+#: code:addons/web/static/src/xml/base.xml:494
#, python-format
msgid "Only you"
msgstr ""
@@ -2360,59 +2323,59 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2052
+#: code:addons/web/static/src/js/fields/basic_fields.js:2125
#, python-format
msgid "Open"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:231
+#: code:addons/web/static/src/xml/base.xml:238
#, python-format
msgid "Open Developer Tools"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:241
+#: code:addons/web/static/src/xml/base.xml:248
#, python-format
msgid "Open View"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:195
+#: code:addons/web/static/src/xml/menu.xml:181
#, python-format
msgid "Open the next record"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:186
+#: code:addons/web/static/src/xml/menu.xml:172
#, python-format
msgid "Open the previous record"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:177
+#: code:addons/web/static/src/xml/menu.xml:163
#, python-format
msgid "Open to kanban view"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:168
+#: code:addons/web/static/src/xml/menu.xml:154
#, python-format
msgid "Open to list view"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/relational_fields.js:639
+#: code:addons/web/static/src/js/fields/relational_fields.js:640
#: code:addons/web/static/src/js/views/calendar/calendar_controller.js:323
-#: code:addons/web/static/src/js/views/form/form_controller.js:616
-#: code:addons/web/static/src/js/views/form/form_controller.js:638
+#: code:addons/web/static/src/js/views/form/form_controller.js:628
+#: code:addons/web/static/src/js/views/form/form_controller.js:650
#, python-format
msgid "Open: "
msgstr ""
@@ -2420,7 +2383,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:23
-#: code:addons/web/static/src/xml/base.xml:861
+#: code:addons/web/static/src/xml/base.xml:871
#: code:addons/web/static/src/xml/kanban.xml:82
#, python-format
msgid "Orange"
@@ -2459,21 +2422,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:517
+#: code:addons/web/static/src/xml/base.xml:524
#, python-format
msgid "Pie Chart"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:274
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:279
#, python-format
msgid "Pie chart cannot display all zero numbers.. Try to change your domain to display positive results"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:259
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:264
#, python-format
msgid "Pie chart cannot mix positive and negative numbers. Try to change your domain to only display positive results"
msgstr ""
@@ -2487,7 +2450,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/list/list_renderer.js:352
+#: code:addons/web/static/src/js/views/list/list_renderer.js:353
#, python-format
msgid "Please click on the \"save\" button first."
msgstr ""
@@ -2515,7 +2478,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1525
+#: code:addons/web/static/src/xml/base.xml:1488
#, python-format
msgid "Please update translations of :"
msgstr ""
@@ -2534,7 +2497,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1549
+#: code:addons/web/static/src/xml/base.xml:1512
#, python-format
msgid "Preferences"
msgstr ""
@@ -2561,7 +2524,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:741
+#: code:addons/web/static/src/xml/base.xml:748
#: code:addons/web/static/src/xml/web_calendar.xml:75
#, python-format
msgid "Previous"
@@ -2569,14 +2532,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:24
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:41
#, python-format
msgid "Previous Period"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:25
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:42
#, python-format
msgid "Previous Year"
msgstr ""
@@ -2592,7 +2555,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:32
-#: code:addons/web/static/src/xml/base.xml:870
+#: code:addons/web/static/src/xml/base.xml:880
#: code:addons/web/static/src/xml/kanban.xml:91
#, python-format
msgid "Purple"
@@ -2600,7 +2563,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:561
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:33
+#: code:addons/web/static/src/xml/base.xml:568
#, python-format
msgid "Quarter"
msgstr ""
@@ -2619,7 +2583,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1160
+#: code:addons/web/static/src/xml/base.xml:1170
#, python-format
msgid "Range"
msgstr ""
@@ -2627,7 +2591,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:22
-#: code:addons/web/static/src/xml/base.xml:860
+#: code:addons/web/static/src/xml/base.xml:870
#: code:addons/web/static/src/xml/colorpicker.xml:27
#: code:addons/web/static/src/xml/kanban.xml:81
#, python-format
@@ -2636,21 +2600,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:249
+#: code:addons/web/static/src/xml/base.xml:256
#, python-format
msgid "Regenerate Assets Bundles"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/widgets/model_field_selector.js:467
+#: code:addons/web/static/src/js/widgets/model_field_selector.js:489
#, python-format
msgid "Relation not allowed"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:771
+#: code:addons/web/static/src/xml/base.xml:781
#, python-format
msgid "Relation to follow"
msgstr ""
@@ -2664,30 +2628,30 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:157
-#: code:addons/web/static/src/xml/base.xml:1238
-#: code:addons/web/static/src/xml/base.xml:1412
+#: code:addons/web/static/src/js/views/view_dialogs.js:147
+#: code:addons/web/static/src/xml/base.xml:1236
+#: code:addons/web/static/src/xml/base.xml:1375
#, python-format
msgid "Remove"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1413
+#: code:addons/web/static/src/xml/base.xml:1376
#, python-format
msgid "Remove All"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1966
+#: code:addons/web/static/src/js/fields/basic_fields.js:2039
#, python-format
msgid "Remove from Favorites"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:696
+#: code:addons/web/static/src/xml/base.xml:703
#, python-format
msgid "Remove tag"
msgstr ""
@@ -2713,42 +2677,42 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/services/crash_manager.js:223
+#: code:addons/web/static/src/js/services/crash_manager.js:227
#, python-format
msgid "Request timeout"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2048
+#: code:addons/web/static/src/js/fields/basic_fields.js:2121
#, python-format
msgid "Restore"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:240
+#: code:addons/web/static/src/xml/base.xml:247
#, python-format
msgid "Run Click Everywhere Test"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:239
+#: code:addons/web/static/src/xml/base.xml:246
#, python-format
msgid "Run JS Mobile Tests"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:238
+#: code:addons/web/static/src/xml/base.xml:245
#, python-format
msgid "Run JS Tests"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1226
+#: code:addons/web/static/src/xml/base.xml:1318
#, python-format
msgid "SEE RESULT"
msgstr ""
@@ -2756,7 +2720,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:27
-#: code:addons/web/static/src/xml/base.xml:865
+#: code:addons/web/static/src/xml/base.xml:875
#: code:addons/web/static/src/xml/kanban.xml:86
#, python-format
msgid "Salmon pink"
@@ -2771,11 +2735,11 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:137
+#: code:addons/web/static/src/js/views/view_dialogs.js:127
#: code:addons/web/static/src/js/widgets/domain_selector_dialog.js:28
-#: code:addons/web/static/src/xml/base.xml:390
-#: code:addons/web/static/src/xml/base.xml:412
-#: code:addons/web/static/src/xml/base.xml:1375
+#: code:addons/web/static/src/xml/base.xml:397
+#: code:addons/web/static/src/xml/base.xml:419
+#: code:addons/web/static/src/xml/base.xml:1338
#: code:addons/web/static/src/xml/report.xml:17
#, python-format
msgid "Save"
@@ -2783,44 +2747,44 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:137
+#: code:addons/web/static/src/js/views/view_dialogs.js:127
#, python-format
msgid "Save & Close"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:146
+#: code:addons/web/static/src/js/views/view_dialogs.js:136
#, python-format
msgid "Save & New"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1577
+#: code:addons/web/static/src/js/fields/basic_fields.js:1641
#, python-format
msgid "Save As..."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:132
+#: code:addons/web/static/src/xml/base.xml:1324
#, python-format
-msgid "Save a record"
+msgid "Save Current Search"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1443
+#: code:addons/web/static/src/xml/menu.xml:118
#, python-format
-msgid "Save as:"
+msgid "Save a record"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1358
+#: code:addons/web/static/src/xml/base.xml:1406
#, python-format
-msgid "Save current search"
+msgid "Save as:"
msgstr ""
#. module: web
@@ -2832,37 +2796,35 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1419
+#: code:addons/web/static/src/xml/base.xml:1382
#, python-format
msgid "Save fields list"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1446
+#: code:addons/web/static/src/xml/base.xml:1409
#, python-format
msgid "Saved exports:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1592
+#: code:addons/web/static/src/xml/base.xml:1555
#, python-format
msgid "Search"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:366
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:336
#, python-format
msgid "Search %(field)s at: %(value)s"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:199
-#: code:addons/web/static/src/js/views/search/search_inputs.js:218
-#: code:addons/web/static/src/js/views/search/search_inputs.js:407
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:145
#, python-format
msgid "Search %(field)s for: %(value)s"
msgstr ""
@@ -2876,7 +2838,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1231
+#: code:addons/web/static/src/xml/base.xml:1223
#, python-format
msgid "Search..."
msgstr ""
@@ -2897,11 +2859,11 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/view_dialogs.js:410
-#: code:addons/web/static/src/xml/base.xml:974
-#: code:addons/web/static/src/xml/base.xml:975
-#: code:addons/web/static/src/xml/base.xml:1005
-#: code:addons/web/static/src/xml/base.xml:1006
+#: code:addons/web/static/src/js/views/view_dialogs.js:374
+#: code:addons/web/static/src/xml/base.xml:984
+#: code:addons/web/static/src/xml/base.xml:985
+#: code:addons/web/static/src/xml/base.xml:1015
+#: code:addons/web/static/src/xml/base.xml:1016
#, python-format
msgid "Select"
msgstr ""
@@ -2913,7 +2875,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:610
+#: code:addons/web/static/src/xml/base.xml:617
#, python-format
msgid "Select a model to add a filter."
msgstr ""
@@ -2927,7 +2889,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2746
+#: code:addons/web/static/src/js/fields/basic_fields.js:2831
#, python-format
msgid "Selected records"
msgstr ""
@@ -2948,7 +2910,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:268
+#: code:addons/web/static/src/xml/base.xml:275
#, python-format
msgid "Set Defaults"
msgstr ""
@@ -2962,14 +2924,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1371
+#: code:addons/web/static/src/xml/base.xml:1335
#, python-format
msgid "Share with all users"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:114
+#: code:addons/web/static/src/xml/menu.xml:100
#, python-format
msgid "Shortcuts"
msgstr ""
@@ -2989,7 +2951,7 @@ msgid "Size:"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:1169
+#: code:addons/web/controllers/main.py:1139
#, python-format
msgid "Something horrible happened"
msgstr ""
@@ -3024,21 +2986,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1547
+#: code:addons/web/static/src/xml/base.xml:1510
#, python-format
msgid "Support"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2061
+#: code:addons/web/static/src/js/fields/basic_fields.js:2134
#, python-format
msgid "Switch Off"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2062
+#: code:addons/web/static/src/js/fields/basic_fields.js:2135
#, python-format
msgid "Switch On"
msgstr ""
@@ -3066,7 +3028,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:260
+#: code:addons/web/static/src/xml/base.xml:267
#, python-format
msgid "Technical Translation"
msgstr ""
@@ -3087,41 +3049,41 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/widgets/model_field_selector.js:406
+#: code:addons/web/static/src/js/widgets/model_field_selector.js:428
#, python-format
msgid "The field chain is not valid. Did you maybe use a non-existing field name or followed a non-relational field?"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1577
+#: code:addons/web/static/src/js/fields/basic_fields.js:1641
#, python-format
msgid "The field is empty, there's nothing to save !"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/basic/basic_controller.js:398
+#: code:addons/web/static/src/js/views/basic/basic_controller.js:426
#: code:addons/web/static/src/js/widgets/attach_document.js:65
#, python-format
msgid "The following fields are invalid:"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:821
+#: code:addons/web/controllers/main.py:811
#, python-format
msgid "The new password and its confirmation must be identical."
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:832
+#: code:addons/web/controllers/main.py:822
#, python-format
msgid "The old password you provided is incorrect, your password was not changed."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/services/crash_manager.js:224
+#: code:addons/web/static/src/js/services/crash_manager.js:228
#, python-format
msgid "The operation was interrupted. This usually means that the current operation is taking too much time."
msgstr ""
@@ -3135,62 +3097,62 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1395
+#: code:addons/web/static/src/js/fields/basic_fields.js:1437
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/relational_fields.js:1643
+#: code:addons/web/static/src/js/fields/relational_fields.js:1658
#, python-format
msgid "The type of the field '%s' must be a many2many field with a relation to 'ir.attachment' model."
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:1513
+#: code:addons/web/controllers/main.py:1484
#, python-format
msgid "There are too many rows (%s rows, limit: 65535) to export as Excel 97-2003 (.xls) format. Consider splitting the export."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:1416
+#: code:addons/web/static/src/js/fields/basic_fields.js:1458
#, python-format
msgid "There was a problem while uploading your file"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:13
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:16
#, python-format
msgid "This Month"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:14
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:17
#, python-format
msgid "This Quarter"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:12
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:15
#, python-format
msgid "This Week"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:15
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:18
#, python-format
msgid "This Year"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/widgets/date_picker.js:181
+#: code:addons/web/static/src/js/widgets/date_picker.js:180
#, python-format
msgid "This date is on the future. Make sure it is what you expected."
msgstr ""
@@ -3204,7 +3166,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/favorites_menu.js:272
+#: code:addons/web/static/src/js/views/control_panel/search/favorite_menu.js:87
#, python-format
msgid "This filter is global and will be removed for everybody if you continue."
msgstr ""
@@ -3221,15 +3183,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_view.js:1039
-#: code:addons/web/static/src/js/views/search/time_range_menu.js:128
-#, python-format
-msgid "Time Range"
-msgstr ""
-
-#. module: web
-#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1139
+#: code:addons/web/static/src/xml/base.xml:1149
#, python-format
msgid "Time Ranges"
msgstr ""
@@ -3243,7 +3197,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:11
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:14
#: code:addons/web/static/src/xml/web_calendar.xml:76
#: code:addons/web/static/src/xml/web_calendar.xml:89
#, python-format
@@ -3252,7 +3206,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:244
+#: code:addons/web/static/src/xml/base.xml:251
#, python-format
msgid "Toggle Timelines"
msgstr ""
@@ -3267,7 +3221,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:211
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:212
#, python-format
msgid "Traceback:"
msgstr ""
@@ -3281,7 +3235,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:577
+#: code:addons/web/static/src/xml/base.xml:584
#, python-format
msgid "Try to add some records, or make sure\n"
" that there is at least one measure and no active filter in the search bar."
@@ -3289,14 +3243,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:112
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:117
#, python-format
msgid "Try to add some records, or make sure that there is no active filter in the search bar."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:338
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:339
#, python-format
msgid "Trying to reconnect..."
msgstr ""
@@ -3317,7 +3271,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/list/list_controller.js:162
+#: code:addons/web/static/src/js/views/list/list_controller.js:170
#, python-format
msgid "Unarchive"
msgstr ""
@@ -3332,12 +3286,13 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/calendar/calendar_model.js:578
-#: code:addons/web/static/src/js/views/graph/graph_renderer.js:547
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:76
-#: code:addons/web/static/src/js/views/kanban/kanban_column.js:79
-#: code:addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js:182
-#: code:addons/web/static/src/js/views/list/list_renderer.js:435
-#: code:addons/web/static/src/js/views/list/list_renderer.js:438
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:341
+#: code:addons/web/static/src/js/views/graph/graph_renderer.js:523
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:77
+#: code:addons/web/static/src/js/views/kanban/kanban_column.js:80
+#: code:addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js:183
+#: code:addons/web/static/src/js/views/list/list_renderer.js:436
+#: code:addons/web/static/src/js/views/list/list_renderer.js:439
#: code:addons/web/static/src/js/views/pivot/pivot_model.js:1078
#, python-format
msgid "Undefined"
@@ -3352,7 +3307,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:202
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:203
#, python-format
msgid "Unknown CORS error"
msgstr ""
@@ -3380,14 +3335,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/pivot/pivot_view.js:106
+#: code:addons/web/static/src/js/views/pivot/pivot_view.js:117
#, python-format
msgid "Untitled"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1393
+#: code:addons/web/static/src/xml/base.xml:1356
#, python-format
msgid "Update data (import-compatible export)"
msgstr ""
@@ -3401,60 +3356,60 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1577
+#: code:addons/web/static/src/xml/base.xml:1540
#, python-format
msgid "Upgrade to enterprise"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1571
+#: code:addons/web/static/src/xml/base.xml:1534
#, python-format
msgid "Upgrade to future versions"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:974
-#: code:addons/web/static/src/xml/base.xml:1005
+#: code:addons/web/static/src/xml/base.xml:984
+#: code:addons/web/static/src/xml/base.xml:1015
#, python-format
msgid "Upload your file"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/relational_fields.js:1807
+#: code:addons/web/static/src/js/fields/relational_fields.js:1822
#, python-format
msgid "Uploading Error"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:938
-#: code:addons/web/static/src/xml/base.xml:978
-#: code:addons/web/static/src/xml/base.xml:1004
-#: code:addons/web/static/src/xml/base.xml:1060
+#: code:addons/web/static/src/xml/base.xml:948
+#: code:addons/web/static/src/xml/base.xml:988
+#: code:addons/web/static/src/xml/base.xml:1014
+#: code:addons/web/static/src/xml/base.xml:1070
#, python-format
msgid "Uploading..."
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1365
+#: code:addons/web/static/src/xml/base.xml:1331
#, python-format
msgid "Use by default"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1387
+#: code:addons/web/static/src/xml/base.xml:1350
#, python-format
msgid "Use data in a spreadsheet (export all data)"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1371
+#: code:addons/web/static/src/xml/base.xml:1335
#, python-format
msgid "Users"
msgstr ""
@@ -3469,27 +3424,28 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/tools/debug_manager.js:287
-#: code:addons/web/static/src/xml/base.xml:258
+#: code:addons/web/static/src/xml/base.xml:265
#, python-format
msgid "View Fields"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:270
+#: code:addons/web/static/src/xml/base.xml:277
#, python-format
msgid "View Metadata"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/action_manager.js:580
+#: code:addons/web/static/src/js/chrome/action_manager.js:544
#: code:addons/web/static/src/js/chrome/action_manager_report.js:69
#: code:addons/web/static/src/js/services/crash_manager.js:13
#: code:addons/web/static/src/js/services/crash_manager.js:14
#: code:addons/web/static/src/js/views/basic/basic_controller.js:78
-#: code:addons/web/static/src/js/views/list/list_renderer.js:352
-#: code:addons/web/static/src/xml/base.xml:606
+#: code:addons/web/static/src/js/views/control_panel/search/favorite_menu.js:92
+#: code:addons/web/static/src/js/views/list/list_renderer.js:353
+#: code:addons/web/static/src/xml/base.xml:613
#, python-format
msgid "Warning"
msgstr ""
@@ -3524,7 +3480,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:559
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:31
+#: code:addons/web/static/src/xml/base.xml:566
#: code:addons/web/static/src/xml/web_calendar.xml:81
#, python-format
msgid "Week"
@@ -3539,7 +3496,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:1383
+#: code:addons/web/static/src/xml/base.xml:1346
#, python-format
msgid "What do you want to do?"
msgstr ""
@@ -3553,34 +3510,35 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/menu.xml:126
+#: code:addons/web/static/src/xml/menu.xml:112
#, python-format
msgid "Windows/Linux"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:497
+#: code:addons/web/controllers/main.py:487
#, python-format
msgid "Wrong login/password"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/fields/basic_fields.js:2283
+#: code:addons/web/static/src/js/fields/basic_fields.js:2356
#, python-format
msgid "Wrong value entered!"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:290
+#: code:addons/web/static/src/xml/base.xml:297
#, python-format
msgid "XML ID:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:562
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:34
+#: code:addons/web/static/src/xml/base.xml:569
#, python-format
msgid "Year"
msgstr ""
@@ -3588,7 +3546,7 @@ msgstr ""
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views/kanban/kanban_record.js:24
-#: code:addons/web/static/src/xml/base.xml:862
+#: code:addons/web/static/src/xml/base.xml:872
#: code:addons/web/static/src/xml/kanban.xml:83
#, python-format
msgid "Yellow"
@@ -3596,7 +3554,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:337
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:295
#: code:addons/web/static/src/xml/base.xml:49
#, python-format
msgid "Yes"
@@ -3604,14 +3562,14 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/time_range_menu_options.js:16
+#: code:addons/web/static/src/js/views/control_panel/search/control_panel_view_parameters.js:19
#, python-format
msgid "Yesterday"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/chrome/abstract_web_client.js:352
+#: code:addons/web/static/src/js/chrome/abstract_web_client.js:353
#, python-format
msgid "You are back online"
msgstr ""
@@ -3625,13 +3583,13 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/widgets/model_field_selector.js:467
+#: code:addons/web/static/src/js/widgets/model_field_selector.js:489
#, python-format
msgid "You cannot follow relations for this field chain construction"
msgstr ""
#. module: web
-#: code:addons/web/controllers/main.py:819
+#: code:addons/web/controllers/main.py:809
#, python-format
msgid "You cannot leave any password empty."
msgstr ""
@@ -3659,7 +3617,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/services/crash_manager.js:212
+#: code:addons/web/static/src/js/services/crash_manager.js:216
#, python-format
msgid "Your Odoo session expired. Please refresh the current web page."
msgstr ""
@@ -3715,7 +3673,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:639
+#: code:addons/web/static/src/xml/base.xml:646
#, python-format
msgid "all records"
msgstr ""
@@ -3729,7 +3687,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:168
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:167
#: code:addons/web/static/src/js/widgets/domain_selector.js:23
#, python-format
msgid "contains"
@@ -3744,23 +3702,23 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:169
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:168
#, python-format
msgid "doesn't contain"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:275
-#: code:addons/web/static/src/js/views/search/search_filters.js:304
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:283
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:312
#, python-format
msgid "greater than"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:277
-#: code:addons/web/static/src/js/views/search/search_filters.js:306
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:285
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:314
#, python-format
msgid "greater than or equal to"
msgstr ""
@@ -3774,55 +3732,55 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:296
-#: code:addons/web/static/src/js/views/search/search_filters.js:331
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:304
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:339
#: code:addons/web/static/src/js/widgets/domain_selector.js:863
-#: code:addons/web/static/src/xml/base.xml:727
+#: code:addons/web/static/src/xml/base.xml:734
#, python-format
msgid "is"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:188
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:196
#, python-format
msgid "is after"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:189
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:197
#, python-format
msgid "is before"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:190
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:198
#, python-format
msgid "is between"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:170
-#: code:addons/web/static/src/js/views/search/search_filters.js:186
-#: code:addons/web/static/src/js/views/search/search_filters.js:273
-#: code:addons/web/static/src/js/views/search/search_filters.js:302
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:169
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:194
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:281
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:310
#, python-format
msgid "is equal to"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:350
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:358
#, python-format
msgid "is false"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:332
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:340
#: code:addons/web/static/src/js/widgets/domain_selector.js:864
#, python-format
msgid "is not"
@@ -3837,21 +3795,21 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:171
-#: code:addons/web/static/src/js/views/search/search_filters.js:187
-#: code:addons/web/static/src/js/views/search/search_filters.js:274
-#: code:addons/web/static/src/js/views/search/search_filters.js:303
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:170
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:195
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:282
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:311
#, python-format
msgid "is not equal to"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:173
-#: code:addons/web/static/src/js/views/search/search_filters.js:192
-#: code:addons/web/static/src/js/views/search/search_filters.js:280
-#: code:addons/web/static/src/js/views/search/search_filters.js:309
-#: code:addons/web/static/src/js/views/search/search_filters.js:334
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:172
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:200
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:288
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:317
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:342
#: code:addons/web/static/src/js/widgets/domain_selector.js:37
#, python-format
msgid "is not set"
@@ -3859,11 +3817,11 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:172
-#: code:addons/web/static/src/js/views/search/search_filters.js:191
-#: code:addons/web/static/src/js/views/search/search_filters.js:279
-#: code:addons/web/static/src/js/views/search/search_filters.js:308
-#: code:addons/web/static/src/js/views/search/search_filters.js:333
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:171
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:199
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:287
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:316
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:341
#: code:addons/web/static/src/js/widgets/domain_selector.js:36
#, python-format
msgid "is set"
@@ -3871,7 +3829,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:349
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:357
#, python-format
msgid "is true"
msgstr ""
@@ -3885,8 +3843,8 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:276
-#: code:addons/web/static/src/js/views/search/search_filters.js:305
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:284
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:313
#, python-format
msgid "less than"
msgstr ""
@@ -3900,29 +3858,29 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_filters.js:278
-#: code:addons/web/static/src/js/views/search/search_filters.js:307
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:286
+#: code:addons/web/static/src/js/views/control_panel/search/search_filters.js:315
#, python-format
msgid "less than or equal to"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:729
+#: code:addons/web/static/src/xml/base.xml:736
#, python-format
msgid "not"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:237
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:219
#, python-format
msgid "not a valid integer"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/js/views/search/search_inputs.js:252
+#: code:addons/web/static/src/js/views/control_panel/search/search_bar_autocomplete_sources.js:230
#, python-format
msgid "not a valid number"
msgstr ""
@@ -3943,22 +3901,24 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:648
+#: code:addons/web/static/src/xml/base.xml:655
#, python-format
msgid "of the following rules:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:663
+#: code:addons/web/static/src/xml/base.xml:670
#, python-format
msgid "of:"
msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:720
-#: code:addons/web/static/src/xml/base.xml:1320
+#: code:addons/web/static/src/js/views/control_panel/search/search_facet.js:95
+#: code:addons/web/static/src/js/views/control_panel/search/search_facet.js:97
+#: code:addons/web/static/src/xml/base.xml:727
+#: code:addons/web/static/src/xml/base.xml:1257
#, python-format
msgid "or"
msgstr ""
@@ -3972,7 +3932,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:604
+#: code:addons/web/static/src/xml/base.xml:611
#, python-format
msgid "record(s)"
msgstr ""
@@ -3986,7 +3946,7 @@ msgstr ""
#. module: web
#. openerp-web
-#: code:addons/web/static/src/xml/base.xml:729
+#: code:addons/web/static/src/xml/base.xml:736
#, python-format
msgid "set"
msgstr ""
diff --git a/addons/web/static/lib/py.js/lib/py.js b/addons/web/static/lib/py.js/lib/py.js
index 06d834321de..bd794323995 100644
--- a/addons/web/static/lib/py.js/lib/py.js
+++ b/addons/web/static/lib/py.js/lib/py.js
@@ -282,7 +282,10 @@ var py = {};
var name_pattern = new RegExp('^' + Name + '$');
var strip = new RegExp('^' + Whitespace);
return function tokenize(s) {
- var max=s.length, tokens = [], start, end = undefined;
+ s = s
+ .replace(/\\\"/g, '\\u0022') // for double quote
+ .replace(/\\\'/g, '\\u0027'); // for single quote
+ var max=s.length, tokens = [], start, end;
// /g flag makes repeated exec() have memory
var pseudoprog = new RegExp(PseudoToken, 'g');
@@ -302,7 +305,6 @@ var py = {};
end = pseudoprog.lastIndex;
// strip leading space caught by Whitespace
var token = s.slice(start, end).replace(strip, '');
- var initial = token[0];
if (number_pattern.test(token)) {
tokens.push(create(symbols['(number)'], {
@@ -310,9 +312,13 @@ var py = {};
}));
} else if (string_pattern.test(token)) {
var m = string_pattern.exec(token);
+ var value = (m[3] !== undefined ? m[3] : m[5]);
+ value
+ .replace(/\\u0022/g, '"')
+ .replace(/\\u0027/g, "'");
tokens.push(create(symbols['(string)'], {
unicode: !!(m[2] || m[4]),
- value: (m[3] !== undefined ? m[3] : m[5])
+ value: value
}));
} else if (token in symbols) {
var symbol;
diff --git a/addons/web/static/src/js/chrome/action_manager.js b/addons/web/static/src/js/chrome/action_manager.js
index c798189c0a0..107c6e314eb 100644
--- a/addons/web/static/src/js/chrome/action_manager.js
+++ b/addons/web/static/src/js/chrome/action_manager.js
@@ -332,9 +332,6 @@ var ActionManager = Widget.extend({
// update the internal state and the DOM
self._pushController(controller);
- // toggle the fullscreen mode for actions in target='fullscreen'
- self._toggleFullscreen();
-
// store the action into the sessionStorage so that it can be
// fully restored on F5
self.call('session_storage', 'setItem', 'current_action', action._originalAction);
@@ -720,6 +717,9 @@ var ActionManager = Widget.extend({
action: this.getCurrentAction(),
controller: controller,
});
+
+ // toggle the fullscreen mode for actions in target='fullscreen'
+ this._toggleFullscreen();
},
/**
* Pushes the given state, with additional information about the given
diff --git a/addons/web/static/src/js/chrome/action_manager_act_window.js b/addons/web/static/src/js/chrome/action_manager_act_window.js
index 1a688ffa6b2..106f9f2aa47 100644
--- a/addons/web/static/src/js/chrome/action_manager_act_window.js
+++ b/addons/web/static/src/js/chrome/action_manager_act_window.js
@@ -93,7 +93,7 @@ ActionManager.include({
action = state.action;
options = _.extend(options, {
additional_context: context,
- resID: state.id,
+ resID: state.id || undefined, // empty string with bbq
viewType: state.view_type,
});
}
@@ -396,7 +396,7 @@ ActionManager.include({
var inline = action.target === 'inline';
var options = {
action_id: action.id,
- toolbar: inDialog && inline,
+ toolbar: !inDialog && !inline,
};
var views = action.views.slice();
if (!inline && !(inDialog && action.views[0][1] === 'form')) {
@@ -635,7 +635,7 @@ ActionManager.include({
_.object(_.reject(_.pairs(env.context), function (pair) {
return pair[0].match('^(?:(?:default_|search_default_|show_).+|' +
'.+_view_ref|group_by|group_by_no_leaf|active_id|' +
- 'active_ids)$') !== null;
+ 'active_ids|orderedBy)$') !== null;
}))
);
ctx.add(actionData.context || {});
diff --git a/addons/web/static/src/js/core/dialog.js b/addons/web/static/src/js/core/dialog.js
index 492ea06c7bd..83eded92c8a 100644
--- a/addons/web/static/src/js/core/dialog.js
+++ b/addons/web/static/src/js/core/dialog.js
@@ -143,7 +143,11 @@ var Dialog = Widget.extend({
$.when(def).always(self.close.bind(self));
}
});
- self.$footer.append($button);
+ if (self.technical) {
+ self.$footer.append($button);
+ } else {
+ self.$footer.prepend($button);
+ }
});
},
diff --git a/addons/web/static/src/js/core/dom.js b/addons/web/static/src/js/core/dom.js
index 848e406c4b2..b8a5b8be3a4 100644
--- a/addons/web/static/src/js/core/dom.js
+++ b/addons/web/static/src/js/core/dom.js
@@ -506,7 +506,7 @@ var dom = {
var $dropdownMenu = $('<ul/>', {class: 'dropdown-menu'});
$extraItemsToggle = $('<li/>', {class: 'nav-item dropdown o_extra_menu_items'})
- .append($('<a/>', {href: '#', class: 'nav-link dropdown-toggle o-no-caret', 'data-toggle': 'dropdown'})
+ .append($('<a/>', {role: 'button', href: '#', class: 'nav-link dropdown-toggle o-no-caret', 'data-toggle': 'dropdown', 'aria-expanded': false})
.append($('<i/>', {class: 'fa fa-plus'})))
.append($dropdownMenu);
$extraItemsToggle.insertAfter($items.last());
diff --git a/addons/web/static/src/js/tools/debug_manager.js b/addons/web/static/src/js/tools/debug_manager.js
index a348f54acd9..f09d8745f04 100644
--- a/addons/web/static/src/js/tools/debug_manager.js
+++ b/addons/web/static/src/js/tools/debug_manager.js
@@ -365,6 +365,10 @@ DebugManager.include({
views: [[false, 'list'], [false, 'form']],
type: 'ir.actions.act_window',
domain: [['res_model', '=', this._action.res_model], ['res_id', '=', selectedIDs[0]]],
+ context: {
+ default_res_model: this._action.res_model,
+ default_res_id: selectedIDs[0],
+ },
});
},
get_metadata: function() {
diff --git a/addons/web/static/src/js/views/abstract_view.js b/addons/web/static/src/js/views/abstract_view.js
index 75de2be9446..5921c1b4bc3 100644
--- a/addons/web/static/src/js/views/abstract_view.js
+++ b/addons/web/static/src/js/views/abstract_view.js
@@ -105,7 +105,7 @@ var AbstractView = Factory.extend({
this.arch = this.fieldsView.arch;
this.fields = this.fieldsView.viewFields;
this.userContext = params.userContext || {};
- this.withControlPanel = params.withControlPanel;
+ this.withControlPanel = this.withControlPanel && params.withControlPanel;
// the boolean parameter 'isEmbedded' determines if the view should be
// considered as a subview. For now this is only used by the graph
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 8266b1dee42..9706251ed07 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -1758,7 +1758,7 @@ var BasicModel = AbstractModel.extend({
model: list.model,
method: 'read',
args: [_.pluck(data, 'id'), fieldNames],
- context: record.context,
+ context: _.extend({}, record.context, field.context),
}).then(function (records) {
_.each(records, function (record) {
list_records[record.id].data = record;
@@ -1833,7 +1833,7 @@ var BasicModel = AbstractModel.extend({
addDef = this._applyX2ManyChange(record, fieldName, {
operation: 'ADD_M2M',
ids: values
- });
+ }, viewType);
}
if (removedIds.length) {
var listData = _.map(list.data, function (localId) {
@@ -1847,7 +1847,7 @@ var BasicModel = AbstractModel.extend({
}
return _.findWhere(listData, {res_id: resID}).id;
}),
- });
+ }, viewType);
}
return $.when(addDef, removedDef);
}
@@ -2827,7 +2827,7 @@ var BasicModel = AbstractModel.extend({
var ids = record.data[fieldName] || [];
var list = self._makeDataPoint({
count: ids.length,
- context: record.context,
+ context: _.extend({}, record.context, field.context),
fieldsInfo: fieldsInfo,
fields: view ? view.fields : fieldInfo.relatedFields,
limit: fieldInfo.limit,
@@ -4289,9 +4289,12 @@ var BasicModel = AbstractModel.extend({
}
return list;
}).then(function () {
- self._fetchX2ManysSingleBatch(list);
- self._fetchReferencesSingleBatch(list);
- return list;
+ var fetchingDefs = [];
+ fetchingDefs.push(self._fetchX2ManysSingleBatch(list));
+ fetchingDefs.push(self._fetchReferencesSingleBatch(list));
+ return $.when.apply($, fetchingDefs).then(function () {
+ return list;
+ });
});
});
},
@@ -4322,11 +4325,24 @@ var BasicModel = AbstractModel.extend({
}
return def.then(function () {
var resIDs = [];
- // generate the current count and res_ids list by applying the changes
- var currentCount = list.count;
var currentResIDs = list.res_ids;
- var effectiveLimit = (list.limit || 0) - (list.tempLimitIncrement || 0);
- var upperBound = effectiveLimit ? Math.min(list.offset + effectiveLimit, currentCount) : currentCount;
+ // if new records have been added to the list, their virtual ids have
+ // been pushed at the end of res_ids (or at the beginning, depending
+ // on the editable property), ignoring completely the current page
+ // where the records have actually been created ; for that reason,
+ // we use orderedResIDs which is a freezed order with the virtual ids
+ // at the correct position where they were actually inserted ; however,
+ // when we use orderedResIDs, we must filter out ids that are not in
+ // res_ids, which correspond to records that have been removed from
+ // the relation (this information being taken into account in res_ids
+ // but not in orderedResIDs)
+ if (list.orderedResIDs) {
+ currentResIDs = list.orderedResIDs.filter(function (resID) {
+ return list.res_ids.indexOf(resID) >= 0;
+ });
+ }
+ var currentCount = currentResIDs.length;
+ var upperBound = list.limit ? Math.min(list.offset + list.limit, currentCount) : currentCount;
var fieldNames = list.getFieldNames();
for (var i = list.offset; i < upperBound; i++) {
var resId = currentResIDs[i];
diff --git a/addons/web/static/src/js/views/basic/basic_view.js b/addons/web/static/src/js/views/basic/basic_view.js
index d5d6cfa18d5..39444fdfd75 100644
--- a/addons/web/static/src/js/views/basic/basic_view.js
+++ b/addons/web/static/src/js/views/basic/basic_view.js
@@ -145,6 +145,21 @@ var BasicView = AbstractView.extend({
if (_.difference(fieldViewTypes, recordViewTypes).length) {
fieldNames.push(name);
}
+
+ if (record.data[name].viewType === 'default') {
+ // Use case: x2many (tags) in x2many list views
+ // When opening the x2many record form view, the
+ // x2many will be reloaded but it may not have
+ // the same fields (ex: tags in list and list in
+ // form) so we need to merge the fieldsInfo to
+ // avoid losing the initial fields (display_name)
+ var defaultFieldInfo = record.data[name].fieldsInfo.default;
+ _.each(fieldViews, function (fieldView) {
+ _.each(fieldView.fieldsInfo, function (x2mFieldInfo) {
+ _.defaults(x2mFieldInfo, defaultFieldInfo);
+ });
+ });
+ }
}
}
// Many2one: context is not the same between the different views
diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js
index 1f8c9423cac..7c06a7d818d 100644
--- a/addons/web/static/src/js/views/calendar/calendar_model.js
+++ b/addons/web/static/src/js/views/calendar/calendar_model.js
@@ -244,18 +244,18 @@ return AbstractModel.extend({
this.setDate(this.data.target_date.clone().add(-1, this.data.scale));
},
/**
- * @todo: this should not work. it ignores the domain/context
- *
* @override
- * @param {any} _handle ignored
- * @param {Object} params
+ * @param {Object} [params.context]
* @param {Array} [params.domain]
* @returns {Deferred}
*/
- reload: function (_handle, params) {
+ reload: function (handle, params) {
if (params.domain) {
this.data.domain = params.domain;
}
+ if (params.context) {
+ this.data.context = params.context;
+ }
return this._loadCalendar();
},
/**
@@ -385,6 +385,9 @@ return AbstractModel.extend({
* @returns {Object}
*/
_getFullCalendarOptions: function () {
+ var week_start = _t.database.parameters.week_start || 0;
+ // calendar uses index 0 for Sunday but Odoo stores it as 7
+ week_start = week_start % 7;
return {
defaultView: (this.mode === "month")? "month" : ((this.mode === "week")? "agendaWeek" : ((this.mode === "day")? "agendaDay" : "agendaWeek")),
header: false,
@@ -404,7 +407,7 @@ return AbstractModel.extend({
monthNamesShort: moment.monthsShort(),
dayNames: moment.weekdays(),
dayNamesShort: moment.weekdaysShort(),
- firstDay: _t.database.parameters.week_start,
+ firstDay: week_start,
slotLabelFormat: _t.database.parameters.time_format.search("%H") != -1 ? 'H:mm': 'h(:mm)a',
};
},
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_controller.js b/addons/web/static/src/js/views/control_panel/control_panel_controller.js
index 991cee949e8..3d6e62f4bf9 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_controller.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_controller.js
@@ -160,12 +160,11 @@ var ControlPanelController = mvc.Controller.extend({
*/
_onFacetRemoved: function (ev) {
ev.stopPropagation();
- var group = ev.data.group;
- if (!group) {
- group = this.renderer.getLastFacet();
+ var group = ev.data.group || this.renderer.getLastFacet();
+ if (group) {
+ this.model.deactivateGroup(group.id);
+ this._reportNewQueryAndRender();
}
- this.model.deactivateGroup(group.id);
- this._reportNewQueryAndRender();
},
/**
* @private
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_model.js b/addons/web/static/src/js/views/control_panel/control_panel_model.js
index 9353022eacf..67b1a4c64f8 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_model.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_model.js
@@ -645,10 +645,7 @@ var ControlPanelModel = mvc.Model.extend({
* @returns {Object} context
*/
_getFilterContext: function (filter) {
- var context = {};
- if (filter.type === 'favorite') {
- _.extend(context, filter.context);
- }
+ var context = filter.context || {};
// the following code aims to restore this:
// https://github.com/odoo/odoo/blob/master/addons/web/static/src/js/views/search/search_inputs.js#L498
// this is required for the helpdesk tour to pass
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_renderer.js b/addons/web/static/src/js/views/control_panel/control_panel_renderer.js
index eea7fdae430..665fe73bf7d 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_renderer.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_renderer.js
@@ -102,7 +102,7 @@ var ControlPanelRenderer = Renderer.extend({
//--------------------------------------------------------------------------
/**
- * @returns {Object}
+ * @returns {Object|undefined}
*/
getLastFacet: function () {
return this.state.facets.slice(-1)[0];
diff --git a/addons/web/static/src/js/views/control_panel/control_panel_view.js b/addons/web/static/src/js/views/control_panel/control_panel_view.js
index 381e5dcf7e5..2bde26340e7 100644
--- a/addons/web/static/src/js/views/control_panel/control_panel_view.js
+++ b/addons/web/static/src/js/views/control_panel/control_panel_view.js
@@ -141,6 +141,7 @@ var ControlPanelView = Factory.extend({
'Ω';
if (filter.type === 'filter') {
filter.domain = attrs.domain;
+ filter.context = pyUtils.eval('context', attrs.context);
if (attrs.date) {
filter.fieldName = attrs.date;
filter.fieldType = this.fields[attrs.date].type;
@@ -196,6 +197,7 @@ var ControlPanelView = Factory.extend({
var groupOfGroupBys = [];
var groupNumber = 1;
+
_.each(preFilters, function (preFilter) {
if (preFilter.attrs && preFilter.attrs.invisible) {
return;
diff --git a/addons/web/static/src/js/views/form/form_view.js b/addons/web/static/src/js/views/form/form_view.js
index d49f2b005fa..5a00350c68f 100644
--- a/addons/web/static/src/js/views/form/form_view.js
+++ b/addons/web/static/src/js/views/form/form_view.js
@@ -26,13 +26,20 @@ var FormView = BasicView.extend({
* @override
*/
init: function (viewInfo, params) {
+ var hasSidebar = params.hasSidebar;
this._super.apply(this, arguments);
var mode = params.mode || (params.currentId ? 'readonly' : 'edit');
this.loadParams.type = 'record';
+ // this is kind of strange, but the param object is modified by
+ // AbstractView, so we only need to use its hasSidebar value if it was
+ // not already present in the beginning of this method
+ if (hasSidebar === undefined) {
+ hasSidebar = params.hasSidebar;
+ }
+ this.controllerParams.hasSidebar = hasSidebar;
this.controllerParams.disableAutofocus = params.disable_autofocus;
- this.controllerParams.hasSidebar = params.hasSidebar;
this.controllerParams.toolbarActions = viewInfo.toolbar;
this.controllerParams.footerToButtons = params.footerToButtons;
@@ -63,7 +70,6 @@ var FormView = BasicView.extend({
/**
* @override
- * @param {string} [action.target]
*/
_extractParamsFromAction: function (action) {
var params = this._super.apply(this, arguments);
@@ -73,6 +79,7 @@ var FormView = BasicView.extend({
params.withControlPanel = !(inDialog || inline);
params.footerToButtons = inDialog;
params.hasSearchView = inDialog ? false : params.hasSearchView;
+ params.hasSidebar = !inDialog && !inline;
params.searchMenuTypes = inDialog ? [] : params.searchMenuTypes;
if (inDialog || inline || fullscreen) {
params.mode = 'edit';
@@ -115,9 +122,14 @@ var FormView = BasicView.extend({
while (matches = regex.exec(attrs.context)) {
context[matches[1]] = matches[2];
}
+
+ // Remove *_view_ref coming from parent view
+ var refinedContext = _.pick(self.loadParams.context, function (value, key) {
+ return key.indexOf('_view_ref') === -1;
+ });
defs.push(parent.loadViews(
field.relation,
- new Context(context, self.userContext, self.loadParams.context).eval(),
+ new Context(context, self.userContext, refinedContext).eval(),
[[null, attrs.mode === 'tree' ? 'list' : attrs.mode]])
.then(function (views) {
for (var viewName in views) {
diff --git a/addons/web/static/src/js/views/graph/graph_renderer.js b/addons/web/static/src/js/views/graph/graph_renderer.js
index fe4efab1b20..38c2f02351e 100644
--- a/addons/web/static/src/js/views/graph/graph_renderer.js
+++ b/addons/web/static/src/js/views/graph/graph_renderer.js
@@ -337,8 +337,8 @@ return AbstractRenderer.extend({
var self = this;
// Remove Undefined of first GroupBy
- var graphData = _.filter(this.state.data, function(elem){
- return elem.labels[0] !== undefined;
+ var graphData = _.filter(this.state.data, function (elem) {
+ return elem.labels[0] !== undefined && elem.labels[0] !== _t("Undefined");
});
// undefined label value becomes a string 'Undefined' translated
@@ -391,10 +391,9 @@ return AbstractRenderer.extend({
var tick = 0;
var serie, tickLabel;
var identity = function (p) {return p;};
-
- for (var i = 0; i < this.state.data.length; i++) {
+ for (var i = 0; i < graphData.length; i++) {
if (graphData[i].labels[0] !== tickLabel) {
- tickLabel = this.state.data[i].labels[0];
+ tickLabel = graphData[i].labels[0];
ticksLabels.push(tickLabel);
tick++;
}
diff --git a/addons/web/static/src/js/views/kanban/kanban_column.js b/addons/web/static/src/js/views/kanban/kanban_column.js
index 57ecc6f4b4e..b526b80a971 100644
--- a/addons/web/static/src/js/views/kanban/kanban_column.js
+++ b/addons/web/static/src/js/views/kanban/kanban_column.js
@@ -114,7 +114,6 @@ var KanbanColumn = Widget.extend({
revert: 0,
delay: 0,
items: '> .o_kanban_record:not(.o_updating)',
- helper: 'clone',
cursor: 'move',
over: function () {
self.$el.addClass('o_kanban_hover');
@@ -122,6 +121,15 @@ var KanbanColumn = Widget.extend({
out: function () {
self.$el.removeClass('o_kanban_hover');
},
+ start: function (event, ui) {
+ ui.item.addClass('o_currently_dragged');
+ },
+ stop: function (event, ui) {
+ var item = ui.item;
+ setTimeout(function () {
+ item.removeClass('o_currently_dragged');
+ });
+ },
update: function (event, ui) {
var record = ui.item.data('record');
var index = self.records.indexOf(record);
diff --git a/addons/web/static/src/js/views/kanban/kanban_record.js b/addons/web/static/src/js/views/kanban/kanban_record.js
index d9d7ac77fe2..46f6964dd1c 100644
--- a/addons/web/static/src/js/views/kanban/kanban_record.js
+++ b/addons/web/static/src/js/views/kanban/kanban_record.js
@@ -5,7 +5,6 @@ odoo.define('web.KanbanRecord', function (require) {
* This file defines the KanbanRecord widget, which corresponds to a card in
* a Kanban view.
*/
-
var config = require('web.config');
var core = require('web.core');
var Domain = require('web.Domain');
@@ -210,6 +209,11 @@ var KanbanRecord = Widget.extend({
* @private
*/
_openRecord: function () {
+ if (this.$el.hasClass('o_currently_dragged')) {
+ // this record is currently being dragged and dropped, so we do not
+ // want to open it.
+ return;
+ }
var editMode = this.$el.hasClass('oe_kanban_global_click_edit');
this.trigger_up('open_record', {
id: this.db_id,
diff --git a/addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js b/addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js
index 8619448e793..b7f2dd62b28 100644
--- a/addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js
+++ b/addons/web/static/src/js/views/kanban/kanban_renderer_mobile.js
@@ -143,7 +143,7 @@ KanbanRenderer.include({
onSuccess: function () {
// update the columns and tabs positions (optionally with an animation)
var updateFunc = animate ? 'animate' : 'css';
- self.$('.o_kanban_mobile_tab').removeClass('o_current');
+ self.$('.o_kanban_mobile_tab, .o_kanban_group').removeClass('o_current');
_.each(self.widgets, function (column, index) {
var columnID = column.id || column.db_id;
var $column = self.$('.o_kanban_group[data-id="' + columnID + '"]');
@@ -157,6 +157,7 @@ KanbanRenderer.include({
} else if (index === moveToIndex) {
$column[updateFunc]({left: '0%'});
$tab[updateFunc]({left: '50%'});
+ $column.addClass('o_current');
$tab.addClass('o_current');
} else if (index < moveToIndex) {
$column.css({left: '-100%'});
diff --git a/addons/web/static/src/js/views/list/list_view.js b/addons/web/static/src/js/views/list/list_view.js
index 291cb8de8a0..a28eb4da03a 100644
--- a/addons/web/static/src/js/views/list/list_view.js
+++ b/addons/web/static/src/js/views/list/list_view.js
@@ -57,8 +57,21 @@ var ListView = BasicView.extend({
//--------------------------------------------------------------------------
// Private
- //---
+ //--------------------------------------------------------------------------
+ /**
+ * @override
+ */
+ _extractParamsFromAction: function (action) {
+ var params = this._super.apply(this, arguments);
+ var inDialog = action.target === 'new';
+ var inline = action.target === 'inline';
+ params.hasSidebar = !inDialog && !inline;
+ return params;
+ },
+ /**
+ * @override
+ */
_updateMVCParams: function () {
this._super.apply(this, arguments);
this.controllerParams.noLeaf = !!this.loadParams.context.group_by_no_leaf;
diff --git a/addons/web/static/src/js/views/pivot/pivot_controller.js b/addons/web/static/src/js/views/pivot/pivot_controller.js
index a4833b40d81..ac48ab769ff 100644
--- a/addons/web/static/src/js/views/pivot/pivot_controller.js
+++ b/addons/web/static/src/js/views/pivot/pivot_controller.js
@@ -345,7 +345,8 @@ var PivotController = AbstractController.extend({
var col_id = $target.data('id');
var measure = $target.data('measure');
var isAscending = $target.hasClass('o_pivot_measure_row_sorted_asc');
- this.model.sortRows(col_id, measure, isAscending);
+ var dataType = $target.data('data_type');
+ this.model.sortRows(col_id, measure, isAscending, dataType);
this.update({}, {reload: false});
},
/**
diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js
index 1a0d3625440..5a6423fbe34 100644
--- a/addons/web/static/src/js/views/pivot/pivot_model.js
+++ b/addons/web/static/src/js/views/pivot/pivot_model.js
@@ -457,16 +457,23 @@ var PivotModel = AbstractModel.extend({
* @param {any} col_id
* @param {any} measure
* @param {any} descending
+ * @param {'data'|'comparisonData'|'variation'} [dataType]
*/
- sortRows: function (col_id, measure, descending) {
+ sortRows: function (col_id, measure, descending, dataType) {
var cells = this.data.cells;
+ var comparisonFunction = compare;
+ if (this.data.compare) {
+ dataType = dataType || 'data';
+ comparisonFunction = specialCompare;
+ }
this._traverseTree(this.data.main_row.root, function (header) {
- header.children.sort(compare);
+ header.children.sort(comparisonFunction);
});
this.data.sorted_column = {
id: col_id,
measure: measure,
order: descending ? 'desc' : 'asc',
+ dataType: dataType,
};
function _getValue (id1, id2) {
if ((id1 in cells) && (id2 in cells[id1])) {
@@ -476,12 +483,26 @@ var PivotModel = AbstractModel.extend({
}
function compare (row1, row2) {
- var values1 = _getValue(row1.id, col_id),
- values2 = _getValue(row2.id, col_id),
- value1 = values1 ? values1[measure] : 0,
- value2 = values2 ? values2[measure] : 0;
+ var values1 = _getValue(row1.id, col_id);
+ var values2 = _getValue(row2.id, col_id);
+ var value1 = values1 ? values1[measure] : 0;
+ var value2 = values2 ? values2[measure] : 0;
return descending ? value1 - value2 : value2 - value1;
}
+ function specialCompare (row1, row2) {
+ var values1 = _getValue(row1.id, col_id);
+ var values2 = _getValue(row2.id, col_id);
+ var value1 = values1 ? values1[measure] : {data: 0, comparisonData: 0, variation: {magnitude: 0}};
+ var value2 = values2 ? values2[measure] : {data: 0, comparisonData: 0, variation: {magnitude: 0}};
+ if (dataType === 'variation') {
+ return descending ?
+ value1[dataType].magnitude - value2[dataType].magnitude:
+ value2[dataType].magnitude - value1[dataType].magnitude;
+ }
+ return descending ?
+ value1[dataType] - value2[dataType]:
+ value2[dataType] - value1[dataType];
+ }
},
/**
* Toggle the active state for a given measure, then reload the data.
diff --git a/addons/web/static/src/js/views/pivot/pivot_renderer.js b/addons/web/static/src/js/views/pivot/pivot_renderer.js
index a68d91330a9..787e28e38a9 100644
--- a/addons/web/static/src/js/views/pivot/pivot_renderer.js
+++ b/addons/web/static/src/js/views/pivot/pivot_renderer.js
@@ -116,6 +116,8 @@ var PivotRenderer = AbstractRenderer.extend({
_renderHeaders: function ($thead, headers, nbrCols) {
var self = this;
var i, j, cell, $row, $cell;
+ var measure, dataType;
+ var id, measureCellIds = [];
var groupbyLabels = _.map(this.state.colGroupBys, function (gb) {
return self.state.fields[gb.split(':')[0]].string;
@@ -144,10 +146,13 @@ var PivotRenderer = AbstractRenderer.extend({
$cell.data('id', cell.id);
}
if (cell.measure) {
+ measure = cell.measure;
+ measureCellIds.push(cell.id);
$cell.addClass('o_pivot_measure_row text-muted')
- .text(this.state.fields[cell.measure].string);
- $cell.data('id', cell.id).data('measure', cell.measure);
- if (!this.compare && cell.id === this.state.sortedColumn.id && cell.measure === this.state.sortedColumn.measure) {
+ .text(this.state.fields[measure].string);
+ $cell.data('id', cell.id).data('measure', measure);
+ if (cell.id === this.state.sortedColumn.id &&
+ measure === this.state.sortedColumn.measure) {
$cell.addClass('o_pivot_measure_row_sorted_' + this.state.sortedColumn.order);
if (this.state.sortedColumn.order == 'asc') {
$cell.attr('aria-sorted', 'ascending');
@@ -167,12 +172,30 @@ var PivotRenderer = AbstractRenderer.extend({
}
if (this.compare) {
var colLabels = [this.timeRangeDescription, this.comparisonTimeRangeDescription, 'Variation'];
+ var dataTypes = ['data', 'comparisonData', 'variation'];
$row = $('<tr>');
for (i = 0; i < 3 * nbrCols; i++) {
+ id = measureCellIds[~~(i / 3)];
+ measure = this.state.measures[(~~(i / 3)) % this.state.measures.length];
+ dataType = dataTypes[i % 3];
$cell = $('<th>')
+ .addClass('o_pivot_measure_row text-muted')
+ .data('data_type', dataType)
+ .data('id', id)
+ .data('measure', measure)
.text(colLabels[i % 3])
.attr('rowspan', 1)
.attr('colspan', 1);
+ if (dataType === this.state.sortedColumn.dataType &&
+ id === this.state.sortedColumn.id &&
+ measure === this.state.sortedColumn.measure) {
+ $cell.addClass('o_pivot_measure_row_sorted_' + this.state.sortedColumn.order);
+ if (this.state.sortedColumn.order === 'asc') {
+ $cell.attr('aria-sorted', 'ascending');
+ } else {
+ $cell.attr('aria-sorted', 'descending');
+ }
+ }
$row.append($cell);
}
$thead.append($row);
diff --git a/addons/web/static/src/js/views/pivot/pivot_view.js b/addons/web/static/src/js/views/pivot/pivot_view.js
index 38d8d80a9d7..5e05a2fe7e7 100644
--- a/addons/web/static/src/js/views/pivot/pivot_view.js
+++ b/addons/web/static/src/js/views/pivot/pivot_view.js
@@ -70,9 +70,6 @@ var PivotView = AbstractView.extend({
widgets[name] = field.attrs.widget;
}
- if (field.attrs.string) {
- measures[name].string = field.attrs.string;
- }
if (field.attrs.invisible && py.eval(field.attrs.invisible)) {
delete measures[name];
@@ -89,6 +86,11 @@ var PivotView = AbstractView.extend({
if (field.attrs.type === 'measure' && !(field.attrs.name in measures)) {
measures[field.attrs.name] = self.fields[field.attrs.name];
}
+
+ if (field.attrs.string) {
+ measures[name].string = field.attrs.string;
+ }
+
if (field.attrs.type === 'measure' || 'operator' in field.attrs) {
activeMeasures.push(name);
measures[name] = self.fields[name];
diff --git a/addons/web/static/src/js/widgets/attach_document.js b/addons/web/static/src/js/widgets/attach_document.js
index 041b021d60b..13496f3aea7 100644
--- a/addons/web/static/src/js/widgets/attach_document.js
+++ b/addons/web/static/src/js/widgets/attach_document.js
@@ -11,7 +11,7 @@ var _t = core._t;
var AttachDocument = Widget.extend({
template: 'AttachDocument',
events: {
- 'click span.o_attach_document': '_onClickAttachDocument',
+ 'click': '_onClickAttachDocument',
'change input.o_input_file': '_onFileChanged',
},
/**
@@ -76,6 +76,9 @@ var AttachDocument = Widget.extend({
* @param {Event} ev
*/
_onClickAttachDocument: function (ev) {
+ if ($(ev.target).is('input.o_input_file')) {
+ return;
+ }
var fieldNames = this.getParent().canBeSaved(this.state.id);
if (fieldNames.length) {
return this._notifyInvalidFields(fieldNames);
diff --git a/addons/web/static/src/js/widgets/switch_company_menu.js b/addons/web/static/src/js/widgets/switch_company_menu.js
index c9498950a04..cc0f8825643 100644
--- a/addons/web/static/src/js/widgets/switch_company_menu.js
+++ b/addons/web/static/src/js/widgets/switch_company_menu.js
@@ -53,7 +53,7 @@ var SwitchCompanyMenu = Widget.extend({
} else {
a = '<span style="margin-right: 24px;"/>';
}
- companiesList += '<a href="#" class="dropdown-item" data-menu="company" data-company-id="' +
+ companiesList += '<a role="menuitem" href="#" class="dropdown-item" data-menu="company" data-company-id="' +
company[0] + '">' + a + company[1] + '</a>';
});
this.$('.dropdown-menu').html(companiesList);
diff --git a/addons/web/static/src/scss/bootstrap_overridden.scss b/addons/web/static/src/scss/bootstrap_overridden.scss
index edff888acbf..b81146a811f 100644
--- a/addons/web/static/src/scss/bootstrap_overridden.scss
+++ b/addons/web/static/src/scss/bootstrap_overridden.scss
@@ -126,8 +126,8 @@ $badge-font-weight: normal !default;
// Padding applied to the modal body
$modal-inner-padding: $o-horizontal-padding !default;
-$modal-lg: 980px !default;
-$modal-md: 650px !default;
+$modal-lg: $o-modal-lg !default;
+$modal-md: $o-modal-md !default;
// Breadcrumbs
diff --git a/addons/web/static/src/scss/kanban_view_mobile.scss b/addons/web/static/src/scss/kanban_view_mobile.scss
index b74ae8aaea5..1c5a9eab531 100644
--- a/addons/web/static/src/scss/kanban_view_mobile.scss
+++ b/addons/web/static/src/scss/kanban_view_mobile.scss
@@ -36,6 +36,9 @@
margin-left: 0; // override the margin-left: -1px of the desktop mode
border: none;
+ &.o_current {
+ position: initial;
+ }
.o_kanban_header {
display: none;
}
diff --git a/addons/web/static/src/scss/layout_background.scss b/addons/web/static/src/scss/layout_background.scss
index ff2d0cef3b0..9c47ac72a27 100644
--- a/addons/web/static/src/scss/layout_background.scss
+++ b/addons/web/static/src/scss/layout_background.scss
@@ -34,34 +34,48 @@
background-position: bottom center;
background-repeat: no-repeat;
min-height: 620px;
+
+ .table {
+ border-top: 1px solid gray('300');
+ }
+
+ .table td, .table th {
+ border-top: none;
+ }
thead tr th, h2 {
color: $o-brand-odoo;
}
tbody {
color: gray('700');
- tr:nth-child(odd) {
- background-color: rgba(220, 205, 216, 0.2);
- }
- tr td {
- border-top: none;
+ tr {
+ &:nth-child(odd) {
+ background-color: rgba(220, 205, 216, 0.2);
+ }
+ &.o_line_section {
+ color: $o-brand-odoo;
+ background-color: rgba(73, 80, 87, 0.2) !important;
+ }
}
}
/*Total table*/
- .row > .col-4 > table {
- tr:nth-child(odd) {
- background-color: transparent !important;
- }
- tr:first-child td {
- /*we could get rid of this rule if .border-black td would be terminated in report.scss*/
- border-top: none !important;
- }
- tr:last-child td {
- color: $o-brand-odoo;
- }
- }
- #total {
- table tr:last-child td {
- border-bottom: 1px solid black;
+ /* row div rule compat 12.0 */
+ .row > div > table,
+ div#total table {
+ tr {
+ &:nth-child(odd) {
+ background-color: transparent !important;
+ }
+ /* first-child & last-child rule compat 12.0 */
+ &:first-child,
+ &:last-child,
+ &.o_subtotal,
+ &.o_total {
+ border-top: none !important;
+ td {
+ color: $o-brand-odoo;
+ border-top: 1px solid gray('400') !important;
+ }
+ }
}
}
}
diff --git a/addons/web/static/src/scss/layout_boxed.scss b/addons/web/static/src/scss/layout_boxed.scss
index b0b2fb1f743..bf19b6fb7ae 100644
--- a/addons/web/static/src/scss/layout_boxed.scss
+++ b/addons/web/static/src/scss/layout_boxed.scss
@@ -23,52 +23,73 @@
}
}
.o_report_layout_boxed {
- // This is not a general rule since the id is not used in all the reports,
- // we should make a general structure for report body to use it everywhere
- #informations {
- border: 1px solid gray('700');
- padding-top: 10px;
- margin: 0;
- }
> h2 {
text-transform: uppercase;
}
table {
border: 1px solid gray('700');
thead {
+ border-bottom: 2px solid gray('700');
tr th {
- border-bottom: 3px solid gray('700') !important;
text-transform: uppercase;
+ border: 1px solid gray('700');
}
}
tbody {
color: gray('700');
tr {
td {
+ // remove border-top from standard layout
border-top: none;
border-right: 1px solid gray('700');
}
- td:last-child {
+ &.o_line_section td,
+ &.o_line_note td,
+ &.is-subtotal td {
+ border-top: 1px solid gray('700');
+ border-bottom: 1px solid gray('700');
+ }
+ &.o_line_section td {
+ background-color: gray('700');
+ color: #fff;
+ }
+ &.is-subtotal,
+ td.o_price_total {
background-color: gray('200');
}
}
}
}
+ /* compat 12.0 */
+ .page > table:not(.o_main_table) tr td:last-child {
+ background-color: gray('200');
+ }
+ /* compat 12.0 */
+ .row:not(#total) > div > table tr:not(:first-child):not(:last-child) td:last-child {
+ background-color: gray('200');
+ }
/*Total table*/
- .row > .col-4 > table {
- td {
- border-right: none;
- }
- tr:last-child td, tr:first-child td {
- /*we could get rid of this rule if .border-black td would be terminated in report.scss*/
- border-top: none !important;
- }
- tr:first-child td {
- background-color: transparent;
- }
- tr:last-child td {
- background-color: gray('700');
- color: #fff;
+ /* row div rule compat 12.0 */
+ .row > div > table,
+ div#total table {
+ tr {
+ &:first-child,
+ &.o_subtotal {
+ border-bottom: 1px solid gray('700');
+
+ td:first-child {
+ border-right: none;
+ }
+ }
+ &:last-child td,
+ &.o_total td {
+ background-color: gray('700');
+ color: #fff;
+
+ &:first-child {
+ border-right: none;
+ }
+ }
}
}
}
diff --git a/addons/web/static/src/scss/layout_clean.scss b/addons/web/static/src/scss/layout_clean.scss
index 06b2e808dd4..910abc763a4 100644
--- a/addons/web/static/src/scss/layout_clean.scss
+++ b/addons/web/static/src/scss/layout_clean.scss
@@ -18,12 +18,10 @@
font-weight: bolder;
}
.pagenumber {
- width: 35px;
- height: 35px;
border: 3px solid $o-brand-odoo;
background-color: $o-brand-primary;
color: white;
- padding-top: 6px;
+ padding: 4px 8px;
text-align: center;
}
}
@@ -36,6 +34,10 @@
color: $o-brand-odoo;
}
table {
+ &.o_main_table {
+ margin-bottom: 0;
+ }
+
thead {
color: $o-brand-odoo;
tr th {
@@ -66,18 +68,22 @@
}
}
/*Total table*/
- .row > .col-4 {
- width: 43%;
- position: relative;
- top: -20px;
- > table {
- tr:last-child td {
- border-top: 1px solid gray('200') !important;
- }
- tr:first-child td {
- /*we could get rid of this rule if .border-black td would be terminated in report.scss*/
+ /* compat 12.0 */
+ .row:not(#total) > div:has(table) {
+ top: -16px;
+ }
+ /* row col rule compat 12.0 */
+ .row > div > table,
+ div#total table {
+ tr {
+ &:first-child td,
+ &.o_subtotal {
border-top: none !important;
}
+ &:last-child td,
+ &.o_total {
+ border-top: 1px solid gray('200') !important;
+ }
}
}
}
diff --git a/addons/web/static/src/scss/primary_variables.scss b/addons/web/static/src/scss/primary_variables.scss
index 45d1b7ac807..2bdc03a132b 100644
--- a/addons/web/static/src/scss/primary_variables.scss
+++ b/addons/web/static/src/scss/primary_variables.scss
@@ -65,6 +65,9 @@ $o-sheet-vpadding: 24px;
$o-notification-error-bg-color: #F16567;
$o-notification-info-bg-color: #FCFBEA;
+$o-modal-lg: 980px;
+$o-modal-md: 650px;
+
// Needed for having no spacing between sheet and mail body in mass_mailing:
// Different required cancel paddings between web and web_enterprise
$o-sheet-cancel-tpadding: 0px;
diff --git a/addons/web/static/src/scss/report.scss b/addons/web/static/src/scss/report.scss
index 37a7630225b..e901b5b9364 100644
--- a/addons/web/static/src/scss/report.scss
+++ b/addons/web/static/src/scss/report.scss
@@ -44,3 +44,18 @@ body {
.o_underline {
text-decoration: underline;
}
+
+/*Total table*/
+div#total {
+ page-break-inside: avoid;
+ table {
+ tr {
+ &.o_subtotal,
+ &.o_total {
+ td {
+ border-top: 1px solid black !important;
+ }
+ }
+ }
+ }
+}
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 102e70efa1e..55d744d3a60 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -235,7 +235,7 @@
<t t-name="WebClient.DebugManager">
<li class="o_debug_manager" role="menuitem">
- <a href="#" title="Open Developer Tools" aria-label="Open Developer Tools" data-toggle="dropdown" aria-expanded="false" tabindex="-1" data-display="static">
+ <a role="button" href="#" title="Open Developer Tools" aria-label="Open Developer Tools" data-toggle="dropdown" aria-expanded="false" tabindex="-1" data-display="static">
<span class="fa fa-bug"/>
</a>
<div class="dropdown-menu dropdown-menu-right o_debug_dropdown" role="menu"/>
@@ -853,7 +853,7 @@
<span class="o_badge_text" t-att-title="el.display_name"><span role="img" t-attf-aria-label="Tag color: #{colornames[color]}"/><t t-esc="el.display_name"/></span>
</t>
<t t-if="colorField">
- <a href="#" class="dropdown-toggle o-no-caret" data-toggle="dropdown">
+ <a role="button" href="#" class="dropdown-toggle o-no-caret" data-toggle="dropdown" aria-expanded="false">
<t t-raw="_badge_text"/>
</a>
</t>
@@ -1080,10 +1080,10 @@
<t t-if="widget.items.length !== 0">
<t t-set="group" t-value="0"/>
<t t-foreach="widget.items" t-as="item">
- <div t-if="group !== item.groupNumber" class="dropdown-divider" data-removable="1"/>
+ <div t-if="group !== item.groupNumber" role="separator" class="dropdown-divider" data-removable="1"/>
<div class="o_menu_item"
t-att-data-id="item.id">
- <a href="#" t-attf-class="dropdown-item#{item.isActive ? ' selected ' : ''}">
+ <a role="menuitem" href="#" t-attf-class="dropdown-item#{item.isActive ? ' selected ' : ''}">
<t t-esc="item.description"/>
<span t-if="item.isRemovable" t-att-data-id="item.id" class="o_trash_button" > <span class="fa fa-trash-o"></span> </span>
<span t-if="item.hasOptions" t-att-data-id="item.id" class="o_submenu_switcher">
@@ -1093,10 +1093,10 @@
<ul t-if="item.hasOptions &amp;&amp; widget.openItems[item.id]" class="list-unstyled">
<t t-set="subgroup" t-value="0"/>
<t t-foreach="item.options" t-as="option">
- <li t-if="subgroup !== option.groupNumber" class="dropdown-divider" data-removable="1"/>
+ <li t-if="subgroup !== option.groupNumber" role="separator" class="dropdown-divider" data-removable="1"/>
<li class="o_item_option"
t-att-data-item_id="item.id" t-att-data-option_id="option.optionId">
- <a href="#" t-attf-class="dropdown-item#{item.currentOptionId === option.optionId ? ' selected': ''} pl-5"><t t-esc="option.description"/></a>
+ <a role="menuitem" href="#" t-attf-class="dropdown-item#{item.currentOptionId === option.optionId ? ' selected': ''} pl-5"><t t-esc="option.description"/></a>
</li>
<t t-set="subgroup" t-value="option.groupNumber"/>
</t>
@@ -1117,8 +1117,8 @@
</div>
<t t-name="GroupByMenuGenerator">
- <div t-if="widget.presentedFields.length !== 0 &amp;&amp; widget.items.length !== 0" class="dropdown-divider o_generator_menu"/>
- <button t-if="widget.presentedFields.length !== 0" type="button" class="dropdown-item o_generator_menu o_add_custom_group">Add Custom Group</button>
+ <div t-if="widget.presentedFields.length !== 0 &amp;&amp; widget.items.length !== 0" role="separator" class="dropdown-divider o_generator_menu"/>
+ <button t-if="widget.presentedFields.length !== 0" type="button" class="dropdown-item o_generator_menu o_add_custom_group" aria-expanded="false">Add Custom Group</button>
<div t-if="widget.generatorMenuIsOpen" class="dropdown-item-text o_generator_menu">
<select class="w-auto o_input o_group_selector o_add_group">
<t t-foreach="widget.presentedFields" t-as="field">
@@ -1132,8 +1132,8 @@
</t>
<t t-name="FilterMenuGenerator">
- <div t-if="Object.keys(widget.fields).length !== 0 &amp;&amp; widget.items.length !== 0" class="dropdown-divider o_generator_menu"/>
- <button t-if="Object.keys(widget.fields).length !== 0" type="button" class="dropdown-item o_generator_menu o_add_custom_filter">Add Custom Filter</button>
+ <div t-if="Object.keys(widget.fields).length !== 0 &amp;&amp; widget.items.length !== 0" role="separator" class="dropdown-divider o_generator_menu"/>
+ <button t-if="Object.keys(widget.fields).length !== 0" type="button" class="dropdown-item o_generator_menu o_add_custom_filter" aria-expanded="false">Add Custom Filter</button>
<div t-if="widget.generatorMenuIsOpen" class="dropdown-item-text o_generator_menu o_add_filter_menu">
<button class="btn btn-primary o_apply_filter" type="button">Apply</button>
<button class="btn btn-secondary o_add_condition" type="button">
@@ -1335,7 +1335,7 @@
<label for="o_favorite_share_all_users" class="custom-control-label">Share with all users <span class="fa fa-users" role="img" aria-label="Users" title="Users"/></label>
</div>
<div class="dropdown-item-text o_save_favorite">
- <button role="menuitem" type="button" class="btn btn-primary">Save</button>
+ <button type="button" class="btn btn-primary">Save</button>
</div>
</div>
</div>
@@ -1495,7 +1495,7 @@
<t t-name="UserMenu">
<li class="o_user_menu">
- <a class="dropdown-toggle" data-toggle="dropdown" data-display="static" aria-expanded="false" href="#">
+ <a role="button" class="dropdown-toggle" data-toggle="dropdown" data-display="static" aria-expanded="false" href="#">
<img class="rounded-circle oe_topbar_avatar" t-att-src="_s + '/web/static/src/img/user_menu_avatar.png'" alt="Avatar"/>
<span class="oe_topbar_name"/>
</a>
@@ -1516,7 +1516,7 @@
<t t-name="SwitchCompanyMenu">
<li class="o_switch_company_menu">
- <a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#" aria-label="Dropdown menu" title="Dropdown menu">
+ <a role="button" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#" aria-label="Dropdown menu" title="Dropdown menu">
<span t-attf-class="#{widget.isMobile ? 'fa fa-building-o' : 'oe_topbar_name'}"/>
</a>
<div class="dropdown-menu dropdown-menu-right" role="menu"/>
diff --git a/addons/web/static/src/xml/kanban.xml b/addons/web/static/src/xml/kanban.xml
index b91b8844752..220395fef02 100644
--- a/addons/web/static/src/xml/kanban.xml
+++ b/addons/web/static/src/xml/kanban.xml
@@ -24,8 +24,8 @@
<a t-if="widget.deletable and widget.id" role="menuitem" class="dropdown-item o_column_delete" href="#">Delete</a>
</t>
<t t-if="widget.has_active_field and widget.archivable">
- <a href="#" class="dropdown-item o_column_archive_records">Archive All</a>
- <a href="#" class="dropdown-item o_column_unarchive_records">Unarchive All</a>
+ <a role="menuitem" href="#" class="dropdown-item o_column_archive_records">Archive All</a>
+ <a role="menuitem" href="#" class="dropdown-item o_column_unarchive_records">Unarchive All</a>
</t>
</div>
</span>
diff --git a/addons/web/static/src/xml/menu.xml b/addons/web/static/src/xml/menu.xml
index 4cf905674d7..3838cc6c226 100644
--- a/addons/web/static/src/xml/menu.xml
+++ b/addons/web/static/src/xml/menu.xml
@@ -97,7 +97,7 @@
<t t-extend="UserMenu.Actions">
<t t-jquery=".dropdown-divider" t-operation="before">
- <a href="#" data-menu="shortcuts" class="dropdown-item d-none d-md-inline-block">Shortcuts</a>
+ <a role="menuitem" href="#" data-menu="shortcuts" class="dropdown-item d-none d-md-inline-block">Shortcuts</a>
</t>
</t>
diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js
index e1b14b4d363..990c166a419 100644
--- a/addons/web/static/tests/chrome/action_manager_tests.js
+++ b/addons/web/static/tests/chrome/action_manager_tests.js
@@ -735,6 +735,37 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test('properly load default record', function (assert) {
+ assert.expect(5);
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ assert.step(args.method || route);
+ return this._super.apply(this, arguments);
+ },
+ });
+ actionManager.loadState({
+ action: 3,
+ id: "", // might happen with bbq and id=& in URL
+ model: 'partner',
+ view_type: 'form',
+ });
+
+ assert.containsOnce(actionManager, '.o_form_view',
+ "should have rendered a form view");
+
+ assert.verifySteps([
+ '/web/action/load',
+ 'load_views',
+ 'default_get',
+ ]);
+
+ actionManager.destroy();
+ });
+
QUnit.test('load requested view for act window actions', function (assert) {
assert.expect(6);
@@ -2095,6 +2126,39 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test('sidebar is present in list view', function (assert) {
+ assert.expect(5);
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ var res = this._super.apply(this, arguments);
+ if (args.method === 'load_views') {
+ assert.strictEqual(args.kwargs.options.toolbar, true,
+ "should ask for toolbar information");
+ return res.then(function (fieldsViews) {
+ fieldsViews.list.toolbar = {
+ print: [{name: "Print that record"}],
+ };
+ return fieldsViews;
+ });
+ }
+ return res;
+ },
+ });
+ actionManager.doAction(3);
+
+ assert.isNotVisible(actionManager.$('.o_cp_sidebar button.o_dropdown_toggler_btn:contains("Print")'));
+ assert.isNotVisible(actionManager.$('.o_cp_sidebar button.o_dropdown_toggler_btn:contains("Action")'));
+ testUtils.dom.clickFirst(actionManager.$('input.custom-control-input'));
+ assert.isVisible(actionManager.$('.o_cp_sidebar button.o_dropdown_toggler_btn:contains("Print")'));
+ assert.isVisible(actionManager.$('.o_cp_sidebar button.o_dropdown_toggler_btn:contains("Action")'));
+
+ actionManager.destroy();
+ });
+
QUnit.test('can switch between views', function (assert) {
assert.expect(18);
@@ -2155,6 +2219,62 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test('orderedBy in context is not propagated when executing another action', function (assert) {
+ assert.expect(6);
+
+ this.data.partner.fields.foo.sortable = true,
+
+ this.archs['partner,false,form'] = '<header>' +
+ '<button name="8" string="Execute action" type="action"/>' +
+ '</header>';
+
+ var searchReadCount = 1;
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/search_read') {
+ if (searchReadCount === 1) {
+ assert.strictEqual(args.model, 'partner');
+ assert.notOk(args.sort);
+ }
+ if (searchReadCount === 2) {
+ assert.strictEqual(args.model, 'partner');
+ assert.strictEqual(args.sort, "foo ASC");
+ }
+ if (searchReadCount === 3) {
+ assert.strictEqual(args.model, 'pony');
+ assert.notOk(args.sort);
+ }
+ searchReadCount += 1;
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+ actionManager.doAction(3);
+
+ // Simulate the activation of a filter
+ var searchData = {
+ domains: [[["foo", "=", "yop"]]],
+ contexts: [{
+ orderedBy: [],
+ }],
+ };
+ actionManager.trigger_up('search', searchData);
+
+ // Sort records
+ actionManager.$('.o_list_view th.o_column_sortable').click();
+
+ // get to the form view of the model, on the first record
+ actionManager.$('.o_data_cell:first').click();
+
+ // Change model by clicking on the button within the form
+ actionManager.$('.o_form_view button').click();
+
+ actionManager.destroy();
+ });
+
QUnit.test('breadcrumbs are updated when switching between views', function (assert) {
assert.expect(10);
@@ -3314,6 +3434,79 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
+ QUnit.test('fullscreen on action change: back to a "current" action', function (assert) {
+ assert.expect(3);
+
+ this.actions[0].target = 'fullscreen';
+ this.archs['partner,false,form'] = '<form>' +
+ '<button name="1" type="action" class="oe_stat_button" />' +
+ '</form>';
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ intercepts: {
+ toggle_fullscreen: function (ev) {
+ var fullscreen = ev.data.fullscreen;
+
+ switch (toggleFullscreenCalls) {
+ case 0:
+ assert.strictEqual(fullscreen, false);
+ break;
+ case 1:
+ assert.strictEqual(fullscreen, true);
+ break;
+ case 2:
+ assert.strictEqual(fullscreen, false);
+ break;
+ }
+ },
+ },
+
+ });
+
+ var toggleFullscreenCalls = 0;
+ actionManager.doAction(6);
+
+ toggleFullscreenCalls = 1;
+ actionManager.$('button[name=1]').click();
+
+ toggleFullscreenCalls = 2;
+ $('.breadcrumb li a:first').click();
+
+ actionManager.destroy();
+ });
+
+ QUnit.test('fullscreen on action change: all "fullscreen" actions', function (assert) {
+ assert.expect(3);
+
+ this.actions[5].target = 'fullscreen';
+ this.archs['partner,false,form'] = '<form>' +
+ '<button name="1" type="action" class="oe_stat_button" />' +
+ '</form>';
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ intercepts: {
+ toggle_fullscreen: function (ev) {
+ var fullscreen = ev.data.fullscreen;
+ assert.strictEqual(fullscreen, true);
+ },
+ },
+ });
+
+ actionManager.doAction(6);
+
+ actionManager.$('button[name=1]').click();
+
+ $('.breadcrumb li a:first').click();
+
+ actionManager.destroy();
+ });
+
QUnit.module('"ir.actions.act_window_close" actions');
QUnit.test('close the currently opened dialog', function (assert) {
diff --git a/addons/web/static/tests/core/py_utils_tests.js b/addons/web/static/tests/core/py_utils_tests.js
index d59fd30f957..be5760fc6c7 100644
--- a/addons/web/static/tests/core/py_utils_tests.js
+++ b/addons/web/static/tests/core/py_utils_tests.js
@@ -1254,6 +1254,13 @@ QUnit.module('core', function () {
assert.checkAST(expr);
});
+ QUnit.test("parse escaped quoted strings", function (assert) {
+ assert.expect(2);
+
+ assert.checkAST(`'\"'`, "a string containing \"");
+ assert.checkAST(`'\'`, "a string containing \'");
+ });
+
QUnit.module('pyutils (_normalizeDomain)');
QUnit.assert.checkNormalization = function (domain, normalizedDomain) {
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 6c3493828ad..15999ca952e 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -228,6 +228,90 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('widget many2many_checkboxes in a subview', function (assert) {
+ assert.expect(2);
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch:'<form string="Partners">' +
+ '<sheet>' +
+ '<notebook>' +
+ '<page string="Turtles">' +
+ '<field name="turtles" mode="tree">' +
+ '<tree>' +
+ '<field name="id"/>' +
+ '</tree>' +
+ '</field>' +
+ '</page>' +
+ '</notebook>' +
+ '</sheet>' +
+ '</form>',
+ archs: {
+ 'turtle,false,form': '<form>' +
+ '<field name="partner_ids" widget="many2many_checkboxes"/>' +
+ '</form>',
+ },
+ res_id: 1,
+ });
+
+ form.$buttons.find('.o_form_button_edit').click();
+ form.$('.o_data_cell').click();
+ // edit the partner_ids field by (un)checking boxes on the widget
+ var $firstCheckbox = $('.modal .custom-control-input').first();
+ $firstCheckbox.click();
+ assert.ok($firstCheckbox.prop('checked'), "the checkbox should be ticked");
+ var $secondCheckbox = $('.modal .custom-control-input').eq(1);
+ $secondCheckbox.click();
+ assert.notOk($secondCheckbox.prop('checked'), "the checkbox should be unticked");
+ form.destroy();
+ });
+
+ QUnit.test('delete a record while adding another one in a multipage', function (assert) {
+ // in a many2one with at least 2 pages, add a new line. Delete the line above it.
+ // (the onchange makes it so that the virtualID is inserted in the middle of the currentResIDs.)
+ // it should load the next line to display it on the page.
+ assert.expect(2);
+
+ this.data.partner.records[0].turtles = [2, 3];
+ this.data.partner.onchanges.turtles = function (obj) {
+ obj.turtles = [[5]].concat(obj.turtles);
+ };
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch:'<form string="Partners">' +
+ '<sheet>' +
+ '<group>' +
+ '<field name="turtles">' +
+ '<tree editable="bottom" limit="1" decoration-muted="turtle_bar == False">' +
+ '<field name="turtle_foo"/>' +
+ '<field name="turtle_bar"/>' +
+ '</tree>' +
+ '</field>' +
+ '</group>' +
+ '</sheet>' +
+ '</form>',
+ res_id: 1,
+ });
+
+ form.$buttons.find('.o_form_button_edit').click();
+ // add a line (virtual record)
+ form.$('.o_field_x2many_list_row_add a').click();
+ form.$('.o_input').val('pi').trigger('input');
+ // delete the line above it
+ form.$('.o_list_record_remove').first().click();
+ // the next line should be displayed below the newly added one
+ assert.strictEqual(form.$('.o_data_row').length, 2, "should have 2 records");
+ assert.strictEqual(form.$('.o_data_row .o_data_cell:first-child').text(), 'pikawa',
+ "should display the correct records on page 1");
+
+ form.destroy();
+ });
+
QUnit.test('one2many, onchange, edition and multipage...', function (assert) {
assert.expect(7);
@@ -252,7 +336,7 @@ QUnit.module('relational_fields', {
'</form>',
res_id: 1,
mockRPC: function (route, args) {
- assert.step(args.method + ' ' + args.model)
+ assert.step(args.method + ' ' + args.model);
return this._super(route, args);
},
viewOptions: {
@@ -362,6 +446,39 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('many2many read, field context is properly sent', function (assert) {
+ assert.expect(4);
+
+ this.data.partner.fields.timmy.context = {hello: 'world'};
+ this.data.partner.records[0].timmy = [12];
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="timmy" widget="many2many_tags"/>' +
+ '</form>',
+ res_id: 1,
+ mockRPC: function (route, args) {
+ if (args.method === 'read' && args.model === 'partner_type') {
+ assert.step(args.kwargs.context.hello);
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.verifySteps(['world']);
+
+ form.$buttons.find('.o_form_button_edit').click();
+ var $m2mInput = form.$('.o_field_many2manytags input');
+ $m2mInput.click();
+ $m2mInput.autocomplete('widget').find('li:first()').click();
+ assert.verifySteps(['world', 'world']);
+
+ form.destroy();
+ });
+
QUnit.module('FieldStatus');
QUnit.test('static statusbar widget on many2one field', function (assert) {
@@ -1323,6 +1440,53 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('widget many2many_tags in one2many with display_name', function (assert) {
+ assert.expect(4);
+ this.data.turtle.records[0].partner_ids = [2];
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<sheet>' +
+ '<field name="turtles">' +
+ '<tree>' +
+ '<field name="partner_ids" widget="many2many_tags"/>' + // will use display_name
+ '</tree>' +
+ '<form>' +
+ '<sheet>' +
+ '<field name="partner_ids"/>' +
+ '</sheet>' +
+ '</form>' +
+ '</field>' +
+ '</sheet>' +
+ '</form>',
+ archs: {
+ 'partner,false,list': '<tree><field name="foo"/></tree>',
+ },
+ res_id: 1,
+ });
+
+ assert.strictEqual(form.$('.o_field_one2many[name="turtles"] .o_list_view .o_field_many2manytags[name="partner_ids"]').text().replace(/\s/g, ''),
+ "secondrecordaaa", "the tags should be correctly rendered");
+
+ // open the x2m form view
+ form.$('.o_field_one2many[name="turtles"] .o_list_view td.o_data_cell:first').click();
+ assert.strictEqual($('.modal .o_form_view .o_field_many2many[name="partner_ids"] .o_list_view .o_data_cell').text(),
+ "blipMy little Foo Value", "the list view should be correctly rendered with foo");
+
+ $('.modal button.o_form_button_cancel').click();
+ assert.strictEqual(form.$('.o_field_one2many[name="turtles"] .o_list_view .o_field_many2manytags[name="partner_ids"]').text().replace(/\s/g, ''),
+ "secondrecordaaa", "the tags should still be correctly rendered");
+
+ form.$buttons.find('.o_form_button_edit').click();
+ assert.strictEqual(form.$('.o_field_one2many[name="turtles"] .o_list_view .o_field_many2manytags[name="partner_ids"]').text().replace(/\s/g, ''),
+ "secondrecordaaa", "the tags should still be correctly rendered");
+
+ form.destroy();
+ });
+
QUnit.test('widget many2many_tags: tags title attribute', function (assert) {
assert.expect(1);
this.data.turtle.records[0].partner_ids = [2];
diff --git a/addons/web/static/tests/helpers/test_utils_create.js b/addons/web/static/tests/helpers/test_utils_create.js
index 0adb13d466f..5a64512260e 100644
--- a/addons/web/static/tests/helpers/test_utils_create.js
+++ b/addons/web/static/tests/helpers/test_utils_create.js
@@ -135,6 +135,7 @@ function createAsyncView(params) {
currentId: 'res_id' in params ? params.res_id : undefined,
domain: params.domain || [],
context: params.context || {},
+ hasSidebar: false,
});
// patch the View to handle the groupBy given in params, as we can't give it
// in init (unlike the domain and context which can be set in the action)
diff --git a/addons/web/static/tests/helpers/test_utils_dom.js b/addons/web/static/tests/helpers/test_utils_dom.js
index b89f5a8eb5f..dcf9eab6e15 100644
--- a/addons/web/static/tests/helpers/test_utils_dom.js
+++ b/addons/web/static/tests/helpers/test_utils_dom.js
@@ -17,6 +17,10 @@ odoo.define('web.test_utils_dom', function () {
* events, but it is enough to help test drag and drop operations with jqueryUI
* sortable.
*
+ * @todo: remove the withTrailingClick option when the jquery update branch is
+ * merged. This is not the default as of now, because handlers are triggered
+ * synchronously, which is not the same as the 'reality'.
+ *
* @param {jqueryElement} $el
* @param {jqueryElement} $to
* @param {Object} [options]
@@ -27,9 +31,13 @@ odoo.define('web.test_utils_dom', function () {
* @param {boolean} [options.continueMove=false] whether to trigger the
* mousedown action (will only work after another call of this function with
* without this option)
+ * @param {boolean} [options.withTrailingClick=false] if true, this utility
+ * function will also trigger a click on the target after the mouseup event
+ * (this is actually what happens when a drag and drop operation is done)
*/
function dragAndDrop($el, $to, options) {
- var position = (options && options.position) || 'center';
+ options = options || {};
+ var position = options.position || 'center';
var elementCenter = $el.offset();
var toOffset = $to.offset();
@@ -58,7 +66,7 @@ function dragAndDrop($el, $to, options) {
toOffset.top += bound.top;
}
$el.trigger($.Event("mouseenter"));
- if (!(options && options.continueMove)) {
+ if (!(options.continueMove)) {
elementCenter.left += $el.outerWidth() / 2;
elementCenter.top += $el.outerHeight() / 2;
@@ -75,12 +83,15 @@ function dragAndDrop($el, $to, options) {
pageY: toOffset.top
}));
- if (!(options && options.disableDrop)) {
+ if (!options.disableDrop) {
$el.trigger($.Event("mouseup", {
which: 1,
pageX: toOffset.left,
pageY: toOffset.top
}));
+ if (options.withTrailingClick) {
+ $el.click();
+ }
} else {
// It's impossible to drag another element when one is already
// being dragged. So it's necessary to finish the drop when the test is
diff --git a/addons/web/static/tests/tools/debug_manager_tests.js b/addons/web/static/tests/tools/debug_manager_tests.js
index fde90105bfb..fb454aae0d1 100644
--- a/addons/web/static/tests/tools/debug_manager_tests.js
+++ b/addons/web/static/tests/tools/debug_manager_tests.js
@@ -46,6 +46,10 @@ QUnit.module('DebugManager', {}, function () {
intercepts: {
do_action: function (event) {
assert.deepEqual(event.data.action, {
+ context: {
+ default_res_model: "test.model",
+ default_res_id: 5,
+ },
domain: [["res_model", "=", "test.model"],["res_id", "=", 5]],
name: "Manage Attachments",
res_model: "ir.attachment",
diff --git a/addons/web/static/tests/views/calendar_tests.js b/addons/web/static/tests/views/calendar_tests.js
index 3f4c6376d5b..264a00cc52a 100644
--- a/addons/web/static/tests/views/calendar_tests.js
+++ b/addons/web/static/tests/views/calendar_tests.js
@@ -557,6 +557,98 @@ QUnit.module('Views', {
$view.remove();
});
+ QUnit.test('default week start (US)', function (assert) {
+ // if not given any option, default week start is on Sunday
+ assert.expect(1);
+ var done = assert.async();
+
+ createAsyncView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch:
+ '<calendar class="o_calendar_test" '+
+ 'date_start="start" '+
+ 'date_stop="stop" '+
+ 'mode="week">'+
+ '</calendar>',
+ archs: archs,
+
+ viewOptions: {
+ initialDate: initialDate,
+ },
+ }).then(function (calendar) {
+ assert.strictEqual(calendar.$('.fc-day-header').first().text(), "Sun 12/11",
+ "The first day of the week should be Sunday");
+ calendar.destroy();
+ done();
+ });
+ });
+
+ QUnit.test('European week start', function (assert) {
+ // the week start depends on the locale
+ assert.expect(1);
+ var done = assert.async();
+
+ createAsyncView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch:
+ '<calendar class="o_calendar_test" '+
+ 'date_start="start" '+
+ 'date_stop="stop" '+
+ 'mode="week">'+
+ '</calendar>',
+ archs: archs,
+
+ viewOptions: {
+ initialDate: initialDate,
+ },
+ translateParameters: {
+ week_start: 1,
+ },
+ }).then(function (calendar) {
+ assert.strictEqual(calendar.$('.fc-day-header').first().text(), "Mon 12/12",
+ "The first day of the week should be Monday");
+ calendar.destroy();
+ done();
+ });
+ });
+
+ QUnit.test('week numbering', function (assert) {
+ // week number depends on the week start, which depends on the locale
+ // the calendar library uses numbers [0 .. 6], while Odoo uses [1 .. 7]
+ // so if the modulo is not done, the week number is incorrect
+ assert.expect(1);
+ var done = assert.async();
+
+ createAsyncView({
+ View: CalendarView,
+ model: 'event',
+ data: this.data,
+ arch:
+ '<calendar class="o_calendar_test" '+
+ 'date_start="start" '+
+ 'date_stop="stop" '+
+ 'mode="week">'+
+ '</calendar>',
+ archs: archs,
+
+ viewOptions: {
+ initialDate: initialDate,
+ },
+ translateParameters: {
+ week_start: 7,
+ },
+ }).then(function (calendar) {
+ assert.strictEqual(calendar.$('.fc-week-number').text(), "W51",
+ "We should be on the 51st week");
+ calendar.destroy();
+ done();
+ });
+ });
+
QUnit.test('create event with timezone in week mode with formViewDialog European locale', function (assert) {
assert.expect(8);
diff --git a/addons/web/static/tests/views/control_panel_tests.js b/addons/web/static/tests/views/control_panel_tests.js
index 08cc1391719..ee191e4d3a9 100644
--- a/addons/web/static/tests/views/control_panel_tests.js
+++ b/addons/web/static/tests/views/control_panel_tests.js
@@ -120,6 +120,7 @@ QUnit.module('Views', {
assert.deepEqual(
controlPanelFactory.loadParams.groups,
[[{
+ context: {},
description: "Hello",
groupNumber: 2,
domain: "[]",
@@ -198,6 +199,7 @@ QUnit.module('Views', {
controlPanelFactory.loadParams.groups,
[[
{
+ "context": {},
"description": "Hello One",
"domain": "[]",
"groupNumber": 2,
@@ -205,6 +207,7 @@ QUnit.module('Views', {
"type": "filter"
},
{
+ "context": {},
"description": "Hello Two",
"domain": "[('bar', '=', 3)]",
"groupNumber": 2,
@@ -233,6 +236,7 @@ QUnit.module('Views', {
[
[
{
+ context: {},
description: "Hello One",
domain: "[]",
groupNumber: 2,
@@ -242,6 +246,7 @@ QUnit.module('Views', {
],
[
{
+ context: {},
description: "Hello Two",
domain: "[('bar', '=', 3)]",
groupNumber: 4,
@@ -267,6 +272,7 @@ QUnit.module('Views', {
[
[
{
+ context: {},
description: "Hello",
domain: "[]",
groupNumber: 2,
@@ -353,5 +359,61 @@ QUnit.module('Views', {
controlPanel.destroy();
});
+
+ QUnit.module('Control Panel behaviour');
+
+ QUnit.test('remove a facet with backspace', async function (assert) {
+ assert.expect(2);
+
+ var controlPanel = await createControlPanel({
+ model: 'partner',
+ arch: "<search><filter name=\"filterA\" string=\"A\" domain=\"[]\"/></search>",
+ data: this.data,
+ searchMenuTypes: ['filter'],
+ });
+ testUtils.dom.click(controlPanel.$('.o_filters_menu_button'));
+ testUtils.dom.click($('.o_menu_item a'));
+ assert.strictEqual($('.o_searchview .o_searchview_facet .o_facet_values span').text().trim(), 'A',
+ 'should have a facet with A');
+
+ // delete a facet
+ controlPanel.$('input.o_searchview_input').trigger($.Event('keydown', {
+ which: $.ui.keyCode.BACKSPACE,
+ keyCode: $.ui.keyCode.BACKSPACE,
+ }));
+ assert.strictEqual($('.o_searchview .o_searchview_facet .o_facet_values span').length, 0,
+ 'there should be no facet');
+
+ // delete nothing (should not crash)
+ controlPanel.$('input.o_searchview_input').trigger($.Event('keydown', {
+ which: $.ui.keyCode.BACKSPACE,
+ keyCode: $.ui.keyCode.BACKSPACE,
+ }));
+
+ controlPanel.destroy();
+ });
+
+ QUnit.module('Control Panel Rendering');
+
+ QUnit.test('invisible filters are not rendered', async function (assert) {
+ assert.expect(2);
+ var controlPanel = await createControlPanel({
+ model: 'partner',
+ arch: "<search>" +
+ "<filter name=\"filterA\" string=\"A\" domain=\"[]\"/>" +
+ "<filter name=\"filterB\" string=\"B\" invisible=\"1\" domain=\"[]\"/>" +
+ "</search>",
+ data: this.data,
+ searchMenuTypes: ['filter'],
+ context: {
+ search_disable_custom_filters: true,
+ },
+ });
+ testUtils.dom.click(controlPanel.$('.o_filters_menu_button'));
+ assert.containsOnce(controlPanel, '.o_menu_item a:contains("A")');
+ assert.containsNone(controlPanel, '.o_menu_item a:contains("B")');
+
+ controlPanel.destroy();
+ });
});
});
diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js
index a120a6a7547..e1cb3277dba 100644
--- a/addons/web/static/tests/views/form_tests.js
+++ b/addons/web/static/tests/views/form_tests.js
@@ -17,6 +17,7 @@ var Widget = require('web.Widget');
var _t = core._t;
var createView = testUtils.createView;
var createAsyncView = testUtils.createAsyncView;
+var createActionManager = testUtils.createActionManager;
QUnit.module('Views', {
beforeEach: function () {
@@ -299,7 +300,78 @@ QUnit.module('Views', {
form.destroy();
});
+ QUnit.test('Form and subview with _view_ref contexts', function (assert) {
+ assert.expect(2);
+
+ this.data.product.fields.partner_type_ids = {string: "one2many field", type: "one2many", relation: "partner_type"},
+ this.data.product.records = [{id: 1, name: 'Tromblon', partner_type_ids: [12,14]}];
+ this.data.partner.records[0].product_id = 1;
+
+ var actionManager = createActionManager({
+ data: this.data,
+ archs: {
+ 'product,false,form': '<form>'+
+ '<field name="name"/>'+
+ '<field name="partner_type_ids" context="{\'tree_view_ref\': \'some_other_tree_view\'}"/>' +
+ '</form>',
+ 'partner_type,false,list': '<tree>'+
+ '<field name="color"/>'+
+ '</tree>',
+ 'product,false,search': '<search></search>',
+ },
+ mockRPC: function (route, args) {
+ if (args.method === 'load_views') {
+ var context = args.kwargs.context;
+ if (args.model === 'product') {
+ assert.deepEqual(context, {tree_view_ref: 'some_tree_view'},
+ 'The correct _view_ref should have been sent to the server, first time');
+ }
+ if (args.model === 'partner_type') {
+ assert.deepEqual(context, {tree_view_ref: 'some_other_tree_view'},
+ 'The correct _view_ref should have been sent to the server for the subview');
+ }
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form>' +
+ '<field name="name"/>' +
+ '<field name="product_id" context="{\'tree_view_ref\': \'some_tree_view\'}"/>' +
+ '</form>',
+ res_id: 1,
+
+ mockRPC: function(route, args) {
+ if (args.method === 'get_formview_action') {
+ return $.when({
+ res_id: 1,
+ type: 'ir.actions.act_window',
+ target: 'current',
+ res_model: args.model,
+ context: args.kwargs.context,
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'views': [[false, 'form']],
+ });
+ }
+ return this._super(route, args);
+ },
+
+ interceptsPropagate: {
+ do_action: function (ev) {
+ actionManager.doAction(ev.data.action);
+ },
+ },
+ });
+ form.$('.o_field_widget[name="product_id"]').click();
+ form.destroy();
+ actionManager.destroy();
+ });
QUnit.test('invisible fields are properly hidden', function (assert) {
assert.expect(4);
diff --git a/addons/web/static/tests/views/graph_tests.js b/addons/web/static/tests/views/graph_tests.js
index 73f2179dc8f..d651afc030c 100644
--- a/addons/web/static/tests/views/graph_tests.js
+++ b/addons/web/static/tests/views/graph_tests.js
@@ -785,13 +785,40 @@ QUnit.module('Views', {
'</graph>',
});
- assert.strictEqual(graph.$("svg.nvd3-svg:contains('Undefined')").length, 0);
- assert.strictEqual(graph.$("svg.nvd3-svg:contains('March')").length, 1);
+ assert.strictEqual(graph.$("svg.nvd3-svg .nv-x:contains('Undefined')").length, 0);
+ assert.strictEqual(graph.$("svg.nvd3-svg:contains('January')").length, 1);
testUtils.dom.click(graph.$buttons.find('.o_graph_button[data-mode=bar]'));
- assert.strictEqual(graph.$("svg.nvd3-svg:contains('Undefined')").length, 1);
+ assert.strictEqual(graph.$("svg.nvd3-svg .nv-x:contains('Undefined')").length, 1);
+ assert.strictEqual(graph.$("svg.nvd3-svg:contains('January')").length, 1);
+
+ graph.destroy();
+ });
+
+ QUnit.test('Undefined should appear in bar, pie graph but not in line graph with multiple groupbys', function (assert) {
+ assert.expect(6);
+
+ var graph = createView({
+ View: GraphView,
+ model: "foo",
+ groupBy:['date', 'color_id'],
+ data: this.data,
+ arch: '<graph string="Partners" type="line">' +
+ '<field name="bar"/>' +
+ '</graph>',
+ });
+
+ assert.strictEqual(graph.$("svg.nvd3-svg .nv-x:contains('Undefined')").length, 0);
assert.strictEqual(graph.$("svg.nvd3-svg:contains('January')").length, 1);
+ graph.$buttons.find('.o_graph_button[data-mode=bar]').click();
+ assert.strictEqual(graph.$("svg.nvd3-svg .nv-x:contains('Undefined')").length, 1);
+ assert.strictEqual(graph.$("svg.nvd3-svg:contains('January')").length, 1);
+
+ // Undefined should not appear after switching back to line chart
+ graph.$buttons.find('.o_graph_button[data-mode=line]').click();
+ assert.strictEqual(graph.$("svg.nvd3-svg .nv-x:contains('Undefined')").length, 0);
+ assert.strictEqual(graph.$("svg.nvd3-svg:contains('January')").length, 1);
graph.destroy();
});
});
diff --git a/addons/web/static/tests/views/kanban_mobile_tests.js b/addons/web/static/tests/views/kanban_mobile_tests.js
index 98e65d1ea9c..a9eec223143 100644
--- a/addons/web/static/tests/views/kanban_mobile_tests.js
+++ b/addons/web/static/tests/views/kanban_mobile_tests.js
@@ -56,7 +56,7 @@ QUnit.module('Views', {
QUnit.module('KanbanView Mobile');
QUnit.test('mobile grouped rendering', function (assert) {
- assert.expect(9);
+ assert.expect(11);
var kanban = createView({
View: KanbanView,
@@ -75,6 +75,8 @@ QUnit.module('Views', {
assert.containsN(kanban, '.o_kanban_group', 2, "should have 2 columns" );
assert.hasClass(kanban.$('.o_kanban_mobile_tab:first'),'o_current',
"first tab is the active tab with class 'o_current'");
+ assert.hasClass(kanban.$('.o_kanban_group:first'),'o_current',
+ "first column is the active column with class 'o_current'");
assert.containsN(kanban, '.o_kanban_group:first > div.o_kanban_record', 2,
"there are 2 records in active tab");
assert.strictEqual(kanban.$('.o_kanban_group:nth(1) > div.o_kanban_record').length, 0,
@@ -89,6 +91,8 @@ QUnit.module('Views', {
kanban.$('.o_kanban_mobile_tab:nth(1)').trigger('click');
assert.hasClass(kanban.$('.o_kanban_mobile_tab:nth(1)'),'o_current',
"second tab is now active with class 'o_current'");
+ assert.hasClass(kanban.$('.o_kanban_group:nth(1)'),'o_current',
+ "second column is now active with class 'o_current'");
assert.strictEqual(kanban.$('.o_kanban_group:nth(1) > div.o_kanban_record').length, 2,
"the 2 records of the second group have now been loaded");
diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js
index c398e9df09f..6702a9bee37 100644
--- a/addons/web/static/tests/views/kanban_tests.js
+++ b/addons/web/static/tests/views/kanban_tests.js
@@ -465,7 +465,7 @@ QUnit.module('Views', {
});
QUnit.test('quick create record with quick_create_view', function (assert) {
- assert.expect(17);
+ assert.expect(19);
var kanban = createView({
View: KanbanView,
@@ -497,6 +497,7 @@ QUnit.module('Views', {
},
});
+ assert.containsOnce(kanban, '.o_cp_controller', 'should have one control panel');
assert.containsOnce(kanban, '.o_kanban_group:first .o_kanban_record',
"first column should contain one record");
@@ -508,6 +509,7 @@ QUnit.module('Views', {
"should have a quick create element in the first column");
assert.strictEqual($quickCreate.find('.o_form_view.o_xxs_form_view').length, 1,
"should have rendered an XXS form view");
+ assert.containsOnce(kanban, '.o_cp_controller', 'should not have instantiated an extra control panel');
assert.strictEqual($quickCreate.find('input').length, 2,
"should have two inputs");
assert.strictEqual($quickCreate.find('.o_field_widget').length, 3,
@@ -2376,9 +2378,60 @@ QUnit.module('Views', {
kanban.destroy();
});
+ QUnit.test('wait x2manys batch fetches to re-render', function (assert) {
+ assert.expect(4);
+ var done = assert.async();
+
+ var def;
+ var kanban = createView({
+ View: KanbanView,
+ model: 'partner',
+ data: this.data,
+ arch: '<kanban class="o_kanban_test">' +
+ '<field name="product_id"/>' +
+ '<templates><t t-name="kanban-box">' +
+ '<div>' +
+ '<field name="category_ids" widget="many2many_tags"/>' +
+ '</div>' +
+ '</t></templates>' +
+ '</kanban>',
+ groupBy: ['product_id'],
+ mockRPC: function (route, args) {
+ var result = this._super(route, args);
+ if (args.method === 'read') {
+ return $.when(def).then(function() {
+ return result;
+ });
+ }
+ return result;
+ },
+ });
+
+ def = $.Deferred();
+ assert.containsN(kanban, '.o_tag', 2);
+ kanban.update({groupBy: ['state']});
+
+ def.resolve().then(function () {
+ assert.containsN(kanban, '.o_tag', 2,
+ 'Should display 2 tags after update');
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_tag').text(),
+ 'gold', 'First category should be \'gold\'');
+ assert.strictEqual(kanban.$('.o_kanban_group:eq(2) .o_tag').text(),
+ 'silver', 'Second category should be \'silver\'');
+ kanban.destroy();
+ done();
+ });
+ });
+
QUnit.test('can drag and drop a record from one column to the next', function (assert) {
assert.expect(9);
+ // @todo: remove this resequenceDef whenever the jquery upgrade branch
+ // is merged. This is currently necessary to simulate the reality: we
+ // need the click handlers to be executed after the end of the drag and
+ // drop operation, not before.
+ var resequenceDef = $.Deferred();
+
var envIDs = [1, 3, 2, 4]; // the ids that should be in the environment during this test
this.data.partner.fields.sequence = {type: 'number', string: "Sequence"};
var kanban = createView({
@@ -2388,7 +2441,7 @@ QUnit.module('Views', {
arch: '<kanban class="o_kanban_test" on_create="quick_create">' +
'<field name="product_id"/>' +
'<templates><t t-name="kanban-box">' +
- '<div><field name="foo"/>' +
+ '<div class="oe_kanban_global_click"><field name="foo"/>' +
'<t t-if="widget.editable"><span class="thisiseditable">edit</span></t>' +
'</div>' +
'</t></templates>' +
@@ -2397,7 +2450,7 @@ QUnit.module('Views', {
mockRPC: function (route, args) {
if (route === '/web/dataset/resequence') {
assert.ok(true, "should call resequence");
- return $.when(true);
+ return resequenceDef.then(_.constant(true));
}
return this._super(route, args);
},
@@ -2410,13 +2463,15 @@ QUnit.module('Views', {
var $record = kanban.$('.o_kanban_group:nth-child(1) .o_kanban_record:first');
var $group = kanban.$('.o_kanban_group:nth-child(2)');
envIDs = [3, 2, 4, 1]; // first record of first column moved to the bottom of second column
- testUtils.dom.dragAndDrop($record, $group);
+ testUtils.dom.dragAndDrop($record, $group, {withTrailingClick: true});
+ resequenceDef.resolve();
assert.containsOnce(kanban, '.o_kanban_group:nth-child(1) .o_kanban_record');
assert.containsN(kanban, '.o_kanban_group:nth-child(2) .o_kanban_record', 3);
assert.containsN(kanban, '.thisiseditable', 4);
assert.deepEqual(kanban.exportState().resIds, envIDs);
+ resequenceDef.resolve();
kanban.destroy();
});
diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js
index 46c28529bed..930fadbbb7b 100644
--- a/addons/web/static/tests/views/pivot_tests.js
+++ b/addons/web/static/tests/views/pivot_tests.js
@@ -149,6 +149,23 @@ QUnit.module('Views', {
pivot.destroy();
});
+ QUnit.test('pivot rendering with string attribute on non stored field', function (assert) {
+ assert.expect(1);
+
+ this.data.partner.fields.fubar = {string: "Fubar", type: "integer", store:false};
+
+ var pivot = createView({
+ View: PivotView,
+ model: "partner",
+ data: this.data,
+ arch: '<pivot string="Partners">' +
+ '<field name="fubar" string="fubar" type="measure"/>' +
+ '</pivot>',
+ });
+ assert.containsOnce(pivot, '.o_pivot', 'Non stored fields can have a string attribute');
+ pivot.destroy();
+ });
+
QUnit.test('pivot rendering with invisible attribute on field', function (assert) {
assert.expect(2);
// when invisible, a field should neither be an active measure,
@@ -1415,7 +1432,7 @@ QUnit.module('Views', {
actionManager.destroy();
});
- QUnit.test('export data in excel with comparison', function (assert) {
+ QUnit.test('export data in excel with comparison', function (assert) {
assert.expect(10);
this.data.partner.records[0].date = '2016-12-15';
@@ -1570,5 +1587,147 @@ QUnit.module('Views', {
unpatchDate();
actionManager.destroy();
});
+
+ QUnit.module('Sort in comparison mode', {
+ beforeEach: function () {
+ this.data.partner.records[0].date = '2016-12-15';
+ this.data.partner.records[1].date = '2016-12-17';
+ this.data.partner.records[2].date = '2016-11-22';
+ this.data.partner.records[3].date = '2016-11-03';
+
+ this.data.partner.fields.company_type = {string: "Company Type", type: "selection", selection: [["company", "Company"], ["individual", "individual"]], searchable: true, store: true, sortable: true};
+
+ this.data.partner.records[0].company_type = 'company';
+ this.data.partner.records[1].company_type = 'individual';
+ this.data.partner.records[2].company_type = 'company';
+ this.data.partner.records[3].company_type = 'individual';
+
+
+ this.unpatchDate = patchDate(2016, 11, 20, 1, 0, 0);
+
+ this.actualResult = function () {
+ var actualResult = $('.o_pivot .o_pivot_cell_value div').map(function() {
+ return $( this ).text();
+ }).get().join();
+ return actualResult;
+ };
+
+ // create an action manager to test the interactions with the search view
+ this.actionManager = createActionManager({
+ data: this.data,
+ archs: {
+ 'partner,false,pivot': '<pivot>' +
+ '<field name="date" interval="day" type="row"/>' +
+ '<field name="company_type" type="col"/>' +
+ '<field name="foo" type="measure"/>' +
+ '</pivot>',
+ 'partner,false,search': '<search></search>',
+ },
+ debug: 1,
+ });
+
+ this.actionManager.doAction({
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'pivot']],
+ flags: {
+ pivot: {
+ additionalMeasures: ['product_id'],
+ }
+ }
+ });
+
+ // open time range menu
+ testUtils.dom.click($('.o_control_panel .o_time_range_menu_button'));
+ // select 'Today' as range
+ testUtils.fields.editInput($('.o_control_panel .o_time_range_selector'), 'this_month');
+ // check checkbox 'Compare To'
+ testUtils.dom.click($('.o_control_panel .o_time_range_menu .o_comparison_checkbox'));
+ // Click on 'Apply' button
+ testUtils.dom.click($('.o_control_panel .o_time_range_menu .o_apply_range'));
+ // We are in comparison mode
+ },
+ afterEach: function () {
+ this.unpatchDate();
+ this.actionManager.destroy();
+ },
+ }, function () {
+ QUnit.test('when clicking on measure, sort by "This Month" (period of interest)', function (assert) {
+ assert.expect(1);
+
+ // click on 'Foo' in column Total/Company
+ testUtils.dom.click($('.o_pivot_measure_row').eq(0));
+ var results = [
+ "12", "17", "-29.41%", "1", "2", "-50%", "13", "19", "-31.58%",
+ "12", "0", "100%", "12", "0" , "100%",
+ "1", "0", "100%", "1" , "0", "100%",
+ "0", "17", "-100%", "0", "17", "-100%",
+ "0", "2", "-100%", "0" , "2" , "-100%"
+ ];
+ assert.strictEqual(this.actualResult(), results.join());
+ });
+
+ QUnit.test(
+ 'click on a period of interest header sort according to the appropriate column ' +
+ 'first in ascending order then in descending order',
+ function (assert) {
+ assert.expect(2);
+
+ // click on 'This Month' in column Total/Individual/Foo
+ testUtils.dom.click($('.o_pivot_measure_row').eq(6));
+ var results = [
+ "12", "17", "-29.41%", "1", "2", "-50%", "13", "19", "-31.58%",
+ "1", "0", "100%", "1" , "0", "100%",
+ "12", "0", "100%", "12", "0" , "100%",
+ "0", "17", "-100%", "0", "17", "-100%",
+ "0", "2", "-100%", "0" , "2" , "-100%"
+ ];
+ var actualResult = $('.o_pivot .o_pivot_cell_value div').text();
+ assert.strictEqual(actualResult, results.join(''));
+
+ // click once again on 'This Month' in column Total/Individual/Foo
+ testUtils.dom.click($('.o_pivot_measure_row').eq(6));
+ results = [
+ "12", "17", "-29.41%", "1", "2", "-50%", "13", "19", "-31.58%",
+ "12", "0", "100%", "12", "0" , "100%",
+ "0", "17", "-100%", "0", "17", "-100%",
+ "0", "2", "-100%", "0" , "2" , "-100%",
+ "1", "0", "100%", "1" , "0", "100%"
+ ];
+ assert.strictEqual(this.actualResult(), results.join());
+ });
+
+ QUnit.test('click on a period of comparison header sort according to appropriate column',
+ function (assert) {
+ assert.expect(1);
+
+ // click on 'Previous Period' in column Total/Individual/Foo
+ testUtils.dom.click($('.o_pivot_measure_row').eq(7));
+ var results = [
+ "12", "17", "-29.41%", "1", "2", "-50%", "13", "19", "-31.58%",
+ "0", "2", "-100%", "0" , "2" , "-100%",
+ "12", "0", "100%", "12", "0" , "100%",
+ "1", "0", "100%", "1" , "0", "100%",
+ "0", "17", "-100%", "0", "17", "-100%"
+ ];
+ assert.strictEqual(this.actualResult(), results.join());
+ });
+
+ QUnit.test('click on a variation header sort according to appropriate column',
+ function (assert) {
+ assert.expect(1);
+
+ // click on 'Variation' in column Total/Individual/Foo
+ testUtils.dom.click($('.o_pivot_measure_row').eq(11));
+ var results = [
+ "12", "17", "-29.41%", "1", "2", "-50%", "13", "19", "-31.58%",
+ "12", "0", "100%", "12", "0" , "100%",
+ "1", "0", "100%", "1" , "0", "100%",
+ "0", "17", "-100%", "0", "17", "-100%",
+ "0", "2", "-100%", "0" , "2" , "-100%"
+ ];
+ assert.strictEqual(this.actualResult(), results.join());
+ });
+ });
});
});
diff --git a/addons/web/static/tests/views/search_filters_menu_tests.js b/addons/web/static/tests/views/search_filters_menu_tests.js
deleted file mode 100644
index e9246520f1d..00000000000
--- a/addons/web/static/tests/views/search_filters_menu_tests.js
+++ /dev/null
@@ -1,140 +0,0 @@
-odoo.define('web.search_filters_menu_tests', function (require) {
-"use strict";
-
-var FilterMenu = require('web.FilterMenu');
-var testUtils = require('web.test_utils');
-
-function createFilterMenu(filters, fields, params) {
- params = params || {};
- var target = params.debug ? document.body : $('#qunit-fixture');
- var menu = new FilterMenu(null, filters, fields);
- testUtils.mock.addMockEnvironment(menu, params);
- menu.appendTo(target);
- return menu;
-}
-
-QUnit.module('FilterMenu', {
- beforeEach: function () {
- this.filters = [
- {
- isActive: false,
- description: 'some filter',
- domain: '',
- groupNumber: 1,
- },
- ];
- this.fields = {
- boolean_field: {string: "Boolean Field", type: "boolean", default: true, searchable: true},
- date_field: {string: "A date", type: "date", searchable: true},
- char_field: {string: "Char Field", type: "char", default: "foo", searchable: true, trim: true},
- };
- },
-}, function () {
-
- QUnit.test('simple rendering with no filter', function (assert) {
- assert.expect(4);
-
- var filterMenu = createFilterMenu([], this.fields);
- testUtils.dom.click(filterMenu.$('span.fa-filter'));
- assert.containsOnce(filterMenu, '.dropdown-divider');
- assert.ok(!filterMenu.$('.dropdown-divider').is(':visible'));
- assert.containsN(filterMenu, '.dropdown-divider, .dropdown-item, .dropdown-item-text', 3,
- 'should have 3 elements: a hidden divider, a add custom filter item, a apply button + add condition button');
- assert.containsOnce(filterMenu, '.o_add_custom_filter.o_closed_menu');
- filterMenu.destroy();
- });
-
- QUnit.test('simple rendering with a filter', function (assert) {
- assert.expect(2);
-
- var filterMenu = createFilterMenu(this.filters, this.fields);
- assert.containsN(filterMenu, '.dropdown-divider, .dropdown-item, .dropdown-item-text', 5,
- 'should have 4 elements: a hidden, separator, a filter, a separator, a add custom filter item, a apply button + add condition button');
- assert.containsOnce(filterMenu, '.o_add_custom_filter.o_closed_menu');
- filterMenu.destroy();
- });
-
- QUnit.test('click on add custom filter opens the submenu', function (assert) {
- assert.expect(3);
-
- var filterMenu = createFilterMenu([], this.fields);
- // open menu dropdown
- testUtils.dom.click(filterMenu.$('span.fa-filter'));
- // open add custom filter submenu
- testUtils.dom.click(filterMenu.$('.o_add_custom_filter'));
- assert.hasClass(filterMenu.$('.o_add_custom_filter'), 'o_open_menu');
- assert.ok(filterMenu.$('.o_add_filter_menu').is(':visible'));
- assert.containsN(filterMenu, '.dropdown-divider, .dropdown-item, .dropdown-item-text', 4,
- 'should have 3 elements: a hidden divider, a add custom filter item, a proposition, a apply button + add condition button');
-
- filterMenu.destroy();
- });
-
- QUnit.test('removing last prop disable the apply button', function (assert) {
- assert.expect(2);
-
- var filterMenu = createFilterMenu([], this.fields);
- // open menu dropdown and custom filter submenu
- testUtils.dom.click(filterMenu.$('span.fa-filter'));
- testUtils.dom.click(filterMenu.$('.o_add_custom_filter'));
-
- // remove the current unique proposition
- testUtils.dom.click(filterMenu.$('.o_searchview_extended_delete_prop'));
-
- assert.ok(filterMenu.$('.o_apply_filter').attr('disabled'));
-
- assert.containsN(filterMenu, '.dropdown-divider, .dropdown-item, .dropdown-item-text', 3,
- 'should have 3 elements: a hidden separator, a add custom filter item, a apply button + add condition button');
-
- filterMenu.destroy();
- });
-
- QUnit.test('readding a proposition reenable apply button', function (assert) {
- assert.expect(1);
-
- var filterMenu = createFilterMenu([], this.fields);
- // open menu dropdown and custom filter submenu, remove existing prop
- testUtils.dom.click(filterMenu.$('span.fa-filter'));
- testUtils.dom.click(filterMenu.$('.o_add_custom_filter'));
- testUtils.dom.click(filterMenu.$('.o_searchview_extended_delete_prop'));
- // read a proposition
- testUtils.dom.click(filterMenu.$('.o_add_condition'));
- assert.ok(!filterMenu.$('.o_apply_filter').attr('disabled'));
-
- filterMenu.destroy();
- });
-
- QUnit.test('adding a simple filter works', function (assert) {
- assert.expect(6);
-
- delete this.fields.date_field;
- var filterMenu = createFilterMenu([], this.fields, {
- debug: true,
- intercepts: {
- new_filters: function (ev) {
- var filter = ev.data.filters[0];
- assert.strictEqual(filter.type, 'filter');
- assert.strictEqual(filter.description, 'Boolean Field is true');
- assert.strictEqual(filter.domain, '[[\"boolean_field\",\"=\",True]]');
- filterMenu.update([{
- isActive: true,
- description: '?',
- domain: '?',
- groupNumber: 1,
- }]);
- },
- },
- });
- // open menu dropdown and custom filter submenu, remove existing prop
- testUtils.dom.click(filterMenu.$('span.fa-filter'));
- testUtils.dom.click(filterMenu.$('.o_add_custom_filter'));
- // click on apply to activate filter
- testUtils.dom.click(filterMenu.$('.o_apply_filter'));
- assert.hasClass(filterMenu.$('.o_add_custom_filter'), 'o_closed_menu');
- assert.containsNone(filterMenu, '.o_filter_condition');
- assert.containsOnce(filterMenu, '.dropdown-divider:visible',
- 'there should be a separator between filters and add custom filter menu');
- filterMenu.destroy();
- });
-});
-});
diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js
index fa3fe817c2a..f4b0163ce07 100644
--- a/addons/web/static/tests/views/search_view_tests.js
+++ b/addons/web/static/tests/views/search_view_tests.js
@@ -2,6 +2,7 @@ odoo.define('web.search_view_tests', function (require) {
"use strict";
var FormView = require('web.FormView');
+var ListView = require('web.ListView');
var testUtils = require('web.test_utils');
var createActionManager = testUtils.createActionManager;
@@ -694,6 +695,39 @@ QUnit.module('Search View', {
window.Date = RealDate;
});
+ QUnit.test('`context` key in <filter> is used', function (assert) {
+ assert.expect(3);
+
+ this.archs['partner,4,search'] = '<search>'+
+ '<filter string="AAA" name="some_filter" context="{\'coucou_1\': 1}"></filter>' +
+ '</search>';
+
+ var actionManager = createActionManager({
+ actions: this.actions,
+ archs: this.archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/search_read') {
+ assert.step(JSON.stringify(args.context));
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ actionManager.doAction(5);
+
+ // select filter
+ testUtils.dom.click($('.o_search_options .fa-filter'));
+ testUtils.dom.click($('.o_menu_item:contains(AAA)'));
+
+ assert.verifySteps([
+ "{}",
+ "{\"coucou_1\":1}",
+ ]);
+
+ actionManager.destroy();
+ });
+
QUnit.module('Favorites Menu');
QUnit.test('dynamic filters are saved dynamic', function (assert) {
diff --git a/addons/web/views/report_templates.xml b/addons/web/views/report_templates.xml
index b33f89cd929..c9f78d20394 100644
--- a/addons/web/views/report_templates.xml
+++ b/addons/web/views/report_templates.xml
@@ -103,9 +103,9 @@
<t t-call-assets="web.report_assets_pdf" t-js="false"/>
<t t-call-assets="web.report_assets_common" t-js="false"/>
<t t-call-assets="web.report_assets_pdf" t-css="false"/>
- <t t-call-assets="web.report_assets_common" t-css="false"/>
<meta charset="utf-8"/>
- <t t-if="subst is True">
+ <t t-set="subst_needed" t-value="subst is True"/>
+ <t t-if="subst_needed">
<script>
function subst() {
var vars = {};
@@ -138,7 +138,7 @@
</script>
</t>
</head>
- <body class="container" onload="subst()">
+ <body class="container" t-att-onload="subst_needed and 'subst()'">
<t t-raw="body"/>
</body>
</html>