diff --git a/addons/analytic/views/analytic_account_views.xml b/addons/analytic/views/analytic_account_views.xml
index 33ac5a02516..450d7b84e46 100644
--- a/addons/analytic/views/analytic_account_views.xml
+++ b/addons/analytic/views/analytic_account_views.xml
@@ -52,6 +52,7 @@
+
diff --git a/addons/analytic/views/analytic_line_views.xml b/addons/analytic/views/analytic_line_views.xml
index 733fdd67b63..c1a543e4ce8 100644
--- a/addons/analytic/views/analytic_line_views.xml
+++ b/addons/analytic/views/analytic_line_views.xml
@@ -5,6 +5,8 @@
account.analytic.line
+
+
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index 7b7b41e7df7..36528002fe1 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -362,6 +362,7 @@
10
+
@@ -763,6 +764,7 @@
+
diff --git a/addons/hr_contract/views/hr_contract_views.xml b/addons/hr_contract/views/hr_contract_views.xml
index 557a0ef0336..a1482aab2a0 100644
--- a/addons/hr_contract/views/hr_contract_views.xml
+++ b/addons/hr_contract/views/hr_contract_views.xml
@@ -239,6 +239,7 @@
hr.contract
+
diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml
index 3e260c055c5..0a455bc07a5 100644
--- a/addons/hr_expense/views/hr_expense_views.xml
+++ b/addons/hr_expense/views/hr_expense_views.xml
@@ -45,6 +45,7 @@
hr.expense
+
@@ -613,6 +614,7 @@
hr.expense.sheet
+
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index ac9faf26ef3..21d8ef76fcc 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -12,6 +12,8 @@
+
+
diff --git a/addons/mrp/views/mrp_routing_views.xml b/addons/mrp/views/mrp_routing_views.xml
index 927ea6ab3b6..602553cda6f 100644
--- a/addons/mrp/views/mrp_routing_views.xml
+++ b/addons/mrp/views/mrp_routing_views.xml
@@ -7,6 +7,7 @@
mrp.routing.workcenter
+
@@ -53,6 +54,7 @@
+
diff --git a/addons/mrp/views/mrp_workcenter_views.xml b/addons/mrp/views/mrp_workcenter_views.xml
index 9bd085e7b33..6ff1512c487 100644
--- a/addons/mrp/views/mrp_workcenter_views.xml
+++ b/addons/mrp/views/mrp_workcenter_views.xml
@@ -33,6 +33,7 @@
mrp.workcenter
+
diff --git a/addons/repair/views/repair_views.xml b/addons/repair/views/repair_views.xml
index 5608b968385..08c36bd6ea1 100644
--- a/addons/repair/views/repair_views.xml
+++ b/addons/repair/views/repair_views.xml
@@ -7,6 +7,7 @@
repair.order
+
diff --git a/addons/stock/views/stock_location_views.xml b/addons/stock/views/stock_location_views.xml
index b219c7b82f7..ecf5cfdab50 100644
--- a/addons/stock/views/stock_location_views.xml
+++ b/addons/stock/views/stock_location_views.xml
@@ -91,6 +91,7 @@
+
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index 242f8ce37ae..c6d2cdc26a1 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -65,6 +65,7 @@
+
diff --git a/addons/stock/views/stock_scrap_views.xml b/addons/stock/views/stock_scrap_views.xml
index 970c1532c20..10ff98d47a7 100644
--- a/addons/stock/views/stock_scrap_views.xml
+++ b/addons/stock/views/stock_scrap_views.xml
@@ -121,6 +121,8 @@
stock.scrap
+
+
diff --git a/addons/stock_picking_batch/views/stock_picking_batch_views.xml b/addons/stock_picking_batch/views/stock_picking_batch_views.xml
index 62bef20fb7b..fb1ec110d74 100644
--- a/addons/stock_picking_batch/views/stock_picking_batch_views.xml
+++ b/addons/stock_picking_batch/views/stock_picking_batch_views.xml
@@ -174,6 +174,7 @@
stock.picking.batch
+
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index e0e29fcb394..8fab67c638a 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -286,7 +286,7 @@ export class MockServer {
}
const defaultValues = {};
const stateExceptions = {}; // what is this ?
- (editableView && modifiersNames || ["invisible"]).forEach((attr) => {
+ ((editableView && modifiersNames) || ["invisible"]).forEach((attr) => {
stateExceptions[attr] = [];
defaultValues[attr] = !!field[attr];
});
@@ -467,7 +467,7 @@ export class MockServer {
case "form":
return true;
case "tree":
- return !!node.getAttribute("editable");
+ return node.getAttribute("editable") || node.getAttribute("multi_edit");
case "field": {
const fname = node.getAttribute("name");
const field = this.models[modelName].fields[fname];
@@ -489,11 +489,9 @@ export class MockServer {
_onchangeAbleView(node) {
if (node.tagName === "form") {
return true;
- }
- else if (node.tagName === "tree") {
+ } else if (node.tagName === "tree") {
return true;
- }
- else if (node.tagName === "kanban") {
+ } else if (node.tagName === "kanban") {
return true;
}
}
diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py
index d243da03e68..6904e950e23 100644
--- a/odoo/addons/base/models/ir_ui_view.py
+++ b/odoo/addons/base/models/ir_ui_view.py
@@ -1319,7 +1319,7 @@ actual arch.
return True
def _editable_tag_tree(self, node, name_manager):
- return node.get('editable')
+ return node.get('editable') or node.get('multi_edit')
def _editable_tag_field(self, node, name_manager):
field = name_manager.model._fields.get(node.get('name'))