From 0b265a6564133b40e1b3090f736a0af24900188a Mon Sep 17 00:00:00 2001 From: Cocographique <nmi@odoo.com> Date: Fri, 21 Aug 2020 11:12:27 +0000 Subject: [PATCH] [IMP] website, *: add 'hamburger full' header template *: website_sale, website_sale_wishlist Part of https://github.com/odoo/odoo/pull/56427 task-2264627 Co-authored-by: qsm-odoo <qsm@odoo.com> --- addons/website/models/theme_models.py | 1 + .../src/js/content/snippets.animation.js | 19 +++++ addons/website/static/src/scss/website.scss | 76 ++++++++++++++++-- addons/website/views/snippets/snippets.xml | 5 +- addons/website/views/website_templates.xml | 79 ++++++++++++++++++- addons/website_sale/views/templates.xml | 10 +++ .../views/website_sale_wishlist_template.xml | 10 +++ 7 files changed, 193 insertions(+), 7 deletions(-) diff --git a/addons/website/models/theme_models.py b/addons/website/models/theme_models.py index a55ef2c9e4e7..c1c9ccbdda36 100644 --- a/addons/website/models/theme_models.py +++ b/addons/website/models/theme_models.py @@ -193,6 +193,7 @@ class Theme(models.AbstractModel): self.disable_view('website.template_header_boxed') self.disable_view('website.template_header_centered_logo') self.disable_view('website.template_header_image') + self.disable_view('website.template_header_hamburger_full') # Reinitialize footer templates self.enable_view('website.footer_custom') diff --git a/addons/website/static/src/js/content/snippets.animation.js b/addons/website/static/src/js/content/snippets.animation.js index 7de8fbef0299..a68e8555c1d5 100644 --- a/addons/website/static/src/js/content/snippets.animation.js +++ b/addons/website/static/src/js/content/snippets.animation.js @@ -978,6 +978,25 @@ registry.FooterSlideout = publicWidget.Widget.extend({ }, }); +registry.HeaderHamburgerFull = publicWidget.Widget.extend({ + selector: 'header:has(.o_header_hamburger_full_toggler):not(:has(.o_offcanvas_menu_toggler))', + events: { + 'click .o_header_hamburger_full_toggler': '_onToggleClick', + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + */ + _onToggleClick() { + document.body.classList.add('overflow-hidden'); + setTimeout(() => $(window).trigger('scroll'), 100); + }, +}); + return { Widget: publicWidget.Widget, Animation: Animation, diff --git a/addons/website/static/src/scss/website.scss b/addons/website/static/src/scss/website.scss index b901ecabb979..0d5fb8a161d5 100644 --- a/addons/website/static/src/scss/website.scss +++ b/addons/website/static/src/scss/website.scss @@ -823,17 +823,28 @@ header { @if $-off-canvas-hamburger { #top_menu_collapse { - flex-direction: if($-hamburger-left, row, row-reverse); &.collapsing, &.show { @include o-position-absolute(0, 0, 0, 0); position: fixed; - display: flex; - align-items: stretch; z-index: $zindex-sticky; transition: none; transform: none; + &, & > .o_header_collapsed_content_wrapper { + // TODO improve: ugly code to reset a potential wrapper + display: flex !important; + flex-flow: if($-hamburger-left, row, row-reverse) nowrap !important; + align-items: stretch !important; + justify-content: flex-start !important; + } + > .o_header_collapsed_content_wrapper { + // TODO improve: ugly code to reset a potential wrapper + max-width: none !important; + padding: 0 !important; + margin: 0 !important; + } + .o_offcanvas_menu_backdrop { @include o-position-absolute(0, 0, 0, 0); opacity: .2; @@ -843,12 +854,13 @@ header { #top_menu { flex: 0 0 auto !important; overflow: auto; - flex-wrap: nowrap; + flex-flow: column nowrap !important; @if $-hamburger-center { width: 100%; max-width: none; } @else { max-width: 560px; + text-align: left !important; } min-width: 250px; margin: 0 !important; @@ -871,6 +883,13 @@ header { .nav-item, .dropdown-menu { text-align: inherit; } + .nav-item, .nav-link { + margin: 0 !important; + } + + .navbar-toggler { + display: block !important; + } // Open all dropdowns .dropdown-toggle { @@ -895,7 +914,7 @@ header { .o_connected_user header:not(.o_header_is_scrolled) &, .o_connected_user header.o_header_affixed & { - padding-top: $o-navbar-height; + padding-top: $o-navbar-height !important; } } &.collapsing #top_menu { @@ -997,6 +1016,53 @@ header { width: 50%; } } +} @else if o-website-value('header-template') == 'hamburger-full' { + @if not $-off-canvas-hamburger { + @include media-breakpoint-up(md) { + #wrapwrap { + $o-hamburger-full-navbar-height: $o-theme-navbar-logo-height + ($navbar-padding-y * 2); + > header { + .navbar-collapse { + > .container { + height: calc(100vh - #{$o-navbar-height} - #{$o-hamburger-full-navbar-height}); + transition: height .3s ease; + } + .nav-link { + padding-right: $nav-link-padding-x; + padding-left: $nav-link-padding-x; + } + .dropdown-menu { + position: absolute; + } + } + &:not(.o_header_affixed) { + position: sticky; + top: 0; + right: 0; + bottom: auto; + left: 0; + z-index: $zindex-fixed; + } + &.o_header_affixed { + transform: none !important; + } + } + > main { + > :first-child:not(#wrap), #wrap > :first-child { + &::before { + content: ""; + display: block; + width: 100%; + margin-top: $o-hamburger-full-navbar-height; + } + } + } + } + #oe_main_menu_navbar ~ #wrapwrap > header { + top: $o-navbar-height; + } + } + } } // Mega menu diff --git a/addons/website/views/snippets/snippets.xml b/addons/website/views/snippets/snippets.xml index f09a8ec82e2b..ed7d7b6ad1e7 100644 --- a/addons/website/views/snippets/snippets.xml +++ b/addons/website/views/snippets/snippets.xml @@ -602,6 +602,9 @@ <we-button data-name="header_image_opt" data-customize-website-views="website.template_header_image" data-customize-website-variable="'image'">Image</we-button> + <we-button data-name="header_hamburger_full_opt" + data-customize-website-views="website.template_header_hamburger_full" + data-customize-website-variable="'hamburger-full'">Hamburger Full</we-button> </we-select> <!-- Header Sidebar Template - Options --> @@ -633,7 +636,7 @@ data-customize-website-views="">Default</we-button> <we-button data-name="off_canvas_menu_opt" data-customize-website-variable="'off-canvas'" - data-customize-website-views="website.option_header_off_canvas, website.option_header_off_canvas_template_header_hamburger, website.option_header_off_canvas_template_header_sidebar">Off-Canvas</we-button> + data-customize-website-views="website.option_header_off_canvas, website.option_header_off_canvas_template_header_hamburger, website.option_header_off_canvas_template_header_sidebar, website.option_header_off_canvas_template_header_hamburger_full">Off-Canvas</we-button> </we-select> <we-select string=" ⌙ Logo" data-dependencies="off_canvas_menu_opt" data-reload="/"> <we-button data-customize-website-views="">Text</we-button> diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index f3d02bcd1b34..8e6b9e2e4bc6 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -1004,6 +1004,80 @@ </xpath> </template> +<template id="template_header_hamburger_full" inherit_id="website.layout" name="Template Header Hambuger Full" active="False"> + <xpath expr="//header//nav" position="replace"> + <nav class="navbar navbar-light o_colored_level o_cc"> + <div id="top_menu_container" class="container"> + <!-- Brand --> + <t t-call="website.placeholder_header_brand"/> + <!-- Navbar Toggler --> + <t t-call="website.navbar_toggler"> + <t t-set="_toggler_class" t-value="'o_header_hamburger_full_toggler ml-auto'"/> + </t> + </div> + <!-- Navbar Collapse --> + <div id="top_menu_collapse" class="collapse navbar-collapse"> + <div class="o_header_collapsed_content_wrapper container d-flex flex-column align-items-lg-center justify-content-lg-center"> + <!-- Menu --> + <t t-call="website.navbar_nav"> + <t t-set="_nav_class" t-value="'navbar-expand flex-column flex-lg-row text-center'"/> + <t t-foreach="website.menu_id.child_id" t-as="submenu"> + <t t-call="website.submenu"> + <t t-set="item_class" t-value="'nav-item'"/> + <t t-set="link_class" t-value="'nav-link'"/> + </t> + </t> + <!-- Sign In --> + <t t-call="portal.placeholder_user_sign_in"> + <t t-set="_item_class" t-value="'nav-item'"/> + <t t-set="_link_class" t-value="'nav-link font-weight-bold'"/> + </t> + <!-- User Dropdown --> + <t t-call="portal.user_dropdown"> + <t t-set="_user_name" t-value="true"/> + <t t-set="_item_class" t-value="'nav-item dropdown'"/> + <t t-set="_link_class" t-value="'nav-link font-weight-bold ml-lg-3'"/> + </t> + </t> + <!-- Social Icons --> + <div class="oe_structure w-100" id="oe_structure_header_hamburger_full_1"/> + </div> + </div> + </nav> + </xpath> +</template> + +<template id="template_header_hamburger_full_oe_structure_header_hamburger_full_1" inherit_id="website.template_header_hamburger_full" name="Template Header Hamburger Full (oe_structure_header_hamburger_full_1)"> + <xpath expr="//*[hasclass('oe_structure')][@id='oe_structure_header_hamburger_full_1']" position="replace"> + <div class="oe_structure w-100" id="oe_structure_header_hamburger_full_1"> + <div class="s_hr pt32 pb32" data-name="Separator"> + <hr class="w-100 mx-auto" style="border-top-width: 1px; border-top-style: solid; border-color: var(--400);"/> + </div> + <div class="s_share text-center" data-name="Social Media"> + <h4 class="s_share_title d-none">Follow us</h4> + <a href="/website/social/facebook" class="s_share_facebook" target="_blank"> + <i class="fa fa-1x fa-fw fa-facebook rounded-circle shadow-sm"/> + </a> + <a href="/website/social/twitter" class="s_share_twitter" target="_blank"> + <i class="fa fa-1x fa-fw fa-twitter rounded-circle shadow-sm"/> + </a> + <a href="/website/social/linkedin" class="s_share_linkedin" target="_blank"> + <i class="fa fa-1x fa-fw fa-linkedin rounded-circle shadow-sm"/> + </a> + <a href="/website/social/github" class="s_share_github" target="_blank"> + <i class="fa fa-1x fa-fw fa-github rounded-circle shadow-sm"/> + </a> + <a href="/website/social/youtube" class="s_share_youtube" target="_blank"> + <i class="fa fa-1x fa-fw fa-youtube rounded-circle shadow-sm"/> + </a> + <a href="/website/social/instagram" class="s_share_instagram" target="_blank"> + <i class="fa fa-1x fa-fw fa-instagram rounded-circle shadow-sm"/> + </a> + </div> + </div> + </xpath> +</template> + <!-- Navbar Hamburger Options --> <template id="option_header_off_canvas" inherit_id="website.navbar_nav" name="Off-Canvas Header" active="False"> <xpath expr="//ul[@id='top_menu']" position="attributes"> @@ -1039,13 +1113,16 @@ <xpath expr="//div[@id='oe_structure_header_hamburger_3']" position="replace"/> </template> - <template id="option_header_off_canvas_template_header_sidebar" inherit_id="website.template_header_sidebar" active="False" priority="32"> <xpath expr="//div[@id='oe_structure_header_sidebar_1']" position="attributes"> <attribute name="class" add="d-none d-lg-block" separator=" "/> </xpath> </template> +<template id="option_header_off_canvas_template_header_hamburger_full" inherit_id="website.template_header_hamburger_full" active="False" priority="32"> + <xpath expr="//div[@id='oe_structure_header_hamburger_full_1']" position="replace"/> +</template> + <!-- Header options --> <template id="option_layout_hide_header" inherit_id="website.layout" active="False"> <xpath expr="//header" position="before"> diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index db464258b040..2b4ad2164ed4 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -193,6 +193,16 @@ </xpath> </template> + <template id="template_header_hamburger_full" inherit_id="website.template_header_hamburger_full"> + <xpath expr="//t[@t-foreach='website.menu_id.child_id']" position="after"> + <t t-call="website_sale.header_cart_link"> + <t t-set="_icon" t-value="True"/> + <t t-set="_item_class" t-value="'nav-item ml-lg-3'"/> + <t t-set="_link_class" t-value="'nav-link'"/> + </t> + </xpath> + </template> + <!-- Products Search Bar input-group template --> <template id="website_sale_products_search_box" inherit_id="website.website_search_box" primary="True"> <xpath expr="//input[@name='search']" position="attributes"> diff --git a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml index 73f82f90ccc2..25f2558a2033 100644 --- a/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml +++ b/addons/website_sale_wishlist/views/website_sale_wishlist_template.xml @@ -152,6 +152,16 @@ </xpath> </template> + <template id="template_header_hamburger_full" inherit_id="website_sale.template_header_hamburger_full"> + <xpath expr="//t[@t-call='website_sale.header_cart_link']" position="after"> + <t t-call="website_sale_wishlist.header_wishlist_link"> + <t t-set="_icon" t-value="True"/> + <t t-set="_item_class" t-value="'nav-item ml-lg-2'"/> + <t t-set="_link_class" t-value="'nav-link'"/> + </t> + </xpath> + </template> + <template id="product_wishlist" name="Wishlist Page"> <t t-call="website.layout"> <t t-set="additional_title">Shop Wishlist</t> -- GitLab