From acfca25e48ac9bc227234de860fe8128f0312ed4 Mon Sep 17 00:00:00 2001 From: Benoit Socias Date: Tue, 31 Oct 2023 13:13:32 +0100 Subject: [PATCH] [FIX] web_editor: ignore device visibility upon snippet drop Since [1] when device visibility became a visibility option, when dropping a snippet that contains device-invisible blocks, all those blocks were made visible. This commit makes that behavior limited to blocks that are not device-invisible. (E.g. when dropping a popup) Steps to reproduce: - drop a Columns snippet - hide a column on mobile - hide a column on desktop - save snippet - drop saved snippet in either desktop or mobile preview => All columns were shown with the `o_snippet_override_invisible` effect on the conditional ones. [1]: https://github.com/odoo/odoo/commit/3103e0553011b5c1f4078972d7a88fa3fd4068b2 task-3538535 closes odoo/odoo#140505 Signed-off-by: Arthur Detroux (ard) --- .../static/src/js/editor/snippets.editor.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 4ba9d6c8379..38f71319d10 100644 --- a/addons/web_editor/static/src/js/editor/snippets.editor.js +++ b/addons/web_editor/static/src/js/editor/snippets.editor.js @@ -207,7 +207,10 @@ var SnippetEditor = Widget.extend({ isCurrent: targetEl === this.$target[0], }); } + // TODO In master differentiate device-based visibility. + this._toggleVisibilityStatusIgnoreDeviceVisibility = true; await this.toggleTargetVisibility(true); + this._toggleVisibilityStatusIgnoreDeviceVisibility = false; }, /** * Notifies all the associated snippet options that the template which @@ -885,6 +888,21 @@ var SnippetEditor = Widget.extend({ * @param {boolean} [show] */ _toggleVisibilityStatus: function (show) { + // TODO In master differentiate device-based visibility. + if (this._toggleVisibilityStatusIgnoreDeviceVisibility) { + if (this.$target[0].matches(".o_snippet_mobile_invisible, .o_snippet_desktop_invisible")) { + const isMobilePreview = weUtils.isMobileView(this.$target[0]); + const isMobileHidden = this.$target[0].classList.contains("o_snippet_mobile_invisible"); + if (isMobilePreview === isMobileHidden) { + // Preview mode and hidden type are the same. + show = false; + } else { + // Preview mode is not related to hidden type. + delete this.$target[0].dataset.invisible; + return false; + } + } + } if (show === undefined) { show = !this.isTargetVisible(); }