diff --git a/addons/web_editor/static/src/js/editor/snippets.editor.js b/addons/web_editor/static/src/js/editor/snippets.editor.js index a6e0ce66191..3f9315607a0 100644 --- a/addons/web_editor/static/src/js/editor/snippets.editor.js +++ b/addons/web_editor/static/src/js/editor/snippets.editor.js @@ -2392,20 +2392,42 @@ var SnippetsMenu = Widget.extend({ await self._scrollToSnippet($target, self.$scrollable); _.defer(async function () { - self._disableUndroppableSnippets(); - + // Free the mutex now to allow following operations + // (mutexed as well). dragAndDropResolve(); + // First call the onBuilt of all options of each + // item in the snippet (and so build their editor + // instance first). await self._callForEachChildSnippet($target, function (editor, $snippet) { return editor.buildSnippet(); }); - self.trigger_up('snippet_dropped', {$target: $target}); + // The snippet is now fully built, notify the + // editor for changed content. $target.trigger('content_changed'); + + // Now notifies that a snippet was dropped (at the + // moment, useful to start public widgets for + // instance (no saved content)). + await self._mutex.exec(() => { + const proms = []; + self.trigger_up('snippet_dropped', { + $target: $target, + addPostDropAsync: prom => proms.push(prom), + }); + return Promise.all(proms); + }); + + // Lastly, ensure that the snippets or its related + // parts are added to the invisible DOM list if + // needed. await self._updateInvisibleDOM(); + // Restore editor to its normal edition state, also + // make sure the undroppable snippets are updated. + self._disableUndroppableSnippets(); self.options.wysiwyg.odooEditor.unbreakableStepUnactive(); self.options.wysiwyg.odooEditor.historyStep(); - self.$el.find('.oe_snippet_thumbnail').removeClass('o_we_already_dragging'); }); } else { diff --git a/addons/website/static/src/js/menu/edit.js b/addons/website/static/src/js/menu/edit.js index 5ade99c596f..e31baeed29f 100644 --- a/addons/website/static/src/js/menu/edit.js +++ b/addons/website/static/src/js/menu/edit.js @@ -486,10 +486,13 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ _onSnippetDropped: function (ev) { this._targetForEdition().find('.oe_structure.oe_empty, [data-oe-type="html"]') .attr('contenteditable', true); - this.trigger_up('widgets_start_request', { - editableMode: true, - $target: ev.data.$target, - }); + ev.data.addPostDropAsync(new Promise(resolve => { + this.trigger_up('widgets_start_request', { + editableMode: true, + $target: ev.data.$target, + onSuccess: () => resolve(), + }); + })); }, /** * Called when a snippet is removed from the page. If the wrapper element is