From ada22a583ff1cda4676ba36b91bffc55f71e1d5d Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Sun, 17 May 2026 13:30:10 -0400 Subject: [PATCH] feat(portal): mobile sidebar hamburger toggle (vanilla JS) 20 lines, no framework. Toggles .o_fp_open on sidebar + backdrop. Backdrop click closes drawer; navigating a sidebar link on mobile auto-closes. No-ops gracefully when sidebar isn't on the page (logged-out, 500 pages, etc.). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../static/src/js/fp_portal_sidebar.js | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 fusion_plating/fusion_plating_portal/static/src/js/fp_portal_sidebar.js diff --git a/fusion_plating/fusion_plating_portal/static/src/js/fp_portal_sidebar.js b/fusion_plating/fusion_plating_portal/static/src/js/fp_portal_sidebar.js new file mode 100644 index 00000000..a86ffe78 --- /dev/null +++ b/fusion_plating/fusion_plating_portal/static/src/js/fp_portal_sidebar.js @@ -0,0 +1,48 @@ +/** + * Fusion Plating — Portal sidebar hamburger toggle. + * Vanilla JS — no OWL / no jQuery. Loaded on every /my/* page. + * Below 768px the sidebar is translateX(-100%); toggling + * .o_fp_open on both sidebar + backdrop shows/hides it. + */ +(function () { + "use strict"; + + function init() { + var sidebar = document.querySelector(".o_fp_portal_sidebar"); + var hamburger = document.querySelector(".o_fp_portal_hamburger"); + var backdrop = document.querySelector(".o_fp_portal_backdrop"); + if (!sidebar || !hamburger || !backdrop) { + return; // sidebar not on this page (logged-out, error pages, etc.) + } + + function toggleOpen(force) { + var willOpen = (typeof force === "boolean") + ? force + : !sidebar.classList.contains("o_fp_open"); + sidebar.classList.toggle("o_fp_open", willOpen); + backdrop.classList.toggle("o_fp_open", willOpen); + } + + hamburger.addEventListener("click", function (e) { + e.preventDefault(); + toggleOpen(); + }); + backdrop.addEventListener("click", function () { + toggleOpen(false); + }); + // Close when navigating to a sidebar link on mobile + sidebar.querySelectorAll("a.o_fp_sidebar_item").forEach(function (a) { + a.addEventListener("click", function () { + if (window.innerWidth < 769) { + toggleOpen(false); + } + }); + }); + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +})();