diff --git a/addons/web/tooling/_eslintrc.json b/addons/web/tooling/_eslintrc.json index 92f7c655619..9ae39986a6f 100644 --- a/addons/web/tooling/_eslintrc.json +++ b/addons/web/tooling/_eslintrc.json @@ -60,6 +60,7 @@ "Collapse": "readonly", "Dropdown": "readonly", "Modal": "readonly", + "Offcanvas": "readonly", "Popover": "readonly", "Tooltip": "readonly" } diff --git a/addons/website/static/src/js/content/snippets.animation.js b/addons/website/static/src/js/content/snippets.animation.js index 9c0844e44f5..5b3f6d60a64 100644 --- a/addons/website/static/src/js/content/snippets.animation.js +++ b/addons/website/static/src/js/content/snippets.animation.js @@ -1039,8 +1039,23 @@ registry.anchorSlide = publicWidget.Widget.extend({ if (!$anchor.length || !scrollValue) { return; } - ev.preventDefault(); - this._scrollTo($anchor, scrollValue); + + const offcanvasEl = this.el.closest('.offcanvas.o_navbar_mobile'); + if (offcanvasEl && offcanvasEl.classList.contains('show')) { + // Special case for anchors in offcanvas in mobile: we can't just + // _scrollTo() after preventDefault because preventDefault would + // prevent the offcanvas to be closed. The choice is then to close + // it ourselves manually and once it's fully closed, then start our + // own smooth scrolling. + ev.preventDefault(); + Offcanvas.getInstance(offcanvasEl).hide(); + offcanvasEl.addEventListener('hidden.bs.offcanvas', () => { + this._scrollTo($anchor, scrollValue); + }); + } else { + ev.preventDefault(); + this._scrollTo($anchor, scrollValue); + } }, }); diff --git a/odoo/addons/test_lint/tests/eslintrc b/odoo/addons/test_lint/tests/eslintrc index 20228f6eb5c..54f897808dd 100644 --- a/odoo/addons/test_lint/tests/eslintrc +++ b/odoo/addons/test_lint/tests/eslintrc @@ -46,6 +46,7 @@ "Collapse": "readonly", "Dropdown": "readonly", "Modal": "readonly", + "Offcanvas": "readonly", "Popover": "readonly", "Tooltip": "readonly" }