diff --git a/addons/web/static/src/views/list/list_controller.xml b/addons/web/static/src/views/list/list_controller.xml
index ec1abdd8f9b..321acc1b399 100644
--- a/addons/web/static/src/views/list/list_controller.xml
+++ b/addons/web/static/src/views/list/list_controller.xml
@@ -47,26 +47,26 @@
Create
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/addons/web/static/src/views/utils.js b/addons/web/static/src/views/utils.js
index 48ff29a674b..6d832e25f63 100644
--- a/addons/web/static/src/views/utils.js
+++ b/addons/web/static/src/views/utils.js
@@ -208,6 +208,7 @@ export function processButton(node) {
string: node.getAttribute("string") || undefined,
options: JSON.parse(node.getAttribute("options") || "{}"),
modifiers: JSON.parse(node.getAttribute("modifiers") || "{}"),
+ display: node.getAttribute("display") || "selection",
clickParams: {
close: archParseBoolean(node.getAttribute("close"), false),
context: node.getAttribute("context") || "{}",
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index 4456778a6bd..3c55c5d0c09 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -810,7 +810,7 @@ QUnit.module("Views", (hooks) => {
);
cpButtons = getButtons(target);
assert.containsOnce(cpButtons[0], 'button[name="x"]');
- assert.hasClass(cpButtons[0].querySelector('button[name="x"]'), "btn btn-secondary");
+ assert.hasClass(cpButtons[0].querySelector('button[name="x"]'), "btn btn-secondary plaf");
assert.containsOnce(cpButtons[0], ".o_list_selection_box");
assert.strictEqual(
cpButtons[0].querySelector('button[name="x"]').nextElementSibling,
@@ -827,6 +827,54 @@ QUnit.module("Views", (hooks) => {
assert.containsNone(cpButtons[0], 'button[name="y"]');
});
+ QUnit.test(
+ "list view: action button in controlPanel with display='always'",
+ async function (assert) {
+ await makeView({
+ type: "list",
+ resModel: "foo",
+ serverData,
+ arch: `
+
+
+
+ `,
+ });
+ let cpButtons = getButtons(target)[0];
+ assert.deepEqual(
+ [...cpButtons.querySelectorAll("button")].map((button) =>
+ button.textContent.trim()
+ ),
+ ["Create", "display", ""]
+ );
+
+ await click(
+ target.querySelector('.o_data_row .o_list_record_selector input[type="checkbox"]')
+ );
+ cpButtons = getButtons(target)[0];
+ assert.deepEqual(
+ [...cpButtons.querySelectorAll("button")].map((button) =>
+ button.textContent.trim()
+ ),
+ ["Create", "display", "default-selection"]
+ );
+
+ await click(
+ target.querySelector('.o_data_row .o_list_record_selector input[type="checkbox"]')
+ );
+ cpButtons = getButtons(target)[0];
+ assert.deepEqual(
+ [...cpButtons.querySelectorAll("button")].map((button) =>
+ button.textContent.trim()
+ ),
+ ["Create", "display", ""]
+ );
+ }
+ );
+
QUnit.test(
"list view: action button executes action on click: buttons are disabled and re-enabled",
async function (assert) {
diff --git a/odoo/addons/base/rng/common.rng b/odoo/addons/base/rng/common.rng
index eb6073252bb..af9db2ae9f0 100644
--- a/odoo/addons/base/rng/common.rng
+++ b/odoo/addons/base/rng/common.rng
@@ -360,6 +360,7 @@
+