diff options
Diffstat (limited to 'addons/web')
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 && 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 && 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 && 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 && 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 && 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> |
