diff --git a/addons/web/static/src/legacy/js/views/form/form_renderer.js b/addons/web/static/src/legacy/js/views/form/form_renderer.js index af5b4b3d69e..fcee6d0ee58 100644 --- a/addons/web/static/src/legacy/js/views/form/form_renderer.js +++ b/addons/web/static/src/legacy/js/views/form/form_renderer.js @@ -652,14 +652,19 @@ var FormRenderer = BasicRenderer.extend({ _renderHeaderButtons: function (node) { var self = this; var buttons = []; - _.each(node.children, function (child) { + var children = [...node.children]; + while(children.length) { + var child = children.shift(); if (child.tag === 'button') { buttons.push(self._renderHeaderButton(child)); } if (child.tag === 'widget') { buttons.push(self._renderTagWidget(child)); } - }); + if (child.children){ + children.push(...child.children); + } + } return this._renderStatusbarButtons(buttons); }, /** diff --git a/addons/web/static/tests/legacy/views/form_tests.js b/addons/web/static/tests/legacy/views/form_tests.js index d3504e29266..efb1a21f22c 100644 --- a/addons/web/static/tests/legacy/views/form_tests.js +++ b/addons/web/static/tests/legacy/views/form_tests.js @@ -2209,6 +2209,36 @@ QUnit.module('LegacyViews', { form.destroy(); }); + QUnit.test("nested buttons in form view header", async function (assert) { + assert.expect(4); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: + '
' + + '
' + + '
' + + '
', + res_id: 2, + }); + + var buttons = form.$('.o_form_statusbar button'); + assert.hasAttrValue(buttons[0], 'name', '0'); + assert.hasAttrValue(buttons[1], 'name', '1'); + assert.hasAttrValue(buttons[2], 'name', '2'); + assert.hasAttrValue(buttons[3], 'name', '3'); + + form.destroy(); + }); + QUnit.test('button in form view and long willStart', async function (assert) { assert.expect(6); diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index fa47aba501b..1fe2e0c0878 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -2644,6 +2644,32 @@ QUnit.module("Views", (hooks) => { ); }); + QUnit.test("nested buttons in form view header", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+
+
+
`, + resId: 2, + }); + + const buttons = target.querySelectorAll('.o_form_statusbar button'); + assert.strictEqual(buttons[0].attributes.name.textContent, "0"); + assert.strictEqual(buttons[1].attributes.name.textContent, "1"); + assert.strictEqual(buttons[2].attributes.name.textContent, "2"); + assert.strictEqual(buttons[3].attributes.name.textContent, "3"); + }); + QUnit.test("button in form view and long willStart", async function (assert) { const mockedActionService = { start() {