diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index 9daa9c9936a..d0778ded0fd 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -802,9 +802,6 @@ var BasicRenderer = AbstractRenderer.extend(WidgetAdapterMixin, { self._registerModifiers(node, record, widget); widget.$el.addClass('o_widget'); $el.replaceWith(widget.$el); - if (self._isInDom && widget.on_attach_callback) { - widget.on_attach_callback(); - } }); return $el; diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js index ffdb0d59064..483db4b2b09 100644 --- a/addons/web/static/src/js/views/form/form_renderer.js +++ b/addons/web/static/src/js/views/form/form_renderer.js @@ -55,6 +55,7 @@ var FormRenderer = BasicRenderer.extend(WidgetAdapterMixin, { on_attach_callback: function () { WidgetAdapterMixin.on_attach_callback.call(this); this._isInDom = true; + _.invoke(this.widgets, 'on_attach_callback'); this._super.apply(this, arguments); }, /** @@ -1010,6 +1011,7 @@ var FormRenderer = BasicRenderer.extend(WidgetAdapterMixin, { _.forEach(self.allFieldWidgets, function (widgets){ _.invoke(widgets, 'on_attach_callback'); }); + _.invoke(self.widgets, 'on_attach_callback'); } }).guardedCatch(function () { $form.remove(); diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 227980cc634..27461dda3f4 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -9294,6 +9294,33 @@ QUnit.module('Views', { form.destroy(); }); + + QUnit.test('reload a form view with a pie chart does not crash', async function (assert) { + assert.expect(3); + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: `
+ + `, + }); + + assert.containsOnce(form, '.o_widget'); + const canvasId1 = form.el.querySelector('.o_widget canvas').id; + + await form.reload(); + await testUtils.nextTick(); + + assert.containsOnce(form, '.o_widget'); + const canvasId2 = form.el.querySelector('.o_widget canvas').id; + // A new canvas should be found in the dom + assert.notStrictEqual(canvasId1, canvasId2); + + form.destroy(); + delete widgetRegistry.map.test; + }); }); });