[MERGE] forward port branch 11.0 up to 39d9c362c5
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * hr_expense
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Martin Trigaux <mat@odoo.com>, 2017
|
||||
# Michael Yeung <michael@deluxe.hk>, 2017
|
||||
@@ -13,10 +13,10 @@ msgstr ""
|
||||
"PO-Revision-Date: 2017-11-16 08:08+0000\n"
|
||||
"Last-Translator: Michael Yeung <michael@deluxe.hk>, 2017\n"
|
||||
"Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n"
|
||||
"Language: zh_TW\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Language: zh_TW\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#. module: hr_expense
|
||||
@@ -1800,7 +1800,7 @@ msgstr ""
|
||||
#: code:addons/hr_expense/models/hr_expense.py:344
|
||||
#, python-format
|
||||
msgid "or send receipts by email to %s."
|
||||
msgstr ""
|
||||
msgstr "或者通過電子郵件向 %s 發送收據。"
|
||||
|
||||
#. module: hr_expense
|
||||
#: model:ir.ui.view,arch_db:hr_expense.hr_expense_planner
|
||||
|
||||
@@ -22,7 +22,13 @@ class AccountAnalyticLine(models.Model):
|
||||
|
||||
@api.onchange('project_id')
|
||||
def onchange_project_id(self):
|
||||
# reset task when changing project
|
||||
self.task_id = False
|
||||
# force domain on task when project is set
|
||||
if self.project_id:
|
||||
return {'domain': {
|
||||
'task_id': [('project_id', '=', self.project_id.id)]
|
||||
}}
|
||||
|
||||
@api.onchange('employee_id')
|
||||
def _onchange_employee_id(self):
|
||||
|
||||
@@ -50,6 +50,7 @@ function strip_html (node, transform_children) {
|
||||
|
||||
function inline (node, transform_children) {
|
||||
if (node.nodeType === 3) return node.data;
|
||||
if (node.nodeType === 8) return "";
|
||||
if (node.tagName === "BR") return " ";
|
||||
if (node.tagName.match(/^(A|P|DIV|PRE|BLOCKQUOTE)$/)) return transform_children();
|
||||
node.innerHTML = transform_children();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -10,8 +10,7 @@ msgstr ""
|
||||
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
|
||||
"PO-Revision-Date: 2016-07-19 02:21+0000\n"
|
||||
"Last-Translator: Martin Trigaux\n"
|
||||
"Language-Team: French (Canada) (http://www.transifex.com/odoo/odoo-9/"
|
||||
"language/fr_CA/)\n"
|
||||
"Language-Team: French (Canada) (http://www.transifex.com/odoo/odoo-9/language/fr_CA/)\n"
|
||||
"Language: fr_CA\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -226,10 +225,8 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,help:point_of_sale.action_pos_session
|
||||
msgid ""
|
||||
"A session is a period of time, usually one day, during which\n"
|
||||
" you sell through the point of sale. The user has to check "
|
||||
"the\n"
|
||||
" currencies in your cash registers at the beginning and the "
|
||||
"end\n"
|
||||
" you sell through the point of sale. The user has to check the\n"
|
||||
" currencies in your cash registers at the beginning and the end\n"
|
||||
" of each session."
|
||||
msgstr ""
|
||||
|
||||
@@ -672,15 +669,15 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_account_journal_journal_user
|
||||
msgid ""
|
||||
"Check this box if this journal define a payment method that can be used in a "
|
||||
"point of sale."
|
||||
"Check this box if this journal define a payment method that can be used in a"
|
||||
" point of sale."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_config_group_by
|
||||
msgid ""
|
||||
"Check this if you want to group the Journal Items by Product while closing a "
|
||||
"Session"
|
||||
"Check this if you want to group the Journal Items by Product while closing a"
|
||||
" Session"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -1130,8 +1127,7 @@ msgstr "Nom affiché"
|
||||
#: model:ir.actions.act_window,help:point_of_sale.product_template_action
|
||||
msgid ""
|
||||
"Do not forget to set the price and the point of sale category\n"
|
||||
" in which it should appear. If a product has no point of "
|
||||
"sale\n"
|
||||
" in which it should appear. If a product has no point of sale\n"
|
||||
" category, you can not sell it through the point of sale\n"
|
||||
" interface."
|
||||
msgstr ""
|
||||
@@ -1470,8 +1466,7 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,help:point_of_sale.product_pos_category_action
|
||||
msgid ""
|
||||
"If you put a photo on the category, the layout of the\n"
|
||||
" touchscreen interface will automatically. We suggest not to "
|
||||
"put\n"
|
||||
" touchscreen interface will automatically. We suggest not to put\n"
|
||||
" a photo on categories for small (1024x768) screens."
|
||||
msgstr ""
|
||||
|
||||
@@ -2156,7 +2151,7 @@ msgstr ""
|
||||
#: code:addons/point_of_sale/models/pos_config.py:180
|
||||
#, fuzzy, python-format
|
||||
msgid "POS Order %s"
|
||||
msgstr "Commande"
|
||||
msgstr "Commande %s"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_order_line_form
|
||||
@@ -2270,10 +2265,8 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,help:point_of_sale.action_account_journal_form
|
||||
msgid ""
|
||||
"Payment methods are defined by accounting journals having the\n"
|
||||
" field <i>PoS Payment Method</i> checked. In order to be "
|
||||
"useable\n"
|
||||
" from the touchscreen interface, you must set the payment "
|
||||
"method\n"
|
||||
" field <i>PoS Payment Method</i> checked. In order to be useable\n"
|
||||
" from the touchscreen interface, you must set the payment method\n"
|
||||
" on the <i>Point of Sale</i> configuration."
|
||||
msgstr ""
|
||||
|
||||
@@ -2987,8 +2980,8 @@ msgstr ""
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_category_image_small
|
||||
msgid ""
|
||||
"Small-sized image of the category. It is automatically resized as a 64x64px "
|
||||
"image, with aspect ratio preserved. Use this field anywhere a small image is "
|
||||
"required."
|
||||
"image, with aspect ratio preserved. Use this field anywhere a small image is"
|
||||
" required."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3349,7 +3342,8 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/models/pos_session.py:215
|
||||
#, python-format
|
||||
msgid "The type of the journal for your payment method should be bank or cash "
|
||||
msgid ""
|
||||
"The type of the journal for your payment method should be bank or cash "
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3371,11 +3365,9 @@ msgstr ""
|
||||
#: code:addons/point_of_sale/static/src/js/screens.js:1867
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There is no cash payment method available in this point of sale to handle "
|
||||
"the change.\n"
|
||||
"There is no cash payment method available in this point of sale to handle the change.\n"
|
||||
"\n"
|
||||
" Please pay the exact amount or add a cash payment method in the point of "
|
||||
"sale configuration"
|
||||
" Please pay the exact amount or add a cash payment method in the point of sale configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3388,8 +3380,8 @@ msgstr ""
|
||||
#: code:addons/point_of_sale/models/pos_order.py:607
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There is no receivable account defined to make payment for the partner: \"%s"
|
||||
"\" (id:%d)."
|
||||
"There is no receivable account defined to make payment for the partner: "
|
||||
"\"%s\" (id:%d)."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3421,8 +3413,8 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_account_journal_amount_authorized_diff
|
||||
msgid ""
|
||||
"This field depicts the maximum difference allowed between the ending balance "
|
||||
"and the theoretical cash when closing a session, for non-POS managers. If "
|
||||
"This field depicts the maximum difference allowed between the ending balance"
|
||||
" and the theoretical cash when closing a session, for non-POS managers. If "
|
||||
"this maximum is reached, the user will have an error message at the closing "
|
||||
"of his session saying that he needs to contact his manager."
|
||||
msgstr ""
|
||||
@@ -3457,8 +3449,7 @@ msgid ""
|
||||
"\n"
|
||||
"- Bill Splitting: Allows you to split an order into different orders \n"
|
||||
"\n"
|
||||
"- Kitchen Order Printing: allows you to print orders updates to kitchen or "
|
||||
"bar printers"
|
||||
"- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3476,8 +3467,8 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This operation will permanently destroy all unpaid orders from all sessions "
|
||||
"that have been put in the local storage. You will lose all the data and exit "
|
||||
"the point of sale. This operation cannot be undone."
|
||||
"that have been put in the local storage. You will lose all the data and exit"
|
||||
" the point of sale. This operation cannot be undone."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3827,11 +3818,11 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have to define which payment method must be available in the point of "
|
||||
"sale by reusing existing bank and cash through \"Accounting / "
|
||||
"Configuration / Journals / Journals\". Select a journal and check the field "
|
||||
"\"PoS Payment Method\" from the \"Point of Sale\" tab. You can also create "
|
||||
"new payment methods directly from menu \"PoS Backend / Configuration / "
|
||||
"Payment Methods\"."
|
||||
"sale by reusing existing bank and cash through \"Accounting / Configuration "
|
||||
"/ Journals / Journals\". Select a journal and check the field \"PoS Payment "
|
||||
"Method\" from the \"Point of Sale\" tab. You can also create new payment "
|
||||
"methods directly from menu \"PoS Backend / Configuration / Payment "
|
||||
"Methods\"."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -4093,8 +4084,8 @@ msgstr ""
|
||||
|
||||
#~ msgid "Allow the users to synchronize their calendar with Google Calendar"
|
||||
#~ msgstr ""
|
||||
#~ "Permet aux utilisateurs de synchroniser leur calendrier avec le "
|
||||
#~ "\"Calendrier Google\""
|
||||
#~ "Permet aux utilisateurs de synchroniser leur calendrier avec le \"Calendrier"
|
||||
#~ " Google\""
|
||||
|
||||
#~ msgid "Attach Google documents to any record"
|
||||
#~ msgstr "Joindre des documents Google à tout enregistrement"
|
||||
|
||||
@@ -11,8 +11,7 @@ msgstr ""
|
||||
"POT-Creation-Date: 2016-08-18 14:06+0000\n"
|
||||
"PO-Revision-Date: 2016-01-27 10:50+0000\n"
|
||||
"Last-Translator: Martin Trigaux\n"
|
||||
"Language-Team: Dutch (Belgium) (http://www.transifex.com/odoo/odoo-9/"
|
||||
"language/nl_BE/)\n"
|
||||
"Language-Team: Dutch (Belgium) (http://www.transifex.com/odoo/odoo-9/language/nl_BE/)\n"
|
||||
"Language: nl_BE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -227,10 +226,8 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,help:point_of_sale.action_pos_session
|
||||
msgid ""
|
||||
"A session is a period of time, usually one day, during which\n"
|
||||
" you sell through the point of sale. The user has to check "
|
||||
"the\n"
|
||||
" currencies in your cash registers at the beginning and the "
|
||||
"end\n"
|
||||
" you sell through the point of sale. The user has to check the\n"
|
||||
" currencies in your cash registers at the beginning and the end\n"
|
||||
" of each session."
|
||||
msgstr ""
|
||||
|
||||
@@ -673,15 +670,15 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_account_journal_journal_user
|
||||
msgid ""
|
||||
"Check this box if this journal define a payment method that can be used in a "
|
||||
"point of sale."
|
||||
"Check this box if this journal define a payment method that can be used in a"
|
||||
" point of sale."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_config_group_by
|
||||
msgid ""
|
||||
"Check this if you want to group the Journal Items by Product while closing a "
|
||||
"Session"
|
||||
"Check this if you want to group the Journal Items by Product while closing a"
|
||||
" Session"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -1134,8 +1131,7 @@ msgstr "Naam weergeven"
|
||||
#: model:ir.actions.act_window,help:point_of_sale.product_template_action
|
||||
msgid ""
|
||||
"Do not forget to set the price and the point of sale category\n"
|
||||
" in which it should appear. If a product has no point of "
|
||||
"sale\n"
|
||||
" in which it should appear. If a product has no point of sale\n"
|
||||
" category, you can not sell it through the point of sale\n"
|
||||
" interface."
|
||||
msgstr ""
|
||||
@@ -1480,8 +1476,7 @@ msgstr ""
|
||||
#: model:ir.actions.act_window,help:point_of_sale.product_pos_category_action
|
||||
msgid ""
|
||||
"If you put a photo on the category, the layout of the\n"
|
||||
" touchscreen interface will automatically. We suggest not to "
|
||||
"put\n"
|
||||
" touchscreen interface will automatically. We suggest not to put\n"
|
||||
" a photo on categories for small (1024x768) screens."
|
||||
msgstr ""
|
||||
|
||||
@@ -1530,8 +1525,8 @@ msgstr "In behandeling"
|
||||
#, python-format
|
||||
msgid "In order to delete a sale, it must be new or cancelled."
|
||||
msgstr ""
|
||||
"Als u een verkoop wilt verwijderen, moet deze in status Nieuw of Geannuleerd "
|
||||
"staan."
|
||||
"Als u een verkoop wilt verwijderen, moet deze in status Nieuw of Geannuleerd"
|
||||
" staan."
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_config_search
|
||||
@@ -2172,7 +2167,7 @@ msgstr "Verkoopanalyse"
|
||||
#: code:addons/point_of_sale/models/pos_config.py:180
|
||||
#, fuzzy, python-format
|
||||
msgid "POS Order %s"
|
||||
msgstr "Kassaverkooporders"
|
||||
msgstr "Kassaverkooporders %s"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.ui.view,arch_db:point_of_sale.view_pos_order_line_form
|
||||
@@ -2198,7 +2193,7 @@ msgstr "Kassaverkooporderlijnen"
|
||||
#: code:addons/point_of_sale/models/pos_config.py:191
|
||||
#, fuzzy, python-format
|
||||
msgid "POS order line %s"
|
||||
msgstr "Kassaverkooporderlijnen"
|
||||
msgstr "Kassaverkooporderlijnen %s"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: model:ir.ui.view,arch_db:point_of_sale.view_report_pos_order_search
|
||||
@@ -2286,10 +2281,8 @@ msgstr "Betaalterminal"
|
||||
#: model:ir.actions.act_window,help:point_of_sale.action_account_journal_form
|
||||
msgid ""
|
||||
"Payment methods are defined by accounting journals having the\n"
|
||||
" field <i>PoS Payment Method</i> checked. In order to be "
|
||||
"useable\n"
|
||||
" from the touchscreen interface, you must set the payment "
|
||||
"method\n"
|
||||
" field <i>PoS Payment Method</i> checked. In order to be useable\n"
|
||||
" from the touchscreen interface, you must set the payment method\n"
|
||||
" on the <i>Point of Sale</i> configuration."
|
||||
msgstr ""
|
||||
|
||||
@@ -2317,8 +2310,8 @@ msgid ""
|
||||
"Person who uses the cash register. It can be a reliever, a student or an "
|
||||
"interim employee."
|
||||
msgstr ""
|
||||
"Persoon die de kassa gebruikt. Dit kan een kassa-ophaler, een student of een "
|
||||
"interimarbeider zijn."
|
||||
"Persoon die de kassa gebruikt. Dit kan een kassa-ophaler, een student of een"
|
||||
" interimarbeider zijn."
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
@@ -2365,8 +2358,8 @@ msgstr "Gelieve groot bedrag te bevestigen"
|
||||
#, python-format
|
||||
msgid "Please define income account for this product: \"%s\" (id:%d)."
|
||||
msgstr ""
|
||||
"Gelieve een opbrengstenrekening in te stellen voor dit product: \"%s\" (id:"
|
||||
"%d)."
|
||||
"Gelieve een opbrengstenrekening in te stellen voor dit product: \"%s\" "
|
||||
"(id:%d)."
|
||||
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/models/pos_order.py:437
|
||||
@@ -3008,8 +3001,8 @@ msgstr ""
|
||||
#: model:ir.model.fields,help:point_of_sale.field_pos_category_image_small
|
||||
msgid ""
|
||||
"Small-sized image of the category. It is automatically resized as a 64x64px "
|
||||
"image, with aspect ratio preserved. Use this field anywhere a small image is "
|
||||
"required."
|
||||
"image, with aspect ratio preserved. Use this field anywhere a small image is"
|
||||
" required."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3376,7 +3369,8 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: code:addons/point_of_sale/models/pos_session.py:215
|
||||
#, python-format
|
||||
msgid "The type of the journal for your payment method should be bank or cash "
|
||||
msgid ""
|
||||
"The type of the journal for your payment method should be bank or cash "
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3392,19 +3386,17 @@ msgid ""
|
||||
"There are pending operations that could not be saved into the database, are "
|
||||
"you sure you want to exit?"
|
||||
msgstr ""
|
||||
"Er zijn hangende transacties die niet kunnen worden opgeslagen. Bent u zeker "
|
||||
"dat u wilt afsluiten?"
|
||||
"Er zijn hangende transacties die niet kunnen worden opgeslagen. Bent u zeker"
|
||||
" dat u wilt afsluiten?"
|
||||
|
||||
#. module: point_of_sale
|
||||
#. openerp-web
|
||||
#: code:addons/point_of_sale/static/src/js/screens.js:1867
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There is no cash payment method available in this point of sale to handle "
|
||||
"the change.\n"
|
||||
"There is no cash payment method available in this point of sale to handle the change.\n"
|
||||
"\n"
|
||||
" Please pay the exact amount or add a cash payment method in the point of "
|
||||
"sale configuration"
|
||||
" Please pay the exact amount or add a cash payment method in the point of sale configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3417,8 +3409,8 @@ msgstr ""
|
||||
#: code:addons/point_of_sale/models/pos_order.py:607
|
||||
#, python-format
|
||||
msgid ""
|
||||
"There is no receivable account defined to make payment for the partner: \"%s"
|
||||
"\" (id:%d)."
|
||||
"There is no receivable account defined to make payment for the partner: "
|
||||
"\"%s\" (id:%d)."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3450,8 +3442,8 @@ msgstr ""
|
||||
#. module: point_of_sale
|
||||
#: model:ir.model.fields,help:point_of_sale.field_account_journal_amount_authorized_diff
|
||||
msgid ""
|
||||
"This field depicts the maximum difference allowed between the ending balance "
|
||||
"and the theoretical cash when closing a session, for non-POS managers. If "
|
||||
"This field depicts the maximum difference allowed between the ending balance"
|
||||
" and the theoretical cash when closing a session, for non-POS managers. If "
|
||||
"this maximum is reached, the user will have an error message at the closing "
|
||||
"of his session saying that he needs to contact his manager."
|
||||
msgstr ""
|
||||
@@ -3486,8 +3478,7 @@ msgid ""
|
||||
"\n"
|
||||
"- Bill Splitting: Allows you to split an order into different orders \n"
|
||||
"\n"
|
||||
"- Kitchen Order Printing: allows you to print orders updates to kitchen or "
|
||||
"bar printers"
|
||||
"- Kitchen Order Printing: allows you to print orders updates to kitchen or bar printers"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3505,8 +3496,8 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This operation will permanently destroy all unpaid orders from all sessions "
|
||||
"that have been put in the local storage. You will lose all the data and exit "
|
||||
"the point of sale. This operation cannot be undone."
|
||||
"that have been put in the local storage. You will lose all the data and exit"
|
||||
" the point of sale. This operation cannot be undone."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -3857,11 +3848,11 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid ""
|
||||
"You have to define which payment method must be available in the point of "
|
||||
"sale by reusing existing bank and cash through \"Accounting / "
|
||||
"Configuration / Journals / Journals\". Select a journal and check the field "
|
||||
"\"PoS Payment Method\" from the \"Point of Sale\" tab. You can also create "
|
||||
"new payment methods directly from menu \"PoS Backend / Configuration / "
|
||||
"Payment Methods\"."
|
||||
"sale by reusing existing bank and cash through \"Accounting / Configuration "
|
||||
"/ Journals / Journals\". Select a journal and check the field \"PoS Payment "
|
||||
"Method\" from the \"Point of Sale\" tab. You can also create new payment "
|
||||
"methods directly from menu \"PoS Backend / Configuration / Payment "
|
||||
"Methods\"."
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
@@ -4324,8 +4315,8 @@ msgstr ""
|
||||
#~ msgstr "Boekingen doen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Generate all sale journal entries for non invoiced orders linked to a "
|
||||
#~ "closed cash register or statement."
|
||||
#~ "Generate all sale journal entries for non invoiced orders linked to a closed"
|
||||
#~ " cash register or statement."
|
||||
#~ msgstr ""
|
||||
#~ "Maak alle verkoopboekingen voor niet-gefactureerde orders in een gesloten "
|
||||
#~ "kasboek of uittreksel."
|
||||
@@ -4464,8 +4455,8 @@ msgstr ""
|
||||
|
||||
#~ msgid "This allows users to trigger a password reset from the Login page."
|
||||
#~ msgstr ""
|
||||
#~ "Dit stelt gebruikers in staat om een wachtwoord herinitialisatie te "
|
||||
#~ "starten via de Aanmeldingspagina."
|
||||
#~ "Dit stelt gebruikers in staat om een wachtwoord herinitialisatie te starten "
|
||||
#~ "via de Aanmeldingspagina."
|
||||
|
||||
#~ msgid "Timmermans Kriek 37.5cl"
|
||||
#~ msgstr "Timmermans Kriek 37.5cl"
|
||||
@@ -4481,8 +4472,8 @@ msgstr ""
|
||||
#~ "products, an ease the product management in the ecommerce for example"
|
||||
#~ msgstr ""
|
||||
#~ "Werken met productvarianten biedt u de mogelijkheid om varianten voor "
|
||||
#~ "eenzelfde product te definiëren, en vergemakkelijkt het productbeheer "
|
||||
#~ "voor bijv. e-Commerce"
|
||||
#~ "eenzelfde product te definiëren, en vergemakkelijkt het productbeheer voor "
|
||||
#~ "bijv. e-Commerce"
|
||||
|
||||
#~ msgid "transaction for the pos"
|
||||
#~ msgstr "transactie voor kassaverkoop"
|
||||
|
||||
@@ -2,6 +2,7 @@ odoo.define('stock.stock_report_generic', function (require) {
|
||||
'use strict';
|
||||
|
||||
var core = require('web.core');
|
||||
var session = require('web.session');
|
||||
var Widget = require('web.Widget');
|
||||
var ControlPanelMixin = require('web.ControlPanelMixin');
|
||||
var session = require('web.session');
|
||||
@@ -15,7 +16,7 @@ var stock_report_generic = Widget.extend(ControlPanelMixin, {
|
||||
// Stores all the parameters of the action.
|
||||
init: function(parent, action) {
|
||||
this.actionManager = parent;
|
||||
this.given_context = {};
|
||||
this.given_context = session.user_context;
|
||||
this.controller_url = action.context.url;
|
||||
if (action.context.context) {
|
||||
this.given_context = action.context.context;
|
||||
|
||||
@@ -257,8 +257,8 @@ class ProductProduct(models.Model):
|
||||
@api.model
|
||||
def _get_anglo_saxon_price_unit(self, uom=False):
|
||||
price = self.standard_price
|
||||
if not uom or self.uom_id.id == uom.id:
|
||||
return price
|
||||
if not self or not uom or self.uom_id.id == uom.id:
|
||||
return price or 0.0
|
||||
return self.uom_id._compute_price(price, uom)
|
||||
|
||||
|
||||
|
||||
@@ -1494,69 +1494,6 @@ class ExcelExport(ExportFormat, http.Controller):
|
||||
fp.close()
|
||||
return data
|
||||
|
||||
class Reports(http.Controller):
|
||||
POLLING_DELAY = 0.25
|
||||
TYPES_MAPPING = {
|
||||
'doc': 'application/vnd.ms-word',
|
||||
'html': 'text/html',
|
||||
'odt': 'application/vnd.oasis.opendocument.text',
|
||||
'pdf': 'application/pdf',
|
||||
'sxw': 'application/vnd.sun.xml.writer',
|
||||
'xls': 'application/vnd.ms-excel',
|
||||
}
|
||||
|
||||
@http.route('/web/report', type='http', auth="user")
|
||||
@serialize_exception
|
||||
def index(self, action, token):
|
||||
action = json.loads(action)
|
||||
|
||||
context = dict(request.context)
|
||||
context.update(action["context"])
|
||||
|
||||
report_data = {}
|
||||
report_ids = context.get("active_ids", None)
|
||||
if 'report_type' in action:
|
||||
report_data['report_type'] = action['report_type']
|
||||
if 'datas' in action:
|
||||
if 'ids' in action['datas']:
|
||||
report_ids = action['datas'].pop('ids')
|
||||
report_data.update(action['datas'])
|
||||
|
||||
report_id = dispatch_rpc('report', 'report', [
|
||||
request.session.db, request.session.uid, request.session.password,
|
||||
action["report_name"], report_ids, report_data, context])
|
||||
|
||||
report_struct = None
|
||||
while True:
|
||||
report_struct = dispatch_rpc('report', 'report_get', [
|
||||
request.session.db, request.session.uid, request.session.password, report_id])
|
||||
if report_struct["state"]:
|
||||
break
|
||||
|
||||
time.sleep(self.POLLING_DELAY)
|
||||
|
||||
report = base64.b64decode(report_struct['result'])
|
||||
if report_struct.get('code') == 'zlib':
|
||||
report = zlib.decompress(report)
|
||||
report_mimetype = self.TYPES_MAPPING.get(
|
||||
report_struct['format'], 'octet-stream')
|
||||
file_name = action.get('name', 'report')
|
||||
if 'name' not in action:
|
||||
reports = request.env['ir.actions.report']
|
||||
reports = reports.search([('report_name', '=', action['report_name'])])
|
||||
if reports:
|
||||
file_name = reports[0].name
|
||||
else:
|
||||
file_name = action['report_name']
|
||||
file_name = '%s.%s' % (file_name, report_struct['format'])
|
||||
|
||||
return request.make_response(report,
|
||||
headers=[
|
||||
('Content-Disposition', content_disposition(file_name)),
|
||||
('Content-Type', report_mimetype),
|
||||
('Content-Length', len(report))],
|
||||
cookies={'fileToken': token})
|
||||
|
||||
class Apps(http.Controller):
|
||||
@http.route('/apps/<app>', auth='user')
|
||||
def get_app_url(self, req, app):
|
||||
|
||||
+19
-26
@@ -10,8 +10,7 @@ msgstr ""
|
||||
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
|
||||
"PO-Revision-Date: 2016-04-21 09:34+0000\n"
|
||||
"Last-Translator: Martin Trigaux\n"
|
||||
"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/"
|
||||
"odoo-9/language/en_GB/)\n"
|
||||
"Language-Team: English (United Kingdom) (http://www.transifex.com/odoo/odoo-9/language/en_GB/)\n"
|
||||
"Language: en_GB\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -1054,8 +1053,7 @@ msgstr ""
|
||||
#: code:addons/web/static/src/js/views/pivot_view.js:808
|
||||
#, python-format
|
||||
msgid ""
|
||||
"For Excel compatibility, data cannot be exported if there is more than 256 "
|
||||
"columns.\n"
|
||||
"For Excel compatibility, data cannot be exported if there is more than 256 columns.\n"
|
||||
"\n"
|
||||
"Tip: try to flip axis, filter further or reduce the number of measures."
|
||||
msgstr ""
|
||||
@@ -1465,8 +1463,8 @@ msgstr ""
|
||||
#: code:addons/web/static/src/js/views/graph_widget.js:95
|
||||
#, python-format
|
||||
msgid ""
|
||||
"No data available for this chart. Try to add some records, or make sure that "
|
||||
"there is no active filter in the search bar."
|
||||
"No data available for this chart. Try to add some records, or make sure that"
|
||||
" there is no active filter in the search bar."
|
||||
msgstr ""
|
||||
|
||||
#. module: web
|
||||
@@ -1474,10 +1472,8 @@ msgstr ""
|
||||
#: code:addons/web/static/src/xml/base.xml:691
|
||||
#, python-format
|
||||
msgid ""
|
||||
"No data available for this pivot table. Try to add some records, or make "
|
||||
"sure\n"
|
||||
" that there is at least one measure and no active filter in "
|
||||
"the search bar."
|
||||
"No data available for this pivot table. 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 ""
|
||||
|
||||
#. module: web
|
||||
@@ -1527,7 +1523,7 @@ msgstr ""
|
||||
#: code:addons/web/static/src/js/views/form_relational_widgets.js:329
|
||||
#, fuzzy, python-format
|
||||
msgid "No value found for the field %s for value %s"
|
||||
msgstr "No value found for the field for value "
|
||||
msgstr "No value found for the field for value %s"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -2154,8 +2150,8 @@ msgstr "The following fields are invalid:"
|
||||
#: code:addons/web/static/src/js/views/list_view_editable.js:124
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The line has been modified, your changes will be discarded. Are you sure you "
|
||||
"want to discard the changes ?"
|
||||
"The line has been modified, your changes will be discarded. Are you sure you"
|
||||
" want to discard the changes ?"
|
||||
msgstr ""
|
||||
|
||||
#. module: web
|
||||
@@ -2207,11 +2203,11 @@ msgstr "The selected file exceed the maximum file size of %s."
|
||||
#: code:addons/web/static/src/js/views/form_relational_widgets.js:1550
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The type of the field '%s' must be a many2many field with a relation to 'ir."
|
||||
"attachment' model."
|
||||
"The type of the field '%s' must be a many2many field with a relation to "
|
||||
"'ir.attachment' model."
|
||||
msgstr ""
|
||||
"The type of the field '%s' must be a many2many field with a relation to 'ir."
|
||||
"attachment' model."
|
||||
"The type of the field '%s' must be a many2many field with a relation to "
|
||||
"'ir.attachment' model."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -2241,15 +2237,11 @@ msgstr "This resource is empty"
|
||||
#: code:addons/web/static/src/xml/base.xml:1304
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This wizard will export all data that matches the current search criteria to "
|
||||
"a CSV file.\n"
|
||||
" You can export all data or only the fields that can be "
|
||||
"reimported after modification."
|
||||
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
|
||||
" You can export all data or only the fields that can be reimported after modification."
|
||||
msgstr ""
|
||||
"This wizard will export all data that matches the current search criteria to "
|
||||
"a CSV file.\n"
|
||||
" You can export all data or only the fields that can be "
|
||||
"reimported after modification."
|
||||
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
|
||||
" You can export all data or only the fields that can be reimported after modification."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -2584,7 +2576,8 @@ msgstr ""
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/framework/misc.js:17
|
||||
#, python-format
|
||||
msgid "You may not believe it,<br />but the application is actually loading..."
|
||||
msgid ""
|
||||
"You may not believe it,<br />but the application is actually loading..."
|
||||
msgstr ""
|
||||
"You may not believe it,<br />but the application is actually loading..."
|
||||
|
||||
|
||||
+16
-22
@@ -12,16 +12,13 @@ msgstr ""
|
||||
"POT-Creation-Date: 2016-08-18 14:08+0000\n"
|
||||
"PO-Revision-Date: 2016-02-22 05:01+0000\n"
|
||||
"Last-Translator: Rick Hunter <rick_hunter_ec@yahoo.com>\n"
|
||||
"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-9/"
|
||||
"language/es_EC/)\n"
|
||||
"Language-Team: Spanish (Ecuador) (http://www.transifex.com/odoo/odoo-9/language/es_EC/)\n"
|
||||
"Language: es_EC\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"#-#-#-#-# es_EC.po (Odoo 9.0) #-#-#-#-#\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"#-#-#-#-# es_EC.po (Odoo 9.0) #-#-#-#-#\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -1472,8 +1469,8 @@ msgstr "Sin actualizar:"
|
||||
#: code:addons/web/static/src/js/views/graph_widget.js:95
|
||||
#, python-format
|
||||
msgid ""
|
||||
"No data available for this chart. Try to add some records, or make sure that "
|
||||
"there is no active filter in the search bar."
|
||||
"No data available for this chart. Try to add some records, or make sure that"
|
||||
" there is no active filter in the search bar."
|
||||
msgstr ""
|
||||
"No existen datos disponibles para este gráfico. Trate de añadir algunos "
|
||||
"récords, o asegúrese que no existan filtros activos en la barra de búsqueda."
|
||||
@@ -1483,10 +1480,8 @@ msgstr ""
|
||||
#: code:addons/web/static/src/xml/base.xml:691
|
||||
#, python-format
|
||||
msgid ""
|
||||
"No data available for this pivot table. Try to add some records, or make "
|
||||
"sure\n"
|
||||
" that there is at least one measure and no active filter in "
|
||||
"the search bar."
|
||||
"No data available for this pivot table. 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 ""
|
||||
"No existen datos disponibles para esta tabla dinámica. Trate de añadir "
|
||||
"algunos registros, o asegúrese que exista por lo menos una medida y no "
|
||||
@@ -1727,8 +1722,8 @@ msgid ""
|
||||
"Pie chart cannot display all zero numbers.. Try to change your domain to "
|
||||
"display positive results"
|
||||
msgstr ""
|
||||
"Los gráficos de pastel no pueden mostrar los números 0. Trate de cambiar sus "
|
||||
"filtros para mostrar los resultados positivos."
|
||||
"Los gráficos de pastel no pueden mostrar los números 0. Trate de cambiar sus"
|
||||
" filtros para mostrar los resultados positivos."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -2221,18 +2216,18 @@ msgstr ""
|
||||
#: code:addons/web/static/src/js/views/form_widgets.js:1199
|
||||
#, python-format
|
||||
msgid "The selected file exceed the maximum file size of %s."
|
||||
msgstr "El archivo seleccionado supera el tamaño máximo de% s."
|
||||
msgstr "El archivo seleccionado supera el tamaño máximo de %s."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/views/form_relational_widgets.js:1550
|
||||
#, python-format
|
||||
msgid ""
|
||||
"The type of the field '%s' must be a many2many field with a relation to 'ir."
|
||||
"attachment' model."
|
||||
"The type of the field '%s' must be a many2many field with a relation to "
|
||||
"'ir.attachment' model."
|
||||
msgstr ""
|
||||
"El tipo de campo '%s' debe ser un campo many2many con una relación a 'ir."
|
||||
"attachment' model."
|
||||
"El tipo de campo '%s' debe ser un campo many2many con una relación a "
|
||||
"'ir.attachment' model."
|
||||
|
||||
#. module: web
|
||||
#. openerp-web
|
||||
@@ -2261,10 +2256,8 @@ msgstr "El recurso esta vacío"
|
||||
#: code:addons/web/static/src/xml/base.xml:1304
|
||||
#, python-format
|
||||
msgid ""
|
||||
"This wizard will export all data that matches the current search criteria to "
|
||||
"a CSV file.\n"
|
||||
" You can export all data or only the fields that can be "
|
||||
"reimported after modification."
|
||||
"This wizard will export all data that matches the current search criteria to a CSV file.\n"
|
||||
" You can export all data or only the fields that can be reimported after modification."
|
||||
msgstr ""
|
||||
"Este asistente exportará todos los datos que coincidan con el criterio de "
|
||||
"búsqueda actual a un archivo CSV.\n"
|
||||
@@ -2607,7 +2600,8 @@ msgstr ""
|
||||
#. openerp-web
|
||||
#: code:addons/web/static/src/js/framework/misc.js:17
|
||||
#, python-format
|
||||
msgid "You may not believe it,<br />but the application is actually loading..."
|
||||
msgid ""
|
||||
"You may not believe it,<br />but the application is actually loading..."
|
||||
msgstr ""
|
||||
"Usted no lo creerá,<br />pero la aplicación actualmente está cargando ..."
|
||||
|
||||
|
||||
+3
@@ -11,6 +11,9 @@ $.extend($.expr[':'], {
|
||||
containsLike: function (element, index, matches){
|
||||
return element.innerHTML.toUpperCase().indexOf(matches[3].toUpperCase()) >= 0;
|
||||
},
|
||||
containsTextLike: function (element, index, matches){
|
||||
return element.innerText.toUpperCase().indexOf(matches[3].toUpperCase()) >= 0;
|
||||
},
|
||||
containsExact: function (element, index, matches){
|
||||
return $.trim(element.innerHTML) === matches[3];
|
||||
},
|
||||
|
||||
@@ -256,7 +256,7 @@ var BasicRenderer = AbstractRenderer.extend({
|
||||
// If the view is in edit mode and that a widget have to switch
|
||||
// its "readonly" state, we have to re-render it completely
|
||||
if ('readonly' in modifiers && element.widget) {
|
||||
var mode = modifiers.readonly ? 'readonly' : modifiersData.baseMode;
|
||||
var mode = modifiers.readonly ? 'readonly' : modifiersData.baseModeByRecord[record.id];
|
||||
if (mode !== element.widget.mode) {
|
||||
self._rerenderFieldWidget(element.widget, record, {
|
||||
keepBaseMode: true,
|
||||
@@ -416,16 +416,17 @@ var BasicRenderer = AbstractRenderer.extend({
|
||||
* @param {Object} [options.callback] the callback to call on registration
|
||||
* and on modifiers updates
|
||||
* @param {boolean} [options.keepBaseMode=false] this function registers the
|
||||
* 'baseMode' of the node; this is a field widget specific settings which
|
||||
* 'baseMode' of the node on a per record basis;
|
||||
* this is a field widget specific settings which
|
||||
* represents the generic mode of the widget, regardless of its modifiers
|
||||
* (the interesting case is the list view: all widgets are supposed to be
|
||||
* in the baseMode 'readonly', except the ones that are in the line that
|
||||
* is currently being edited).
|
||||
* With option 'keepBaseMode' set to true, the current baseMode of the
|
||||
* With option 'keepBaseMode' set to true, the baseMode of the record's
|
||||
* node isn't overridden (this is particularily useful when a field widget
|
||||
* is re-rendered because its readonly modifier changed, as in this case,
|
||||
* we don't want to change its base mode).
|
||||
* @param {string} [options.mode] the 'baseMode' of the node is set to this
|
||||
* @param {string} [options.mode] the 'baseMode' of the record's node is set to this
|
||||
* value (if not given, it is set to this.mode, the mode of the renderer)
|
||||
* @returns {Object} for code efficiency, returns the last evaluated
|
||||
* modifiers for the given node and record.
|
||||
@@ -443,15 +444,16 @@ var BasicRenderer = AbstractRenderer.extend({
|
||||
modifiers: modifiers,
|
||||
evaluatedModifiers: {},
|
||||
elementsByRecord: {},
|
||||
baseModeByRecord : {},
|
||||
};
|
||||
if (!_.isEmpty(modifiers)) { // Register only if modifiers might change (TODO condition might be improved here)
|
||||
this.allModifiersData.push(modifiersData);
|
||||
}
|
||||
}
|
||||
|
||||
// Compute node's base mode if necessary
|
||||
if (!options.keepBaseMode) {
|
||||
modifiersData.baseMode = options.mode || this.mode;
|
||||
// Compute the record's base mode
|
||||
if (!modifiersData.baseModeByRecord[record.id] || !options.keepBaseMode) {
|
||||
modifiersData.baseModeByRecord[record.id] = options.mode || this.mode;
|
||||
}
|
||||
|
||||
// Evaluate if necessary
|
||||
|
||||
@@ -504,8 +504,8 @@ ListRenderer.include({
|
||||
var $row = this._super.apply(this, arguments);
|
||||
if (this.addTrashIcon) {
|
||||
var $icon = this.isMany2Many ?
|
||||
$('<i>', {class: 'fa fa-times', name: 'unlink'}) :
|
||||
$('<i>', {class: 'fa fa-trash-o', name: 'delete'});
|
||||
$('<button>', {class: 'fa fa-times o_list_record_remove', name: 'unlink', 'aria-label': _t('Unlink row ') + (index+1)}) :
|
||||
$('<button>', {class: 'fa fa-trash-o o_list_record_remove', name: 'delete', 'aria-label': _t('Delete row ') + (index+1)});
|
||||
var $td = $('<td>', {class: 'o_list_record_remove'}).append($icon);
|
||||
$row.append($td);
|
||||
}
|
||||
|
||||
@@ -70,6 +70,14 @@
|
||||
width: 1px; // to prevent the column to expand
|
||||
}
|
||||
|
||||
.o_list_record_delete_btn {
|
||||
padding: 0px;
|
||||
background-style: none;
|
||||
border-style: none;
|
||||
height: 0px;
|
||||
display: table-cell;
|
||||
}
|
||||
|
||||
// Decoration of the row
|
||||
.text-bf {
|
||||
font-weight: bold;
|
||||
|
||||
@@ -2261,6 +2261,65 @@ QUnit.module('relational_fields', {
|
||||
|
||||
QUnit.module('FieldOne2Many');
|
||||
|
||||
QUnit.test('one2many list editable with cell readonly modifier', function (assert) {
|
||||
assert.expect(4);
|
||||
|
||||
this.data.partner.records[0].p = [2];
|
||||
this.data.partner.records[1].turtles = [1,2];
|
||||
var form = createView({
|
||||
View: FormView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch:'<form string="Partners">' +
|
||||
'<field name="p">' +
|
||||
'<tree editable="bottom">' +
|
||||
'<field name="turtles" invisible="1"/>' +
|
||||
'<field name="foo" attrs="{"readonly" : [("turtles", "!=", [])] }"/>' +
|
||||
'<field name="qux" attrs="{"readonly" : [("turtles", "!=", [])] }"/>' +
|
||||
'</tree>' +
|
||||
'</field>' +
|
||||
'</form>',
|
||||
res_id: 1,
|
||||
mockRPC: function (route, args) {
|
||||
if (route === '/web/dataset/call_kw/partner/write') {
|
||||
assert.deepEqual(args.args[1].p[1][2], {foo: 'ff', qux: 99},
|
||||
'The right values should be written');
|
||||
}
|
||||
return this._super(route, args);
|
||||
}
|
||||
});
|
||||
|
||||
form.$buttons.find('.o_form_button_edit').click();
|
||||
form.$('.o_field_x2many_list_row_add a').click();
|
||||
|
||||
var $targetInput = $('.o_selected_row .o_input[name=foo]');
|
||||
assert.equal($targetInput[0], document.activeElement,
|
||||
'The first input of the line should have the focus');
|
||||
|
||||
// Simulating hitting the 'f' key twice
|
||||
$targetInput.val('f').trigger('input');
|
||||
$targetInput.val($targetInput.val() + 'f').trigger('input');
|
||||
|
||||
assert.equal($targetInput[0], document.activeElement,
|
||||
'The first input of the line should still have the focus');
|
||||
|
||||
// Simulating a TAB key
|
||||
$targetInput.trigger($.Event('keydown', {which: 9, keyCode:9}));
|
||||
|
||||
var $secondTarget = $('.o_selected_row .o_input[name=qux]');
|
||||
|
||||
assert.equal($secondTarget[0], document.activeElement,
|
||||
'The second input of the line should have the focus after the TAB press');
|
||||
|
||||
|
||||
$secondTarget.val(9).trigger('input');
|
||||
$secondTarget.val($secondTarget.val() + 9).trigger('input');
|
||||
|
||||
form.$buttons.find('.o_form_button_save').click();
|
||||
|
||||
form.destroy();
|
||||
});
|
||||
|
||||
QUnit.test('one2many basic properties', function (assert) {
|
||||
assert.expect(6);
|
||||
|
||||
@@ -3891,13 +3950,13 @@ QUnit.module('relational_fields', {
|
||||
});
|
||||
form.$buttons.find('.o_form_button_edit').click();
|
||||
|
||||
assert.strictEqual(form.$('td.o_list_record_remove i').length, 2,
|
||||
assert.strictEqual(form.$('td.o_list_record_remove button').length, 2,
|
||||
"should have 2 remove buttons");
|
||||
|
||||
assert.ok(form.$('td.o_list_record_remove i').first().hasClass('fa fa-times'),
|
||||
assert.ok(form.$('td.o_list_record_remove button').first().hasClass('fa fa-times'),
|
||||
"should have X icons to remove (unlink) records");
|
||||
|
||||
form.$('td.o_list_record_remove i').first().click();
|
||||
form.$('td.o_list_record_remove button').first().click();
|
||||
|
||||
assert.strictEqual(form.$('td.o_list_record_remove i').length, 1,
|
||||
"should have 1 remove button (a record is supposed to have been unlinked)");
|
||||
@@ -3937,13 +3996,13 @@ QUnit.module('relational_fields', {
|
||||
});
|
||||
form.$buttons.find('.o_form_button_edit').click();
|
||||
|
||||
assert.strictEqual(form.$('td.o_list_record_remove i').length, 2,
|
||||
assert.strictEqual(form.$('td.o_list_record_remove button').length, 2,
|
||||
"should have 2 remove buttons");
|
||||
|
||||
assert.ok(form.$('td.o_list_record_remove i').first().hasClass('fa fa-trash-o'),
|
||||
assert.ok(form.$('td.o_list_record_remove button').first().hasClass('fa fa-trash-o'),
|
||||
"should have trash bin icons to remove (delete) records");
|
||||
|
||||
form.$('td.o_list_record_remove i').first().click();
|
||||
form.$('td.o_list_record_remove button').first().click();
|
||||
|
||||
assert.strictEqual(form.$('td.o_list_record_remove i').length, 1,
|
||||
"should have 1 remove button (a record is supposed to have been deleted)");
|
||||
@@ -6689,8 +6748,8 @@ QUnit.module('relational_fields', {
|
||||
form.$('input.o_field_integer[name="int_field"]').val('0').trigger('input');
|
||||
|
||||
// remove and start over
|
||||
form.$('.o_list_record_remove:first i').click();
|
||||
form.$('.o_list_record_remove:first i').click();
|
||||
form.$('.o_list_record_remove:first button').click();
|
||||
form.$('.o_list_record_remove:first button').click();
|
||||
|
||||
// enable the many2many onchange
|
||||
form.$('input.o_field_integer[name="int_field"]').val('10').trigger('input');
|
||||
@@ -8423,7 +8482,7 @@ QUnit.module('relational_fields', {
|
||||
mode: 'edit',
|
||||
},
|
||||
});
|
||||
form.$('.o_list_record_remove:first i').click();
|
||||
form.$('.o_list_record_remove:first button').click();
|
||||
assert.strictEqual(form.$('.o_data_row').text(), 'from onchange',
|
||||
'onchange has been properly applied');
|
||||
form.destroy();
|
||||
@@ -8463,7 +8522,7 @@ QUnit.module('relational_fields', {
|
||||
mode: 'edit',
|
||||
},
|
||||
});
|
||||
form.$('.o_list_record_remove:first i').click();
|
||||
form.$('.o_list_record_remove:first button').click();
|
||||
assert.strictEqual(form.$('.o_data_row').text(), 'from onchange id2from onchange id3',
|
||||
'onchange has been properly applied');
|
||||
form.destroy();
|
||||
|
||||
@@ -1141,7 +1141,7 @@ body.editor_enable {
|
||||
width: @o-switch-size - 0.2;
|
||||
height: @o-switch-size - 0.2;
|
||||
margin-top: 0.1ex;
|
||||
margin-left: 0.3ex;
|
||||
margin-left: 0.1ex;
|
||||
border-radius: 100rem;
|
||||
.transition(all 0.3s @o-we-md-ease);
|
||||
box-shadow: 0 1px 1px darken(@o-switch-inactive-color,35%), inset 0 0 0 1px lighten(@o-switch-inactive-color,10%);
|
||||
@@ -1157,6 +1157,14 @@ body.editor_enable {
|
||||
}
|
||||
}
|
||||
}
|
||||
&.o_switch_danger {
|
||||
> input {
|
||||
&:not(:checked) + span {
|
||||
box-shadow: none;
|
||||
.o-linear-gradient(0deg, lighten(@brand-danger, 5%), darken(@brand-danger, 5%));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-menu label .o_switch {
|
||||
|
||||
@@ -242,6 +242,7 @@ var WebsiteRoot = BodyManager.extend({
|
||||
})
|
||||
.done(function (result) {
|
||||
$data.toggleClass("css_unpublished css_published");
|
||||
$(".ribbon-publish.ribbon-wrapper").toggleClass("css_unpublished css_published");
|
||||
$data.find('input').prop("checked", result);
|
||||
$data.parents("[data-publish]").attr("data-publish", +result ? 'on' : 'off');
|
||||
})
|
||||
|
||||
@@ -534,3 +534,37 @@ body .modal {
|
||||
color: @odoo-brand-optional;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Unpublished page's ribbon
|
||||
.ribbon-publish.ribbon-wrapper {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
z-index: 5;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
overflow: hidden;
|
||||
&.css_published {
|
||||
display:none;
|
||||
}
|
||||
&.css_unpublished {
|
||||
display:block;
|
||||
}
|
||||
}
|
||||
.ribbon-publish .ribbon {
|
||||
font: bold 15px Sans-Serif;
|
||||
color: white;
|
||||
text-align: center;
|
||||
-webkit-transform: rotate(45deg);
|
||||
-moz-transform: rotate(45deg);
|
||||
-ms-transform: rotate(45deg);
|
||||
-o-transform: rotate(45deg);
|
||||
position: relative;
|
||||
padding: 7px 65px;
|
||||
right: 27px;
|
||||
top: 44px;
|
||||
width: 300px;
|
||||
cursor: default;
|
||||
white-space: unset;
|
||||
word-wrap:break-word;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
<xpath expr="//t[@t-set='html_data']" position="after">
|
||||
<t t-set="body_classname" t-value="'o_connected_user' if env['ir.ui.view'].user_has_groups('base.group_user') else None"/>
|
||||
</xpath>
|
||||
<xpath expr="//div[@id='wrapwrap']//header" position="after">
|
||||
<div t-if="'website_published' in main_object.fields_get()" t-attf-class="ribbon-publish ribbon-wrapper #{main_object.website_published and 'css_published' or 'css_unpublished'}">
|
||||
<div class="ribbon btn btn-danger">Unpublished</div>
|
||||
</div>
|
||||
</xpath>
|
||||
<xpath expr="//div[@id='wrapwrap']" position="before">
|
||||
<nav groups="base.group_user" t-if="website and menu_data" id="oe_main_menu_navbar" class="o_main_navbar">
|
||||
<ul id="oe_applications">
|
||||
@@ -61,7 +66,7 @@
|
||||
<ul class="o_menu_systray hidden-xs" groups="website.group_website_publisher">
|
||||
<li t-if="'website_published' in main_object.fields_get()" t-attf-class="js_publish_management #{main_object.website_published and 'css_published' or 'css_unpublished'}" t-att-data-id="main_object.id" t-att-data-object="main_object._name" t-att-data-controller="publish_controller">
|
||||
<a>
|
||||
<label class="o_switch js_publish_btn" for="id" >
|
||||
<label class="o_switch o_switch_danger js_publish_btn" for="id" >
|
||||
<input type="checkbox" t-att-checked="main_object.website_published" id="id"/>
|
||||
<span/>
|
||||
<span class="css_publish">Unpublished</span>
|
||||
|
||||
@@ -5,7 +5,8 @@ import werkzeug
|
||||
|
||||
from odoo import exceptions, fields, http, _
|
||||
from odoo.http import request
|
||||
from odoo.addons.portal.controllers.portal import CustomerPortal, get_records_pager
|
||||
from odoo.addons.portal.controllers.portal import get_records_pager
|
||||
from odoo.addons.sale.controllers.portal import CustomerPortal
|
||||
from odoo.addons.portal.controllers.mail import _message_post_helper
|
||||
|
||||
|
||||
|
||||
@@ -277,7 +277,7 @@ var BaseSettingRenderer = FormRenderer.extend({
|
||||
module.settingView.find('h2').addClass('o_hidden');
|
||||
module.settingView.find('.settingSearchHeader').addClass('o_hidden');
|
||||
module.settingView.find('.o_settings_container').removeClass('mt16');
|
||||
var resultSetting = module.settingView.find("label:containsLike('" + self.searchText + "')");
|
||||
var resultSetting = module.settingView.find("label:containsTextLike('" + self.searchText + "')");
|
||||
if (resultSetting.length > 0) {
|
||||
resultSetting.each(function () {
|
||||
var settingBox = $(this).closest('.o_setting_box');
|
||||
|
||||
@@ -408,7 +408,7 @@ odoo.define('web.test.x2many', function (require) {
|
||||
trigger: '.ui-autocomplete a:first',
|
||||
}, { // remove record
|
||||
content: "delete the last item in the editable list",
|
||||
trigger: '.o_list_view .o_data_row td.o_list_record_remove i:visible:last',
|
||||
trigger: '.o_list_view .o_data_row td.o_list_record_remove button:visible:last',
|
||||
}, {
|
||||
content: "test one2many onchange after delete",
|
||||
trigger: '.o_content:not(:has(textarea[name="message_concat"]:propValueContains(Administrator:d)))',
|
||||
|
||||
Reference in New Issue
Block a user