diff --git a/addons/web/static/src/views/list/list_arch_parser.js b/addons/web/static/src/views/list/list_arch_parser.js index df3f7347e21..d697c0649fb 100644 --- a/addons/web/static/src/views/list/list_arch_parser.js +++ b/addons/web/static/src/views/list/list_arch_parser.js @@ -125,11 +125,21 @@ export class ListArchParser extends XMLParser { })) .filter((button) => button.modifiers.invisible !== true); return false; - } else if (node.tagName === "create") { - creates.push({ - context: node.getAttribute("context"), - description: node.getAttribute("string"), - }); + } else if (node.tagName === "control") { + for (const childNode of node.children) { + if (childNode.tagName === "button") { + creates.push({ + type: "button", + ...processButton(childNode), + }); + } else if (childNode.tagName === "create") { + creates.push({ + type: "create", + context: childNode.getAttribute("context"), + string: childNode.getAttribute("string"), + }); + } + } return false; } else if (["tree", "list"].includes(node.tagName)) { const activeActions = { diff --git a/addons/web/static/src/views/list/list_controller.scss b/addons/web/static/src/views/list/list_controller.scss index f097bcede66..a146ae94b17 100644 --- a/addons/web/static/src/views/list/list_controller.scss +++ b/addons/web/static/src/views/list/list_controller.scss @@ -330,10 +330,16 @@ } .o_field_x2many_list_row_add, .o_group_field_row_add { - a:focus, a:active { + a:focus, a:active, button:focus, button:active { color: $link-hover-color; outline: none; } + + button { + font-weight: 400; + padding: 0; + vertical-align: baseline; + } } } diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js index 4b096089137..34586292319 100644 --- a/addons/web/static/src/views/list/list_renderer.js +++ b/addons/web/static/src/views/list/list_renderer.js @@ -78,7 +78,7 @@ export class ListRenderer extends Component { this.creates = this.props.archInfo.creates.length ? this.props.archInfo.creates - : [{ description: this.env._t("Add a line") }]; + : [{ type: "create", string: this.env._t("Add a line") }]; this.cellToFocus = null; this.activeRowId = null; diff --git a/addons/web/static/src/views/list/list_renderer.xml b/addons/web/static/src/views/list/list_renderer.xml index b791eb54623..6cadfaa080d 100644 --- a/addons/web/static/src/views/list/list_renderer.xml +++ b/addons/web/static/src/views/list/list_renderer.xml @@ -81,14 +81,25 @@ > - + + diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index 0e78e2686a1..e98144d740d 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -9099,6 +9099,45 @@ QUnit.module("Fields", (hooks) => { ); }); + QUnit.test("o2m add an action button control", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + serverData, + resId: 2, + arch: ` +
+ + + + +