From 7e1d4c6490d5539f83731d935dcfe9e845f6892e Mon Sep 17 00:00:00 2001 From: druid <druid@druids-MBP-2.lan> Date: Thu, 14 Jan 2021 23:17:04 +0200 Subject: [PATCH] closing menu panel --- .../hy-desktop-menu-links.tsx | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx b/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx index dae341d5..6d450fd2 100644 --- a/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx +++ b/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx @@ -67,7 +67,6 @@ export class HyDesktopMenuLinks { } showPanel(id) { - console.log('show panel'); const menuItems = this.el.shadowRoot.querySelectorAll(`.desktop-menu-link`); const menuPanelItems = this.el.shadowRoot.querySelectorAll('.hy-desktop-menu-panel'); // all panels const activeMenuItem = this.el.shadowRoot.querySelector(`.desktop-menu-link[link-id="${id}"]`) as HTMLElement; @@ -127,6 +126,13 @@ export class HyDesktopMenuLinks { } } + closePanel() { + this.isDesktopMenuOpen = false; + this.currenOpenMenuId = 0; + this.showBackdropShadow(); + this.clearPanelItemsStatus(); + } + clearPanelItemsStatus() { const menuItems = this.el.shadowRoot.querySelectorAll(`.desktop-menu-link`); const menuPanelItems = this.el.shadowRoot.querySelectorAll('.hy-desktop-menu-panel'); @@ -147,31 +153,56 @@ export class HyDesktopMenuLinks { } handleDesktopMenuClose(event) { - console.log(event.type); + this.closePanel(); - this.isDesktopMenuOpen = false; - this.currenOpenMenuId = 0; - this.showBackdropShadow(); - this.clearPanelItemsStatus(); + event.stopPropagation(); + } + + handleDesktopMenuLeave(event) { + let leaveEvent = event as MouseEvent; + let hyHeader = this.el.closest('.hy-site-header') as HTMLElement; + const headerHeight = hyHeader.offsetTop + hyHeader.offsetHeight; + + if (leaveEvent.clientY < headerHeight - 4) { + this.closePanel(); + } event.stopPropagation(); } handleDesktopMenuToggle(event, id) { - console.log(event.type); + let toggleEvent = event as MouseEvent; - this.isDesktopMenuOpen = true; + const activeMenuItem = this.el.shadowRoot.querySelector( + `.desktop-menu-link[link-id="${id}"] .desktop-menu-link__label` + ) as HTMLElement; + let topBorder = activeMenuItem.getClientRects()[0].top; if (this.currenOpenMenuId != id) { this.currenOpenMenuId = id; - this.showPanel(id); + + if (toggleEvent.clientY < topBorder) { + this.closePanel(); + } else { + this.isDesktopMenuOpen = true; + this.showPanel(id); + } + } else { + // Mouse moving around the same menu link + if (toggleEvent.clientY < topBorder) { + this.closePanel(); + } else { + if (!this.isDesktopMenuOpen) { + this.isDesktopMenuOpen = true; + this.showPanel(id); + } + } } event.stopPropagation(); } handleDesktopMenuFocus(event, id) { - console.log(event.type); if (this.isDesktopMenuOpen && this.currenOpenMenuId != id) { this.currenOpenMenuId = id; this.showPanel(id); @@ -181,8 +212,6 @@ export class HyDesktopMenuLinks { } handleDesktopMenuClick(event, id) { - console.log(event.type); - this.isDesktopMenuOpen = !this.isDesktopMenuOpen; if (!this.isDesktopMenuOpen) { this.handleDesktopMenuClose(event); @@ -234,7 +263,9 @@ export class HyDesktopMenuLinks { class={classAttributes} link-id={id} onClick={(e) => this.handleDesktopMenuClick(e, id)} - onMouseOver={(e) => this.handleDesktopMenuToggle(e, id)} + //onMouseOver={(e) => this.handleDesktopMenuToggle(e, id)} + onMouseMove={(e) => this.handleDesktopMenuToggle(e, id)} + onMouseLeave={(e) => this.handleDesktopMenuLeave(e)} onFocus={(e) => this.handleDesktopMenuFocus(e, id)} aria-expanded="false" > -- GitLab